From 248340094b94b6f34781b66c563b454c38d5a36c Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Wed, 20 Aug 2025 08:54:36 -0400 Subject: [PATCH 1/2] adding MR2133 to correct flt issue #1328 --- lib_com/options.h | 2 ++ lib_com/prot.h | 4 ++++ lib_com/swb_tbe_com.c | 30 +++++++++++++++++++++++++++--- lib_dec/acelp_core_dec.c | 7 ++++++- lib_dec/dec_acelp_tcx_main.c | 7 ++++++- lib_enc/acelp_core_enc.c | 7 ++++++- lib_enc/enc_acelp_tcx_main.c | 7 ++++++- 7 files changed, 57 insertions(+), 7 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 9077fa821..d273a2fe7 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -208,6 +208,8 @@ #define NONBE_FIX_1337_MISSING_DIRECTIVITY_DISTATT_EXTREND /* Eri: issue 1337: Missing directivity setting and distance attenuation in external renderer IVAS_rend */ #define FIX_1348_OVERFLOW /* FhG: fix BASOP overflow in hq_lr_dec(), brings floating-point code inline with FX */ +#define NONBE_1328_FIX_NON_LINEARITY /* VA: Fix possible issue when computing bwe_exc_extended and previous frame were almost 0 */ + /* #################### End BASOP porting switches ############################ */ /* clang-format on */ diff --git a/lib_com/prot.h b/lib_com/prot.h index 5afa0a595..7047d5157 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -2638,6 +2638,10 @@ void non_linearity( const int16_t coder_type, /* i : Coder Type */ const float *voice_factors, /* i : Voice Factors */ const int16_t L_frame /* i : ACELP frame length */ +#ifdef NONBE_1328_FIX_NON_LINEARITY + , + const int16_t element_mode /* i : element_mode to differentiate EVS and IVAS */ +#endif ); void interp_code_5over2( diff --git a/lib_com/swb_tbe_com.c b/lib_com/swb_tbe_com.c index a8d88c2b0..ed06e5763 100644 --- a/lib_com/swb_tbe_com.c +++ b/lib_com/swb_tbe_com.c @@ -1353,6 +1353,10 @@ void non_linearity( const int16_t coder_type, /* i : Coder Type */ const float *voice_factors, /* i : Voice Factors */ const int16_t L_frame /* i : ACELP frame length */ +#ifdef NONBE_1328_FIX_NON_LINEARITY + , + const int16_t element_mode /* i : element_mode to differentiate EVS and IVAS */ +#endif ) { int16_t i, j; @@ -1365,7 +1369,9 @@ void non_linearity( int16_t en_abs = 0; float v_fac = 0, ths; int16_t nframes; - +#ifdef NONBE_1328_FIX_NON_LINEARITY + float sc_factor; +#endif if ( L_frame == L_FRAME16k ) { nframes = 5; @@ -1410,8 +1416,17 @@ void non_linearity( scale = 0.67f; } - +#ifdef NONBE_1328_FIX_NON_LINEARITY + sc_factor = 1024.0f; + if ( element_mode > EVS_MONO ) + { + sc_factor = (float) ( 1 << max( 13 - norm_s( j + 1 ), 0 ) ); /* Adapt the scaling factor allowed depending of max position */ + sc_factor = max( sc_factor, 2.0f ); + } + if ( *prev_scale <= 0.0 || *prev_scale > sc_factor * scale ) +#else if ( *prev_scale <= 0.0 || *prev_scale > 1024.0f * scale ) +#endif { scale_step = 1.0; *prev_scale = scale; @@ -1468,8 +1483,17 @@ void non_linearity( scale = 0.67f; } - +#ifdef NONBE_1328_FIX_NON_LINEARITY + sc_factor = 1024.0f; + if ( element_mode > EVS_MONO ) + { + sc_factor = (float) ( 1 << max( 12 - norm_s( j - length / 2 + 1 ), 0 ) ); /* allowed intra frame jump is smaller */ + sc_factor = max( sc_factor, 2.0f ); + } + if ( *prev_scale <= 0.0 || *prev_scale > sc_factor * scale ) +#else if ( *prev_scale <= 0.0 || *prev_scale > 1024.0f * scale ) +#endif { scale_step = 1.0; *prev_scale = scale; diff --git a/lib_dec/acelp_core_dec.c b/lib_dec/acelp_core_dec.c index 9d29df201..fa9244557 100644 --- a/lib_dec/acelp_core_dec.c +++ b/lib_dec/acelp_core_dec.c @@ -1442,7 +1442,12 @@ ivas_error acelp_core_dec( if ( !st->ppp_mode_dec && ( st->idchan == 0 || st->element_mode != IVAS_CPE_TD || ( st->idchan == 1 && st->element_mode == IVAS_CPE_TD && st->tdm_LRTD_flag ) ) ) { - non_linearity( bwe_exc, bwe_exc_extended, st->hBWE_TD->old_bwe_exc_extended, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale, st->coder_type, voice_factors, st->L_frame ); + non_linearity( bwe_exc, bwe_exc_extended, st->hBWE_TD->old_bwe_exc_extended, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale, st->coder_type, voice_factors, st->L_frame +#ifdef NONBE_1328_FIX_NON_LINEARITY + , + st->element_mode +#endif + ); } if ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) diff --git a/lib_dec/dec_acelp_tcx_main.c b/lib_dec/dec_acelp_tcx_main.c index 4689bdb79..431868b80 100644 --- a/lib_dec/dec_acelp_tcx_main.c +++ b/lib_dec/dec_acelp_tcx_main.c @@ -425,7 +425,12 @@ void dec_acelp_tcx_frame( if ( st->core == ACELP_CORE && st->igf && st->con_tcx == 0 ) { - non_linearity( ptr_bwe_exc, bwe_exc_extended, st->hBWE_TD->old_bwe_exc_extended, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale, st->coder_type, voice_factors, st->L_frame ); + non_linearity( ptr_bwe_exc, bwe_exc_extended, st->hBWE_TD->old_bwe_exc_extended, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale, st->coder_type, voice_factors, st->L_frame +#ifdef NONBE_1328_FIX_NON_LINEARITY + , + st->element_mode +#endif + ); /* update the old BWE exe memory */ mvr2r( &old_bwe_exc[L_FRAME32k], st->hBWE_TD->old_bwe_exc, PIT16k_MAX * 2 ); diff --git a/lib_enc/acelp_core_enc.c b/lib_enc/acelp_core_enc.c index 2958cf920..98e53f072 100644 --- a/lib_enc/acelp_core_enc.c +++ b/lib_enc/acelp_core_enc.c @@ -713,7 +713,12 @@ ivas_error acelp_core_enc( if ( !st->Opt_SC_VBR && ( st->idchan == 0 || st->element_mode != IVAS_CPE_TD || ( st->idchan == 1 && st->element_mode == IVAS_CPE_TD && st->tdm_LRTD_flag ) ) ) { /* Apply a non linearity to the SHB excitation */ - non_linearity( bwe_exc, bwe_exc_extended, st->hBWE_TD->old_bwe_exc_extended, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale, st->coder_type, voice_factors, st->L_frame ); + non_linearity( bwe_exc, bwe_exc_extended, st->hBWE_TD->old_bwe_exc_extended, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale, st->coder_type, voice_factors, st->L_frame +#ifdef NONBE_1328_FIX_NON_LINEARITY + , + st->element_mode +#endif + ); } if ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) diff --git a/lib_enc/enc_acelp_tcx_main.c b/lib_enc/enc_acelp_tcx_main.c index 6ede9b9bf..fa85e6af2 100644 --- a/lib_enc/enc_acelp_tcx_main.c +++ b/lib_enc/enc_acelp_tcx_main.c @@ -99,7 +99,12 @@ void enc_acelp_tcx_main( /* Apply non linearity to the SHB excitation */ if ( st->core == ACELP_CORE && st->igf ) { - non_linearity( ptr_bwe_exc, bwe_exc_extended, st->hBWE_TD->old_bwe_exc_extended, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale, st->coder_type, voice_factors, st->L_frame ); + non_linearity( ptr_bwe_exc, bwe_exc_extended, st->hBWE_TD->old_bwe_exc_extended, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale, st->coder_type, voice_factors, st->L_frame +#ifdef NONBE_1328_FIX_NON_LINEARITY + , + st->element_mode +#endif + ); /* update the old_BWE_exc memory */ mvr2r( &old_bwe_exc[L_FRAME32k], st->hBWE_TD->old_bwe_exc, PIT16k_MAX * 2 ); -- GitLab From 066144bc2ae970172b529537c9651c816051f800 Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Wed, 20 Aug 2025 09:15:58 -0400 Subject: [PATCH 2/2] fix clang --- lib_com/prot.h | 2 +- lib_dec/acelp_core_dec.c | 2 +- lib_dec/dec_acelp_tcx_main.c | 2 +- lib_enc/acelp_core_enc.c | 2 +- lib_enc/enc_acelp_tcx_main.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_com/prot.h b/lib_com/prot.h index 7047d5157..5ad14bf89 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -2641,7 +2641,7 @@ void non_linearity( #ifdef NONBE_1328_FIX_NON_LINEARITY , const int16_t element_mode /* i : element_mode to differentiate EVS and IVAS */ -#endif +#endif ); void interp_code_5over2( diff --git a/lib_dec/acelp_core_dec.c b/lib_dec/acelp_core_dec.c index fa9244557..159702cfc 100644 --- a/lib_dec/acelp_core_dec.c +++ b/lib_dec/acelp_core_dec.c @@ -1442,7 +1442,7 @@ ivas_error acelp_core_dec( if ( !st->ppp_mode_dec && ( st->idchan == 0 || st->element_mode != IVAS_CPE_TD || ( st->idchan == 1 && st->element_mode == IVAS_CPE_TD && st->tdm_LRTD_flag ) ) ) { - non_linearity( bwe_exc, bwe_exc_extended, st->hBWE_TD->old_bwe_exc_extended, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale, st->coder_type, voice_factors, st->L_frame + non_linearity( bwe_exc, bwe_exc_extended, st->hBWE_TD->old_bwe_exc_extended, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale, st->coder_type, voice_factors, st->L_frame #ifdef NONBE_1328_FIX_NON_LINEARITY , st->element_mode diff --git a/lib_dec/dec_acelp_tcx_main.c b/lib_dec/dec_acelp_tcx_main.c index 431868b80..a591157e4 100644 --- a/lib_dec/dec_acelp_tcx_main.c +++ b/lib_dec/dec_acelp_tcx_main.c @@ -429,7 +429,7 @@ void dec_acelp_tcx_frame( #ifdef NONBE_1328_FIX_NON_LINEARITY , st->element_mode -#endif +#endif ); /* update the old BWE exe memory */ diff --git a/lib_enc/acelp_core_enc.c b/lib_enc/acelp_core_enc.c index 98e53f072..2d57baa82 100644 --- a/lib_enc/acelp_core_enc.c +++ b/lib_enc/acelp_core_enc.c @@ -717,7 +717,7 @@ ivas_error acelp_core_enc( #ifdef NONBE_1328_FIX_NON_LINEARITY , st->element_mode -#endif +#endif ); } diff --git a/lib_enc/enc_acelp_tcx_main.c b/lib_enc/enc_acelp_tcx_main.c index fa85e6af2..8851d9be5 100644 --- a/lib_enc/enc_acelp_tcx_main.c +++ b/lib_enc/enc_acelp_tcx_main.c @@ -103,7 +103,7 @@ void enc_acelp_tcx_main( #ifdef NONBE_1328_FIX_NON_LINEARITY , st->element_mode -#endif +#endif ); /* update the old_BWE_exc memory */ -- GitLab