Commit d210182e authored by Archit Tamarapu's avatar Archit Tamarapu
Browse files

refactor IVAS_REND_GetSamples() and IVAS_REND_GetSplitBinauralBitstream()

parent 07b23093
Loading
Loading
Loading
Loading
Loading
+140 −105
Original line number Diff line number Diff line
@@ -3749,7 +3749,14 @@ ivas_error IVAS_REND_AddInput(
        int16_t cldfb_in_flag;
        cldfb_in_flag = getCldfbRendFlag( hIvasRend, getAudioConfigType( inConfig ) );

        if ( ( error = ivas_pre_rend_init( hIvasRend->splitRendWrapper, &hIvasRend->splitRendEncBuffer, &hIvasRend->hRendererConfig->split_rend_config, hIvasRend->headRotData, hIvasRend->sampleRateOut, hIvasRend->outputConfig, cldfb_in_flag, hIvasRend->num_subframes ) ) != IVAS_ERR_OK )
        if ( ( error = ivas_pre_rend_init( hIvasRend->splitRendWrapper,
                                           &hIvasRend->splitRendEncBuffer,
                                           &hIvasRend->hRendererConfig->split_rend_config,
                                           hIvasRend->headRotData,
                                           hIvasRend->sampleRateOut,
                                           hIvasRend->outputConfig,
                                           cldfb_in_flag,
                                           hIvasRend->num_subframes ) ) != IVAS_ERR_OK )
        {
            return error;
        }
@@ -4644,7 +4651,14 @@ ivas_error IVAS_REND_FeedRenderConfig(
            hIvasRend->splitRendWrapper = NULL;
        }

        if ( ( error = ivas_pre_rend_init( hIvasRend->splitRendWrapper, &hIvasRend->splitRendEncBuffer, &hIvasRend->hRendererConfig->split_rend_config, hIvasRend->headRotData, hIvasRend->sampleRateOut, hIvasRend->outputConfig, cldfb_in_flag, hIvasRend->num_subframes ) ) != IVAS_ERR_OK )
        if ( ( error = ivas_pre_rend_init( hIvasRend->splitRendWrapper,
                                           &hIvasRend->splitRendEncBuffer,
                                           &hIvasRend->hRendererConfig->split_rend_config,
                                           hIvasRend->headRotData,
                                           hIvasRend->sampleRateOut,
                                           hIvasRend->outputConfig,
                                           cldfb_in_flag,
                                           hIvasRend->num_subframes ) ) != IVAS_ERR_OK )
        {
            return error;
        }
@@ -7576,7 +7590,6 @@ static ivas_error getSamplesInternal(
    ivas_error error;
    int16_t numOutChannels;
    int16_t cldfb2tdSampleFact;
    IVAS_REND_AudioBuffer outAudioOrig;

    /* Validate function arguments */
    if ( hIvasRend == NULL || outAudio.data == NULL )
@@ -7646,23 +7659,8 @@ static ivas_error getSamplesInternal(
        return IVAS_ERR_WRONG_NUM_CHANNELS;
    }

    /* Clear original output buffer */
    set_zero( outAudio.data, outAudio.config.numChannels * outAudio.config.numSamplesPerChannel );

    outAudioOrig = outAudio;
    /* Use internal buffer if outputting split rendering bitstream */
    if ( ( hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ||
         ( hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) )
    {
        int16_t num_poses_orig;
        num_poses_orig = hIvasRend->splitRendWrapper->multiBinPoseData.num_poses;
        outAudio = hIvasRend->splitRendEncBuffer;
        ISAR_PRE_REND_GetMultiBinPoseData( &hIvasRend->hRendererConfig->split_rend_config, &hIvasRend->splitRendWrapper->multiBinPoseData, hIvasRend->headRotData.sr_pose_pred_axis );
        assert( num_poses_orig == hIvasRend->splitRendWrapper->multiBinPoseData.num_poses && "number of poses should not change dynamically" );

        /* Clear output buffer for split rendering bitstream */
    /* Clear output buffer */
    set_zero( outAudio.data, outAudio.config.numChannels * outAudio.config.numSamplesPerChannel );
    }

    if ( ( error = renderActiveInputsIsm( hIvasRend, outAudio ) ) != IVAS_ERR_OK )
    {
@@ -7684,30 +7682,118 @@ static ivas_error getSamplesInternal(
        return error;
    }

    if ( hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM )
    return IVAS_ERR_OK;
}


/*-------------------------------------------------------------------*
 * IVAS_REND_GetSamples()
 *
 *
 *-------------------------------------------------------------------*/

ivas_error IVAS_REND_GetSamples(
    IVAS_REND_HANDLE hIvasRend,    /* i/o: Renderer handle          */
    IVAS_REND_AudioBuffer outAudio /* i/o: buffer for output audio  */
)
{
        ISAR_SPLIT_REND_BITS_DATA bits;
        int16_t cldfb_in_flag;
        float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
        float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
    ivas_error error;

    if ( ( error = getSamplesInternal( hIvasRend, outAudio, NULL ) ) != IVAS_ERR_OK )
    {
        return error;
    }

    if ( outAudio.config.is_cldfb == 0 )
    {
#ifndef DISABLE_LIMITER
#ifdef DEBUGGING
        hIvasRend->numClipping +=
#endif
            limitRendererOutput( hIvasRend->hLimiter, outAudio.data, outAudio.config.numSamplesPerChannel, IVAS_LIMITER_THRESHOLD );
#endif
    }

    /* update global cominbed orientation start index */
    ivas_combined_orientation_update_start_index( hIvasRend->hCombinedOrientationData, outAudio.config.numSamplesPerChannel );

    return IVAS_ERR_OK;
}


/*-------------------------------------------------------------------*
 * IVAS_REND_GetSplitBinauralBitstream()
 *
 *
 *-------------------------------------------------------------------*/

ivas_error IVAS_REND_GetSplitBinauralBitstream(
    IVAS_REND_HANDLE hIvasRend,      /* i/o: Renderer handle             */
    IVAS_REND_AudioBuffer outAudio,  /* i/o: buffer for output audio     */
    IVAS_REND_BitstreamBuffer *hBits /* o  : buffer for output bitstream */
)
{
    ivas_error error;
    int16_t ch;
    int16_t cldfb_in_flag;
    int16_t i, ro_md_flag;
    int16_t num_poses_orig;
    float *tmpBinaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS], tmpBinaural_buff[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][L_FRAME48k];
    float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
    float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
    IVAS_REND_AudioBufferConfig *pSplitEncBufConfig;
    ISAR_SPLIT_REND_CONFIG_HANDLE pSplitRendConfig;
    ISAR_SPLIT_REND_BITS_DATA bits;

        for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ )
    for ( ch = 0; ch < MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS; ch++ )
    {
        tmpBinaural[ch] = tmpBinaural_buff[ch];
    }

        if ( outAudio.config.is_cldfb == 1 )
    cldfb_in_flag = getCldfbRendFlag( hIvasRend, IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN );
    pSplitEncBufConfig = &hIvasRend->splitRendEncBuffer.config;
    pSplitRendConfig = &hIvasRend->hRendererConfig->split_rend_config;

    /* configure output buffer for the split rendering multi-poses */
    pSplitEncBufConfig->is_cldfb = cldfb_in_flag;
    if ( pSplitRendConfig->dof == 0 || pSplitRendConfig->poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE )
    {
        pSplitEncBufConfig->numSamplesPerChannel = outAudio.config.numSamplesPerChannel;
    }
    else
    {
        pSplitEncBufConfig->numSamplesPerChannel = (int16_t) ( hIvasRend->sampleRateOut / FRAMES_PER_SEC );
    }
    pSplitEncBufConfig->numSamplesPerChannel *= cldfb_in_flag ? 2 : 1;

    num_poses_orig = hIvasRend->splitRendWrapper->multiBinPoseData.num_poses;
    ISAR_PRE_REND_GetMultiBinPoseData( pSplitRendConfig,
                                       &hIvasRend->splitRendWrapper->multiBinPoseData,
                                       hIvasRend->headRotData.sr_pose_pred_axis );
    assert( num_poses_orig == hIvasRend->splitRendWrapper->multiBinPoseData.num_poses && "number of poses should not change dynamically" );

    /* Clear output buffer for split rendering bitstream */
    set_zero( hIvasRend->splitRendEncBuffer.data, pSplitEncBufConfig->numChannels * pSplitEncBufConfig->numSamplesPerChannel );

    /* hIvasRend->splitRendEncBuffer used for BINAURAL_SPLIT_CODED output
       outAudio used later for BINAURAL_SPLIT_PCM output */
    if ( ( error = getSamplesInternal( hIvasRend,
                                       hIvasRend->splitRendEncBuffer,
                                       NULL ) ) != IVAS_ERR_OK )
    {
        return error;
    }

    /* copy outputs */
    if ( hIvasRend->splitRendEncBuffer.config.is_cldfb == 1 )
    {
        cldfb_in_flag = 1;
            copyBufferToCLDFBarray( outAudio, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural );
        copyBufferToCLDFBarray( hIvasRend->splitRendEncBuffer, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural );
    }
    else
    {
        cldfb_in_flag = 0;
            copyBufferTo2dArray( outAudio, tmpBinaural_buff );
        copyBufferTo2dArray( hIvasRend->splitRendEncBuffer, tmpBinaural_buff );
    }

    /* Encode split rendering bitstream */
@@ -7725,10 +7811,10 @@ static ivas_error getSamplesInternal(

    if ( ( error = ISAR_PRE_REND_MultiBinToSplitBinaural( hIvasRend->splitRendWrapper,
                                                          hIvasRend->headRotData.headPositions[0],
                                                              hIvasRend->hRendererConfig->split_rend_config.splitRendBitRate,
                                                              hIvasRend->hRendererConfig->split_rend_config.codec,
                                                              hIvasRend->hRendererConfig->split_rend_config.isar_frame_size_ms,
                                                              hIvasRend->hRendererConfig->split_rend_config.codec_frame_size_ms,
                                                          pSplitRendConfig->splitRendBitRate,
                                                          pSplitRendConfig->codec,
                                                          pSplitRendConfig->isar_frame_size_ms,
                                                          pSplitRendConfig->codec_frame_size_ms,
                                                          &bits,
                                                          Cldfb_RealBuffer_Binaural,
                                                          Cldfb_ImagBuffer_Binaural,
@@ -7744,14 +7830,11 @@ static ivas_error getSamplesInternal(

    convertInternalBitsBuffToBitsBuffer( hBits, bits );

        /* reset to outAudioOrig in case of PCM output */
        outAudio = outAudioOrig;

    /* copy over first pose data to outAudio */
    if ( hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM )
    {
        accumulate2dArrayToBuffer( tmpBinaural_buff, &outAudio );
    }
    }

    if ( outAudio.config.is_cldfb == 0 )
    {
@@ -7770,54 +7853,6 @@ static ivas_error getSamplesInternal(
}


/*-------------------------------------------------------------------*
 * IVAS_REND_GetSamples()
 *
 *
 *-------------------------------------------------------------------*/

ivas_error IVAS_REND_GetSamples(
    IVAS_REND_HANDLE hIvasRend,    /* i/o: Renderer handle          */
    IVAS_REND_AudioBuffer outAudio /* i/o: buffer for output audio  */
)
{

    return getSamplesInternal( hIvasRend, outAudio, NULL );
}


/*-------------------------------------------------------------------*
 * IVAS_REND_GetSplitBinauralBitstream()
 *
 *
 *-------------------------------------------------------------------*/

ivas_error IVAS_REND_GetSplitBinauralBitstream(
    IVAS_REND_HANDLE hIvasRend,      /* i/o: Renderer handle             */
    IVAS_REND_AudioBuffer outAudio,  /* i/o: buffer for output audio     */
    IVAS_REND_BitstreamBuffer *hBits /* o  : buffer for output bitstream */
)
{
    int16_t cldfb_in_flag;

    cldfb_in_flag = getCldfbRendFlag( hIvasRend, IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN );
    hIvasRend->splitRendEncBuffer.config.is_cldfb = cldfb_in_flag;
    if ( hIvasRend->hRendererConfig->split_rend_config.dof == 0 || hIvasRend->hRendererConfig->split_rend_config.poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE )
    {
        hIvasRend->splitRendEncBuffer.config.numSamplesPerChannel = outAudio.config.numSamplesPerChannel;
    }
    else
    {
        hIvasRend->splitRendEncBuffer.config.numSamplesPerChannel = (int16_t) ( hIvasRend->sampleRateOut / FRAMES_PER_SEC );
    }
    hIvasRend->splitRendEncBuffer.config.numSamplesPerChannel *= cldfb_in_flag ? 2 : 1;

    /* hIvasRend->splitRendEncBuffer used for BINAURAL_SPLIT_CODED output
       outAudio used for BINAURAL_SPLIT_PCM output */
    return getSamplesInternal( hIvasRend, outAudio, hBits );
}


/*-------------------------------------------------------------------*
 * IVAS_REND_GetSplitRendBitstreamHeader()
 *