From 922a769ecfc6d4e10cff50abd452852f6b9c5552 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 21 Oct 2024 08:15:27 +0200 Subject: [PATCH 1/5] Add fix NONBE_FIX_1208_DFT_STEREO_PLC_BURST --- lib_com/options.h | 1 + lib_dec/ivas_stereo_dft_plc.c | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index e4c1c04bdb..b9ad1a912b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -183,6 +183,7 @@ #define NONBE_FIX_1197_OMASA_META_BUFFER /* Nokia: OMASA ISM_MASA_MODE_PARAM_ONE_OBJ history zero in rateswitching */ #define FIX_1139_REV_COLORATION_SHORT_T60 /* Nokia,FhG: Fix issue 1139, prevent sound coloration artefacts at very low reverberation times */ +#define NONBE_FIX_1208_DFT_STEREO_PLC_BURST /* Ericsson: Issue 1208, fix for overflow of sample offset counter for burst error in DFT Stereo PLC. */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_stereo_dft_plc.c b/lib_dec/ivas_stereo_dft_plc.c index 31f86bc348..a86ed79260 100644 --- a/lib_dec/ivas_stereo_dft_plc.c +++ b/lib_dec/ivas_stereo_dft_plc.c @@ -80,6 +80,9 @@ void stereo_dft_res_ecu( float fac; float trigo_dec[STEREO_DFT32MS_N_8k / 2 + 1]; int16_t trigo_step; +#ifdef NONBE_FIX_1208_DFT_STEREO_PLC_BURST + int16_t time_offs; +#endif set_zero( pDFT_RES, L_FRAME8k ); @@ -106,7 +109,12 @@ void stereo_dft_res_ecu( if ( k == 0 ) { mvr2r( pDFT_RES, res_buf, L_FRAME8k ); +#ifdef NONBE_FIX_1208_DFT_STEREO_PLC_BURST + time_offs = min( MAX16B_FLT, hStereoDft->time_offs + L_FRAME8k ); + stereo_dft_res_subst_spec( hStereoDft, res_buf, DFT_PRED_RES, time_offs, L_res, L_FRAME8k, k, num_plocs, plocs, plocsi, FALSE ); +#else stereo_dft_res_subst_spec( hStereoDft, res_buf, DFT_PRED_RES, hStereoDft->time_offs + output_frame, L_res, L_FRAME8k, k, num_plocs, plocs, plocsi, FALSE ); +#endif rfft( res_buf, trigo_dec, L_FRAME8k, +1 ); @@ -133,7 +141,11 @@ void stereo_dft_res_ecu( } /*in case of burst error*/ +#ifdef NONBE_FIX_1208_DFT_STEREO_PLC_BURST + hStereoDft->time_offs = min( MAX16B_FLT, hStereoDft->time_offs + L_FRAME8k ); +#else hStereoDft->time_offs += L_FRAME8k; +#endif } set_zero( DFT_PRED_RES, 2 * L_res ); -- GitLab From 656acdd7b9ca6919ce13e003bb8959f47ee1d4a8 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 21 Oct 2024 08:50:13 +0200 Subject: [PATCH 2/5] Cleanup of NONBE_FIX_1208_DFT_STEREO_PLC_BURST --- lib_com/ivas_prot.h | 2 ++ lib_dec/ivas_stereo_dft_dec.c | 4 ++++ lib_dec/ivas_stereo_dft_dec_dmx.c | 4 ++++ lib_dec/ivas_stereo_dft_plc.c | 6 ++++-- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 700a9cc75c..2fb3d11fb9 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -1407,7 +1407,9 @@ void stereo_dft_res_ecu( float *pDFT_RES, /* i/o: residual signal */ float *const DFT_PRED_RES, /* i/o: residual prediction signal */ const int16_t k, /* i : Subframe index */ +#ifndef NONBE_FIX_1208_DFT_STEREO_PLC_BURST const int16_t output_frame, /* i : Output frame length */ +#endif const int16_t prev_bfi, /* i : Previous BFI */ const float dmx_nrg, /* i : Down-mix energy */ int16_t *num_plocs, /* i/o: Number of peak locations */ diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index bf2774a1ac..3d0f89a046 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -1288,7 +1288,11 @@ void stereo_dft_dec( } else { +#ifdef NONBE_FIX_1208_DFT_STEREO_PLC_BURST + stereo_dft_res_ecu( hStereoDft, pDFT_RES, DFT_PRED_RES, k, prev_bfi, dmx_nrg, &num_plocs, plocs, plocsi, input_mem ); +#else stereo_dft_res_ecu( hStereoDft, pDFT_RES, DFT_PRED_RES, k, output_frame, prev_bfi, dmx_nrg, &num_plocs, plocs, plocsi, input_mem ); +#endif } } diff --git a/lib_dec/ivas_stereo_dft_dec_dmx.c b/lib_dec/ivas_stereo_dft_dec_dmx.c index 4cc48bea4d..5eb8faf516 100644 --- a/lib_dec/ivas_stereo_dft_dec_dmx.c +++ b/lib_dec/ivas_stereo_dft_dec_dmx.c @@ -159,7 +159,11 @@ void stereo_dft_unify_dmx( pPredGain = hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX; hStereoDft->past_DMX_pos = ( hStereoDft->past_DMX_pos + STEREO_DFT_PAST_MAX - 1 ) % STEREO_DFT_PAST_MAX; stereo_dft_generate_res_pred( hStereoDft, samp_ratio, pDFT_DMX, DFT_PRED_RES, pPredGain, k, DFT[1] + k * STEREO_DFT32MS_N_MAX, &stop, st0->bfi ); +#ifdef NONBE_FIX_1208_DFT_STEREO_PLC_BURST + stereo_dft_res_ecu( hStereoDft, pDFT_RES, DFT_PRED_RES, k, prev_bfi, dmx_nrg, &num_plocs, plocs, plocsi, input_mem ); +#else stereo_dft_res_ecu( hStereoDft, pDFT_RES, DFT_PRED_RES, k, output_frame, prev_bfi, dmx_nrg, &num_plocs, plocs, plocsi, input_mem ); +#endif } } diff --git a/lib_dec/ivas_stereo_dft_plc.c b/lib_dec/ivas_stereo_dft_plc.c index a86ed79260..b3ddba3ed6 100644 --- a/lib_dec/ivas_stereo_dft_plc.c +++ b/lib_dec/ivas_stereo_dft_plc.c @@ -64,7 +64,9 @@ void stereo_dft_res_ecu( float *pDFT_RES, /* i/o: residual signal */ float *const DFT_PRED_RES, /* i/o: residual prediction signal */ const int16_t k, /* i : Subframe index */ +#ifndef NONBE_FIX_1208_DFT_STEREO_PLC_BURST const int16_t output_frame, /* i : Output frame length */ +#endif const int16_t prev_bfi, /* i : Previous BFI */ const float dmx_nrg, /* i : Down-mix energy */ int16_t *num_plocs, /* i/o: Number of peak locations */ @@ -110,7 +112,7 @@ void stereo_dft_res_ecu( { mvr2r( pDFT_RES, res_buf, L_FRAME8k ); #ifdef NONBE_FIX_1208_DFT_STEREO_PLC_BURST - time_offs = min( MAX16B_FLT, hStereoDft->time_offs + L_FRAME8k ); + time_offs = min( MAX16B, hStereoDft->time_offs + L_FRAME8k ); stereo_dft_res_subst_spec( hStereoDft, res_buf, DFT_PRED_RES, time_offs, L_res, L_FRAME8k, k, num_plocs, plocs, plocsi, FALSE ); #else stereo_dft_res_subst_spec( hStereoDft, res_buf, DFT_PRED_RES, hStereoDft->time_offs + output_frame, L_res, L_FRAME8k, k, num_plocs, plocs, plocsi, FALSE ); @@ -142,7 +144,7 @@ void stereo_dft_res_ecu( /*in case of burst error*/ #ifdef NONBE_FIX_1208_DFT_STEREO_PLC_BURST - hStereoDft->time_offs = min( MAX16B_FLT, hStereoDft->time_offs + L_FRAME8k ); + hStereoDft->time_offs = min( MAX16B, hStereoDft->time_offs + L_FRAME8k ); #else hStereoDft->time_offs += L_FRAME8k; #endif -- GitLab From 62dfd69eb776848b300faafaf2ffffdcce056192 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 21 Oct 2024 12:43:10 +0200 Subject: [PATCH 3/5] Clang format --- lib_dec/ivas_stereo_dft_plc.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib_dec/ivas_stereo_dft_plc.c b/lib_dec/ivas_stereo_dft_plc.c index b3ddba3ed6..84bbee277e 100644 --- a/lib_dec/ivas_stereo_dft_plc.c +++ b/lib_dec/ivas_stereo_dft_plc.c @@ -65,14 +65,14 @@ void stereo_dft_res_ecu( float *const DFT_PRED_RES, /* i/o: residual prediction signal */ const int16_t k, /* i : Subframe index */ #ifndef NONBE_FIX_1208_DFT_STEREO_PLC_BURST - const int16_t output_frame, /* i : Output frame length */ + const int16_t output_frame, /* i : Output frame length */ #endif - const int16_t prev_bfi, /* i : Previous BFI */ - const float dmx_nrg, /* i : Down-mix energy */ - int16_t *num_plocs, /* i/o: Number of peak locations */ - int16_t *plocs, /* i/o: Peak locations (bin) */ - float *plocsi, /* i/o: Peak locations (fractional) */ - float *input_mem /* o : Residual DFT buffer input mem */ + const int16_t prev_bfi, /* i : Previous BFI */ + const float dmx_nrg, /* i : Down-mix energy */ + int16_t *num_plocs, /* i/o: Number of peak locations */ + int16_t *plocs, /* i/o: Peak locations (bin) */ + float *plocsi, /* i/o: Peak locations (fractional) */ + float *input_mem /* o : Residual DFT buffer input mem */ ) { float res_buf[L_FRAME8k]; -- GitLab From 739e06461bbec9acaed951797ad707b42e55c7c9 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 21 Oct 2024 13:01:49 +0200 Subject: [PATCH 4/5] Revert part of fix, since it does not resolve the issue with the PLC frame onset --- lib_dec/ivas_stereo_dft_dec.c | 4 ---- lib_dec/ivas_stereo_dft_dec_dmx.c | 4 ---- lib_dec/ivas_stereo_dft_plc.c | 18 ++++++++---------- 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index 3d0f89a046..bf2774a1ac 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -1288,11 +1288,7 @@ void stereo_dft_dec( } else { -#ifdef NONBE_FIX_1208_DFT_STEREO_PLC_BURST - stereo_dft_res_ecu( hStereoDft, pDFT_RES, DFT_PRED_RES, k, prev_bfi, dmx_nrg, &num_plocs, plocs, plocsi, input_mem ); -#else stereo_dft_res_ecu( hStereoDft, pDFT_RES, DFT_PRED_RES, k, output_frame, prev_bfi, dmx_nrg, &num_plocs, plocs, plocsi, input_mem ); -#endif } } diff --git a/lib_dec/ivas_stereo_dft_dec_dmx.c b/lib_dec/ivas_stereo_dft_dec_dmx.c index 5eb8faf516..4cc48bea4d 100644 --- a/lib_dec/ivas_stereo_dft_dec_dmx.c +++ b/lib_dec/ivas_stereo_dft_dec_dmx.c @@ -159,11 +159,7 @@ void stereo_dft_unify_dmx( pPredGain = hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX; hStereoDft->past_DMX_pos = ( hStereoDft->past_DMX_pos + STEREO_DFT_PAST_MAX - 1 ) % STEREO_DFT_PAST_MAX; stereo_dft_generate_res_pred( hStereoDft, samp_ratio, pDFT_DMX, DFT_PRED_RES, pPredGain, k, DFT[1] + k * STEREO_DFT32MS_N_MAX, &stop, st0->bfi ); -#ifdef NONBE_FIX_1208_DFT_STEREO_PLC_BURST - stereo_dft_res_ecu( hStereoDft, pDFT_RES, DFT_PRED_RES, k, prev_bfi, dmx_nrg, &num_plocs, plocs, plocsi, input_mem ); -#else stereo_dft_res_ecu( hStereoDft, pDFT_RES, DFT_PRED_RES, k, output_frame, prev_bfi, dmx_nrg, &num_plocs, plocs, plocsi, input_mem ); -#endif } } diff --git a/lib_dec/ivas_stereo_dft_plc.c b/lib_dec/ivas_stereo_dft_plc.c index 84bbee277e..30fb49f4ce 100644 --- a/lib_dec/ivas_stereo_dft_plc.c +++ b/lib_dec/ivas_stereo_dft_plc.c @@ -64,15 +64,13 @@ void stereo_dft_res_ecu( float *pDFT_RES, /* i/o: residual signal */ float *const DFT_PRED_RES, /* i/o: residual prediction signal */ const int16_t k, /* i : Subframe index */ -#ifndef NONBE_FIX_1208_DFT_STEREO_PLC_BURST - const int16_t output_frame, /* i : Output frame length */ -#endif - const int16_t prev_bfi, /* i : Previous BFI */ - const float dmx_nrg, /* i : Down-mix energy */ - int16_t *num_plocs, /* i/o: Number of peak locations */ - int16_t *plocs, /* i/o: Peak locations (bin) */ - float *plocsi, /* i/o: Peak locations (fractional) */ - float *input_mem /* o : Residual DFT buffer input mem */ + const int16_t output_frame, /* i : Output frame length */ + const int16_t prev_bfi, /* i : Previous BFI */ + const float dmx_nrg, /* i : Down-mix energy */ + int16_t *num_plocs, /* i/o: Number of peak locations */ + int16_t *plocs, /* i/o: Peak locations (bin) */ + float *plocsi, /* i/o: Peak locations (fractional) */ + float *input_mem /* o : Residual DFT buffer input mem */ ) { float res_buf[L_FRAME8k]; @@ -112,7 +110,7 @@ void stereo_dft_res_ecu( { mvr2r( pDFT_RES, res_buf, L_FRAME8k ); #ifdef NONBE_FIX_1208_DFT_STEREO_PLC_BURST - time_offs = min( MAX16B, hStereoDft->time_offs + L_FRAME8k ); + time_offs = min( MAX16B, hStereoDft->time_offs + output_frame ); stereo_dft_res_subst_spec( hStereoDft, res_buf, DFT_PRED_RES, time_offs, L_res, L_FRAME8k, k, num_plocs, plocs, plocsi, FALSE ); #else stereo_dft_res_subst_spec( hStereoDft, res_buf, DFT_PRED_RES, hStereoDft->time_offs + output_frame, L_res, L_FRAME8k, k, num_plocs, plocs, plocsi, FALSE ); -- GitLab From 3e5667ad8881b06234b64f41383c03262f38d1e5 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 21 Oct 2024 13:04:29 +0200 Subject: [PATCH 5/5] Missing cleanup --- lib_com/ivas_prot.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 2fb3d11fb9..700a9cc75c 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -1407,9 +1407,7 @@ void stereo_dft_res_ecu( float *pDFT_RES, /* i/o: residual signal */ float *const DFT_PRED_RES, /* i/o: residual prediction signal */ const int16_t k, /* i : Subframe index */ -#ifndef NONBE_FIX_1208_DFT_STEREO_PLC_BURST const int16_t output_frame, /* i : Output frame length */ -#endif const int16_t prev_bfi, /* i : Previous BFI */ const float dmx_nrg, /* i : Down-mix energy */ int16_t *num_plocs, /* i/o: Number of peak locations */ -- GitLab