From 0b045556c101910edcc774d88e79ddfb1c4bef4a Mon Sep 17 00:00:00 2001 From: naghibza Date: Tue, 26 Aug 2025 16:37:41 +0200 Subject: [PATCH 1/5] Increased guard bits of DFT_fx, improved precision of past_dmx_nrg calculation in stereo_dft_generate_res_pred_fx(). --- lib_com/options.h | 1 + lib_dec/ivas_cpe_dec_fx.c | 4 ++++ lib_dec/ivas_stereo_dft_dec_fx.c | 20 ++++++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 1f13605df..9db2a02f2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -112,6 +112,7 @@ #define FIX_1944_CRASH_FOR_STEREO /* FhG: improve TonalMDCTConceal_InsertNoise calculation precision */ #define FIX_1970_SBA_CRASH /* Dlb: Fix for issue 1970, SBA crash */ +#define FIX_1946_CRASH_JBM_PROCESSING /* FhG: Increased guard bits of DFT_fx */ /* #################### Start BASOP porting switches ############################ */ #define FIX_1372_ISAR_POST_REND diff --git a/lib_dec/ivas_cpe_dec_fx.c b/lib_dec/ivas_cpe_dec_fx.c index f8d229540..926ba471b 100644 --- a/lib_dec/ivas_cpe_dec_fx.c +++ b/lib_dec/ivas_cpe_dec_fx.c @@ -659,7 +659,11 @@ ivas_error ivas_cpe_dec_fx( IF( NE_16( shift, 31 ) ) { +#ifdef FIX_1946_CRASH_JBM_PROCESSING + shift = sub( add( hCPE->hStereoDft->q_dft, shift ), Q17 ); /* Q17 for guard bits */ +#else shift = sub( add( hCPE->hStereoDft->q_dft, shift ), Q16 ); /* Q16 for guard bits */ +#endif IF( GT_16( shift, hCPE->hStereoDft->q_dft ) ) { diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index 7d3bec07d..a7edd1c97 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -3171,15 +3171,35 @@ void stereo_dft_generate_res_pred_fx( move32(); DFT_PRED_RES[2 * i + 1] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i + 1], g_long ), q_shift1 ) ); /* q_dft */ move32(); +#ifndef FIX_1946_CRASH_JBM_PROCESSING past_dmx_nrg = Madd_32_32( Madd_32_32( past_dmx_nrg, DFT_PRED_RES[2 * i], DFT_PRED_RES[2 * i] ), DFT_PRED_RES[2 * i + 1], DFT_PRED_RES[2 * i + 1] ); /* q_dft */ +#endif } test(); IF( !bfi || GE_16( b, hStereoDft->res_cod_band_max ) ) { +#ifdef FIX_1946_CRASH_JBM_PROCESSING + Word16 q_div, scaleFactor; +#else Word16 q_div; +#endif Word16 op; +#ifdef FIX_1946_CRASH_JBM_PROCESSING + scaleFactor = getScaleFactor32( &DFT_PRED_RES[shl( hStereoDft->band_limits[b], 1 )], sub( shl( len, 1 ), 1 ) ); // calc it in the range [2*hStereoDft->band_limits[b] : 2*(len-1)+1] + scaleFactor = sub( scaleFactor, 4 ); // add headroom + FOR( i = hStereoDft->band_limits[b]; i < len; i++ ) + { + Word32 x_2i = L_shl( DFT_PRED_RES[2 * i], scaleFactor ); + Word32 x_2ip1 = L_shl( DFT_PRED_RES[2 * i + 1], scaleFactor ); + past_dmx_nrg = Madd_32_32( Madd_32_32( past_dmx_nrg, x_2i, x_2i ), x_2ip1, x_2ip1 ); /* q_dft - 1 */ + } +#endif op = BASOP_Util_Divide3232_Scale( L_add( 1, dmx_nrg ), L_add( 1, past_dmx_nrg ), &q_div ); /* q_sqrt */ +#ifdef FIX_1946_CRASH_JBM_PROCESSING + q_sqrt = sub( q_div, shl( scaleFactor, 1 ) ); +#else q_sqrt = q_div; +#endif move16(); norm_fac = Sqrt16( op, &q_sqrt ); g2 = Mpy_32_16_1( pPredGain[b], norm_fac ); /* Q31 */ -- GitLab From 5e50ac940ac92871e3e42732ab55bf8851b88051 Mon Sep 17 00:00:00 2001 From: naghibza Date: Tue, 26 Aug 2025 16:42:21 +0200 Subject: [PATCH 2/5] Applied Clang formatting patch. --- lib_dec/ivas_stereo_dft_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index a7edd1c97..e8723d382 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -3186,7 +3186,7 @@ void stereo_dft_generate_res_pred_fx( Word16 op; #ifdef FIX_1946_CRASH_JBM_PROCESSING scaleFactor = getScaleFactor32( &DFT_PRED_RES[shl( hStereoDft->band_limits[b], 1 )], sub( shl( len, 1 ), 1 ) ); // calc it in the range [2*hStereoDft->band_limits[b] : 2*(len-1)+1] - scaleFactor = sub( scaleFactor, 4 ); // add headroom + scaleFactor = sub( scaleFactor, 4 ); // add headroom FOR( i = hStereoDft->band_limits[b]; i < len; i++ ) { Word32 x_2i = L_shl( DFT_PRED_RES[2 * i], scaleFactor ); -- GitLab From 82cb8f206048009b24f174691114689723f802ab Mon Sep 17 00:00:00 2001 From: naghibza Date: Wed, 27 Aug 2025 09:32:21 +0200 Subject: [PATCH 3/5] Fix Q calculation in stereo_dft_generate_res_pred_fx(). --- lib_dec/ivas_stereo_dft_dec_fx.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index e8723d382..808805137 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -3186,17 +3186,25 @@ void stereo_dft_generate_res_pred_fx( Word16 op; #ifdef FIX_1946_CRASH_JBM_PROCESSING scaleFactor = getScaleFactor32( &DFT_PRED_RES[shl( hStereoDft->band_limits[b], 1 )], sub( shl( len, 1 ), 1 ) ); // calc it in the range [2*hStereoDft->band_limits[b] : 2*(len-1)+1] - scaleFactor = sub( scaleFactor, 4 ); // add headroom + IF( GT_16( scaleFactor, 3 ) ) + { + scaleFactor = sub( scaleFactor, 3 ); // add headroom + } + ELSE + { + scaleFactor = 0; // no guard added since it was fine without scaleFactor + move16(); + } FOR( i = hStereoDft->band_limits[b]; i < len; i++ ) { Word32 x_2i = L_shl( DFT_PRED_RES[2 * i], scaleFactor ); Word32 x_2ip1 = L_shl( DFT_PRED_RES[2 * i + 1], scaleFactor ); - past_dmx_nrg = Madd_32_32( Madd_32_32( past_dmx_nrg, x_2i, x_2i ), x_2ip1, x_2ip1 ); /* q_dft - 1 */ + past_dmx_nrg = Madd_32_32( Madd_32_32( past_dmx_nrg, x_2i, x_2i ), x_2ip1, x_2ip1 ); /* q_dft - 2*scaleFactor */ } #endif op = BASOP_Util_Divide3232_Scale( L_add( 1, dmx_nrg ), L_add( 1, past_dmx_nrg ), &q_div ); /* q_sqrt */ #ifdef FIX_1946_CRASH_JBM_PROCESSING - q_sqrt = sub( q_div, shl( scaleFactor, 1 ) ); + q_sqrt = add( q_div, shl( scaleFactor, 1 ) ); #else q_sqrt = q_div; #endif -- GitLab From c3457ee461d90186be370e5fb1a550225037bad5 Mon Sep 17 00:00:00 2001 From: naghibza Date: Wed, 27 Aug 2025 11:30:16 +0200 Subject: [PATCH 4/5] Trigger fresh pipeline run with minor change --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index f3498154a..b69b5ed2c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -78,7 +78,7 @@ #define FIX_1944_CRASH_FOR_STEREO /* FhG: improve TonalMDCTConceal_InsertNoise calculation precision */ #define FIX_1970_SBA_CRASH /* Dlb: Fix for issue 1970, SBA crash */ -#define FIX_1946_CRASH_JBM_PROCESSING /* FhG: Increased guard bits of DFT_fx */ +#define FIX_1946_CRASH_JBM_PROCESSING /* FhG: Increased guard bits of DFT_fx */ /* #################### Start BASOP porting switches ############################ */ #define NONBE_1244_FIX_SWB_BWE_MEMORY /* VA: issue 1244: fix to SWB BWE memory in case of switching from FB coding - pending a review by Huawei */ -- GitLab From 4f4597f86a0534ca98676146d9427e40ea4b7a84 Mon Sep 17 00:00:00 2001 From: naghibza Date: Wed, 27 Aug 2025 17:17:47 +0200 Subject: [PATCH 5/5] Remove DFT_PRED_RES scaling in past_dmx_nrg calculation in stereo_dft_generate_res_pred_fx() --- lib_dec/ivas_stereo_dft_dec_fx.c | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index 808805137..271e34443 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -3178,37 +3178,18 @@ void stereo_dft_generate_res_pred_fx( test(); IF( !bfi || GE_16( b, hStereoDft->res_cod_band_max ) ) { -#ifdef FIX_1946_CRASH_JBM_PROCESSING - Word16 q_div, scaleFactor; -#else Word16 q_div; -#endif Word16 op; #ifdef FIX_1946_CRASH_JBM_PROCESSING - scaleFactor = getScaleFactor32( &DFT_PRED_RES[shl( hStereoDft->band_limits[b], 1 )], sub( shl( len, 1 ), 1 ) ); // calc it in the range [2*hStereoDft->band_limits[b] : 2*(len-1)+1] - IF( GT_16( scaleFactor, 3 ) ) - { - scaleFactor = sub( scaleFactor, 3 ); // add headroom - } - ELSE - { - scaleFactor = 0; // no guard added since it was fine without scaleFactor - move16(); - } FOR( i = hStereoDft->band_limits[b]; i < len; i++ ) { - Word32 x_2i = L_shl( DFT_PRED_RES[2 * i], scaleFactor ); - Word32 x_2ip1 = L_shl( DFT_PRED_RES[2 * i + 1], scaleFactor ); - past_dmx_nrg = Madd_32_32( Madd_32_32( past_dmx_nrg, x_2i, x_2i ), x_2ip1, x_2ip1 ); /* q_dft - 2*scaleFactor */ + past_dmx_nrg = Madd_32_32( Madd_32_32( past_dmx_nrg, DFT_PRED_RES[2 * i], DFT_PRED_RES[2 * i] ), DFT_PRED_RES[2 * i + 1], DFT_PRED_RES[2 * i + 1] ); /* q_dft */ } #endif op = BASOP_Util_Divide3232_Scale( L_add( 1, dmx_nrg ), L_add( 1, past_dmx_nrg ), &q_div ); /* q_sqrt */ -#ifdef FIX_1946_CRASH_JBM_PROCESSING - q_sqrt = add( q_div, shl( scaleFactor, 1 ) ); -#else q_sqrt = q_div; -#endif move16(); + norm_fac = Sqrt16( op, &q_sqrt ); g2 = Mpy_32_16_1( pPredGain[b], norm_fac ); /* Q31 */ IF( LE_32( q_sqrt, norm_l( g2 ) ) ) -- GitLab