Loading lib_com/options.h +1 −0 Original line number Diff line number Diff line Loading @@ -95,6 +95,7 @@ #define HARMONIZE_ACELP_ENC /* VA: basop issue 2400: Remove duplicated main ACELP encoder function */ #define FIX_2392_MSAN_DESTROY_DEC /* VA: basop issue 2392: fix MSAN in ivas_destroy_dec_fx() */ #define FIX_FLOAT_1522_LTV_MSAN_QMETADATA_ENC_EC3 /* Nokia: float issue 1522: fix uninit MSAN in EC3 of qmetadata encoding */ #define FIX_MDCT_STEREO_ENC_STACK /* VA: basop issue 2428: Move IGF temporary buffers out of the highest stack */ /* #################### End BE switches ################################## */ Loading lib_enc/ivas_stereo_mdct_core_enc_fx.c +12 −1 Original line number Diff line number Diff line Loading @@ -629,6 +629,7 @@ void stereo_mdct_core_enc_fx( } ELSE { #ifndef FIX_MDCT_STEREO_ENC_STACK Word32 powerSpec_fx[CPE_CHANNELS][N_MAX]; // each value has a different exponent Word16 exp_powerSpec[CPE_CHANNELS][N_MAX]; { Loading Loading @@ -665,6 +666,7 @@ void stereo_mdct_core_enc_fx( set16_fx( exp_powerSpec[ch] + length, 0, sub( N_MAX, length ) ); } } #endif FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; Loading @@ -673,6 +675,9 @@ void stereo_mdct_core_enc_fx( { st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; } #ifdef FIX_MDCT_STEREO_ENC_STACK ProcessIGF_ivas_fx_64( st, N_MAX, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[ch][n], p_orig_spectrum_e[ch], powerSpec64[ch], exp_powerSpec64[ch], n ); #else L_subframeTCX = idiv1616( st->hTcxEnc->L_frameTCX, nSubframes ); /* Q0 */ Word16 q_spectrum; q_spectrum = sub( Q31, p_orig_spectrum_e[ch] ); Loading @@ -685,12 +690,14 @@ void stereo_mdct_core_enc_fx( Scale_sig32( orig_spectrum_fx[ch][n], st->hIGFEnc->infoStopLine, sub( q_spectrum, sub( Q31, p_orig_spectrum_e[ch] ) ) ); /* q_spectrum */ ProcessIGF_ivas_fx( st, N_MAX, st->hTcxEnc->spectrum_fx[n], &q_spectrum, orig_spectrum_fx[ch][n], q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 ); #endif } } } } ELSE { #ifndef FIX_MDCT_STEREO_ENC_STACK Word32 powerSpec_fx[CPE_CHANNELS][N_MAX]; // each value has a different exponent Word16 exp_powerSpec[CPE_CHANNELS][N_MAX + L_MDCT_OVLP_MAX]; { Loading Loading @@ -727,6 +734,7 @@ void stereo_mdct_core_enc_fx( set16_fx( exp_powerSpec[ch] + length, 0, sub( N_MAX + L_MDCT_OVLP_MAX, length ) ); } } #endif FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; Loading @@ -749,6 +757,9 @@ void stereo_mdct_core_enc_fx( { FOR( n = 0; n < nSubframes; n++ ) { #ifdef FIX_MDCT_STEREO_ENC_STACK ProcessIGF_ivas_fx_64( st, N_MAX, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[ch][n], p_orig_spectrum_e[ch], powerSpec64[ch], exp_powerSpec64[ch], n ); #else Word16 q_spectrum; L_subframeTCX = idiv1616( st->hTcxEnc->L_frameTCX, nSubframes ); /* Q0 */ q_spectrum = sub( Q31, p_orig_spectrum_e[ch] ); Loading @@ -760,8 +771,8 @@ void stereo_mdct_core_enc_fx( q_spectrum = sub( Q31, st->hTcxEnc->spectrum_e[n] ); Scale_sig32( orig_spectrum_fx[ch][n], st->hIGFEnc->infoStopLine, sub( q_spectrum, sub( Q31, p_orig_spectrum_e[ch] ) ) ); /* q_spectrum */ ProcessIGF_ivas_fx( st, N_MAX, st->hTcxEnc->spectrum_fx[n], &q_spectrum, orig_spectrum_fx[ch][n], q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 ); #endif } } } Loading lib_enc/prot_fx_enc.h +13 −0 Original line number Diff line number Diff line Loading @@ -1175,6 +1175,19 @@ void ProcessIGF_ivas_fx( const Word16 vad_hover_flag /* i : VAD hangover flag */ ); #ifdef FIX_MDCT_STEREO_ENC_STACK void ProcessIGF_ivas_fx_64( Encoder_State *st, /* i/o: Encoder state */ const Word16 powerSpec_len, /* i : length of pPowerSpectrum buffer */ Word32 *pMDCTSpectrum, /* i : MDCT spectrum (*q_spectrum) */ Word32 *pITFMDCTSpectrum, /* i : MDCT spectrum fir ITF */ const Word16 q_ITFMDCTSpectrum, /* i : Q of MDCT spectrum fir ITF */ const Word64 *pPowerSpectrum64, /* i : MDCT^2 + MDST^2 spectrum, or estimate (*q_powerSpec) */ const Word16 *exp_powerSpec64, /* i : Q of power spectrum */ const Word16 frameno /* i : flag indicating index of current subframe */ ); #endif void ProcessIGF_fx( IGF_ENC_INSTANCE_HANDLE const hInstance, /**< in: instance handle of IGF Encoder */ Encoder_State *st, /**< in: Encoder state */ Loading lib_enc/tcx_utils_enc_fx.c +88 −4 Original line number Diff line number Diff line Loading @@ -4052,3 +4052,87 @@ void ProcessStereoIGF_fx( } return; } #ifdef FIX_MDCT_STEREO_ENC_STACK /*---------------------------------------------------------------------* * ProcessIGF_ivas_fx_64() * * *---------------------------------------------------------------------*/ void ProcessIGF_ivas_fx_64( Encoder_State *st, /* i/o: Encoder state */ const Word16 powerSpec_len, /* i : length of pPowerSpectrum buffer */ Word32 *pMDCTSpectrum, /* i : MDCT spectrum (*q_spectrum) */ Word32 *pITFMDCTSpectrum, /* i : MDCT spectrum fir ITF */ const Word16 q_ITFMDCTSpectrum, /* i : Q of MDCT spectrum fir ITF */ const Word64 *pPowerSpectrum64, /* i : MDCT^2 + MDST^2 spectrum, or estimate (*q_powerSpec) */ const Word16 *exp_powerSpec64, /* i/o: Q of power spectrum */ const Word16 frameno /* i : flag indicating index of current subframe */ ) { Word16 i, n1, nsub, length, norm; Word16 nSubframes, L_subframeTCX; Word16 q_spectrum; Word32 powerSpec_fx[N_MAX]; // each value has a different exponent Word16 exp_powerSpec[N_MAX]; IF ( EQ_16( st->hTcxEnc->tcxMode, TCX_20 ) ) { nSubframes = 1; move16(); L_subframeTCX = st->hTcxEnc->L_frameTCX; move16(); } ELSE { nSubframes = NB_DIV; move16(); L_subframeTCX = shr( st->hTcxEnc->L_frameTCX, 1 ); } nsub = 1; length = st->hTcxEnc->L_frameTCX; move16(); move16(); IF( NE_16( st->hTcxEnc->tcxMode, TCX_20 ) ) { length = shr( st->hTcxEnc->L_frameTCX, 1 ); nsub = NB_DIV; move16(); } IF( EQ_16( st->last_core, ACELP_CORE ) ) { length = add( length, shr( length, 2 ) ); } /* Copy powerSpec values from 64 bit buffer to 32 bit buffer */ FOR( n1 = 0; n1 < nsub; n1++ ) { FOR( i = 0; i < length; i++ ) { norm = W_norm( pPowerSpectrum64[i + n1 * length] ); powerSpec_fx[i + n1 * length] = W_extract_h( W_shl( pPowerSpectrum64[i + n1 * length], norm ) ); // exp = exp_powerSpec64[ch][n1]-norm exp_powerSpec[i + n1 * length] = sub( exp_powerSpec64[n1], norm ); move32(); move16(); } } set32_fx( powerSpec_fx + length, 0, sub( N_MAX, length ) ); set16_fx( exp_powerSpec + length, 0, sub( N_MAX, length ) ); q_spectrum = sub( Q31, q_ITFMDCTSpectrum ); IF( st->hIGFEnc ) { q_spectrum = s_min( q_spectrum, sub( Q31, st->hIGFEnc->spec_be_igf_e ) ); } q_spectrum = sub( Q31, st->hTcxEnc->spectrum_e[frameno] ); Scale_sig32( pITFMDCTSpectrum, st->hIGFEnc->infoStopLine, sub( q_spectrum, sub( Q31, q_ITFMDCTSpectrum ) ) ); /* q_spectrum */ ProcessIGF_ivas_fx( st, powerSpec_len, pMDCTSpectrum, &q_spectrum, pITFMDCTSpectrum, q_spectrum, &powerSpec_fx[frameno * L_subframeTCX], &exp_powerSpec[frameno * L_subframeTCX], st->core == TCX_20_CORE, frameno, st->sp_aud_decision0, 0 ); return; } #endif Loading
lib_com/options.h +1 −0 Original line number Diff line number Diff line Loading @@ -95,6 +95,7 @@ #define HARMONIZE_ACELP_ENC /* VA: basop issue 2400: Remove duplicated main ACELP encoder function */ #define FIX_2392_MSAN_DESTROY_DEC /* VA: basop issue 2392: fix MSAN in ivas_destroy_dec_fx() */ #define FIX_FLOAT_1522_LTV_MSAN_QMETADATA_ENC_EC3 /* Nokia: float issue 1522: fix uninit MSAN in EC3 of qmetadata encoding */ #define FIX_MDCT_STEREO_ENC_STACK /* VA: basop issue 2428: Move IGF temporary buffers out of the highest stack */ /* #################### End BE switches ################################## */ Loading
lib_enc/ivas_stereo_mdct_core_enc_fx.c +12 −1 Original line number Diff line number Diff line Loading @@ -629,6 +629,7 @@ void stereo_mdct_core_enc_fx( } ELSE { #ifndef FIX_MDCT_STEREO_ENC_STACK Word32 powerSpec_fx[CPE_CHANNELS][N_MAX]; // each value has a different exponent Word16 exp_powerSpec[CPE_CHANNELS][N_MAX]; { Loading Loading @@ -665,6 +666,7 @@ void stereo_mdct_core_enc_fx( set16_fx( exp_powerSpec[ch] + length, 0, sub( N_MAX, length ) ); } } #endif FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; Loading @@ -673,6 +675,9 @@ void stereo_mdct_core_enc_fx( { st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; } #ifdef FIX_MDCT_STEREO_ENC_STACK ProcessIGF_ivas_fx_64( st, N_MAX, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[ch][n], p_orig_spectrum_e[ch], powerSpec64[ch], exp_powerSpec64[ch], n ); #else L_subframeTCX = idiv1616( st->hTcxEnc->L_frameTCX, nSubframes ); /* Q0 */ Word16 q_spectrum; q_spectrum = sub( Q31, p_orig_spectrum_e[ch] ); Loading @@ -685,12 +690,14 @@ void stereo_mdct_core_enc_fx( Scale_sig32( orig_spectrum_fx[ch][n], st->hIGFEnc->infoStopLine, sub( q_spectrum, sub( Q31, p_orig_spectrum_e[ch] ) ) ); /* q_spectrum */ ProcessIGF_ivas_fx( st, N_MAX, st->hTcxEnc->spectrum_fx[n], &q_spectrum, orig_spectrum_fx[ch][n], q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 ); #endif } } } } ELSE { #ifndef FIX_MDCT_STEREO_ENC_STACK Word32 powerSpec_fx[CPE_CHANNELS][N_MAX]; // each value has a different exponent Word16 exp_powerSpec[CPE_CHANNELS][N_MAX + L_MDCT_OVLP_MAX]; { Loading Loading @@ -727,6 +734,7 @@ void stereo_mdct_core_enc_fx( set16_fx( exp_powerSpec[ch] + length, 0, sub( N_MAX + L_MDCT_OVLP_MAX, length ) ); } } #endif FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; Loading @@ -749,6 +757,9 @@ void stereo_mdct_core_enc_fx( { FOR( n = 0; n < nSubframes; n++ ) { #ifdef FIX_MDCT_STEREO_ENC_STACK ProcessIGF_ivas_fx_64( st, N_MAX, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[ch][n], p_orig_spectrum_e[ch], powerSpec64[ch], exp_powerSpec64[ch], n ); #else Word16 q_spectrum; L_subframeTCX = idiv1616( st->hTcxEnc->L_frameTCX, nSubframes ); /* Q0 */ q_spectrum = sub( Q31, p_orig_spectrum_e[ch] ); Loading @@ -760,8 +771,8 @@ void stereo_mdct_core_enc_fx( q_spectrum = sub( Q31, st->hTcxEnc->spectrum_e[n] ); Scale_sig32( orig_spectrum_fx[ch][n], st->hIGFEnc->infoStopLine, sub( q_spectrum, sub( Q31, p_orig_spectrum_e[ch] ) ) ); /* q_spectrum */ ProcessIGF_ivas_fx( st, N_MAX, st->hTcxEnc->spectrum_fx[n], &q_spectrum, orig_spectrum_fx[ch][n], q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 ); #endif } } } Loading
lib_enc/prot_fx_enc.h +13 −0 Original line number Diff line number Diff line Loading @@ -1175,6 +1175,19 @@ void ProcessIGF_ivas_fx( const Word16 vad_hover_flag /* i : VAD hangover flag */ ); #ifdef FIX_MDCT_STEREO_ENC_STACK void ProcessIGF_ivas_fx_64( Encoder_State *st, /* i/o: Encoder state */ const Word16 powerSpec_len, /* i : length of pPowerSpectrum buffer */ Word32 *pMDCTSpectrum, /* i : MDCT spectrum (*q_spectrum) */ Word32 *pITFMDCTSpectrum, /* i : MDCT spectrum fir ITF */ const Word16 q_ITFMDCTSpectrum, /* i : Q of MDCT spectrum fir ITF */ const Word64 *pPowerSpectrum64, /* i : MDCT^2 + MDST^2 spectrum, or estimate (*q_powerSpec) */ const Word16 *exp_powerSpec64, /* i : Q of power spectrum */ const Word16 frameno /* i : flag indicating index of current subframe */ ); #endif void ProcessIGF_fx( IGF_ENC_INSTANCE_HANDLE const hInstance, /**< in: instance handle of IGF Encoder */ Encoder_State *st, /**< in: Encoder state */ Loading
lib_enc/tcx_utils_enc_fx.c +88 −4 Original line number Diff line number Diff line Loading @@ -4052,3 +4052,87 @@ void ProcessStereoIGF_fx( } return; } #ifdef FIX_MDCT_STEREO_ENC_STACK /*---------------------------------------------------------------------* * ProcessIGF_ivas_fx_64() * * *---------------------------------------------------------------------*/ void ProcessIGF_ivas_fx_64( Encoder_State *st, /* i/o: Encoder state */ const Word16 powerSpec_len, /* i : length of pPowerSpectrum buffer */ Word32 *pMDCTSpectrum, /* i : MDCT spectrum (*q_spectrum) */ Word32 *pITFMDCTSpectrum, /* i : MDCT spectrum fir ITF */ const Word16 q_ITFMDCTSpectrum, /* i : Q of MDCT spectrum fir ITF */ const Word64 *pPowerSpectrum64, /* i : MDCT^2 + MDST^2 spectrum, or estimate (*q_powerSpec) */ const Word16 *exp_powerSpec64, /* i/o: Q of power spectrum */ const Word16 frameno /* i : flag indicating index of current subframe */ ) { Word16 i, n1, nsub, length, norm; Word16 nSubframes, L_subframeTCX; Word16 q_spectrum; Word32 powerSpec_fx[N_MAX]; // each value has a different exponent Word16 exp_powerSpec[N_MAX]; IF ( EQ_16( st->hTcxEnc->tcxMode, TCX_20 ) ) { nSubframes = 1; move16(); L_subframeTCX = st->hTcxEnc->L_frameTCX; move16(); } ELSE { nSubframes = NB_DIV; move16(); L_subframeTCX = shr( st->hTcxEnc->L_frameTCX, 1 ); } nsub = 1; length = st->hTcxEnc->L_frameTCX; move16(); move16(); IF( NE_16( st->hTcxEnc->tcxMode, TCX_20 ) ) { length = shr( st->hTcxEnc->L_frameTCX, 1 ); nsub = NB_DIV; move16(); } IF( EQ_16( st->last_core, ACELP_CORE ) ) { length = add( length, shr( length, 2 ) ); } /* Copy powerSpec values from 64 bit buffer to 32 bit buffer */ FOR( n1 = 0; n1 < nsub; n1++ ) { FOR( i = 0; i < length; i++ ) { norm = W_norm( pPowerSpectrum64[i + n1 * length] ); powerSpec_fx[i + n1 * length] = W_extract_h( W_shl( pPowerSpectrum64[i + n1 * length], norm ) ); // exp = exp_powerSpec64[ch][n1]-norm exp_powerSpec[i + n1 * length] = sub( exp_powerSpec64[n1], norm ); move32(); move16(); } } set32_fx( powerSpec_fx + length, 0, sub( N_MAX, length ) ); set16_fx( exp_powerSpec + length, 0, sub( N_MAX, length ) ); q_spectrum = sub( Q31, q_ITFMDCTSpectrum ); IF( st->hIGFEnc ) { q_spectrum = s_min( q_spectrum, sub( Q31, st->hIGFEnc->spec_be_igf_e ) ); } q_spectrum = sub( Q31, st->hTcxEnc->spectrum_e[frameno] ); Scale_sig32( pITFMDCTSpectrum, st->hIGFEnc->infoStopLine, sub( q_spectrum, sub( Q31, q_ITFMDCTSpectrum ) ) ); /* q_spectrum */ ProcessIGF_ivas_fx( st, powerSpec_len, pMDCTSpectrum, &q_spectrum, pITFMDCTSpectrum, q_spectrum, &powerSpec_fx[frameno * L_subframeTCX], &exp_powerSpec[frameno * L_subframeTCX], st->core == TCX_20_CORE, frameno, st->sp_aud_decision0, 0 ); return; } #endif