Loading lib_basop/enh64.c +28 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,10 @@ #include <stdlib.h> #include "stl.h" #ifdef FIX_2493_CHECK_64BIT #include <assert.h> #endif #define WMC_TOOL_SKIP /***************************************************************************** Loading Loading @@ -74,7 +78,9 @@ Word64 W_add_nosat( Word64 L64_var1, Word64 L64_var2 ) { Word64 L64_var_out; #ifdef FIX_2493_CHECK_64BIT assert( !( ( L64_var2 > 0 && L64_var1 > MAX_64 - L64_var2 ) || ( L64_var2 < 0 && L64_var1 < MIN_64 - L64_var2 ) ) ); #endif L64_var_out = L64_var1 + L64_var2; #ifdef WMOPS Loading Loading @@ -117,7 +123,9 @@ Word64 W_add_nosat( Word64 L64_var1, Word64 L64_var2 ) Word64 W_sub_nosat( Word64 L64_var1, Word64 L64_var2 ) { Word64 L64_var_out; #ifdef FIX_2493_CHECK_64BIT assert( !( ( L64_var2 < 0 && L64_var1 > MAX_64 + L64_var2 ) || ( L64_var2 > 0 && L64_var1 < MIN_64 + L64_var2 ) ) ); #endif L64_var_out = L64_var1 - L64_var2; #ifdef WMOPS Loading Loading @@ -316,6 +324,9 @@ Word64 W_shl_nosat( Word64 L64_var1, Word16 var2 ) } else { #ifdef FIX_2493_CHECK_64BIT assert( ( ( L64_var1 << var2 ) >> var2 ) == L64_var1 ); #endif L64_var_out = L64_var1 << var2; } #ifdef WMOPS Loading Loading @@ -369,6 +380,9 @@ Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 ) if ( var2 < 0 ) { var2 = -var2; #ifdef FIX_2493_CHECK_64BIT assert( ( ( L64_var1 << var2 ) >> var2 ) == L64_var1 ); #endif L64_var_out = L64_var1 << var2; } else Loading Loading @@ -423,6 +437,9 @@ Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 ) Word64 W_mac_32_16( Word64 L64_var1, Word32 L_var2, Word16 var3 ) { Word64 L64_var_out = ( (Word64) L_var2 * var3 ) << 1; #ifdef FIX_2493_CHECK_64BIT assert( !( ( L64_var_out > 0 && L64_var1 > MAX_64 - L64_var_out ) || ( L64_var_out < 0 && L64_var1 < MIN_64 - L64_var_out ) ) ); #endif L64_var_out += L64_var1; #ifdef WMOPS multiCounter[currCounter].W_mac_32_16++; Loading Loading @@ -470,6 +487,9 @@ Word64 W_mac_32_16( Word64 L64_var1, Word32 L_var2, Word16 var3 ) Word64 W_msu_32_16( Word64 L64_var1, Word32 L_var2, Word16 var3 ) { Word64 L64_var_out = ( (Word64) L_var2 * var3 ) << 1; #ifdef FIX_2493_CHECK_64BIT assert( !( ( L64_var_out < 0 && L64_var1 > MAX_64 + L64_var_out ) || ( L64_var_out > 0 && L64_var1 < MIN_64 + L64_var_out ) ) ); #endif L64_var_out = L64_var1 - L64_var_out; #ifdef WMOPS multiCounter[currCounter].W_msu_32_16++; Loading Loading @@ -596,6 +616,9 @@ Word64 W_mult0_16_16( Word16 var1, Word16 var2 ) Word64 W_mac0_16_16( Word64 L64_var1, Word16 var2, Word16 var3 ) { Word64 L64_var_out = (Word64) var2 * var3; #ifdef FIX_2493_CHECK_64BIT assert( !( ( L64_var_out > 0 && L64_var1 > MAX_64 - L64_var_out ) || ( L64_var_out < 0 && L64_var1 < MIN_64 - L64_var_out ) ) ); #endif L64_var_out += L64_var1; #ifdef WMOPS multiCounter[currCounter].W_mac0_16_16++; Loading Loading @@ -642,6 +665,9 @@ Word64 W_mac0_16_16( Word64 L64_var1, Word16 var2, Word16 var3 ) Word64 W_msu0_16_16( Word64 L64_var1, Word16 var2, Word16 var3 ) { Word64 L64_var_out = (Word64) var2 * var3; #ifdef FIX_2493_CHECK_64BIT assert( !( ( L64_var_out < 0 && L64_var1 > MAX_64 + L64_var_out ) || ( L64_var_out > 0 && L64_var1 < MIN_64 + L64_var_out ) ) ); #endif L64_var_out = L64_var1 - L64_var_out; #ifdef WMOPS multiCounter[currCounter].W_msu0_16_16++; Loading lib_com/ivas_spar_com_quant_util_fx.c +15 −0 Original line number Diff line number Diff line Loading @@ -356,23 +356,38 @@ void ivas_map_prior_coeffs_quant( { FOR( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) { #ifdef FIX_2493_CHECK_EXTRACT_L_FIX_INSTRUMENTATION Word16 trial1_16 = imult1616( sub( qs.PR.q_levels[0], 1 ), pSpar_md_prior->band_coeffs_idx[i].pred_index_re[j] ); /*q0*/ pSpar_md_prior->band_coeffs_idx_mapped[i].pred_index_re[j] = round_fx( Mpy_32_16_1( one_by_q_lvl_PR_fx, trial1_16 ) ); /*q0*/ #else Word32 trial1 = L_mult0( sub( qs.PR.q_levels[0], 1 ), pSpar_md_prior->band_coeffs_idx[i].pred_index_re[j] ); /*q0*/ trial1 = L_shl( trial1, 16 ); /*q16*/ trial1 = round_fx( Mpy_32_32( trial1, one_by_q_lvl_PR_fx ) ); /*q16+q31-31-16->0*/ pSpar_md_prior->band_coeffs_idx_mapped[i].pred_index_re[j] = extract_l( trial1 ); /*q0*/ #endif move16(); #ifdef FIX_2493_CHECK_EXTRACT_L_FIX_INSTRUMENTATION Word16 trial2_16 = imult1616( sub( qs.P_r.q_levels[0], 1 ), pSpar_md_prior->band_coeffs_idx[i].decd_index_re[j] ); /*q0*/ pSpar_md_prior->band_coeffs_idx_mapped[i].decd_index_re[j] = round_fx( Mpy_32_16_1( one_by_q_lvl_P_r_fx, trial2_16 ) ); /*q0*/ #else Word32 trial2 = L_mult0( sub( qs.P_r.q_levels[0], 1 ), pSpar_md_prior->band_coeffs_idx[i].decd_index_re[j] ); /*q0*/ trial2 = L_shl( trial2, 16 ); /*q16*/ trial2 = round_fx( Mpy_32_32( trial2, one_by_q_lvl_P_r_fx ) ); /*q16+q31-31-16->0*/ pSpar_md_prior->band_coeffs_idx_mapped[i].decd_index_re[j] = extract_l( trial2 ); /*q0*/ #endif move16(); } FOR( j = 0; j < IVAS_SPAR_MAX_C_COEFF; j++ ) { #ifdef FIX_2493_CHECK_EXTRACT_L_FIX_INSTRUMENTATION Word16 trial1_16 = imult1616( sub( qs.C.q_levels[0], 1 ), pSpar_md_prior->band_coeffs_idx[i].drct_index_re[j] ); /*q0*/ pSpar_md_prior->band_coeffs_idx_mapped[i].drct_index_re[j] = round_fx( Mpy_32_16_1( one_by_q_lvl_C_fx, trial1_16 ) ); /*q0*/ #else Word32 trial1 = L_mult0( sub( qs.C.q_levels[0], 1 ), pSpar_md_prior->band_coeffs_idx[i].drct_index_re[j] ); /*q0*/ trial1 = L_shl( trial1, 16 ); /*q16*/ trial1 = round_fx( Mpy_32_32( trial1, one_by_q_lvl_C_fx ) ); /*q16+q31-31-16->0*/ pSpar_md_prior->band_coeffs_idx_mapped[i].drct_index_re[j] = extract_l( trial1 ); /*q0*/ #endif move16(); } } Loading lib_com/options.h +15 −0 Original line number Diff line number Diff line Loading @@ -100,6 +100,21 @@ #define FIX_BASOP_2640_MASA_STEREO_TYPE_ASSERT /* Nokia: BASOP issue 2640: Fix assert by saturating shift when exponent difference is very large. */ #define FIX_2636_OMASA_INTERFORMAT_BRATE /* VA: basop issue 2636: Correct condition in function ivas_interformat_brate_fx() */ #define FIX_2493_CHECK_64BIT /* FhG: Verify that 64 bit ops do not encounter an overflow. */ #define NONBE_FIX_2493_EXTRACT_L_estDownmixGain_fx /* FhG: Fix extract_l overflow inside estDownmixGain_fx() */ #define NONBE_FIX_2493_EXTRACT_L_swb_pre_proc_fx /* FhG: Fix extract_l overflow inside swb_pre_proc_fx(). Saturation, not a optimal fix. */ #define NONBE_FIX_2493_EXTRACT_L_spectral_balancer_fx16 /* FhG: Fix extract_l overflow inside spectral_balancer_fx16(). Saturation, not a optimal fix. */ #define NONBE_FIX_2493_EXTRACT_L_IGF_CalculateStereoEnvelope_fx /* FhG: Fix extract_l overflow inside IGF_CalculateStereoEnvelope_fx(). Was completely wrong. */ #define NONBE_FIX_2493_EXTRACT_L_GetTCXMaxenergyChange_fx /* FhG: Fix extract_l overflow inside GetTCXMaxenergyChange_fx(). Saturation, not a optimal fix. */ #define NONBE_FIX_2493_EXTRACT_L_res_bpf_adapt_ivas_fx /* FhG: Fix extract_l overflow inside res_bpf_adapt_ivas_fx() */ #define NONBE_FIX_2493_EXTRACT_L_ivas_core_dec_fx /* FhG: Fix extract_l overflow inside ivas_core_dec_fx(). Saturation, not a optimal fix. */ #define NONBE_FIX_2493_EXTRACT_L_d_syn_filt_fx /* FhG: Fix extract_l overflow inside d_syn_filt_fx(). W_shr( x, s ) with s out of range problem. */ #define NONBE_FIX_2493_EXTRACT_L_acelp_core_dec_fx /* FhG: Fix extract_l overflow inside acelp_core_dec_fx() */ #define NONBE_FIX_2493_EXTRACT_L_acelp_fast_fx /* FhG: Fix extract_l overflow inside acelp_fast_fx(). Saturation, not a optimal fix. */ #define NONBE_FIX_2493_EXTRACT_L_swb_tbe_enc_fx /* FhG: Fix extract_l overflow inside swb_tbe_enc_fx() */ #define NONBE_FIX_2493_EXTRACT_L_bw_detect_fx /* FhG: Fix extract_l overflow inside bw_detect_fx(). Saturation, not a optimal fix. */ #define FIX_2493_CHECK_EXTRACT_L_FIX_INSTRUMENTATION /* FhG: Fix instrumentation related to extract_l. */ /* ##################### End NON-BE switches ########################### */ /* ################## End MAINTENANCE switches ######################### */ Loading lib_dec/acelp_core_dec_fx.c +14 −0 Original line number Diff line number Diff line Loading @@ -2262,12 +2262,26 @@ ivas_error acelp_core_dec_fx( } ELSE { #ifdef NONBE_FIX_2493_EXTRACT_L_acelp_core_dec_fx Word16 exc_q; Word16 old_bwe_exc_fx2[( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 )]; exc_q = s_min( st->Q_exc, shr( add( norm_arr( st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET ), st->hBWE_TD->q_old_bwe_exc_extended_fx ), 1 ) ); Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, sub( shl( exc_q, 1 ), st->hBWE_TD->q_old_bwe_exc_extended_fx ) ); /* Q(q_old_bwe_exc_extended_fx) -> Q(2 * exc_q) */ Copy_Scale_sig_nosat( old_bwe_exc_fx, old_bwe_exc_fx2, ( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 ), sub( exc_q, st->Q_exc ) ); non_linearity_fx( st->element_mode, old_bwe_exc_fx2 + PIT16k_MAX * 2, bwe_exc_extended_fx + NL_BUFF_OFFSET, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, exc_q, st->coder_type, voice_factors_fx, st->L_frame ); exp = sub( L_norm_arr( bwe_exc_extended_fx + L_FRAME32k, NL_BUFF_OFFSET ), 16 ); Copy_Scale_sig_32_16_nosat( bwe_exc_extended_fx + L_FRAME32k, st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET, exp ); /* Q(2 * Q_exc) -> Q(q_old_bwe_exc_extended_fx) */ st->hBWE_TD->q_old_bwe_exc_extended_fx = add( shl( exc_q, 1 ), exp ); move16(); #else Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( st->Q_exc, 1 ), st->hBWE_TD->q_old_bwe_exc_extended_fx ) ) ); /* Q(q_old_bwe_exc_extended_fx) -> Q(2 * Q_exc) */ non_linearity_fx( st->element_mode, bwe_exc_fx, bwe_exc_extended_fx + NL_BUFF_OFFSET, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); exp = sub( L_norm_arr( bwe_exc_extended_fx + L_FRAME32k, NL_BUFF_OFFSET ), 16 ); Copy_Scale_sig_32_16( bwe_exc_extended_fx + L_FRAME32k, st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET, exp ); /* Q(2 * Q_exc) -> Q(q_old_bwe_exc_extended_fx) */ st->hBWE_TD->q_old_bwe_exc_extended_fx = add( shl( st->Q_exc, 1 ), exp ); move16(); #endif } } Loading lib_dec/bass_psfilter_fx.c +15 −0 Original line number Diff line number Diff line Loading @@ -990,8 +990,13 @@ Word16 res_bpf_adapt_ivas_fx( move16(); i_end = 64; move16(); #ifdef NONBE_FIX_2493_EXTRACT_L_res_bpf_adapt_ivas_fx bw_inv = 10486; move16(); /* 1/(64 - 39) in Q18 */ #else bw_inv = 1311; move16(); /* 1/(64 - 39) in Q15 */ #endif } ELSE { Loading @@ -999,8 +1004,13 @@ Word16 res_bpf_adapt_ivas_fx( move16(); i_end = 40; move16(); #ifdef NONBE_FIX_2493_EXTRACT_L_res_bpf_adapt_ivas_fx bw_inv = 21845; move16(); /* 1/(40 - 28) in Q18 */ #else bw_inv = 2720; move16(); /* 1/(40 - 28) in Q15*/ #endif } /* Measure energy of high frequency band in MDCT domain */ Loading @@ -1011,8 +1021,13 @@ Word16 res_bpf_adapt_ivas_fx( W_tmp = W_add_nosat( W_tmp, W_mult0_32_32( res_buf[i], res_buf[i] ) ); } #ifdef NONBE_FIX_2493_EXTRACT_L_res_bpf_adapt_ivas_fx res_hb_nrg = W_extract_h( W_shl( W_tmp, sub( 32 - 3, shl( q_res, 1 ) ) ) ); // Q-3 res_hb_nrg = Mpy_32_16_1( res_hb_nrg, bw_inv ); // Q0 #else res_hb_nrg = W_extract_l( W_shr( W_tmp, shl( q_res, 1 ) ) ); // Q0 res_hb_nrg = Mpy_32_16_1( res_hb_nrg, bw_inv ); // Q0 #endif res_hb_nrg = L_add( Mpy_32_16_1( res_hb_nrg, STEREO_DFT_BPF_ADAPT_ALPHA_FX ), Mpy_32_16_1( hStereoDft->res_hb_nrg_mem_fx, sub( MAX_16, STEREO_DFT_BPF_ADAPT_ALPHA_FX ) ) ); hStereoDft->res_hb_nrg_mem_fx = res_hb_nrg; move32(); Loading Loading
lib_basop/enh64.c +28 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,10 @@ #include <stdlib.h> #include "stl.h" #ifdef FIX_2493_CHECK_64BIT #include <assert.h> #endif #define WMC_TOOL_SKIP /***************************************************************************** Loading Loading @@ -74,7 +78,9 @@ Word64 W_add_nosat( Word64 L64_var1, Word64 L64_var2 ) { Word64 L64_var_out; #ifdef FIX_2493_CHECK_64BIT assert( !( ( L64_var2 > 0 && L64_var1 > MAX_64 - L64_var2 ) || ( L64_var2 < 0 && L64_var1 < MIN_64 - L64_var2 ) ) ); #endif L64_var_out = L64_var1 + L64_var2; #ifdef WMOPS Loading Loading @@ -117,7 +123,9 @@ Word64 W_add_nosat( Word64 L64_var1, Word64 L64_var2 ) Word64 W_sub_nosat( Word64 L64_var1, Word64 L64_var2 ) { Word64 L64_var_out; #ifdef FIX_2493_CHECK_64BIT assert( !( ( L64_var2 < 0 && L64_var1 > MAX_64 + L64_var2 ) || ( L64_var2 > 0 && L64_var1 < MIN_64 + L64_var2 ) ) ); #endif L64_var_out = L64_var1 - L64_var2; #ifdef WMOPS Loading Loading @@ -316,6 +324,9 @@ Word64 W_shl_nosat( Word64 L64_var1, Word16 var2 ) } else { #ifdef FIX_2493_CHECK_64BIT assert( ( ( L64_var1 << var2 ) >> var2 ) == L64_var1 ); #endif L64_var_out = L64_var1 << var2; } #ifdef WMOPS Loading Loading @@ -369,6 +380,9 @@ Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 ) if ( var2 < 0 ) { var2 = -var2; #ifdef FIX_2493_CHECK_64BIT assert( ( ( L64_var1 << var2 ) >> var2 ) == L64_var1 ); #endif L64_var_out = L64_var1 << var2; } else Loading Loading @@ -423,6 +437,9 @@ Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 ) Word64 W_mac_32_16( Word64 L64_var1, Word32 L_var2, Word16 var3 ) { Word64 L64_var_out = ( (Word64) L_var2 * var3 ) << 1; #ifdef FIX_2493_CHECK_64BIT assert( !( ( L64_var_out > 0 && L64_var1 > MAX_64 - L64_var_out ) || ( L64_var_out < 0 && L64_var1 < MIN_64 - L64_var_out ) ) ); #endif L64_var_out += L64_var1; #ifdef WMOPS multiCounter[currCounter].W_mac_32_16++; Loading Loading @@ -470,6 +487,9 @@ Word64 W_mac_32_16( Word64 L64_var1, Word32 L_var2, Word16 var3 ) Word64 W_msu_32_16( Word64 L64_var1, Word32 L_var2, Word16 var3 ) { Word64 L64_var_out = ( (Word64) L_var2 * var3 ) << 1; #ifdef FIX_2493_CHECK_64BIT assert( !( ( L64_var_out < 0 && L64_var1 > MAX_64 + L64_var_out ) || ( L64_var_out > 0 && L64_var1 < MIN_64 + L64_var_out ) ) ); #endif L64_var_out = L64_var1 - L64_var_out; #ifdef WMOPS multiCounter[currCounter].W_msu_32_16++; Loading Loading @@ -596,6 +616,9 @@ Word64 W_mult0_16_16( Word16 var1, Word16 var2 ) Word64 W_mac0_16_16( Word64 L64_var1, Word16 var2, Word16 var3 ) { Word64 L64_var_out = (Word64) var2 * var3; #ifdef FIX_2493_CHECK_64BIT assert( !( ( L64_var_out > 0 && L64_var1 > MAX_64 - L64_var_out ) || ( L64_var_out < 0 && L64_var1 < MIN_64 - L64_var_out ) ) ); #endif L64_var_out += L64_var1; #ifdef WMOPS multiCounter[currCounter].W_mac0_16_16++; Loading Loading @@ -642,6 +665,9 @@ Word64 W_mac0_16_16( Word64 L64_var1, Word16 var2, Word16 var3 ) Word64 W_msu0_16_16( Word64 L64_var1, Word16 var2, Word16 var3 ) { Word64 L64_var_out = (Word64) var2 * var3; #ifdef FIX_2493_CHECK_64BIT assert( !( ( L64_var_out < 0 && L64_var1 > MAX_64 + L64_var_out ) || ( L64_var_out > 0 && L64_var1 < MIN_64 + L64_var_out ) ) ); #endif L64_var_out = L64_var1 - L64_var_out; #ifdef WMOPS multiCounter[currCounter].W_msu0_16_16++; Loading
lib_com/ivas_spar_com_quant_util_fx.c +15 −0 Original line number Diff line number Diff line Loading @@ -356,23 +356,38 @@ void ivas_map_prior_coeffs_quant( { FOR( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) { #ifdef FIX_2493_CHECK_EXTRACT_L_FIX_INSTRUMENTATION Word16 trial1_16 = imult1616( sub( qs.PR.q_levels[0], 1 ), pSpar_md_prior->band_coeffs_idx[i].pred_index_re[j] ); /*q0*/ pSpar_md_prior->band_coeffs_idx_mapped[i].pred_index_re[j] = round_fx( Mpy_32_16_1( one_by_q_lvl_PR_fx, trial1_16 ) ); /*q0*/ #else Word32 trial1 = L_mult0( sub( qs.PR.q_levels[0], 1 ), pSpar_md_prior->band_coeffs_idx[i].pred_index_re[j] ); /*q0*/ trial1 = L_shl( trial1, 16 ); /*q16*/ trial1 = round_fx( Mpy_32_32( trial1, one_by_q_lvl_PR_fx ) ); /*q16+q31-31-16->0*/ pSpar_md_prior->band_coeffs_idx_mapped[i].pred_index_re[j] = extract_l( trial1 ); /*q0*/ #endif move16(); #ifdef FIX_2493_CHECK_EXTRACT_L_FIX_INSTRUMENTATION Word16 trial2_16 = imult1616( sub( qs.P_r.q_levels[0], 1 ), pSpar_md_prior->band_coeffs_idx[i].decd_index_re[j] ); /*q0*/ pSpar_md_prior->band_coeffs_idx_mapped[i].decd_index_re[j] = round_fx( Mpy_32_16_1( one_by_q_lvl_P_r_fx, trial2_16 ) ); /*q0*/ #else Word32 trial2 = L_mult0( sub( qs.P_r.q_levels[0], 1 ), pSpar_md_prior->band_coeffs_idx[i].decd_index_re[j] ); /*q0*/ trial2 = L_shl( trial2, 16 ); /*q16*/ trial2 = round_fx( Mpy_32_32( trial2, one_by_q_lvl_P_r_fx ) ); /*q16+q31-31-16->0*/ pSpar_md_prior->band_coeffs_idx_mapped[i].decd_index_re[j] = extract_l( trial2 ); /*q0*/ #endif move16(); } FOR( j = 0; j < IVAS_SPAR_MAX_C_COEFF; j++ ) { #ifdef FIX_2493_CHECK_EXTRACT_L_FIX_INSTRUMENTATION Word16 trial1_16 = imult1616( sub( qs.C.q_levels[0], 1 ), pSpar_md_prior->band_coeffs_idx[i].drct_index_re[j] ); /*q0*/ pSpar_md_prior->band_coeffs_idx_mapped[i].drct_index_re[j] = round_fx( Mpy_32_16_1( one_by_q_lvl_C_fx, trial1_16 ) ); /*q0*/ #else Word32 trial1 = L_mult0( sub( qs.C.q_levels[0], 1 ), pSpar_md_prior->band_coeffs_idx[i].drct_index_re[j] ); /*q0*/ trial1 = L_shl( trial1, 16 ); /*q16*/ trial1 = round_fx( Mpy_32_32( trial1, one_by_q_lvl_C_fx ) ); /*q16+q31-31-16->0*/ pSpar_md_prior->band_coeffs_idx_mapped[i].drct_index_re[j] = extract_l( trial1 ); /*q0*/ #endif move16(); } } Loading
lib_com/options.h +15 −0 Original line number Diff line number Diff line Loading @@ -100,6 +100,21 @@ #define FIX_BASOP_2640_MASA_STEREO_TYPE_ASSERT /* Nokia: BASOP issue 2640: Fix assert by saturating shift when exponent difference is very large. */ #define FIX_2636_OMASA_INTERFORMAT_BRATE /* VA: basop issue 2636: Correct condition in function ivas_interformat_brate_fx() */ #define FIX_2493_CHECK_64BIT /* FhG: Verify that 64 bit ops do not encounter an overflow. */ #define NONBE_FIX_2493_EXTRACT_L_estDownmixGain_fx /* FhG: Fix extract_l overflow inside estDownmixGain_fx() */ #define NONBE_FIX_2493_EXTRACT_L_swb_pre_proc_fx /* FhG: Fix extract_l overflow inside swb_pre_proc_fx(). Saturation, not a optimal fix. */ #define NONBE_FIX_2493_EXTRACT_L_spectral_balancer_fx16 /* FhG: Fix extract_l overflow inside spectral_balancer_fx16(). Saturation, not a optimal fix. */ #define NONBE_FIX_2493_EXTRACT_L_IGF_CalculateStereoEnvelope_fx /* FhG: Fix extract_l overflow inside IGF_CalculateStereoEnvelope_fx(). Was completely wrong. */ #define NONBE_FIX_2493_EXTRACT_L_GetTCXMaxenergyChange_fx /* FhG: Fix extract_l overflow inside GetTCXMaxenergyChange_fx(). Saturation, not a optimal fix. */ #define NONBE_FIX_2493_EXTRACT_L_res_bpf_adapt_ivas_fx /* FhG: Fix extract_l overflow inside res_bpf_adapt_ivas_fx() */ #define NONBE_FIX_2493_EXTRACT_L_ivas_core_dec_fx /* FhG: Fix extract_l overflow inside ivas_core_dec_fx(). Saturation, not a optimal fix. */ #define NONBE_FIX_2493_EXTRACT_L_d_syn_filt_fx /* FhG: Fix extract_l overflow inside d_syn_filt_fx(). W_shr( x, s ) with s out of range problem. */ #define NONBE_FIX_2493_EXTRACT_L_acelp_core_dec_fx /* FhG: Fix extract_l overflow inside acelp_core_dec_fx() */ #define NONBE_FIX_2493_EXTRACT_L_acelp_fast_fx /* FhG: Fix extract_l overflow inside acelp_fast_fx(). Saturation, not a optimal fix. */ #define NONBE_FIX_2493_EXTRACT_L_swb_tbe_enc_fx /* FhG: Fix extract_l overflow inside swb_tbe_enc_fx() */ #define NONBE_FIX_2493_EXTRACT_L_bw_detect_fx /* FhG: Fix extract_l overflow inside bw_detect_fx(). Saturation, not a optimal fix. */ #define FIX_2493_CHECK_EXTRACT_L_FIX_INSTRUMENTATION /* FhG: Fix instrumentation related to extract_l. */ /* ##################### End NON-BE switches ########################### */ /* ################## End MAINTENANCE switches ######################### */ Loading
lib_dec/acelp_core_dec_fx.c +14 −0 Original line number Diff line number Diff line Loading @@ -2262,12 +2262,26 @@ ivas_error acelp_core_dec_fx( } ELSE { #ifdef NONBE_FIX_2493_EXTRACT_L_acelp_core_dec_fx Word16 exc_q; Word16 old_bwe_exc_fx2[( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 )]; exc_q = s_min( st->Q_exc, shr( add( norm_arr( st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET ), st->hBWE_TD->q_old_bwe_exc_extended_fx ), 1 ) ); Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, sub( shl( exc_q, 1 ), st->hBWE_TD->q_old_bwe_exc_extended_fx ) ); /* Q(q_old_bwe_exc_extended_fx) -> Q(2 * exc_q) */ Copy_Scale_sig_nosat( old_bwe_exc_fx, old_bwe_exc_fx2, ( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 ), sub( exc_q, st->Q_exc ) ); non_linearity_fx( st->element_mode, old_bwe_exc_fx2 + PIT16k_MAX * 2, bwe_exc_extended_fx + NL_BUFF_OFFSET, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, exc_q, st->coder_type, voice_factors_fx, st->L_frame ); exp = sub( L_norm_arr( bwe_exc_extended_fx + L_FRAME32k, NL_BUFF_OFFSET ), 16 ); Copy_Scale_sig_32_16_nosat( bwe_exc_extended_fx + L_FRAME32k, st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET, exp ); /* Q(2 * Q_exc) -> Q(q_old_bwe_exc_extended_fx) */ st->hBWE_TD->q_old_bwe_exc_extended_fx = add( shl( exc_q, 1 ), exp ); move16(); #else Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( st->Q_exc, 1 ), st->hBWE_TD->q_old_bwe_exc_extended_fx ) ) ); /* Q(q_old_bwe_exc_extended_fx) -> Q(2 * Q_exc) */ non_linearity_fx( st->element_mode, bwe_exc_fx, bwe_exc_extended_fx + NL_BUFF_OFFSET, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); exp = sub( L_norm_arr( bwe_exc_extended_fx + L_FRAME32k, NL_BUFF_OFFSET ), 16 ); Copy_Scale_sig_32_16( bwe_exc_extended_fx + L_FRAME32k, st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET, exp ); /* Q(2 * Q_exc) -> Q(q_old_bwe_exc_extended_fx) */ st->hBWE_TD->q_old_bwe_exc_extended_fx = add( shl( st->Q_exc, 1 ), exp ); move16(); #endif } } Loading
lib_dec/bass_psfilter_fx.c +15 −0 Original line number Diff line number Diff line Loading @@ -990,8 +990,13 @@ Word16 res_bpf_adapt_ivas_fx( move16(); i_end = 64; move16(); #ifdef NONBE_FIX_2493_EXTRACT_L_res_bpf_adapt_ivas_fx bw_inv = 10486; move16(); /* 1/(64 - 39) in Q18 */ #else bw_inv = 1311; move16(); /* 1/(64 - 39) in Q15 */ #endif } ELSE { Loading @@ -999,8 +1004,13 @@ Word16 res_bpf_adapt_ivas_fx( move16(); i_end = 40; move16(); #ifdef NONBE_FIX_2493_EXTRACT_L_res_bpf_adapt_ivas_fx bw_inv = 21845; move16(); /* 1/(40 - 28) in Q18 */ #else bw_inv = 2720; move16(); /* 1/(40 - 28) in Q15*/ #endif } /* Measure energy of high frequency band in MDCT domain */ Loading @@ -1011,8 +1021,13 @@ Word16 res_bpf_adapt_ivas_fx( W_tmp = W_add_nosat( W_tmp, W_mult0_32_32( res_buf[i], res_buf[i] ) ); } #ifdef NONBE_FIX_2493_EXTRACT_L_res_bpf_adapt_ivas_fx res_hb_nrg = W_extract_h( W_shl( W_tmp, sub( 32 - 3, shl( q_res, 1 ) ) ) ); // Q-3 res_hb_nrg = Mpy_32_16_1( res_hb_nrg, bw_inv ); // Q0 #else res_hb_nrg = W_extract_l( W_shr( W_tmp, shl( q_res, 1 ) ) ); // Q0 res_hb_nrg = Mpy_32_16_1( res_hb_nrg, bw_inv ); // Q0 #endif res_hb_nrg = L_add( Mpy_32_16_1( res_hb_nrg, STEREO_DFT_BPF_ADAPT_ALPHA_FX ), Mpy_32_16_1( hStereoDft->res_hb_nrg_mem_fx, sub( MAX_16, STEREO_DFT_BPF_ADAPT_ALPHA_FX ) ) ); hStereoDft->res_hb_nrg_mem_fx = res_hb_nrg; move32(); Loading