diff --git a/lib_com/options.h b/lib_com/options.h index d5314dd124d6601a3e7dac393fc30500fc7d2a63..3b4d90889520812150be002d0958fcdb236361e7 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -148,4 +148,7 @@ #define FIX_11_1_IVAS_SPAR_DEC_UPMIXER_SF_RND_COEFFS /* FhG ivas_spar_com.c: Zeroes very small negative coeffs via L_shr_r (was L_shr) */ #define FIX_ISSUE_1237 /* VA: replacement of Copy_Scale_sig_16_32_DEPREC() that are doing 16 bits left shift by Copy_Scale_sig_16_32_no_sat() */ #define FIX_ISSUE_1237_KEEP_EVS_BE /* VA: Fix to keep EVS bitexactness to 26.444 */ + +#define FIX1257_POSSIBLE_FIX_TO_EXTRACT_L /* VA: possible fix that prevent BWE to disappear */ + #endif diff --git a/lib_enc/ivas_stereo_icbwe_enc.c b/lib_enc/ivas_stereo_icbwe_enc.c index cc5f8453a7676c6874338305c4f63a79870bd9a3..83e8ce0eb868bc35ecf95cf1769d6339951a6544 100644 --- a/lib_enc/ivas_stereo_icbwe_enc.c +++ b/lib_enc/ivas_stereo_icbwe_enc.c @@ -216,9 +216,11 @@ static Word16 ic_bwe_enc_specMapping_ivas_fx( b_e = BASOP_Util_Add_MantExp( tmp1, sub( add( Txx1_e, T_desired_e ), 1 ), negate( tmp ), exp, &b_fx ); /* Q15-b_fx */ c_e = BASOP_Util_Add_MantExp( T_desired_fx, T_desired_e, negate( Txx1_fx ), Txx1_e, &c_fx ); /* Q15-c_fx */ - +#ifdef FIX1257_POSSIBLE_FIX_TO_EXTRACT_L + u_fx = extract_h( *specMapping_fx ); // specMapping_fx is in Q31, I don't see how extract_l can be used without causing issues, maybe I miss something +#else u_fx = extract_l( *specMapping_fx ); - +#endif tmp = mult( b_fx, b_fx ); // b_e + b_e; tmp1 = mult( a_fx, c_fx ); // a_e + c_e + 2 @@ -374,7 +376,11 @@ static Word16 ic_bwe_enc_gsMapping_ivas_fx( /* quantize the IC-BWE GS mapping*/ IF( EQ_16( element_mode, IVAS_CPE_TD ) ) { - temp2_fx = extract_l( L_shr( temp2_fx32, Q10 ) ); // Q15 +#ifdef FIX1257_POSSIBLE_FIX_TO_EXTRACT_L + temp2_fx = extract_h( L_shl_sat( temp2_fx32, Q16 - Q10 ) ); // Q15 +#else + temp2_fx = extract_l( L_shr( temp2_fx32, Q10 ) ); // Q15 +#endif gsMapping_fx16 = 0; move16(); idx = squant_fx( temp2_fx, &gsMapping_fx16, icbwe_gsMapping_tbl_fx, ( 1 << STEREO_ICBWE_GSBITS ) ); // Q12 @@ -382,7 +388,11 @@ static Word16 ic_bwe_enc_gsMapping_ivas_fx( } ELSE { - temp2_fx = extract_l( L_shr( temp2_fx32, Q10 ) ); // Q15 +#ifdef FIX1257_POSSIBLE_FIX_TO_EXTRACT_L + temp2_fx = extract_h( L_shl_sat( temp2_fx32, 16 - Q10 ) ); // Q15 +#else + temp2_fx = extract_l( L_shr( temp2_fx32, Q10 ) ); // Q15 +#endif gsMapping_fx16 = 0; move16(); idx = squant_fx( temp2_fx, &gsMapping_fx16, icbwe_gsMappingDFT_tbl_fx, ( 1 << STEREO_ICBWE_GSBITS ) ); // Q12 @@ -732,7 +742,11 @@ void stereo_icBWE_enc_ivas_fx( tmp = shr( tmp, sub( Q15, exp ) ); /* Q0 */ FOR( j = 0; j < tmp; ( j++, k++ ) ) { +#ifndef FIX1257_POSSIBLE_FIX_TO_EXTRACT_L excSHB_nonref_fx[k] = extract_l( BASOP_Util_Add_Mant32Exp( Mpy_32_32( temp1_fx, hStereoICBWE->nlExc16k_fx[k] ), add( temp1_e, hStereoICBWE->nlExc16k_e ), Mpy_32_32( temp2_fx, hStereoICBWE->mixExc16k_fx[k] ), add( temp2_e, hStereoICBWE->mixExc16k_e ), &exp_buf[k] ) ); /* Q31-exp_buf */ +#else + excSHB_nonref_fx[k] = extract_h( L_shl_sat( BASOP_Util_Add_Mant32Exp( Mpy_32_32( temp1_fx, hStereoICBWE->nlExc16k_fx[k] ), add( temp1_e, hStereoICBWE->nlExc16k_e ), Mpy_32_32( temp2_fx, hStereoICBWE->mixExc16k_fx[k] ), add( temp2_e, hStereoICBWE->mixExc16k_e ), &exp_buf[k] ), 16 ) ); /* Q31-exp_buf */ +#endif move32(); } } @@ -793,7 +807,7 @@ void stereo_icBWE_enc_ivas_fx( #ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( hStereoICBWE->mem_shb_speech_ref_fx, shb_frame_ref_fx, L_LOOK_16k, add( negate( sub( max_e, hStereoICBWE->mem_shb_speech_ref_e ) ), Q16 ) ); // mem_shb_speech_ref_e #else - Copy_Scale_sig_16_32_DEPREC( hStereoICBWE->mem_shb_speech_ref_fx, shb_frame_ref_fx, L_LOOK_16k, add( negate( sub( max_e, hStereoICBWE->mem_shb_speech_ref_e ) ), Q16 ) ); // mem_shb_speech_ref_e + Copy_Scale_sig_16_32_DEPREC( hStereoICBWE->mem_shb_speech_ref_fx, shb_frame_ref_fx, L_LOOK_16k, add( negate( sub( max_e, hStereoICBWE->mem_shb_speech_ref_e ) ), Q16 ) ); // mem_shb_speech_ref_e #endif hStereoICBWE->mem_shb_speech_ref_e = max_e; shb_frame_ref_e = max_e; @@ -811,7 +825,7 @@ void stereo_icBWE_enc_ivas_fx( #ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( hStereoICBWE->mem_shb_speech_nonref_fx, shb_frame_nonref_fx, L_LOOK_16k, add( negate( sub( max_e, hStereoICBWE->mem_shb_speech_nonref_e ) ), Q16 ) ); // mem_shb_speech_ref_e #else - Copy_Scale_sig_16_32_DEPREC( hStereoICBWE->mem_shb_speech_nonref_fx, shb_frame_nonref_fx, L_LOOK_16k, add( negate( sub( max_e, hStereoICBWE->mem_shb_speech_nonref_e ) ), Q16 ) ); // mem_shb_speech_ref_e + Copy_Scale_sig_16_32_DEPREC( hStereoICBWE->mem_shb_speech_nonref_fx, shb_frame_nonref_fx, L_LOOK_16k, add( negate( sub( max_e, hStereoICBWE->mem_shb_speech_nonref_e ) ), Q16 ) ); // mem_shb_speech_ref_e #endif hStereoICBWE->mem_shb_speech_nonref_e = max_e; shb_frame_nonref_e = max_e; @@ -955,7 +969,11 @@ void stereo_icBWE_enc_ivas_fx( FOR( j = 0; j < ( L_FRAME16k / nbSubFr ); ( j++, k++ ) ) { - excSHB_nonref_fx[k] = extract_l( BASOP_Util_Add_Mant32Exp( Mpy_32_32( temp1_fx, hStereoICBWE->nlExc16k_fx[k] ), temp1_e + hStereoICBWE->nlExc16k_e, Mpy_32_32( temp2_fx, hStereoICBWE->mixExc16k_fx[k] ), temp2_e + hStereoICBWE->mixExc16k_e, &exp_buf[k] ) ); /* Q31-exp_buf */ +#ifdef FIX1257_POSSIBLE_FIX_TO_EXTRACT_L + excSHB_nonref_fx[k] = extract_h( L_shl_sat( BASOP_Util_Add_Mant32Exp( Mpy_32_32( temp1_fx, hStereoICBWE->nlExc16k_fx[k] ), temp1_e + hStereoICBWE->nlExc16k_e, Mpy_32_32( temp2_fx, hStereoICBWE->mixExc16k_fx[k] ), temp2_e + hStereoICBWE->mixExc16k_e, &exp_buf[k] ), 16 ) ); /* Q31-exp_buf */ +#else + excSHB_nonref_fx[k] = extract_l( BASOP_Util_Add_Mant32Exp( Mpy_32_32( temp1_fx, hStereoICBWE->nlExc16k_fx[k] ), temp1_e + hStereoICBWE->nlExc16k_e, Mpy_32_32( temp2_fx, hStereoICBWE->mixExc16k_fx[k] ), temp2_e + hStereoICBWE->mixExc16k_e, &exp_buf[k] ) ); /* Q31-exp_buf */ +#endif move32(); } }