Commit 9db9af55 authored by vaclav's avatar vaclav
Browse files

issue 1319: Optimize the definition of buffer lengths in the SBA decoder;...

issue 1319: Optimize the definition of buffer lengths in the SBA decoder; under FIX_1319_STACK_SBA_DECODER
parent 87e93d91
Loading
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -3719,8 +3719,13 @@ void ivas_dirac_dec_render_sf(
    Decoder_Struct *st_ivas,                                    /* i/o: IVAS decoder structure                  */
    float *output_f[],                                          /* i/o: synthesized core-coder transport channels/DirAC output  */
    const int16_t nchan_transport,                              /* i  : number of transport channels            */
#ifdef FIX_1319_STACK_SBA_DECODER
    float *pppQMfFrame_ts_re[HOA3_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX],
    float *pppQMfFrame_ts_im[HOA3_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX]
#else
    float *pppQMfFrame_ts_re[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX],
    float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX]
#endif
);

void computeDiffuseness_mdft(
+1 −0
Original line number Diff line number Diff line
@@ -160,6 +160,7 @@

/*#define FIX_I4_OL_PITCH*/                             /* fix open-loop pitch used for EVS core switching */
#define TMP_FIX_1119_SPLIT_RENDERING_VOIP               /* FhG: Add error check for unsupported config: split rendering with VoIP mode */
#define FIX_1319_STACK_SBA_DECODER                      /* VA: issue 1319: Optimize the definition of buffer lengths in the SBA decoder */


/* #################### End BE switches ################################## */
+129 −1
Original line number Diff line number Diff line
@@ -1622,6 +1622,80 @@ void ivas_dirac_dec_render(
    return;
}

#ifdef FIX_1319_STACK_SBA_DECODER
/*-------------------------------------------------------------------------
 * Local functions to Perform binaural rendering with optimized stack
 *------------------------------------------------------------------------*/

static void binRenderer_split(
    BINAURAL_RENDERER_HANDLE hBinRenderer,                                                                    /* i/o: binaural renderer handle                      */
    ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE hSplitBinRend,                                                         /* i/o: /* ISAR split binaural rendering handle       */
    COMBINED_ORIENTATION_HANDLE hCombinedOrientationData,                                                     /* i  : combined head and external orientation handle */
    const int16_t numTimeSlots,                                                                               /* i  : number of time slots to render                */
    float Cldfb_RealBuffer_Binaural[][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o  : Rotated Binaural signals                      */
    float Cldfb_ImagBuffer_Binaural[][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o  : Rotated Binaural signals                      */
    float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],                                   /* i  : LS signals                                    */
    float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],                                   /* i  : LS signals                                    */
    const int16_t slot_idx_start,
    const int16_t num_freq_bands,
    const int16_t nchan_out )
{
    int16_t pos_idx, slot_idx, ch;
    float Cldfb_RealBuffer_Binaural_loc[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
    float Cldfb_ImagBuffer_Binaural_loc[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX];

    /* Perform binaural rendering */
    ivas_binRenderer( hBinRenderer, &hSplitBinRend->splitrend.multiBinPoseData, hCombinedOrientationData, numTimeSlots,
#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG
                      NULL,
#endif
                      Cldfb_ImagBuffer_Binaural_loc, Cldfb_ImagBuffer_Binaural_loc, RealBuffer, ImagBuffer );

    for ( slot_idx = 0; slot_idx < numTimeSlots; slot_idx++ )
    {
        for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
        {
            mvr2r( Cldfb_RealBuffer_Binaural_loc[0][ch][slot_idx], Cldfb_RealBuffer_Binaural[0][ch][slot_idx_start + slot_idx], num_freq_bands );
            mvr2r( Cldfb_ImagBuffer_Binaural_loc[0][ch][slot_idx], Cldfb_ImagBuffer_Binaural[0][ch][slot_idx_start + slot_idx], num_freq_bands );
        }
    }

    for ( pos_idx = 0; pos_idx < hBinRenderer->numPoses; pos_idx++ )
    {
        for ( slot_idx = 0; slot_idx < numTimeSlots; slot_idx++ )
        {
            for ( ch = 0; ch < nchan_out; ch++ )
            {
                mvr2r( Cldfb_RealBuffer_Binaural_loc[pos_idx][ch][slot_idx], hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_idx_start + slot_idx], num_freq_bands );
                mvr2r( Cldfb_ImagBuffer_Binaural_loc[pos_idx][ch][slot_idx], hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_idx_start + slot_idx], num_freq_bands );
            }
        }
    }

    return;
}


static void binRenderer(
    BINAURAL_RENDERER_HANDLE hBinRenderer,                                                                    /* i/o: binaural renderer handle                      */
    COMBINED_ORIENTATION_HANDLE hCombinedOrientationData,                                                     /* i  : combined head and external orientation handle */
    const int16_t numTimeSlots,                                                                               /* i  : number of time slots to render                */
    float Cldfb_RealBuffer_Binaural[][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o  : Rotated Binaural signals                      */
    float Cldfb_ImagBuffer_Binaural[][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o  : Rotated Binaural signals                      */
    float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],                                   /* i  : LS signals                                    */
    float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]                                    /* i  : LS signals                                    */
)
{
    /* Perform binaural rendering */
    ivas_binRenderer( hBinRenderer, NULL, hCombinedOrientationData, numTimeSlots,
#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG
                      NULL,
#endif
                      Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, RealBuffer, ImagBuffer );

    return;
}
#endif

/*-------------------------------------------------------------------------
 * ivas_dirac_dec_render_sf()
@@ -1633,8 +1707,13 @@ void ivas_dirac_dec_render_sf(
    Decoder_Struct *st_ivas,       /* i/o: IVAS decoder structure                                  */
    float *output_f[],             /* i/o: synthesized core-coder transport channels/DirAC output  */
    const int16_t nchan_transport, /* i  : number of transport channels                            */
#ifdef FIX_1319_STACK_SBA_DECODER
    float *pppQMfFrame_ts_re[HOA3_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX],
    float *pppQMfFrame_ts_im[HOA3_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX] )
#else
    float *pppQMfFrame_ts_re[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX],
    float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX] )
#endif
{
    int16_t i, ch, idx_in, idx_lfe;
    DIRAC_DEC_HANDLE hDirAC;
@@ -1648,13 +1727,20 @@ void ivas_dirac_dec_render_sf(
    float *p_Rmat;
    int16_t slot_idx_start, slot_idx_start_cldfb_synth, md_idx;

    /*CLDFB: last output channels reserved to LFT for CICPx*/
    /*CLDFB: last output channels reserved to LFE for CICPx*/
#ifdef FIX_1319_STACK_SBA_DECODER
    float Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
    float Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
    float Cldfb_RealBuffer_Binaural[1][BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
    float Cldfb_ImagBuffer_Binaural[1][BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
#else
    float Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX];
    float Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX];
    float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX];
    float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX];
    float Cldfb_RealBuffer_Temp[2][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
    float Cldfb_ImagBuffer_Temp[2][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
#endif
    int16_t index, num_freq_bands;

    /* local copies of azi, ele, diffuseness */
@@ -1831,17 +1917,29 @@ void ivas_dirac_dec_render_sf(
            /* CLDFB Analysis*/
            for ( ch = 0; ch < nchan_transport; ch++ )
            {
#ifdef FIX_1319_STACK_SBA_DECODER
                cldfbAnalysis_ts( &( st_ivas->hTcBuffer->tc[hDirACRend->sba_map_tc[ch]][hSpatParamRendCom->num_freq_bands * index_slot] ),
                                  Cldfb_RealBuffer_Binaural[0][ch][slot_idx], /* note: it is a tmp. buffer at this point */
                                  Cldfb_ImagBuffer_Binaural[0][ch][slot_idx], /* note: it is a tmp. buffer at this point */
                                  hSpatParamRendCom->num_freq_bands,
                                  st_ivas->cldfbAnaDec[ch] );
#else
                cldfbAnalysis_ts( &( st_ivas->hTcBuffer->tc[hDirACRend->sba_map_tc[ch]][hSpatParamRendCom->num_freq_bands * index_slot] ),
                                  Cldfb_RealBuffer_Temp[ch][slot_idx],
                                  Cldfb_ImagBuffer_Temp[ch][slot_idx],
                                  hSpatParamRendCom->num_freq_bands,
                                  st_ivas->cldfbAnaDec[ch] );
#endif
            }
        }

        if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ )
        {
#ifdef FIX_1319_STACK_SBA_DECODER
            ivas_omasa_preProcessStereoTransportsForEditedObjects( st_ivas, Cldfb_RealBuffer_Binaural[0], Cldfb_ImagBuffer_Binaural[0], hSpatParamRendCom->num_freq_bands, subframe_idx );
#else
            ivas_omasa_preProcessStereoTransportsForEditedObjects( st_ivas, Cldfb_RealBuffer_Temp, Cldfb_ImagBuffer_Temp, hSpatParamRendCom->num_freq_bands, subframe_idx );
#endif
        }
    }

@@ -1868,8 +1966,13 @@ void ivas_dirac_dec_render_sf(
        {
            for ( ch = 0; ch < nchan_transport; ch++ )
            {
#ifdef FIX_1319_STACK_SBA_DECODER
                mvr2r( Cldfb_RealBuffer_Binaural[0][ch][slot_idx], Cldfb_RealBuffer[ch][0], hSpatParamRendCom->num_freq_bands );
                mvr2r( Cldfb_ImagBuffer_Binaural[0][ch][slot_idx], Cldfb_ImagBuffer[ch][0], hSpatParamRendCom->num_freq_bands );
#else
                mvr2r( Cldfb_RealBuffer_Temp[ch][slot_idx], Cldfb_RealBuffer[ch][0], hSpatParamRendCom->num_freq_bands );
                mvr2r( Cldfb_ImagBuffer_Temp[ch][slot_idx], Cldfb_ImagBuffer[ch][0], hSpatParamRendCom->num_freq_bands );
#endif
            }
        }
        else
@@ -2312,6 +2415,20 @@ void ivas_dirac_dec_render_sf(
            }
        }

#ifdef FIX_1319_STACK_SBA_DECODER
        /* Perform binaural rendering */
        if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM )
        {
            binRenderer_split( st_ivas->hBinRenderer, st_ivas->hSplitBinRend, st_ivas->hCombinedOrientationData, hSpatParamRendCom->subframe_nbslots[subframe_idx],
                               Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer, slot_idx_start, hSpatParamRendCom->num_freq_bands, st_ivas->hDecoderConfig->nchan_out );
        }
        else
        {
            binRenderer( st_ivas->hBinRenderer, st_ivas->hCombinedOrientationData, hSpatParamRendCom->subframe_nbslots[subframe_idx],
                         Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer );
        }

#else
        /* Perform binaural rendering */
        ivas_binRenderer( st_ivas->hBinRenderer, ( st_ivas->hSplitBinRend == NULL ) ? NULL : &st_ivas->hSplitBinRend->splitrend.multiBinPoseData, st_ivas->hCombinedOrientationData, hSpatParamRendCom->subframe_nbslots[subframe_idx],
#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG
@@ -2334,13 +2451,19 @@ void ivas_dirac_dec_render_sf(
                }
            }
        }
#endif

        /* Inverse CLDFB*/
        for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ )
        {
            /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */
#ifdef FIX_1319_STACK_SBA_DECODER
            float *RealBuffer[CLDFB_SLOTS_PER_SUBFRAME];
            float *ImagBuffer[CLDFB_SLOTS_PER_SUBFRAME];
#else
            float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES];
            float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES];
#endif

            for ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ )
            {
@@ -2364,8 +2487,13 @@ void ivas_dirac_dec_render_sf(
    }
    else
    {
#ifdef FIX_1319_STACK_SBA_DECODER
        float *RealBuffer[CLDFB_SLOTS_PER_SUBFRAME];
        float *ImagBuffer[CLDFB_SLOTS_PER_SUBFRAME];
#else
        float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES];
        float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES];
#endif
        int16_t outchannels;

        idx_in = 0;
+17 −0
Original line number Diff line number Diff line
@@ -1367,15 +1367,28 @@ void ivas_spar_dec_upmixer_sf(
)
{
    int16_t cldfb_band, num_cldfb_bands, numch_in, numch_out;
#ifdef FIX_1319_STACK_SBA_DECODER
    float *cldfb_in_ts_re[HOA3_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX];
    float *cldfb_in_ts_im[HOA3_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX];
#else
    float *cldfb_in_ts_re[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX];
    float *cldfb_in_ts_im[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX];
#endif
    int16_t i, b, ts, out_ch, in_ch;
    int16_t num_spar_bands, spar_band, nchan_transport;
    int16_t num_in_ingest, split_band;
    int16_t slot_size, slot_idx_start;
#ifdef FIX_1319_STACK_SBA_DECODER
    float *p_tc[MAX_INTERN_CHANNELS];
#else
    float *p_tc[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS];
#endif
    int16_t md_idx;
#ifdef FIX_1319_STACK_SBA_DECODER
    float Pcm_tmp[MAX_INTERN_CHANNELS][2 /* Re, Im*/ * L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES];
#else
    float Pcm_tmp[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k];
#endif
    int16_t numch_out_dirac;
    float mixer_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS];
    int16_t b_skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
@@ -1490,7 +1503,11 @@ void ivas_spar_dec_upmixer_sf(
    if ( hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_FOA )
    {
        /* at this point, output channels are used as intermediate procesing buffers */
#ifdef FIX_1319_STACK_SBA_DECODER
        for ( in_ch = 0; in_ch < MAX_INTERN_CHANNELS; in_ch++ )
#else
        for ( in_ch = 0; in_ch < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; in_ch++ )
#endif
        {
            for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ )
            {