From d78a4fbe97b43ba3877993e55318532403aad676 Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Wed, 29 May 2024 10:06:22 -0400 Subject: [PATCH 1/2] fix proposal for 778, solve some bitrate switching issues --- lib_com/options.h | 1 + lib_dec/ivas_core_dec.c | 4 +++ lib_dec/tcx_utils_dec_fx.c | 54 ++++++++++++++++++++++++++------------ 3 files changed, 42 insertions(+), 17 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 3d29e6459..3f2bbc68f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -138,6 +138,7 @@ #define FIX_770_DISCONTINUITIES_SW_TCX2ACELP // Fix discontinuities when switching from TCX to ACELP #define FIX_680_CNG_FRAME_BOUNDARIES_ISSUE /* Step was right shift by 2, which made the OVA wrong */ #define NONBE_FIX_1069_SVD_TUNING /* FhG: issue 1069: tune SVD constants */ +#define FIX_778_STEREO_BRATE_SWITCHING /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_core_dec.c b/lib_dec/ivas_core_dec.c index ae20b0b42..8d617e2fd 100644 --- a/lib_dec/ivas_core_dec.c +++ b/lib_dec/ivas_core_dec.c @@ -576,6 +576,10 @@ ivas_error ivas_core_dec( { st->hHQ_core->Q_fer_samples = 0; } +#ifdef FIX_778_STEREO_BRATE_SWITCHING + st->Q_syn = 0; + move16(); +#endif st->prev_Q_syn = st->Q_syn; Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, st->Q_syn - st->hHQ_core->Q_old_wtda_LB ); diff --git a/lib_dec/tcx_utils_dec_fx.c b/lib_dec/tcx_utils_dec_fx.c index a3761f2cb..c33218ef0 100644 --- a/lib_dec/tcx_utils_dec_fx.c +++ b/lib_dec/tcx_utils_dec_fx.c @@ -47,7 +47,9 @@ void tcx_decoder_memory_update( Copy(xn_buf, synth, L_frame_glob); Copy(synth + sub(L_frame_glob, M+1), st->syn, M+1); +#ifndef FIX_778_STEREO_BRATE_SWITCHING IF (NE_16(st->element_mode, IVAS_CPE_MDCT)) +#endif { IF(!fb) /* TV2FhG -> Condition differs from floating point */ { @@ -55,29 +57,47 @@ void tcx_decoder_memory_update( /* Emphasis of synth -> synth_pe */ tmp = synth[-M - 1]; move16(); - st->Q_syn = E_UTIL_f_preemph3(synth - M, preemph, add(M, L_frame_glob), &tmp, 1); - st->prev_Q_syn = st->Q_syn = st->Q_syn - 1; +#ifdef FIX_778_STEREO_BRATE_SWITCHING + IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) + { +#endif + st->Q_syn = E_UTIL_f_preemph3( synth - M, preemph, add( M, L_frame_glob ), &tmp, 1 ); + st->prev_Q_syn = st->Q_syn = st->Q_syn - 1; +#ifdef FIX_778_STEREO_BRATE_SWITCHING + } + ELSE + { + E_UTIL_f_preemph2( 2, synth - M, preemph, add( M, L_frame_glob ), &tmp ); + st->prev_Q_syn = st->Q_syn = 0; /* in case of MDCT, Q0 seems to be used*/ + } +#endif Copy(synth + sub(L_frame_glob, M), st->mem_syn2_fx, M); Copy(synth + sub(L_frame_glob, L_SYN_MEM), st->mem_syn_r, L_SYN_MEM); - - test(); - IF(st->tcxonly == 0 || LE_16(L_frame_glob, L_FRAME16k)) +#ifdef FIX_778_STEREO_BRATE_SWITCHING + IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { - /* Update excitation */ - IF(NE_16(st->Q_syn + 1, st->Q_exc)) +#endif + test(); + IF(st->tcxonly == 0 || LE_16(L_frame_glob, L_FRAME16k)) { - Scale_sig(st->old_exc_fx, L_EXC_MEM_DEC, sub(st->Q_syn + 1, st->Q_exc)); + /* Update excitation */ + IF(NE_16(st->Q_syn + 1, st->Q_exc)) + { + Scale_sig(st->old_exc_fx, L_EXC_MEM_DEC, sub(st->Q_syn + 1, st->Q_exc)); + } + st->Q_exc = st->Q_syn + 1; + st->Q_subfr[0] = st->Q_subfr[1] = st->Q_subfr[2] = st->Q_subfr[3] = st->Q_subfr[4] = st->Q_exc; + + assert(L_frame_glob < L_EXC_MEM_DEC); + Copy(st->old_exc_fx + L_frame_glob, st->old_exc_fx, sub(L_EXC_MEM_DEC, L_frame_glob)); + Residu3_fx(A, synth, st->old_exc_fx + sub(L_EXC_MEM_DEC, L_frame_glob), L_frame_glob, 1); } - st->Q_exc = st->Q_syn + 1; - st->Q_subfr[0] = st->Q_subfr[1] = st->Q_subfr[2] = st->Q_subfr[3] = st->Q_subfr[4] = st->Q_exc; - - assert(L_frame_glob < L_EXC_MEM_DEC); - Copy(st->old_exc_fx + L_frame_glob, st->old_exc_fx, sub(L_EXC_MEM_DEC, L_frame_glob)); - Residu3_fx(A, synth, st->old_exc_fx + sub(L_EXC_MEM_DEC, L_frame_glob), L_frame_glob, 1); + /* Update old_Aq */ + Copy(A, st->old_Aq_12_8_fx, M + 1); +#ifdef FIX_778_STEREO_BRATE_SWITCHING + } +#endif } - /* Update old_Aq */ - Copy(A, st->old_Aq_12_8_fx, M + 1); - } } return; } -- GitLab From 61db6ae382474da7d6f0f62239bb7e9a290af35e Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Mon, 3 Jun 2024 08:01:17 -0400 Subject: [PATCH 2/2] fix clang formatting --- lib_dec/tcx_utils_dec_fx.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib_dec/tcx_utils_dec_fx.c b/lib_dec/tcx_utils_dec_fx.c index 3b29f0697..be8d5237d 100644 --- a/lib_dec/tcx_utils_dec_fx.c +++ b/lib_dec/tcx_utils_dec_fx.c @@ -78,22 +78,22 @@ void tcx_decoder_memory_update( { #endif test(); - IF(st->tcxonly == 0 || LE_16(L_frame_glob, L_FRAME16k)) + IF( st->tcxonly == 0 || LE_16( L_frame_glob, L_FRAME16k ) ) { /* Update excitation */ - IF(NE_16(st->Q_syn + 1, st->Q_exc)) + IF( NE_16( st->Q_syn + 1, st->Q_exc ) ) { - Scale_sig(st->old_exc_fx, L_EXC_MEM_DEC, sub(st->Q_syn + 1, st->Q_exc)); + Scale_sig( st->old_exc_fx, L_EXC_MEM_DEC, sub( st->Q_syn + 1, st->Q_exc ) ); } st->Q_exc = st->Q_syn + 1; st->Q_subfr[0] = st->Q_subfr[1] = st->Q_subfr[2] = st->Q_subfr[3] = st->Q_subfr[4] = st->Q_exc; - assert(L_frame_glob < L_EXC_MEM_DEC); - Copy(st->old_exc_fx + L_frame_glob, st->old_exc_fx, sub(L_EXC_MEM_DEC, L_frame_glob)); - Residu3_fx(A, synth, st->old_exc_fx + sub(L_EXC_MEM_DEC, L_frame_glob), L_frame_glob, 1); + assert( L_frame_glob < L_EXC_MEM_DEC ); + Copy( st->old_exc_fx + L_frame_glob, st->old_exc_fx, sub( L_EXC_MEM_DEC, L_frame_glob ) ); + Residu3_fx( A, synth, st->old_exc_fx + sub( L_EXC_MEM_DEC, L_frame_glob ), L_frame_glob, 1 ); } /* Update old_Aq */ - Copy(A, st->old_Aq_12_8_fx, M + 1); + Copy( A, st->old_Aq_12_8_fx, M + 1 ); #ifdef FIX_778_STEREO_BRATE_SWITCHING } #endif -- GitLab