From 460aac07ea6d7b7606bbfc546ba90b6683474c71 Mon Sep 17 00:00:00 2001 From: naghibza Date: Fri, 27 Mar 2026 17:07:59 +0100 Subject: [PATCH 1/4] Fix Q_synth after TCX concealment --- lib_com/options.h | 1 + lib_dec/ivas_core_dec_fx.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 374e387de..709ab5516 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -99,6 +99,7 @@ #define FIX_1543_MID_LSF_BITS /* VA: float issue 1543: Resolve "MSAN: use-of-uninitialized-value in lib_enc/lsf_enc.c:262:5 for EVS encoder" */ #define FIX_2488_PREVENT_NEG_PITCH /* VA: Fix for 2488, use saturation to prevent possible wrap-around, thus negative pitch values */ #define FIX_1547_ISMDTX_HANDLE /* VA: float issue 1547: fix use of 'hISMDTX' handle */ +#define FIX_BASOP_2491_MDCT_JBM_CLICK /* FhG: BASOP #2491: Fix Q_synth after TCX concealment */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c index 40688cf91..bb66c6592 100644 --- a/lib_dec/ivas_core_dec_fx.c +++ b/lib_dec/ivas_core_dec_fx.c @@ -766,7 +766,11 @@ ivas_error ivas_core_dec_fx( *---------------------------------------------------------------------*/ /*core_switching_post_dec*/ +#ifdef FIX_BASOP_2491_MDCT_JBM_CLICK + Q_synth = sub( 15, e_sig[0] ); +#else Q_synth = add( sub( 15, e_sig[0] ), st->Q_syn_factor ); +#endif IF( st->cldfbSyn != NULL ) { -- GitLab From e1a6df1a3c4d12edc034eead5b0a89388c2ba74f Mon Sep 17 00:00:00 2001 From: naghibza Date: Mon, 30 Mar 2026 12:18:54 +0200 Subject: [PATCH 2/4] Correct Q_synth only after TCX concealment --- lib_dec/ivas_core_dec_fx.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c index bb66c6592..947dc378e 100644 --- a/lib_dec/ivas_core_dec_fx.c +++ b/lib_dec/ivas_core_dec_fx.c @@ -767,7 +767,14 @@ ivas_error ivas_core_dec_fx( /*core_switching_post_dec*/ #ifdef FIX_BASOP_2491_MDCT_JBM_CLICK - Q_synth = sub( 15, e_sig[0] ); + IF( EQ_16( sts[n]->element_mode, IVAS_CPE_MDCT ) && GT_32( sts[n]->core_brate, SID_2k40 ) && hMCT == NULL ) // In this case, st->Q_syn_factor was already applied earlier in ivas_mdct_core_reconstruct_fx() + { + Q_synth = sub( 15, e_sig[0] ); + } + ELSE + { + Q_synth = add( sub( 15, e_sig[0] ), st->Q_syn_factor ); + } #else Q_synth = add( sub( 15, e_sig[0] ), st->Q_syn_factor ); #endif -- GitLab From 6c109e4b5e31231dc4a27d7d9b029e9bd5341c56 Mon Sep 17 00:00:00 2001 From: naghibza Date: Mon, 30 Mar 2026 13:23:56 +0200 Subject: [PATCH 3/4] Remove redundant if-condition in con_tcx_fx() --- lib_dec/er_dec_tcx_fx.c | 4 ++++ lib_dec/stat_dec.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib_dec/er_dec_tcx_fx.c b/lib_dec/er_dec_tcx_fx.c index 0eecfedee..867ecda51 100644 --- a/lib_dec/er_dec_tcx_fx.c +++ b/lib_dec/er_dec_tcx_fx.c @@ -941,6 +941,9 @@ void con_tcx_fx( } ELSE { +#ifdef FIX_BASOP_2491_MDCT_JBM_CLICK + tmp_deemph = shl_sat( tmp_deemph, Q_syn ); /*Q_syn*/ +#else IF( NE_16( st->element_mode, EVS_MONO ) ) // to keep evs bit-exactness { if ( GT_16( sub( Q_syn, st->Q_syn_factor ), scf ) ) @@ -953,6 +956,7 @@ void con_tcx_fx( { tmp_deemph = shl_sat( tmp_deemph, Q_syn ); /*Q_syn*/ } +#endif st->Q_syn_factor = 0; move16(); st->Q_syn = Q_syn; diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h index bec9811e9..58056843e 100644 --- a/lib_dec/stat_dec.h +++ b/lib_dec/stat_dec.h @@ -1306,7 +1306,7 @@ typedef struct Decoder_State Word16 Q_syn; Word16 Q_syn2; Word16 Q_syn_cng; - Word16 Q_syn_factor; // This q_factor is used to avoid using fix Q0 for synth[] at the output of con_tcx_ivas_fx() and ivas_core_dec_fx(). For con_tcx_ivas_fx, it is used for two consecutive TCX concealment processes and It cannot be greater than 0. + Word16 Q_syn_factor; // This q_factor is used to avoid using fix Q0 for synth[] at the output of con_tcx_fx() and ivas_core_dec_fx(). For con_tcx_fx, it is used for two consecutive TCX concealment processes and It cannot be greater than 0. Word16 prev_Q_syn; Word16 prev_Q_bwe_exc; -- GitLab From 4150d2f037698fafdbe93ceb6ad76a15388513b4 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 30 Mar 2026 16:49:25 +0200 Subject: [PATCH 4/4] remove superfluous condition --- lib_dec/ivas_core_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c index 947dc378e..56e283a3b 100644 --- a/lib_dec/ivas_core_dec_fx.c +++ b/lib_dec/ivas_core_dec_fx.c @@ -767,7 +767,7 @@ ivas_error ivas_core_dec_fx( /*core_switching_post_dec*/ #ifdef FIX_BASOP_2491_MDCT_JBM_CLICK - IF( EQ_16( sts[n]->element_mode, IVAS_CPE_MDCT ) && GT_32( sts[n]->core_brate, SID_2k40 ) && hMCT == NULL ) // In this case, st->Q_syn_factor was already applied earlier in ivas_mdct_core_reconstruct_fx() + IF( EQ_16( sts[n]->element_mode, IVAS_CPE_MDCT ) && GT_32( sts[n]->core_brate, SID_2k40 ) ) // In this case, st->Q_syn_factor was already applied earlier in ivas_mdct_core_reconstruct_fx() { Q_synth = sub( 15, e_sig[0] ); } -- GitLab