diff --git a/lib_com/options.h b/lib_com/options.h index 47515333dcc4f0e4003436e6100d112ef88082f1..ab6123579b877b0c0e5bb15de2abc4a839400125 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -72,6 +72,11 @@ #define NON_BE_FIX_1048_THRESHOLD_COH_BASOP /* Nokia: Fix 1048 replace comparison with 0 with comparison to threshold, to align with BASOP*/ #define NONBE_FIX_1054_NEGATIVE_LVQ_INDEX /* Nokia: issue 1054: Input to decode_comb in deindex_lvq_SHB should be positive */ +#define FIX_1033_MEMORY_LEAK_OMASA /* Nokia / Orange: issue #1033: Memory leak in OMASA to BINAURAL with HRTF with bitrate switching */ +#define FIX_976_USAN_PVQ_ENC_DEC_EVS_CR /* Ericsson: premature cast to unsigned detected by USAN corrected */ +#define FIX_1027_GSC_INT_OVERFLOW /* VA: issue 2207: overflow in GSC */ +#define NONBE_FIX_1096_NAN_VALUES_IN_DIRAC_TO_STEREO /* FhG: avoid sidegain DFT-Stereo param to be larger than 1 when converting from Dirac parameters */ +#define NON_BE_1055_RESET_LP_MEMORIES /* VA: issue 1055: Correctly reset LP filter MA and AR memories in bitrate switching */ /* #################### End FIXES switches ############################ */ diff --git a/lib_dec/amr_wb_dec_fx.c b/lib_dec/amr_wb_dec_fx.c index 53d5fc20fc3ebcc0078b39054bad538d919d6ecb..616b760937d89250b0b8b6df7da66e7b1335b901 100644 --- a/lib_dec/amr_wb_dec_fx.c +++ b/lib_dec/amr_wb_dec_fx.c @@ -763,7 +763,7 @@ ivas_error amr_wb_dec_fx( st_fx->hPFstat->on = 1; move16(); test(); - formant_post_filt_fx( st_fx->hPFstat, tmp_buffer_fx + L_SYN_MEM, Aq_fx, syn_fx, L_FRAME, L_shl( st_fx->psf_lp_noise_fx, 15 ), st_fx->total_brate, EQ_16( sub( amr_io_class, AUDIO_CLAS ), 0 ) ); + formant_post_filt_fx( st_fx->hPFstat, tmp_buffer_fx + L_SYN_MEM, Aq_fx, syn_fx, L_FRAME, L_shl( st_fx->psf_lp_noise_fx, 15 ), st_fx->total_brate, (Word16) EQ_16( sub( amr_io_class, AUDIO_CLAS ), 0 ) ); } /*----------------------------------------------------------------* diff --git a/lib_dec/gs_dec.c b/lib_dec/gs_dec.c index 010aad694bce65a61716783d8e685bb998b73038..dccecfe0c0624ec3e1f05dc2c261784f68eca130 100644 --- a/lib_dec/gs_dec.c +++ b/lib_dec/gs_dec.c @@ -639,7 +639,11 @@ void gsc_dec( } if ( concat_out[j] < 0 ) { +#ifdef FIX_1027_GSC_INT_OVERFLOW + seed_init = (int16_t) ( (int32_t) seed_init + 3 ); +#else seed_init += 3; +#endif } } diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 31976aae0a25af14542ef3d7475cf9116b8235ed..8e4d8f4b17e1a61aa8d4b0b6725d981b7ffb2ee8 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1920,8 +1920,15 @@ static ivas_error ivas_mc_dec_reconfig_fx( IF( st_ivas->hBinRendererTd != NULL && ( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) ) ) { - ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); - st_ivas->hHrtfTD = NULL; +#ifdef FIX_1033_MEMORY_LEAK_OMASA + if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) + { +#endif + ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); + st_ivas->hHrtfTD = NULL; +#ifdef FIX_1033_MEMORY_LEAK_OMASA + } +#endif } IF( st_ivas->hDiracDecBin != NULL ) @@ -2548,8 +2555,15 @@ static ivas_error ivas_mc_dec_reconfig( if ( st_ivas->hBinRendererTd != NULL && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD ) ) { - ivas_td_binaural_close( &st_ivas->hBinRendererTd ); - st_ivas->hHrtfTD = NULL; +#ifdef FIX_1033_MEMORY_LEAK_OMASA + if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) + { +#endif + ivas_td_binaural_close( &st_ivas->hBinRendererTd ); + st_ivas->hHrtfTD = NULL; +#ifdef FIX_1033_MEMORY_LEAK_OMASA + } +#endif } if ( st_ivas->hDiracDecBin != NULL ) diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 0e709625dae461c7d0a6c1b3bab79dab3d5ed02b..d3b2595a0ade9c55469be22279ce4fc56ebe5a05 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -457,10 +457,17 @@ ivas_error ivas_omasa_dec_config_fx( IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) { /* Allocate TD renderer for the objects in DISC mode */ - IF( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, num_src ) ) != IVAS_ERR_OK ) +#ifdef FIX_1033_MEMORY_LEAK_OMASA + IF( st_ivas->hBinRendererTd == NULL ) { - return error; +#endif + IF( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, num_src ) ) != IVAS_ERR_OK ) + { + return error; + } +#ifdef FIX_1033_MEMORY_LEAK_OMASA } +#endif /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ IF( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) @@ -471,9 +478,16 @@ ivas_error ivas_omasa_dec_config_fx( ELSE { /* TD renderer handle */ - ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); +#ifdef FIX_1033_MEMORY_LEAK_OMASA + IF( st_ivas->hBinRendererTd != NULL && st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) + { +#endif + ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); - st_ivas->hHrtfTD = NULL; + st_ivas->hHrtfTD = NULL; +#ifdef FIX_1033_MEMORY_LEAK_OMASA + } +#endif /* ISM renderer handle + ISM data handle */ ivas_omasa_separate_object_renderer_close( st_ivas ); @@ -707,11 +721,18 @@ ivas_error ivas_omasa_dec_config( { if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) { - /* Allocate TD renderer for the objects in DISC mode */ - if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) +#ifdef FIX_1033_MEMORY_LEAK_OMASA + if ( st_ivas->hBinRendererTd == NULL ) { - return error; +#endif + /* Allocate TD renderer for the objects in DISC mode */ + if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } +#ifdef FIX_1033_MEMORY_LEAK_OMASA } +#endif /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ if ( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) @@ -722,8 +743,15 @@ ivas_error ivas_omasa_dec_config( else { /* TD renderer handle */ - ivas_td_binaural_close( &st_ivas->hBinRendererTd ); - st_ivas->hHrtfTD = NULL; +#ifdef FIX_1033_MEMORY_LEAK_OMASA + if ( st_ivas->hBinRendererTd != NULL && st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) + { +#endif + ivas_td_binaural_close( &st_ivas->hBinRendererTd ); + st_ivas->hHrtfTD = NULL; +#ifdef FIX_1033_MEMORY_LEAK_OMASA + } +#endif /* ISM renderer handle + ISM data handle */ ivas_omasa_separate_object_renderer_close( st_ivas ); diff --git a/lib_dec/ivas_sba_dirac_stereo_dec.c b/lib_dec/ivas_sba_dirac_stereo_dec.c index c869afb080971cd4545b62a3897c7a4b18effc0f..4e669a80347637705c3944e59b54fcfbdd4f2e47 100644 --- a/lib_dec/ivas_sba_dirac_stereo_dec.c +++ b/lib_dec/ivas_sba_dirac_stereo_dec.c @@ -386,10 +386,23 @@ static void map_params_dirac_to_stereo( } } +#ifdef NONBE_FIX_1096_NAN_VALUES_IN_DIRAC_TO_STEREO + /* Clamp values here. [-1, 1] is the allowed range, but due to precision issues they can be slightly off which can cause problems later. */ side_gain[b] *= sqrtf( 1.f - diffuseness[b] ); + side_gain[b] = max( min( side_gain[b], 1 ), -1 ); side_gain[b + STEREO_DFT_BAND_MAX] *= sqrtf( 1.f - diffuseness[b] ); + side_gain[b + STEREO_DFT_BAND_MAX] = max( min( side_gain[b + STEREO_DFT_BAND_MAX], 1 ), -1 ); + /* for residual prediction gain, allowed range is [0, 1]*/ res_pred_gain[b] = diffuseness[b] * ( 1.0f - surrCoh[b] ); + res_pred_gain[b] = max( min( res_pred_gain[b], 1 ), 0 ); res_pred_gain[b + STEREO_DFT_BAND_MAX] = diffuseness[b] * ( 1.0f - surrCoh[b] ); + res_pred_gain[b + STEREO_DFT_BAND_MAX] = max( min( res_pred_gain[b + STEREO_DFT_BAND_MAX], 1 ), 0 ); +#else + side_gain[b] *= sqrtf( 1.f - diffuseness[b] ); + side_gain[b + STEREO_DFT_BAND_MAX] *= sqrtf( 1.f - diffuseness[b] ); + res_pred_gain[b] = diffuseness[b] * ( 1.0f - surrCoh[b] ); + res_pred_gain[b + STEREO_DFT_BAND_MAX] = diffuseness[b] * ( 1.0f - surrCoh[b] ); +#endif } } diff --git a/lib_dec/pvq_core_dec.c b/lib_dec/pvq_core_dec.c index 9d09d7572fe366bce89c23add141c16fb10dc1dd..6333fd52db795093a0381bb7d345e78566364601 100644 --- a/lib_dec/pvq_core_dec.c +++ b/lib_dec/pvq_core_dec.c @@ -109,8 +109,17 @@ static void pvq_decode_band( for ( j = 0; j < Np; j++ ) { +#ifdef FIX_976_USAN_PVQ_ENC_DEC_EVS_CR g_part[j] = -( (float) g_part_s[j] ) / 32768; + /* note: here g_part needs to be become exactly 1.0(float) thus in BASOP Word16 g_part_s is in the negative Q15 domain */ +#endif + +#ifdef FIX_976_USAN_PVQ_ENC_DEC_EVS_CR + /* aligned to BASOP to avoid USAN undefined negation warning for -(-32768) */ + g_part_s[j] = negate( g_part_s[j] ); +#else g_part_s[j] = -g_part_s[j]; +#endif } srt_vec_ind( g_part_s, sg_part, idx_sort, Np ); @@ -416,7 +425,11 @@ static void densitySymbolIndexDecode( { tot = res * ( res + 1 ) + 1; dec_freq = rc_decode( &st->BER_detect, hPVQ, tot ); +#ifdef FIX_976_USAN_PVQ_ENC_DEC_EVS_CR + alpha = (int16_t) floor_sqrt_exact( (uint32_t) ( ( res + 1 ) * ( res + 1 ) - dec_freq ) ) + res + 1; +#else alpha = (int16_t) floor_sqrt_exact( (uint32_t) ( res + 1 ) * ( res + 1 ) - dec_freq ) + res + 1; +#endif sym_freq = 2 * ( res - alpha ) + 1; cum_freq = alpha * ( 2 * ( res + 1 ) - alpha ); } @@ -434,7 +447,11 @@ static void densitySymbolIndexDecode( dec_freq = rc_decode( &st->BER_detect, hPVQ, tot ); if ( dec_freq < tot - ( res + 1 ) - ( res - ( c + 1 ) ) * ( res - c ) * c + c + 1 ) { +#ifdef FIX_976_USAN_PVQ_ENC_DEC_EVS_CR + alpha = ( res_c - 1 + (int16_t) floor_sqrt_exact( (uint32_t) ( res_c * ( res_c + 4 * dec_freq - 2 ) + 1 ) ) ) / ( 2 * res_c ); +#else alpha = ( res_c - 1 + (int16_t) floor_sqrt_exact( (uint32_t) res_c * ( res_c + 4 * dec_freq - 2 ) + 1 ) ) / ( 2 * res_c ); +#endif sym_freq = 2 * alpha * res_c + 1; cum_freq = alpha * ( ( alpha - 1 ) * res_c + 1 ); } diff --git a/lib_dec/updt_dec.c b/lib_dec/updt_dec.c index fafad2f8571a9b277c282fdd572c1039c7fe3b8c..70c049e0f67b40f33cb74c4dd5169c264afba23a 100644 --- a/lib_dec/updt_dec.c +++ b/lib_dec/updt_dec.c @@ -518,7 +518,11 @@ void updt_dec_common( st->stab_fac_smooth_lt = ENV_SMOOTH_FAC * st->stab_fac + ( 1.0f - ENV_SMOOTH_FAC ) * st->stab_fac_smooth_lt; } +#ifdef NON_BE_1055_RESET_LP_MEMORIES + if ( ( st->core_brate <= SID_2k40 && st->cng_type == FD_CNG ) || ( st->tcxonly && ( st->codec_mode == MODE2 || st->element_mode > EVS_MONO ) ) ) +#else if ( ( st->core_brate <= SID_2k40 && st->cng_type == FD_CNG ) || ( st->tcxonly && st->codec_mode == MODE2 ) ) +#endif { /* reset LP memories */ set_zero( st->mem_MA, M ); diff --git a/lib_dec/updt_dec_fx.c b/lib_dec/updt_dec_fx.c index 1f018a2435792d8d9a8688c8ab11c8868733e5b4..fb846b91a9f6da889416b36ae7d7bf12a32201b1 100644 --- a/lib_dec/updt_dec_fx.c +++ b/lib_dec/updt_dec_fx.c @@ -983,7 +983,11 @@ void ivas_updt_dec_common_fx( L_mult( sub( MAX_16, ENV_SMOOTH_FAC_FX ), st_fx->stab_fac_smooth_lt_fx ) ) ); } #endif +#ifdef NON_BE_1055_RESET_LP_MEMORIES + IF( ( LE_32( st_fx->core_brate, SID_2k40 ) && EQ_16( st_fx->cng_type, FD_CNG ) ) || ( st_fx->tcxonly && ( EQ_16( st_fx->codec_mode, MODE2 ) || GT_16( st_fx->element_mode, EVS_MONO ) ) ) ) +#else IF( ( ( LE_32( st_fx->core_brate, SID_2k40 ) ) && EQ_16( st_fx->cng_type, FD_CNG ) ) || ( st_fx->tcxonly && EQ_16( st_fx->codec_mode, MODE2 ) ) ) +#endif { /* reset LP memories */ diff --git a/lib_enc/core_enc_updt.c b/lib_enc/core_enc_updt.c index 26342fc329d4831a7f500c4d0a13f0287809e84e..bfd845b496e4c8bb1cb495119a53845f29ff5fb9 100644 --- a/lib_enc/core_enc_updt.c +++ b/lib_enc/core_enc_updt.c @@ -89,7 +89,11 @@ void core_encode_update( } } +#ifdef NON_BE_1055_RESET_LP_MEMORIES + if ( ( st->Opt_DTX_ON && st->core_brate <= SID_2k40 && st->cng_type == FD_CNG ) || ( st->tcxonly && ( st->codec_mode == MODE2 || st->element_mode > EVS_MONO ) ) ) +#else if ( ( st->Opt_DTX_ON && st->core_brate <= SID_2k40 && st->cng_type == FD_CNG ) || ( st->tcxonly && st->codec_mode == MODE2 ) ) +#endif { /* reset LP memories */ set_zero( st->mem_MA, M ); diff --git a/lib_enc/gs_enc.c b/lib_enc/gs_enc.c index 6071f294b08c8d10722efa295f80babaa20928cf..309c56a366054badfb5f3b4ac988b3f7ebefa63b 100644 --- a/lib_enc/gs_enc.c +++ b/lib_enc/gs_enc.c @@ -542,7 +542,11 @@ void gsc_enc( } if ( concat_out[j] < 0 ) { +#ifdef FIX_1027_GSC_INT_OVERFLOW + seed_init = (int16_t) ( (int32_t) seed_init + 3 ); +#else seed_init += 3; +#endif } } diff --git a/lib_enc/pvq_core_enc.c b/lib_enc/pvq_core_enc.c index 6f7375149a2565934d8dea925aa54ed625873c64..a22a68cce526bda8c4573ebccd7139deecedb24f 100644 --- a/lib_enc/pvq_core_enc.c +++ b/lib_enc/pvq_core_enc.c @@ -121,7 +121,12 @@ static void pvq_encode_band( for ( j = 0; j < Np; j++ ) { g_part[j] = -( (float) g_part_s[j] ) / 32768; +#ifdef FIX_976_USAN_PVQ_ENC_DEC_EVS_CR + /* aligned to BASOP to avoid USAN undefined negation warning with -(-32768) */ + g_part_s[j] = negate( g_part_s[j] ); +#else g_part_s[j] = -g_part_s[j]; +#endif } srt_vec_ind( g_part_s, sg_part, idx_sort, Np );