Commit 0809558a authored by Archit Tamarapu's avatar Archit Tamarapu
Browse files

[fix] add caching for LCLD codec path

parent a1e79477
Loading
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -1073,7 +1073,10 @@ ivas_error ivas_init_decoder(
    if ( ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ||
         ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) )
    {
        ivas_dec_init_split_rend( st_ivas );
        if ( ( error = ivas_dec_init_split_rend( st_ivas ) ) != IVAS_ERR_OK )
        {
            return error;
        }
    }
    else
    {
+14 −1
Original line number Diff line number Diff line
@@ -1896,18 +1896,31 @@ void ivas_rend_CldfbSplitPostRendProcess(
    /* Implement CLDFB synthesis */
    for ( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ )
    {
#ifdef API_5MS
        float *RealBuffer[CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES];
        float *ImagBuffer[CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES];

        for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++ )
#else
        float *RealBuffer[CLDFB_NO_COL_MAX];
        float *ImagBuffer[CLDFB_NO_COL_MAX];

        for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ )
#endif
        {
            RealBuffer[slot_idx] = Cldfb_RealBuffer_Binaural[ch_idx][slot_idx];
            ImagBuffer[slot_idx] = Cldfb_ImagBuffer_Binaural[ch_idx][slot_idx];
        }

        cldfbSynthesis( RealBuffer, ImagBuffer, &( output[ch_idx][0] ), num_cldfb_bands * CLDFB_NO_COL_MAX, hBinHrSplitPostRend->cldfbSyn[ch_idx] );
        cldfbSynthesis( RealBuffer, ImagBuffer, &( output[ch_idx][0] ), num_cldfb_bands * CLDFB_NO_COL_MAX
#ifdef API_5MS
                                                                            / MAX_PARAM_SPATIAL_SUBFRAMES
#endif
                        ,
                        hBinHrSplitPostRend->cldfbSyn[ch_idx] );
    }


    pop_wmops();

    return;
+118 −13
Original line number Diff line number Diff line
@@ -60,6 +60,9 @@
#define MAX_BUFFER_LENGTH       ( MAX_BUFFER_LENGTH_PER_CHANNEL * MAX_INPUT_CHANNELS )
#define MAX_CLDFB_BUFFER_LENGTH ( MAX_CLDFB_BUFFER_LENGTH_PER_CHANNEL * MAX_INPUT_CHANNELS )
#define MAX_BIN_BUFFER_LENGTH   ( MAX_BUFFER_LENGTH_PER_CHANNEL * BINAURAL_CHANNELS )
#ifdef API_5MS
#define MAX_CLDFB_BIN_BUFFER_LENGTH ( MAX_CLDFB_BUFFER_LENGTH_PER_CHANNEL * BINAURAL_CHANNELS )
#endif
#else
#define MAX_BUFFER_LENGTH ( MAX_BUFFER_LENGTH_PER_CHANNEL * MAX_INPUT_CHANNELS )
#endif
@@ -2868,12 +2871,24 @@ static ivas_error setRendInputActiveSplitPostRend(
    rendCtx = inputSplitPostRend->base.ctx;
    outConfig = *rendCtx.pOutConfig;

    if ( ( error = allocateInputBaseBufferData( &inputSplitPostRend->bufferData, MAX_BIN_BUFFER_LENGTH ) ) != IVAS_ERR_OK )
    if ( ( error = allocateInputBaseBufferData( &inputSplitPostRend->bufferData,
#ifdef API_5MS
                                                MAX_CLDFB_BIN_BUFFER_LENGTH
#else
                                                MAX_BIN_BUFFER_LENGTH
#endif
                                                ) ) != IVAS_ERR_OK )
    {
        return error;
    }
    initRendInputBase( &inputSplitPostRend->base, inConfig, id, rendCtx,
                       inputSplitPostRend->bufferData, MAX_BIN_BUFFER_LENGTH );
                       inputSplitPostRend->bufferData,
#ifdef API_5MS
                       MAX_CLDFB_BIN_BUFFER_LENGTH
#else
                       MAX_BIN_BUFFER_LENGTH
#endif
    );
    inputSplitPostRend->numCachedSamples = 0;

    if ( ( error = updateSplitPostRendPanGains( inputSplitPostRend, outConfig, hRendCfg ) ) != IVAS_ERR_OK )
@@ -7817,13 +7832,22 @@ static ivas_error renderSplitBinauralWithPostRot(

        /* decode audio */
        if ( splitBinInput->base.inConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_SPLIT_CODED )
        { /* TODO(sgi): For both codecs: decode 20ms, cache last 15ms for the next 3 rendering calls */
        {
#ifdef API_5MS
            if ( bits.codec == IVAS_SPLIT_REND_CODEC_LCLD )
            {
                isPostRendInputCldfb = 1;
            }
            int16_t chnlIdx, slotIdx, smplIdx;
            int16_t pre_rend_frame_size_ms = bits.codec == IVAS_SPLIT_REND_CODEC_LC3PLUS ? hSplitBin->hLc3plusDec->config.ivas_frame_duration_us / 1000 : 20;
            int16_t numSamplesPerChannelCacheSize = *splitBinInput->base.ctx.pOutSampleRate * ( pre_rend_frame_size_ms - bits.codec_frame_size_ms ) / 1000;
            int16_t out_buffer_num_samples_per_channel = outAudio.config.numSamplesPerChannel;
            int16_t out_buffer_num_col_per_channel = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES;
            int16_t numColPerChannelCacheSize = CLDFB_NO_COL_MAX - out_buffer_num_col_per_channel;

            if ( splitBinInput->numCachedSamples == 0 )
            {
#endif
                if ( bits.codec == IVAS_SPLIT_REND_CODEC_LCLD )
                {
                    ivas_splitBinLCLDDecProcess(
@@ -7832,7 +7856,39 @@ static ivas_error renderSplitBinauralWithPostRot(
                        Cldfb_RealBuffer_Binaural,
                        Cldfb_ImagBuffer_Binaural,
                        SplitRendBFI );
#ifndef API_5MS
                    isPostRendInputCldfb = 1;
#endif

#ifdef API_5MS
                    /* copy data over to 5ms buffer */
                    for ( chnlIdx = 0; chnlIdx < BINAURAL_CHANNELS; ++chnlIdx )
                    {
                        for ( slotIdx = 0; slotIdx < CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; ++slotIdx )
                        {
                            mvr2r( Cldfb_RealBuffer_Binaural[chnlIdx][slotIdx], Cldfb_RealBuffer_Binaural_5ms[chnlIdx][slotIdx], CLDFB_NO_CHANNELS_MAX );
                            mvr2r( Cldfb_ImagBuffer_Binaural[chnlIdx][slotIdx], Cldfb_ImagBuffer_Binaural_5ms[chnlIdx][slotIdx], CLDFB_NO_CHANNELS_MAX );
                        }
                    }
                    /* cache the remaining 15ms */
                    splitBinInput->numCachedSamples = numColPerChannelCacheSize;
                    float *writePtr;
                    writePtr = splitBinInput->bufferData;
                    for ( slotIdx = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; slotIdx < CLDFB_NO_COL_MAX; ++slotIdx )
                    {
                        for ( chnlIdx = 0; chnlIdx < BINAURAL_CHANNELS; ++chnlIdx )
                        {
                            for ( smplIdx = 0; smplIdx < CLDFB_NO_CHANNELS_MAX; ++smplIdx )
                            {
                                *writePtr++ = Cldfb_RealBuffer_Binaural[chnlIdx][slotIdx][smplIdx];
                            }
                            for ( smplIdx = 0; smplIdx < CLDFB_NO_CHANNELS_MAX; ++smplIdx )
                            {
                                *writePtr++ = Cldfb_ImagBuffer_Binaural[chnlIdx][slotIdx][smplIdx];
                            }
                        }
                    }
#endif
                }
                else
                {
@@ -7841,20 +7897,57 @@ static ivas_error renderSplitBinauralWithPostRot(
                    {
                        return error;
                    }
#ifdef API_5MS
                    /* cache the remaining 15ms */
                    splitBinInput->numCachedSamples = numSamplesPerChannelCacheSize;
                    mvr2r( &tmpCrendBuffer[0][out_buffer_num_samples_per_channel], splitBinInput->bufferData, numSamplesPerChannelCacheSize );
                    mvr2r( &tmpCrendBuffer[1][out_buffer_num_samples_per_channel], splitBinInput->bufferData + numSamplesPerChannelCacheSize, numSamplesPerChannelCacheSize );
                    mvr2r( &tmpCrendBuffer[0][out_buffer_num_samples_per_channel],
                           splitBinInput->bufferData,
                           numSamplesPerChannelCacheSize );
                    mvr2r( &tmpCrendBuffer[1][out_buffer_num_samples_per_channel],
                           splitBinInput->bufferData + numSamplesPerChannelCacheSize,
                           numSamplesPerChannelCacheSize );
#endif
                }
#ifdef API_5MS
            }
            else
            {
                /* copy from cache */
                if ( bits.codec == IVAS_SPLIT_REND_CODEC_LCLD )
                {
                    int16_t readOffset = ( numColPerChannelCacheSize - splitBinInput->numCachedSamples );
                    float *readPtr;
                    readPtr = splitBinInput->bufferData;
                    isPostRendInputCldfb = 1;

                    readPtr += 2 * readOffset * CLDFB_NO_CHANNELS_MAX * BINAURAL_CHANNELS;
                    for ( slotIdx = 0; slotIdx < CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; ++slotIdx )
                    {
                        for ( chnlIdx = 0; chnlIdx < BINAURAL_CHANNELS; ++chnlIdx )
                        {
                            for ( smplIdx = 0; smplIdx < CLDFB_NO_CHANNELS_MAX; ++smplIdx )
                            {
                                Cldfb_RealBuffer_Binaural_5ms[chnlIdx][slotIdx][smplIdx] = *readPtr++;
                            }
                            for ( smplIdx = 0; smplIdx < CLDFB_NO_CHANNELS_MAX; ++smplIdx )
                            {
                                Cldfb_ImagBuffer_Binaural_5ms[chnlIdx][slotIdx][smplIdx] = *readPtr++;
                            }
                        }
                    }

                    splitBinInput->numCachedSamples -= out_buffer_num_col_per_channel;
                }
                else
                {
                int16_t tdToCldfbSampleFact = 1; /* TODO(sgi):  */
                    int16_t readOffset = numSamplesPerChannelCacheSize - splitBinInput->numCachedSamples;
                    mvr2r( splitBinInput->bufferData + readOffset, tmpCrendBuffer[0], out_buffer_num_samples_per_channel );
                    mvr2r( numSamplesPerChannelCacheSize + splitBinInput->bufferData + readOffset, tmpCrendBuffer[1], out_buffer_num_samples_per_channel );
                    splitBinInput->numCachedSamples -= out_buffer_num_samples_per_channel;
                }
            }
#endif
        }
        else
        {
            copyBufferTo2dArray( splitBinInput->base.inputBuffer, tmpCrendBuffer );
@@ -7868,10 +7961,17 @@ static ivas_error renderSplitBinauralWithPostRot(

            for ( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ )
            {
#ifdef API_5MS
                float *RealBuffer[CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES];
                float *ImagBuffer[CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES];

                for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++ )
#else
                float *RealBuffer[CLDFB_NO_COL_MAX];
                float *ImagBuffer[CLDFB_NO_COL_MAX];

                for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ )
#endif
                {
                    RealBuffer[slot_idx] = Cldfb_RealBuffer_Binaural[ch_idx][slot_idx];
                    ImagBuffer[slot_idx] = Cldfb_ImagBuffer_Binaural[ch_idx][slot_idx];
@@ -7880,7 +7980,11 @@ static ivas_error renderSplitBinauralWithPostRot(
                cldfbSynthesis( RealBuffer,
                                ImagBuffer,
                                &( tmpCrendBuffer[ch_idx][0] ),
                                hSplitBin->hBinHrSplitPostRend->cldfbSyn[0]->no_channels * CLDFB_NO_COL_MAX,
                                hSplitBin->hBinHrSplitPostRend->cldfbSyn[0]->no_channels * CLDFB_NO_COL_MAX
#ifdef API_5MS
                                    / MAX_PARAM_SPATIAL_SUBFRAMES
#endif
                                ,
                                hSplitBin->hBinHrSplitPostRend->cldfbSyn[ch_idx] );
            }
        }
@@ -9411,7 +9515,8 @@ ivas_error IVAS_REND_GetSplitBinauralBitstream(
        }
    }
    hIvasRend->splitRendEncBuffer.config.is_cldfb = cldfb_in;
    if ( hIvasRend->hRendererConfig->split_rend_config.dof == 0 || hIvasRend->hRendererConfig->split_rend_config.poseCorrectionMode == IVAS_SPLIT_REND_POSE_CORRECTION_MODE_NONE )
    if ( hIvasRend->hRendererConfig->split_rend_config.codec == IVAS_SPLIT_REND_CODEC_LC3PLUS &&
         ( hIvasRend->hRendererConfig->split_rend_config.dof == 0 || hIvasRend->hRendererConfig->split_rend_config.poseCorrectionMode == IVAS_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) )
    {
        hIvasRend->splitRendEncBuffer.config.numSamplesPerChannel = hIvasRend->hRendererConfig->split_rend_config.codec_frame_size_ms * ( hIvasRend->sampleRateOut / 1000 );
    }