From 39bc8674cb48e89dab61933829f9d82f92e22cc3 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 19 Dec 2024 14:34:52 +0530 Subject: [PATCH] Fix for 3GPP issue 1127: MLD in the range of 5 to 12 between signals decoded from 128kbps encoded SBA bitstreams at input level -16LKFS Link #1127 --- lib_com/options.h | 1 + lib_enc/ivas_dirac_enc.c | 36 +++++++++++++++++++++++++++++++----- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index a914c8e66..f50f2075a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -100,6 +100,7 @@ #define FIX_1009_OPT_PARAMMC_RENDER /* FhG: Optimize ivas_param_mc_dec_render_fx() */ #define FIX_1109_OPTIM_MCT_STEREO_IGF_DEC /* FhG: optimize mctStereoIGF_dec_fx() */ #define FIX_1110_OPTIM_DIRAC_DECORR_PROC /* FhG: optimize ivas_dirac_dec_decorr_process() */ +#define FIX_1127_IMPROVE_SBA_MLD /* Ittiam: Avoid saturation for DiRAC reference power */ #define FIX_1100_REMOVE_LPC_RESCALING /* VA: Remove the rescaling of LPC coefficient to Q12 as residu and syn-filt are already taking care of it*/ #endif diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 51a446d38..4f471325e 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -742,7 +742,21 @@ void computeReferencePower_enc_fx_dirac( *dirac_mono_flag = ivas_dirac_get_mono_flag_fx( band_grouping, Cldfb_RealBuffer, Cldfb_ImagBuffer, e_Cldfb, nchan_ana, mono_frame_count ); move16(); } - +#ifdef FIX_1127_IMPROVE_SBA_MLD + Word16 gb = 0; + move16(); + FOR( i = 0; i < num_freq_bands; i++ ) + { + brange[0] = band_grouping[i + enc_param_start_band]; + brange[1] = band_grouping[i + enc_param_start_band + 1]; + move16(); + move16(); + gb = s_max( gb, find_guarded_bits_fx( sub( brange[1], brange[0] ) ) ); + } + e_reference_W = sub( 31, sub( add( shl( sub( 31, e_Cldfb ), 1 ), 1 ), gb ) ); + e_reference_temp = e_reference_W; +#endif + move16(); FOR( i = 0; i < num_freq_bands; i++ ) { brange[0] = band_grouping[i + enc_param_start_band]; @@ -758,12 +772,16 @@ void computeReferencePower_enc_fx_dirac( FOR( j = brange[0]; j < brange[1]; j++ ) { +#ifdef FIX_1127_IMPROVE_SBA_MLD + reference_power_W[i] = W_add( reference_power_W[i], W_shr( W_mult_32_32( Cldfb_RealBuffer[0][j], Cldfb_RealBuffer[0][j] ), gb ) ); + reference_power_W[i] = W_add( reference_power_W[i], W_shr( W_mult_32_32( Cldfb_ImagBuffer[0][j], Cldfb_ImagBuffer[0][j] ), gb ) ); +#else reference_power_W[i] = W_mac_32_32( reference_power_W[i], Cldfb_RealBuffer[0][j], Cldfb_RealBuffer[0][j] ); reference_power_W[i] = W_mac_32_32( reference_power_W[i], Cldfb_ImagBuffer[0][j], Cldfb_ImagBuffer[0][j] ); + e_reference_W = imult1616( (Word16) 2, e_Cldfb ); +#endif move64(); move64(); - - e_reference_W = imult1616( (Word16) 2, e_Cldfb ); } reference_power_temp[i] = W_add( reference_power_temp[i], reference_power_W[i] ); move64(); @@ -773,12 +791,16 @@ void computeReferencePower_enc_fx_dirac( /* abs()^2 */ FOR( j = brange[0]; j < brange[1]; j++ ) { +#ifdef FIX_1127_IMPROVE_SBA_MLD + reference_power_temp[i] = W_add( reference_power_temp[i], W_shr( W_mult_32_32( Cldfb_RealBuffer[ch_idx][j], Cldfb_RealBuffer[ch_idx][j] ), gb ) ); + reference_power_temp[i] = W_add( reference_power_temp[i], W_shr( W_mult_32_32( Cldfb_ImagBuffer[ch_idx][j], Cldfb_ImagBuffer[ch_idx][j] ), gb ) ); +#else reference_power_temp[i] = W_mac_32_32( reference_power_temp[i], Cldfb_RealBuffer[ch_idx][j], Cldfb_RealBuffer[ch_idx][j] ); reference_power_temp[i] = W_mac_32_32( reference_power_temp[i], Cldfb_ImagBuffer[ch_idx][j], Cldfb_ImagBuffer[ch_idx][j] ); + e_reference_temp = imult1616( (Word16) 2, e_Cldfb ); +#endif move64(); move64(); - - e_reference_temp = imult1616( (Word16) 2, e_Cldfb ); } } } @@ -813,7 +835,11 @@ void computeReferencePower_enc_fx_dirac( reference_power[i] = W_extract_h( W_shl( reference_power_temp[i], min_norm ) ); // Right shift with min_norm and extract high bits move32(); } +#ifdef FIX_1127_IMPROVE_SBA_MLD + *e_reference = sub( 31, sub( add( sub( 31, e_reference_temp ), min_norm ), 32 ) ); +#else *e_reference = sub( e_reference_temp, min_norm ); +#endif move16(); return; -- GitLab