diff --git a/lib_com/ivas_spar_com_fx.c b/lib_com/ivas_spar_com_fx.c index 69922637d969092d0bf7b5073d0a665570147d47..9b2e683070b360db2d583b860f7bcf51c7ee5440 100644 --- a/lib_com/ivas_spar_com_fx.c +++ b/lib_com/ivas_spar_com_fx.c @@ -802,7 +802,11 @@ static void ivas_get_pred_coeffs_enc_fx( tmp64 = W_mult0_32_32( w_norm_fac, dm_w ); // Q=q_tmp IF( LT_16( q_tmp, q_cov_real[0][0][b] ) ) { +#ifdef FIX_ISSUE_1811_EXCEEDING_W_SHIFTS + tmp64 = W_shr( tmp64, s_min( 63, sub( q_cov_real[0][0][b], q_tmp ) ) ); // Q=q_tmp +#else tmp64 = W_shr( tmp64, sub( q_cov_real[0][0][b], q_tmp ) ); // Q=q_tmp +#endif } ELSE { diff --git a/lib_com/options.h b/lib_com/options.h index fbfe61d36dd31f9b2d934c175675fd011eb6e1fc..f823ed38c6db005be5fd23771d59459949c8aa38 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -83,6 +83,7 @@ #define NONBE_SVD_OPTIMIZATION /* FhG: reduce WMOPS of HouseHolderReduction() in ivas_svd_dec.c() by removing redundant mathematics and using 64 bit additions */ #define FIX_1766_TCX2ACELP_BWE_ISSUE /* VA : Fix rare BWE issue when switching from TCX to ACELP */ #define FIX_1781_SPECTRAL_GAPS /* FhG: Change internal calculation of tcx_noise_factor_ivas_fx() to 32-bit*/ +#define FIX_ISSUE_1811_EXCEEDING_W_SHIFTS /* FhG: limit exceeding 64bit shifts */ /* #################### Start BASOP porting switches ############################ */ diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c old mode 100644 new mode 100755 index 67310a7c7a9d607ae5001364c572f9ca0f31ccfe..8e773ffd9e9f68651a37ceffb84420bb3e702876 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6903,7 +6903,11 @@ void synthesise_fb_high_band_fx( Word64 W_temp; t_Q = sub( shl( exp_tmp, 1 ), 8 ); +#ifdef FIX_ISSUE_1811_EXCEEDING_W_SHIFTS + P_ONE = W_shl( P_ONE, s_min( 63, sub( t_Q, 15 ) ) ); +#else P_ONE = W_shl( P_ONE, sub( t_Q, 15 ) ); +#endif W_temp = W_add( P_ONE, temp1 ); diff --git a/lib_com/tns_base.c b/lib_com/tns_base.c old mode 100644 new mode 100755 index ab5b41038471801befc0891d290a1b6eda80b629..217245eb7944825e909bf1971426b84f4f455713 --- a/lib_com/tns_base.c +++ b/lib_com/tns_base.c @@ -651,8 +651,11 @@ Word16 ITF_Detect_ivas_fx( { sum = W_mac_32_32( sum, temp_spectrum[i], temp_spectrum[i] ); // 2(Q+shift)+1 } - +#ifdef FIX_ISSUE_1811_EXCEEDING_W_SHIFTS + IF( LE_64( sum, W_shl( 32768 * 2 /* HLM_MIN_NRG in Q1 */, s_min( 63, shl( add( Q, shift ), 1 ) ) ) ) ) +#else IF( LE_64( sum, W_shl( 32768 * 2 /* HLM_MIN_NRG in Q1 */, shl( add( Q, shift ), 1 ) ) ) ) +#endif { BREAK; } diff --git a/lib_dec/ivas_lfe_plc_fx.c b/lib_dec/ivas_lfe_plc_fx.c old mode 100644 new mode 100755 index a480ce7bebdcb58eb606d72f4f76374b1747370a..2510ded1564a1971c7a8df0f5298abfd548a487a --- a/lib_dec/ivas_lfe_plc_fx.c +++ b/lib_dec/ivas_lfe_plc_fx.c @@ -646,7 +646,11 @@ static void d_syn_filt_fx( } ELSE { +#ifdef FIX_ISSUE_1811_EXCEEDING_W_SHIFTS + s_fx = W_sub( W_shr( s_fx, s_min( 63, sub( s_q_fx, temp_q ) ) ), temp ); +#else s_fx = W_sub( W_shr( s_fx, sub( s_q_fx, temp_q ) ), temp ); +#endif s_q_fx = temp_q; move16(); } diff --git a/lib_dec/ivas_svd_dec_fx.c b/lib_dec/ivas_svd_dec_fx.c old mode 100644 new mode 100755 index 610b43a935178998fc1042db889d7156ff99783a..4a8b067b38e51eaf53a61ce4c2ea43eab8c8d5b4 --- a/lib_dec/ivas_svd_dec_fx.c +++ b/lib_dec/ivas_svd_dec_fx.c @@ -1504,7 +1504,11 @@ static void singularVectorsAccumulationLeft_fx( FOR( k = nCh + 1; k < nChannelsL; k++ ) /* nChannelsL */ { +#ifdef FIX_ISSUE_1811_EXCEEDING_W_SHIFTS + acc = W_add( acc, W_shr( prod[k], s_min( 63, sub( max_e, prod_e[k] ) ) ) ); +#else acc = W_add( acc, W_shr( prod[k], sub( max_e, prod_e[k] ) ) ); +#endif } Word16 acc_e = W_norm( acc ); acc = W_shl( acc, acc_e ); diff --git a/lib_enc/ivas_mdct_core_enc_fx.c b/lib_enc/ivas_mdct_core_enc_fx.c index 4d8bc7b9979f5a8e60a9b8cbb79cc9c8e942020f..e3da229c3abd5eb296653987f3766a589a54ae9b 100644 --- a/lib_enc/ivas_mdct_core_enc_fx.c +++ b/lib_enc/ivas_mdct_core_enc_fx.c @@ -1964,7 +1964,11 @@ void ivas_mdct_core_whitening_enc_fx( move64(); FOR( i = 0; i < NB_DIV; i++ ) { +#ifdef FIX_ISSUE_1811_EXCEEDING_W_SHIFTS + chE_tot_fx = W_add( W_shr( chE_fx[i], s_min( 63, sub( chE_q[i], q ) ) ), chE_tot_fx ); +#else chE_tot_fx = W_add( W_shr( chE_fx[i], sub( chE_q[i], q ) ), chE_tot_fx ); +#endif } IF( GT_16( q, Q24 ) ) { diff --git a/lib_enc/nois_est_fx.c b/lib_enc/nois_est_fx.c index 99bd4d86b58bea27222eec2a19a2163e48021491..ec358200337d542ed7bcd30fc45ca2d5c1f294d4 100644 --- a/lib_enc/nois_est_fx.c +++ b/lib_enc/nois_est_fx.c @@ -2472,8 +2472,12 @@ void noise_est_ivas_fx( ExpDen = sub( add( q_fr_bands, exp ), Q16 ); } - num = div_s( num, den ); // Q15+ExpNum-ExpDen - w_tmp = W_shl( num, sub( q_fr_bands, sub( ExpNum, ExpDen ) ) ); // q_fr_bands+15 + num = div_s( num, den ); // Q15+ExpNum-ExpDen +#ifdef FIX_ISSUE_1811_EXCEEDING_W_SHIFTS + w_tmp = W_shl( num, s_min( 63, sub( q_fr_bands, sub( ExpNum, ExpDen ) ) ) ); // q_fr_bands+15 +#else + w_tmp = W_shl( num, sub( q_fr_bands, sub( ExpNum, ExpDen ) ) ); // q_fr_bands+15 +#endif w_sum_num = W_add( w_sum_num, w_tmp ); pt1++; diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c old mode 100644 new mode 100755 index 90cf37e88cf072642e56d82525afadbe3adfbab5..9a39eaf38bcf2a8dec667851a36630466ae77582 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -4007,10 +4007,17 @@ static void matrixTransp1Mul_fx( { FOR( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) { +#ifdef FIX_ISSUE_1811_EXCEEDING_W_SHIFTS + outRe_fx[chA][chB] = W_extract_h( W_shl( tmp_outRe_fx[chA][chB], s_max( -63, sub( q_common, q_tmp_outRe_fx[chA][chB] ) ) ) ); + move32(); + outIm_fx[chA][chB] = W_extract_h( W_shl( tmp_outIm_fx[chA][chB], s_max( -63, sub( q_common, q_tmp_outIm_fx[chA][chB] ) ) ) ); + move32(); +#else outRe_fx[chA][chB] = W_extract_h( W_shl( tmp_outRe_fx[chA][chB], sub( q_common, q_tmp_outRe_fx[chA][chB] ) ) ); move32(); outIm_fx[chA][chB] = W_extract_h( W_shl( tmp_outIm_fx[chA][chB], sub( q_common, q_tmp_outIm_fx[chA][chB] ) ) ); move32(); +#endif } } *q_out = sub( q_common, 32 ); diff --git a/lib_rend/ivas_objectRenderer_sfx_fx.c b/lib_rend/ivas_objectRenderer_sfx_fx.c index a2f66839fca7ab9452ce097d20d4272c87751632..de287937039d75501f4baab9d318558ae12ec777 100644 --- a/lib_rend/ivas_objectRenderer_sfx_fx.c +++ b/lib_rend/ivas_objectRenderer_sfx_fx.c @@ -229,7 +229,11 @@ static void sincResample_fx( /* Calculate the sinc-index for the center value of the sinc */ Word16 center_val_e; Word64 center_val; +#ifndef FIX_ISSUE_1811_EXCEEDING_W_SHIFTS center_val = W_sub( t_frac_plus_eps, W_shl( t, sub( 31, t_frac_plus_eps_e ) ) ); // exp(center_val_e) +#else + center_val = W_sub( t_frac_plus_eps, W_shl( t, s_min( sub( 31, t_frac_plus_eps_e ), 63 ) ) ); // exp( center_val_e ) +#endif center_val_e = add( t_frac_plus_eps_e, 6 ); Word16 com_e = s_max( 0, center_val_e ); center_val = W_add( W_shr( center_val, sub( com_e, center_val_e ) ), W_shl( 1, sub( 30, com_e ) ) ); // exp(center_val_e)