Commit a04d8361 authored by vaclav's avatar vaclav
Browse files

Merge branch '1957-ref-PortFlpMr2106' into 'ivas-float-update'

Port MR2106 from float to FLP-ref

See merge request !2153
parents b38b8c6f 5711b3de
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -3728,8 +3728,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][CLDFB_NO_COL_MAX],
    float *pppQMfFrame_ts_im[HOA3_CHANNELS][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 −1
Original line number Diff line number Diff line
@@ -160,7 +160,7 @@
#define NONBE_1244_FIX_SWB_BWE_MEMORY                   /* VA: issue 1244: fix to SWB BWE memory in case of switching from FB coding - pending a review by Huawei */
#define FIX_1113_CLDFB_REND_IN_ISAR                     /* issue 1113: fix the use of CLDFB renderer in split-rendering at the external renderer */
#define NONBE_1328_FIX_NON_LINEARITY                    /* VA: Fix possible issue when computing bwe_exc_extended and previous frame were almost 0  */
#define SIMPLIFY_IVAS_CORE                              /* VA: simplify ivas core coder functions */
#define FIX_1319_STACK_SBA_DECODER                      /* VA: issue 1319: Optimize the definition of buffer lengths in the SBA decoder */

/* #################### End BASOP porting switches ############################ */

+0 −4
Original line number Diff line number Diff line
@@ -678,11 +678,7 @@ ivas_error core_switching_post_dec(
                    synth[i + delay_comp] = ( synth[i + delay_comp] * i + ( tmpDelta - i ) * st->previoussynth[i + delay_comp] ) / tmpDelta;
                }

#ifdef SIMPLIFY_IVAS_CORE
                if ( ( st->element_mode == IVAS_CPE_MDCT || ( st->is_ism_format && st->core == TCX_20_CORE /* <- means TCX in general, TCX10 is forbidden after ACELP */ ) ) && st->last_core_brate <= SID_2k40 && st->core_brate > SID_2k40 )
#else
                if ( ( st->element_mode == IVAS_CPE_MDCT || ( ivas_format == ISM_FORMAT && st->core == TCX_20_CORE /* <- means TCX in general, TCX10 is forbidden after ACELP */ ) ) && st->last_core_brate <= SID_2k40 && st->core_brate > SID_2k40 )
#endif
                {
                    /* smooth transitions to avoid pops in car noise items */
                    smoothTransitionDtxToTcx( synth, output_frame, delay_comp );
+132 −1
Original line number Diff line number Diff line
@@ -1621,6 +1621,82 @@ void ivas_dirac_dec_render(
}


#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_RealBuffer_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], num_freq_bands );
            mvr2r( Cldfb_ImagBuffer_Binaural_loc[0][ch][slot_idx], Cldfb_ImagBuffer_Binaural[0][ch][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()
 *
@@ -1631,8 +1707,14 @@ 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][CLDFB_NO_COL_MAX],
    float *pppQMfFrame_ts_im[HOA3_CHANNELS][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] )
    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;
@@ -1647,12 +1729,19 @@ void ivas_dirac_dec_render_sf(
    int16_t slot_idx_start, slot_idx_start_cldfb_synth, md_idx;

    /*CLDFB: last output channels reserved to LFT 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 */
@@ -1829,17 +1918,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_DISC && st_ivas->ism_mode != ISM_MASA_MODE_MASA_ONE_OBJ )
        {
#ifdef FIX_1319_STACK_SBA_DECODER
            ivas_omasa_preProcessStereoTransportsForMovedObjects( st_ivas, Cldfb_RealBuffer_Binaural[0], Cldfb_ImagBuffer_Binaural[0], hSpatParamRendCom->num_freq_bands, subframe_idx );
#else
            ivas_omasa_preProcessStereoTransportsForMovedObjects( st_ivas, Cldfb_RealBuffer_Temp, Cldfb_ImagBuffer_Temp, hSpatParamRendCom->num_freq_bands, subframe_idx );
#endif
        }
    }

@@ -1866,8 +1967,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
@@ -2309,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],
@@ -2331,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++ )
            {
@@ -2361,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
@@ -1376,15 +1376,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][CLDFB_NO_COL_MAX];
    float *cldfb_in_ts_im[HOA3_CHANNELS][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[HOA3_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[HOA3_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];
@@ -1499,7 +1512,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 < HOA3_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++ )
            {
Loading