Commit 0f943250 authored by Jan Kiene's avatar Jan Kiene
Browse files

port MR 1373 from float

fixes for ME encoder crashing with br and bw switching
parent 109c1d8b
Loading
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -206,7 +206,8 @@

#define NONBE_FIX_979_OSBA_STEREO_5MS                    /* FhG : issue #979 : 5ms and 20ms output different for OSBA and stereo */
#define FIX_983_DISC_ISM_DIGEST_NUM_OBJS                 /* FhG: issue #983: the discrete ISM digest function uses the wrong number of objects */

#define FIX_ACCESS_WITHIN_NULL_STRUCT_MC_BW_SWITCHING   /* FhG: fix usan error in MCT with bw swicthing */
#define NONBE_FIX_986_MC_BW_SWITCHING                         /* FhG: fix crash in bw and br switching with MC */

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

+21 −0
Original line number Diff line number Diff line
@@ -713,6 +713,26 @@ int16_t set_bw_mct(
    }

    bw_changed = 0;
#ifdef NONBE_FIX_986_MC_BW_SWITCHING
    if ( mct_bwidth != last_mct_bwidth )
    {
        bw_changed = 1;
    }

    /*
     * always set bw for all CPEs even if it is the same value as before,
     * in case of bw + br switching when changing to MCT, this overwrites
     * potentially incorrect initial values
     */
    for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
    {
        for ( ch = 0; ch < CPE_CHANNELS; ch++ )
        {
            st = hCPE[cpe_id]->hCoreCoder[ch];
            st->bwidth = mct_bwidth;
        }
    }
#else
    if ( mct_bwidth != last_mct_bwidth )
    {
        bw_changed = 1;
@@ -726,6 +746,7 @@ int16_t set_bw_mct(
            }
        }
    }
#endif

    return bw_changed;
}
+8 −0
Original line number Diff line number Diff line
@@ -578,7 +578,15 @@ ivas_error ivas_cpe_enc(
        if ( ( hCPE->last_element_brate != hCPE->element_brate || hCPE->element_mode != hCPE->last_element_mode || ( hCPE->element_mode == IVAS_CPE_TD && sts[0]->bits_frame_nominal != last_bits_frame_nominal ) || sts[n]->last_bwidth != sts[n]->bwidth ) && ( n == 0 || hCPE->element_mode == IVAS_CPE_MDCT ) )
        {
            int16_t igf;

#ifdef NONBE_FIX_986_MC_BW_SWITCHING
            int16_t bw;

            bw = ( hCPE->element_mode == IVAS_CPE_MDCT ) ? sts[n]->bwidth : sts[n]->max_bwidth;
            igf = getIgfPresent( sts[n]->element_mode, sts[n]->bits_frame_nominal * FRAMES_PER_SEC, bw, sts[n]->rf_mode );
#else
            igf = getIgfPresent( sts[n]->element_mode, sts[n]->bits_frame_nominal * FRAMES_PER_SEC, sts[n]->max_bwidth, sts[n]->rf_mode );
#endif
            if ( ( error = IGF_Reconfig( &sts[n]->hIGFEnc, igf, 0, sts[n]->bits_frame_nominal * FRAMES_PER_SEC, sts[n]->max_bwidth, sts[n]->element_mode, sts[n]->rf_mode ) ) != IVAS_ERR_OK )
            {
                return error;
+8 −2
Original line number Diff line number Diff line
@@ -279,8 +279,14 @@ void ivas_mct_core_enc(

        if ( switch_bw )
        {
            initMdctStereoEncData( hMCT->hBlockData[ch]->hStereoMdct, ivas_format, sts[ch_core]->element_mode, sts[ch_core]->element_brate, sts[ch_core]->bwidth,
                                   sts[ch_core]->igf, sts[ch_core]->hIGFEnc->igfData.igfInfo.grid, 0 );
#ifdef FIX_ACCESS_WITHIN_NULL_STRUCT_MC_BW_SWITCHING
            H_IGF_GRID igf_grid;

            igf_grid = sts[ch_core]->igf ? sts[ch_core]->hIGFEnc->igfData.igfInfo.grid : NULL;
            initMdctStereoEncData( hMCT->hBlockData[ch]->hStereoMdct, ivas_format, sts[ch_core]->element_mode, sts[ch_core]->element_brate, sts[ch_core]->bwidth, sts[ch_core]->igf, igf_grid, 0 );
#else
            initMdctStereoEncData( hMCT->hBlockData[ch]->hStereoMdct, ivas_format, sts[ch_core]->element_mode, sts[ch_core]->element_brate, sts[ch_core]->bwidth, sts[ch_core]->igf, sts[ch_core]->hIGFEnc->igfData.igfInfo.grid, 0 );
#endif
        }

        if ( sts[ch_core]->igf )
+8 −0
Original line number Diff line number Diff line
@@ -172,7 +172,9 @@ ivas_error ivas_mct_enc(
    float orig_spectrum_long[MCT_MAX_BLOCKS][CPE_CHANNELS][L_FRAME48k];
    int16_t switch_bw;
    IVAS_FORMAT ivas_format;
#ifndef NONBE_FIX_986_MC_BW_SWITCHING
    int16_t max_bwidth;
#endif
    int32_t ivas_total_brate;
    ivas_error error;
    float *pdata[MAX_INPUT_CHANNELS];
@@ -186,7 +188,9 @@ ivas_error ivas_mct_enc(
    hMCT->hBstr = st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; /* pointer to write MCT side bits */

    ivas_format = st_ivas->hEncoderConfig->ivas_format;
#ifndef NONBE_FIX_986_MC_BW_SWITCHING
    max_bwidth = st_ivas->hEncoderConfig->max_bwidth;
#endif
    ivas_total_brate = st_ivas->hEncoderConfig->ivas_total_brate;

#ifdef DEBUG_FORCE_MCT_CP
@@ -230,7 +234,11 @@ ivas_error ivas_mct_enc(

        for ( n = 0; n < (int16_t) ( hMCT->nchan_out_woLFE * 0.5 ); n++ )
        {
#ifdef NONBE_FIX_986_MC_BW_SWITCHING
            initMdctStereoEncData( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, st_ivas->hCPE[0]->hCoreCoder[0]->bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->igf ? st_ivas->hCPE[0]->hCoreCoder[0]->hIGFEnc->igfData.igfInfo.grid : NULL, 0 );
#else
            initMdctStereoEncData( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, max_bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->igf ? st_ivas->hCPE[0]->hCoreCoder[0]->hIGFEnc->igfData.igfInfo.grid : NULL, 0 );
#endif
        }
    }