diff --git a/lib_com/options.h b/lib_com/options.h index 2f69d62f4bc414e3e2c550b3948ec4f316579996..1f0645be921d9b89cd8825fe1364df01c4d4d2cf 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -178,6 +178,7 @@ #define NONBE_FIX_760_COHERENCE_MASA /* Nokia: Issue 760: fixes decoder crash for some cases when all energy ratios are 1 */ #define NONBE_FIX_752_OSBA_MISCONFIG_MCT /* FhG: issue 752: misconfiguration of MCT causes crashes for coding with sampling rate under 48kHz at 256kbps*/ #define NONBE_FIX_780_ISM_STARTS_WITH_SID /* VA: issue 780: fix Crash in ISM decoding when bitstream starts with an SID and output_config is not EXT */ +#define NONBE_FIX_ISM_DTX_INFINITE_CNG_ON_TRAILING_SILENCE /* FhG: fix for cng in ISM DTX on sudden silence periods - JBM addon (issue 552) */ /* ##################### End NON-BE switches ############################# */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 586c4838bb831a3d3aa16662bdd636c0f6da3a02..15164e5a18a1199740570d6e8238a31fe57c052a 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -149,6 +149,16 @@ ivas_error ivas_jbm_dec_tc( { return error; } +#ifdef NONBE_FIX_ISM_DTX_INFINITE_CNG_ON_TRAILING_SILENCE + + /* decode dominant object first so the noise energy of the other objects can be limited */ + if ( ( error = ivas_sce_dec( st_ivas, st_ivas->hISMDTX.sce_id_dtx, &output[st_ivas->hISMDTX.sce_id_dtx], output_frame, nb_bits_metadata[st_ivas->hISMDTX.sce_id_dtx] ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_ism_dtx_limit_noise_energy_for_near_silence( st_ivas->hSCE, st_ivas->hISMDTX.sce_id_dtx, st_ivas->nchan_transport ); +#endif } else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { @@ -169,10 +179,21 @@ ivas_error ivas_jbm_dec_tc( for ( n = 0; n < st_ivas->nchan_transport; n++ ) { +#ifdef NONBE_FIX_ISM_DTX_INFINITE_CNG_ON_TRAILING_SILENCE + /* for DTX frames, dominant object has already been decoded before */ + if ( !( ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) && n == st_ivas->hISMDTX.sce_id_dtx ) ) + { + if ( ( error = ivas_sce_dec( st_ivas, n, &output[n], output_frame, nb_bits_metadata[n] ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#else if ( ( error = ivas_sce_dec( st_ivas, n, &output[n], output_frame, nb_bits_metadata[n] ) ) != IVAS_ERR_OK ) { return error; } +#endif /* HP filtering */ hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs );