diff --git a/lib_com/options.h b/lib_com/options.h index adf9f8d1a47a807f3fd511427e6426814e7ec1af..71063d503ed0b8b956b40f1d2111a04705c572ab 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -108,6 +108,10 @@ #define FIX_BASOP_2573_RF_MODE_UPDATE /* FhG: BASOP issue 2573: remove duplicated update of rf_mode parameters from evs_enc_fx(); was already done in updt_enc_common_fx() */ #define FIX_2570_BUF_OVFL /* Orange: basop issue 2570: global-buffer-overflow in lib_rend/ivas_objectRenderer_sources_fx.c */ #define FIX_1550_WRONG_RENDER_FRAMESIZE_PRINTOUT /* Dolby: float issue 1550: Wrong render framesize printout */ +#define HARMONIZE_2553_TonalConceal_Apply /* FhG: Harmonize TonalMDCTConceal_Apply with its ivas derivate */ +#define HARMONIZE_2553_TonalConceal_Init /* FhG: Harmonize TonalMDCTConceal_Init with its ivas derivate */ +#define HARMONIZE_2553_TonalConceal_SaveFreqSignal /* FhG: Harmonize TonalConceal_SaveFreqSignal with its ivas derivate */ +#define HARMONIZE_2553_TonalConceal_SaveTimeSignal /* FhG: Harmonize TonalConceal_SaveTimeSignal with its ivas derivate */ /* #################### End BE switches ################################## */ diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 7d541d076f4dd6b8b77823483077bf91514954b8..c434a6fc125d15fe89f35bd31ae64afdb8a895c8 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -5556,6 +5556,7 @@ void RefineTonalComponents_fx( const Word16 element_mode, const PsychoacousticParameters *psychParamsCurrent ); +#ifndef HARMONIZE_2553_TonalConceal_Init ivas_error TonalMDCTConceal_Init_fx( TonalMDCTConcealPtr self, const Word16 nSamples, @@ -5563,16 +5564,22 @@ ivas_error TonalMDCTConceal_Init_fx( const Word16 nScaleFactors, TCX_CONFIG_HANDLE hTcxCfg /* TCX config */ ); +#endif +#ifdef HARMONIZE_2553_TonalConceal_Init +ivas_error TonalMDCTConceal_Init_fx( + Word16 element_mode, +#else ivas_error TonalMDCTConceal_Init_ivas_fx( +#endif TonalMDCTConcealPtr hTonalMDCTConc, const UWord16 nSamples, const UWord16 nSamplesCore, const UWord16 nScaleFactors, - TCX_CONFIG_HANDLE hTcxCfg /* TCX config */ -); + TCX_CONFIG_HANDLE hTcxCfg ); /* Must be called only when a good frame is recieved - concealment is inactive */ +#ifndef HARMONIZE_2553_TonalConceal_SaveFreqSignal void TonalMDCTConceal_SaveFreqSignal_fx( TonalMDCTConcealPtr self, const Word32 *mdctSpectrum, @@ -5582,8 +5589,14 @@ void TonalMDCTConceal_SaveFreqSignal_fx( const Word16 *scaleFactors, const Word16 *scaleFactors_exp, const Word16 gain_tcx_exp ); +#endif +#ifdef HARMONIZE_2553_TonalConceal_SaveFreqSignal +void TonalMDCTConceal_SaveFreqSignal_fx( + Word16 element_mode, +#else void TonalMDCTConceal_SaveFreqSignal_ivas_fx( +#endif TonalMDCTConcealPtr hTonalMDCTConc, const Word32 *mdctSpectrum, const Word16 mdctSpectrum_exp, @@ -5601,17 +5614,24 @@ void TonalMDCTConceal_UpdateState_fx( const Word16 badBlock, const Word8 tonalConcealmentActive ); - +#ifndef HARMONIZE_2553_TonalConceal_Apply void TonalMDCTConceal_Apply_fx( const TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ Word32 *mdctSpectrum, /*IN/OUT*/ Word16 *mdctSpectrum_exp /*IN */ ); +#endif + +#ifdef HARMONIZE_2553_TonalConceal_Apply +void TonalMDCTConceal_Apply_fx( + Word16 element_mode, +#else void TonalMDCTConceal_Apply_ivas_fx( - TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ - Word32 *mdctSpectrum, /*IN/OUT*/ - Word16 mdctSpectrum_exp, /*IN */ +#endif + const TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ + Word32 *mdctSpectrum, /*IN/OUT*/ + Word16 mdctSpectrum_exp, /*IN */ const PsychoacousticParameters *psychParamsCurrent ); void TonalMDCTConceal_InsertNoise_ivas_fx( @@ -5638,14 +5658,21 @@ void TonalMDCTConceal_InsertNoise_fx( Word16 crossfadeGain, const Word16 crossOverFreq ); +#ifndef HARMONIZE_2553_TonalConceal_SaveTimeSignal void TonalMDCTConceal_SaveTimeSignal_fx( TonalMDCTConcealPtr hTonalMDCTConc, Word16 *timeSignal, Word16 nNewSamples ); +#endif +#ifdef HARMONIZE_2553_TonalConceal_SaveTimeSignal +void TonalMDCTConceal_SaveTimeSignal_fx( + Word16 element_mode, +#else void TonalMDCTConceal_SaveTimeSignal_ivas_fx( +#endif TonalMDCTConcealPtr hTonalMDCTConc, - Word16 *timeSignal, + Word16 *timeSignal, // q_timeSignal Word16 q_timeSignal, Word16 nNewSamples ); diff --git a/lib_dec/core_dec_init_fx.c b/lib_dec/core_dec_init_fx.c index dbffbcc02e8d2f4e0eea3c4a974039ceba8118e7..96815e715676813cdd630dd92e73aa9e9202f096 100644 --- a/lib_dec/core_dec_init_fx.c +++ b/lib_dec/core_dec_init_fx.c @@ -907,7 +907,11 @@ void open_decoder_LPD_fx( st->hTonalMDCTConc->lastBlockData.nSamples = 0; move16(); +#ifdef HARMONIZE_2553_TonalConceal_Init + TonalMDCTConceal_Init_fx( EVS_MONO, st->hTonalMDCTConc, hTcxDec->L_frameTCX, st->L_frame, FDNS_NPTS, st->hTcxCfg ); +#else TonalMDCTConceal_Init_fx( st->hTonalMDCTConc, hTcxDec->L_frameTCX, st->L_frame, FDNS_NPTS, st->hTcxCfg ); +#endif } st->last_tns_active = 0; move16(); @@ -1962,7 +1966,11 @@ void open_decoder_LPD_ivas_fx( move16(); st->hTonalMDCTConc->lastBlockData.nSamples = 0; move16(); +#ifdef HARMONIZE_2553_TonalConceal_Init + TonalMDCTConceal_Init_fx( 1 /*signal non-EVS*/, st->hTonalMDCTConc, st->hTcxDec->L_frameTCX, st->L_frame, FDNS_NPTS, st->hTcxCfg ); +#else TonalMDCTConceal_Init_ivas_fx( st->hTonalMDCTConc, st->hTcxDec->L_frameTCX, st->L_frame, FDNS_NPTS, st->hTcxCfg ); +#endif } st->last_tns_active = 0; diff --git a/lib_dec/dec_LPD_fx.c b/lib_dec/dec_LPD_fx.c index 5b1a13023474d2137853e702cef1b38354a3027f..6293b10c4bbcb7f81cd2fbb2f38a892d8a857099 100644 --- a/lib_dec/dec_LPD_fx.c +++ b/lib_dec/dec_LPD_fx.c @@ -768,7 +768,11 @@ void decoder_LPD_fx( IF( !bfi ) { +#ifdef HARMONIZE_2553_TonalConceal_SaveTimeSignal + TonalMDCTConceal_SaveTimeSignal_fx( st->element_mode, st->hTonalMDCTConc, synthFB, 0, L_frameTCX ); +#else TonalMDCTConceal_SaveTimeSignal_fx( st->hTonalMDCTConc, synthFB, L_frameTCX ); +#endif } decoder_tcx_post_fx( st, synth, synthFB, Aq, bfi ); IF( EQ_16( st->core, TCX_20_CORE ) ) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index f48ae67d8fb56077e52e7746db9bc90b1e64b5a0..dc3696f8b89b751a46d93f3d3bb9c1238d78e41c 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -814,7 +814,11 @@ void decoder_tcx_fx( IF( bfi == 0 ) { +#ifdef HARMONIZE_2553_TonalConceal_SaveFreqSignal + TonalMDCTConceal_SaveFreqSignal_fx( st->element_mode, st->hTonalMDCTConc, x, x_e, L_frameTCX, L_frame, gainlpc2, gainlpc2_e, gain_tcx_e, 0 ); +#else TonalMDCTConceal_SaveFreqSignal_fx( st->hTonalMDCTConc, x, x_e, L_frameTCX, L_frame, gainlpc2, gainlpc2_e, gain_tcx_e ); +#endif } ELSE { @@ -969,7 +973,11 @@ void decoder_tcx_fx( test(); IF( bfi && st->tonal_mdct_plc_active ) { +#ifdef HARMONIZE_2553_TonalConceal_Apply + TonalMDCTConceal_Apply_fx( st->element_mode, st->hTonalMDCTConc, x, x_e, NULL ); +#else TonalMDCTConceal_Apply_fx( st->hTonalMDCTConc, x, &x_e ); +#endif } tmp32 = L_deposit_h( 0 ); @@ -4879,7 +4887,11 @@ void decoder_tcx_noisefilling_fx( test(); IF( bfi == 0 && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { +#ifdef HARMONIZE_2553_TonalConceal_SaveFreqSignal + TonalMDCTConceal_SaveFreqSignal_fx( st->element_mode, st->hTonalMDCTConc, x, *x_e, L_frameTCX, L_frame, gainlpc2, gainlpc2_e, gain_tcx_e, infoIGFStartLine ); +#else TonalMDCTConceal_SaveFreqSignal_ivas_fx( st->hTonalMDCTConc, x, *x_e, L_frameTCX, L_frame, gainlpc2, gainlpc2_e, gain_tcx_e, infoIGFStartLine ); +#endif } ELSE IF( bfi ) { @@ -5200,7 +5212,11 @@ void decoder_tcx_noiseshaping_igf_fx( test(); IF( bfi && st->tonal_mdct_plc_active && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { +#ifdef HARMONIZE_2553_TonalConceal_Apply + TonalMDCTConceal_Apply_fx( st->element_mode, st->hTonalMDCTConc, x_fx, *x_e, st->hTcxCfg->psychParamsCurrent ); +#else TonalMDCTConceal_Apply_ivas_fx( st->hTonalMDCTConc, x_fx, *x_e, st->hTcxCfg->psychParamsCurrent ); +#endif /* If exponent has been updated after TonalMDCTConceal_Apply, then shift the spectrum to common exponent. */ } diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 397a0728e7ae467c14779c66e870ac38a291c257..1bcd79b3bcb314c7e71a3b6978c935f03b8703da 100755 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1257,7 +1257,11 @@ void ivas_mdct_core_reconstruct_fx( test(); IF( ( bfi == 0 ) && st->hTonalMDCTConc != NULL ) { +#ifdef HARMONIZE_2553_TonalConceal_SaveTimeSignal + TonalMDCTConceal_SaveTimeSignal_fx( st->element_mode, st->hTonalMDCTConc, synthFB_fx, q_winFB, L_frameTCX[ch] ); +#else TonalMDCTConceal_SaveTimeSignal_ivas_fx( st->hTonalMDCTConc, synthFB_fx, q_winFB, L_frameTCX[ch] ); +#endif } decoder_tcx_post_ivas_fx( st, synth_fx, synthFB_fx, q_winFB, NULL, bfi, MCT_flag ); @@ -1620,7 +1624,11 @@ void ivas_mdct_core_tns_ns_fx( scf_e[ind] = sub( 15, q_shift ); move16(); } +#ifdef HARMONIZE_2553_TonalConceal_SaveFreqSignal + TonalMDCTConceal_SaveFreqSignal_fx( st->element_mode, st->hTonalMDCTConc, x_fx[ch][k], x_e, L_frameTCX[ch], L_frame[ch], &scf_fx[0], scf_e, 0, get_igf_startline_fx( st, L_frame[ch], L_frameTCX[ch] ) ); +#else TonalMDCTConceal_SaveFreqSignal_ivas_fx( st->hTonalMDCTConc, x_fx[ch][k], x_e, L_frameTCX[ch], L_frame[ch], &scf_fx[0], scf_e, 0, get_igf_startline_fx( st, L_frame[ch], L_frameTCX[ch] ) ); +#endif } } ELSE @@ -1747,8 +1755,11 @@ void ivas_mdct_core_tns_ns_fx( { st->hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e = s_max( st->hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e, st->hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[i] ); } - +#ifdef HARMONIZE_2553_TonalConceal_Apply + TonalMDCTConceal_Apply_fx( st->element_mode, st->hTonalMDCTConc, x_fx[ch][0], x_e, st->hTcxCfg->psychParamsCurrent ); +#else TonalMDCTConceal_Apply_ivas_fx( st->hTonalMDCTConc, x_fx[ch][0], x_e, st->hTcxCfg->psychParamsCurrent ); +#endif } test(); diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index d40505a358e6ba5a4fb84e2ef093ec710863b333..00a4e2b332ba50d78601dd7e3a03bb378fa6971f 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -418,7 +418,11 @@ void stereo_mdct_core_dec_fx( } Word16 s = getScaleFactor32( x_fx[ch][k], L_frameTCX[ch] ); Scale_sig32( x_fx[ch][k], L_frameTCX[ch], s ); /* exp(x_e + 31 - s) */ +#ifdef HARMONIZE_2553_TonalConceal_SaveFreqSignal + TonalMDCTConceal_SaveFreqSignal_fx( 1 /*signal non-EVS*/, st->hTonalMDCTConc, x_fx[ch][k], sub( x_e[ch][k], s ), L_frameTCX[ch], L_frame[ch], &scf_fx[0], scf_e, 0, get_igf_startline_fx( st, L_frame[ch], L_frameTCX[ch] ) ); +#else TonalMDCTConceal_SaveFreqSignal_ivas_fx( st->hTonalMDCTConc, x_fx[ch][k], sub( x_e[ch][k], s ), L_frameTCX[ch], L_frame[ch], &scf_fx[0], scf_e, 0, get_igf_startline_fx( st, L_frame[ch], L_frameTCX[ch] ) ); +#endif Scale_sig32( x_fx[ch][k], L_frameTCX[ch], negate( s ) ); /* exp(x_e) */ } } diff --git a/lib_dec/ivas_tcx_core_dec_fx.c b/lib_dec/ivas_tcx_core_dec_fx.c index eb5c88faaf648cfc673f81b72ca5ff994d5e188d..486896dc0b9fc79d2336ffbb267780e65d75616c 100644 --- a/lib_dec/ivas_tcx_core_dec_fx.c +++ b/lib_dec/ivas_tcx_core_dec_fx.c @@ -631,7 +631,11 @@ void stereo_tcx_core_dec_fx( { IF( !bfi && st->hTonalMDCTConc != NULL ) { +#ifdef HARMONIZE_2553_TonalConceal_SaveTimeSignal + TonalMDCTConceal_SaveTimeSignal_fx( st->element_mode, st->hTonalMDCTConc, synthFB_fx, st->Q_syn, hTcxDec->L_frameTCX ); +#else TonalMDCTConceal_SaveTimeSignal_ivas_fx( st->hTonalMDCTConc, synthFB_fx, st->Q_syn, hTcxDec->L_frameTCX ); +#endif } decoder_tcx_post_ivas_fx( st, synth_fx, synthFB_fx, st->Q_syn, Aq_fx, bfi, 0 ); diff --git a/lib_dec/tonalMDCTconcealment_fx.c b/lib_dec/tonalMDCTconcealment_fx.c index ae55088c0abb5669f97d89814f7c0e6ef018dae8..763cc3c4f5ee131dee616e6389edfae3c0828721 100644 --- a/lib_dec/tonalMDCTconcealment_fx.c +++ b/lib_dec/tonalMDCTconcealment_fx.c @@ -34,6 +34,7 @@ static void FindPhaseDifferences( TonalMDCTConcealPtr const hTonalMDCTConc, Word /*-------------- public functions -------------------- */ /*******************************************************/ +#ifndef HARMONIZE_2553_TonalConceal_Init ivas_error TonalMDCTConceal_Init_fx( TonalMDCTConcealPtr hTonalMDCTConc, const Word16 nSamples, @@ -116,9 +117,15 @@ ivas_error TonalMDCTConceal_Init_fx( return IVAS_ERR_OK; } +#endif +#ifdef HARMONIZE_2553_TonalConceal_Init +ivas_error TonalMDCTConceal_Init_fx( + Word16 element_mode, +#else ivas_error TonalMDCTConceal_Init_ivas_fx( +#endif TonalMDCTConcealPtr hTonalMDCTConc, const UWord16 nSamples, const UWord16 nSamplesCore, @@ -136,6 +143,40 @@ ivas_error TonalMDCTConceal_Init_ivas_fx( hTonalMDCTConc->tcx_cfg = hTcxCfg; hTonalMDCTConc->lastBlockData.spectralData = hTonalMDCTConc->spectralDataBuffers[0]; +#ifdef HARMONIZE_2553_TonalConceal_Init + IF( GT_16( element_mode, EVS_MONO ) ) + { + set16_fx( hTonalMDCTConc->lastBlockData.spectralData, 0, L_FRAME_MAX ); + move16(); + hTonalMDCTConc->secondLastBlockData.spectralData = hTonalMDCTConc->spectralDataBuffers[1]; + set16_fx( hTonalMDCTConc->secondLastBlockData.spectralData, 0, L_FRAME_MAX ); + move16(); + hTonalMDCTConc->secondLastPowerSpectrum = hTonalMDCTConc->secondLastBlockData.spectralData; + move16(); + hTonalMDCTConc->secondLastPowerSpectrum_exp = hTonalMDCTConc->secondLastBlockData.spectralData_exp; + move16(); + hTonalMDCTConc->lastBlockData.scaleFactors = hTonalMDCTConc->scaleFactorsBuffers[0]; + set16_fx( hTonalMDCTConc->lastBlockData.scaleFactors, 0, FDNS_NPTS ); + move16(); + hTonalMDCTConc->secondLastBlockData.scaleFactors = hTonalMDCTConc->scaleFactorsBuffers[1]; + set16_fx( hTonalMDCTConc->secondLastBlockData.scaleFactors, 0, FDNS_NPTS ); + move16(); + } + ELSE + { + move16(); + hTonalMDCTConc->secondLastBlockData.spectralData = hTonalMDCTConc->spectralDataBuffers[1]; + move16(); + hTonalMDCTConc->secondLastPowerSpectrum = hTonalMDCTConc->secondLastBlockData.spectralData; + move16(); + + hTonalMDCTConc->lastBlockData.scaleFactors = hTonalMDCTConc->scaleFactorsBuffers[0]; + move16(); + hTonalMDCTConc->secondLastBlockData.scaleFactors = hTonalMDCTConc->scaleFactorsBuffers[1]; + move16(); + } +#else + set16_fx( hTonalMDCTConc->lastBlockData.spectralData, 0, L_FRAME_MAX ); move16(); hTonalMDCTConc->secondLastBlockData.spectralData = hTonalMDCTConc->spectralDataBuffers[1]; @@ -151,6 +192,7 @@ ivas_error TonalMDCTConceal_Init_ivas_fx( hTonalMDCTConc->secondLastBlockData.scaleFactors = hTonalMDCTConc->scaleFactorsBuffers[1]; set16_fx( hTonalMDCTConc->secondLastBlockData.scaleFactors, 0, FDNS_NPTS ); move16(); +#endif hTonalMDCTConc->lastBlockData.scaleFactors_exp = hTonalMDCTConc->scaleFactorsBuffers_exp[0]; move16(); hTonalMDCTConc->secondLastBlockData.scaleFactors_exp = hTonalMDCTConc->scaleFactorsBuffers_exp[1]; @@ -187,6 +229,28 @@ ivas_error TonalMDCTConceal_Init_ivas_fx( move16(); hTonalMDCTConc->nScaleFactors = nScaleFactors; move16(); +#ifdef HARMONIZE_2553_TonalConceal_Init + IF( GT_16( element_mode, EVS_MONO ) ) + { + set32_fx( hTonalMDCTConc->scaleFactorsBackground_fx, 0, FDNS_NPTS ); + hTonalMDCTConc->scf_fadeout = 16384 /*1.000000 Q14*/; + PsychoacousticParameters_Init_fx( INT_FS_16k, L_FRAME16k, 64, 1, 1, &hTonalMDCTConc->psychParamsTCX20 ); + PsychoacousticParameters_Init_fx( INT_FS_16k, L_FRAME16k / 2, 64, 0, 1, &hTonalMDCTConc->psychParamsTCX10 ); + hTonalMDCTConc->psychParams = NULL; + hTonalMDCTConc->last_block_nrg = 0; + move16(); + hTonalMDCTConc->last_block_nrg_exp = 0; + move16(); + hTonalMDCTConc->curr_noise_nrg = 0; + move16(); + hTonalMDCTConc->curr_noise_nrg_exp = 0; + move16(); + hTonalMDCTConc->faded_signal_nrg = 0; + move16(); + hTonalMDCTConc->faded_signal_nrg_exp = 0; + move16(); + } +#else set32_fx( hTonalMDCTConc->scaleFactorsBackground_fx, 0, FDNS_NPTS ); hTonalMDCTConc->scf_fadeout = 16384 /*1.000000 Q14*/; @@ -206,14 +270,20 @@ ivas_error TonalMDCTConceal_Init_ivas_fx( move16(); hTonalMDCTConc->faded_signal_nrg_exp = 0; move16(); - +#endif /* Offset the pointer to the end of buffer, so that pTCI is not destroyed when new time samples are stored in lastPcmOut */ move16(); move16(); /* just the second half of the second last pcm output is needed */ - set16_fx( hTonalMDCTConc->timeDataBuffer, 0, ( 3 * L_FRAME_MAX ) / 2 ); +#ifdef HARMONIZE_2553_TonalConceal_Init + IF( GT_16( element_mode, EVS_MONO ) ) +#endif + { + set16_fx( hTonalMDCTConc->timeDataBuffer, 0, ( 3 * L_FRAME_MAX ) / 2 ); + } + hTonalMDCTConc->secondLastPcmOut = &hTonalMDCTConc->timeDataBuffer[( 3 * L_FRAME_MAX ) / 2 - ( 3 * s_min( L_FRAME_MAX, nSamples ) / 2 )]; hTonalMDCTConc->lastPcmOut = &hTonalMDCTConc->timeDataBuffer[( 3 * L_FRAME_MAX ) / 2 - s_min( L_FRAME_MAX, nSamples )]; /* If the second last frame was lost, we reuse saved TonalComponentsInfo and don't update pcm buffers */ @@ -222,7 +292,7 @@ ivas_error TonalMDCTConceal_Init_ivas_fx( return IVAS_ERR_OK; } - +#ifndef HARMONIZE_2553_TonalConceal_SaveFreqSignal void TonalMDCTConceal_SaveFreqSignal_fx( TonalMDCTConcealPtr hTonalMDCTConc, const Word32 *mdctSpectrum, // Q31-mdctSpectrum_exp @@ -352,9 +422,14 @@ void TonalMDCTConceal_SaveFreqSignal_fx( return; } +#endif - +#ifdef HARMONIZE_2553_TonalConceal_SaveFreqSignal +void TonalMDCTConceal_SaveFreqSignal_fx( + Word16 element_mode, +#else void TonalMDCTConceal_SaveFreqSignal_ivas_fx( +#endif TonalMDCTConcealPtr hTonalMDCTConc, const Word32 *mdctSpectrum, // Q31-mdctSpectrum_exp const Word16 mdctSpectrum_exp, // Q0 @@ -455,6 +530,22 @@ void TonalMDCTConceal_SaveFreqSignal_ivas_fx( IF( ( nNewSamples > 0 ) && ( LE_16( nNewSamples, 2 * L_FRAME_MAX ) ) ) { /* Store new data */ +#ifdef HARMONIZE_2553_TonalConceal_SaveFreqSignal + IF( GT_16( element_mode, EVS_MONO ) ) + { + Word64 W_tmp = 0; + move64(); + FOR( i = 0; i < infoIGFStartLine; i++ ) + { + W_tmp = W_mac_32_16( W_tmp, Mpy_32_32( mdctSpectrum[i], mdctSpectrum[i] ), 1 ); // exp: mdctSpectrum_exp + mdctSpectrum_exp - 1 + } + s = W_norm( W_tmp ); + hTonalMDCTConc->last_block_nrg = W_extract_h( W_shl( W_tmp, s ) ); // exp:add( sub( shl( mdctSpectrum_exp, 1 ), s ), 31 ) + move32(); + hTonalMDCTConc->last_block_nrg_exp = add( sub( shl( mdctSpectrum_exp, 1 ), s ), 31 ); + move16(); + } +#else Word64 W_tmp = 0; move64(); FOR( i = 0; i < infoIGFStartLine; i++ ) @@ -468,6 +559,7 @@ void TonalMDCTConceal_SaveFreqSignal_ivas_fx( move16(); /* Store new data */ +#endif s = getScaleFactor32( mdctSpectrum, nNewSamples ); max_exp = 0; @@ -482,7 +574,37 @@ void TonalMDCTConceal_SaveFreqSignal_ivas_fx( /*s = sub(s, max_exp);*/ hTonalMDCTConc->lastBlockData.scaleFactors_max_e = max_exp; move16(); +#ifdef HARMONIZE_2553_TonalConceal_SaveFreqSignal + IF( EQ_16( element_mode, EVS_MONO ) ) + { + FOR( i = 0; i < nNewSamples; i++ ) + { + hTonalMDCTConc->lastBlockData.spectralData[i] = extract_h( L_shl( mdctSpectrum[i], s ) ); // 31 - mdctSpectrum_exp +s -16 = 15-(mdctSpectrum_exp -s) + move16(); + } + } + ELSE + { + FOR( i = 0; i < nNewSamples; i++ ) + { + Word16 tmp = 0; + if ( mdctSpectrum[i] != 0 ) + { + tmp = 1; + move16(); + } + hTonalMDCTConc->lastBlockData.spectralData[i] = extract_h( L_shl( mdctSpectrum[i], s ) ); // 31 - mdctSpectrum_exp +s -16 = 15-(mdctSpectrum_exp -s) + move16(); + test(); + if ( hTonalMDCTConc->lastBlockData.spectralData[i] == 0 && EQ_16( tmp, 1 ) ) + { + hTonalMDCTConc->lastBlockData.spectralData[i] = 1; + move16(); + } + } + } +#else FOR( i = 0; i < nNewSamples; i++ ) { Word16 tmp = 0; @@ -501,6 +623,7 @@ void TonalMDCTConceal_SaveFreqSignal_ivas_fx( move16(); } } +#endif hTonalMDCTConc->lastBlockData.spectralData_exp = sub( mdctSpectrum_exp, s ); move16(); @@ -2400,6 +2523,7 @@ void TonalMDCTConceal_InsertNoise_fx( return; } +#ifndef HARMONIZE_2553_TonalConceal_Apply void TonalMDCTConceal_Apply_fx( const TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ Word32 *mdctSpectrum, // Q31-*mdctSpectrum_exp /*IN/OUT*/ @@ -2488,14 +2612,23 @@ void TonalMDCTConceal_Apply_fx( return; } +#endif +#ifdef HARMONIZE_2553_TonalConceal_Apply +void TonalMDCTConceal_Apply_fx( + Word16 element_mode, +#else void TonalMDCTConceal_Apply_ivas_fx( - TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ - Word32 *mdctSpectrum, // Q31-*mdctSpectrum_exp /*IN/OUT*/ - Word16 mdctSpectrum_exp, /*IN */ +#endif + const TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ + Word32 *mdctSpectrum, // Q31-*mdctSpectrum_exp /*IN/OUT*/ + Word16 mdctSpectrum_exp, /*IN */ const PsychoacousticParameters *psychParamsCurrent ) { +#ifdef HARMONIZE_2553_TonalConceal_Apply + Word16 exp; +#endif Word16 i, l; Word16 *phaseDiff, *pCurrentPhase; Word32 phaseToAdd; @@ -2505,22 +2638,27 @@ void TonalMDCTConceal_Apply_ivas_fx( Word16 nSamples; Word16 nBands; +#ifndef HARMONIZE_2553_TonalConceal_Apply Word16 *tmp_secondLastPowerSpectrum = hTonalMDCTConc->secondLastPowerSpectrum; Word16 tmp_secondLastPowerSpectrum_exp = hTonalMDCTConc->secondLastPowerSpectrum_exp; move16(); Word16 max_nSamples = s_max( hTonalMDCTConc->nNonZeroSamples, hTonalMDCTConc->nSamplesCore ); - // To avoid garbage values - set32_fx( powerSpectrum, 0, L_FRAME_MAX ); - - /* Creating 32-bit scaleFactors with common exponent. */ - FOR( i = 0; i < FDNS_NPTS; i++ ) +#else + IF( GT_16( element_mode, EVS_MONO ) ) +#endif { - scaleFactors[i] = L_shr( L_deposit_h( hTonalMDCTConc->secondLastBlockData.scaleFactors[i] ), sub( hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e, hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[i] ) ); // Q31- scaleFactors_max_e+scaleFactors_exp[i] - move32(); - } + // To avoid garbage values + set32_fx( powerSpectrum, 0, L_FRAME_MAX ); + /* Creating 32-bit scaleFactors with common exponent. */ + FOR( i = 0; i < FDNS_NPTS; i++ ) + { + scaleFactors[i] = L_shr( L_deposit_h( hTonalMDCTConc->secondLastBlockData.scaleFactors[i] ), sub( hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e, hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[i] ) ); // Q31- scaleFactors_max_e+scaleFactors_exp[i] + move32(); + } + } IF( s_and( hTonalMDCTConc->lastBlockData.blockIsValid, hTonalMDCTConc->secondLastBlockData.blockIsValid ) ) { assert( hTonalMDCTConc->pTCI->numIndexes > 0 ); @@ -2528,88 +2666,116 @@ void TonalMDCTConceal_Apply_ivas_fx( nSamples = hTonalMDCTConc->nNonZeroSamples; move16(); assert( hTonalMDCTConc->pTCI->upperIndex[hTonalMDCTConc->pTCI->numIndexes - 1] < nSamples ); - - FOR( i = 0; i < nSamples; i++ ) +#ifdef HARMONIZE_2553_TonalConceal_Apply + IF( GT_16( element_mode, EVS_MONO ) ) +#endif { - powerSpectrum[i] = L_deposit_h( tmp_secondLastPowerSpectrum[i] ); // Q31 - secondLastPowerSpectrum_exp + FOR( i = 0; i < nSamples; i++ ) + { +#ifdef HARMONIZE_2553_TonalConceal_Apply + powerSpectrum[i] = L_deposit_h( hTonalMDCTConc->secondLastPowerSpectrum[i] ); // Q31 - secondLastPowerSpectrum_exp +#else + powerSpectrum[i] = L_deposit_h( tmp_secondLastPowerSpectrum[i] ); // Q31 - secondLastPowerSpectrum_exp +#endif + move16(); + } +#ifdef HARMONIZE_2553_TonalConceal_Apply + powerSpectrum_exp = hTonalMDCTConc->secondLastPowerSpectrum_exp; +#else + powerSpectrum_exp = tmp_secondLastPowerSpectrum_exp; +#endif move16(); - } - powerSpectrum_exp = tmp_secondLastPowerSpectrum_exp; - move16(); - - Word16 exp1 = powerSpectrum_exp; - move16(); - IF( psychParamsCurrent == NULL ) - { - nBands = FDNS_NPTS; + Word16 exp1 = powerSpectrum_exp; move16(); - mdct_noiseShaping_ivas_fx( powerSpectrum, &powerSpectrum_exp, hTonalMDCTConc->nSamplesCore, hTonalMDCTConc->secondLastBlockData.scaleFactors, - hTonalMDCTConc->secondLastBlockData.scaleFactors_exp ); - } - ELSE - { - Word16 q_ps, q_sf; - q_ps = sub( 31, powerSpectrum_exp ); - q_sf = sub( 31, hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e ); - /* adding guard bit */ - q_ps = sub( q_ps, 1 ); - FOR( Word16 c = 0; c < hTonalMDCTConc->nSamplesCore; c++ ) + IF( psychParamsCurrent == NULL ) { - powerSpectrum[c] = L_shr( powerSpectrum[c], 1 ); // q_ps -1 - move32(); + nBands = FDNS_NPTS; + move16(); + mdct_noiseShaping_ivas_fx( powerSpectrum, &powerSpectrum_exp, hTonalMDCTConc->nSamplesCore, hTonalMDCTConc->secondLastBlockData.scaleFactors, + hTonalMDCTConc->secondLastBlockData.scaleFactors_exp ); } - - /* adding guard bit */ - q_sf = sub( q_sf, 1 ); - FOR( Word16 c = 0; c < FDNS_NPTS; c++ ) + ELSE { - scaleFactors[c] = L_shr( scaleFactors[c], 1 ); // q_sf - 1 - move32(); - } + Word16 q_ps, q_sf; + q_ps = sub( 31, powerSpectrum_exp ); + q_sf = sub( 31, hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e ); - sns_shape_spectrum_fx( powerSpectrum, &q_ps, psychParamsCurrent, scaleFactors, q_sf, hTonalMDCTConc->nSamplesCore, NULL ); + /* adding guard bit */ + q_ps = sub( q_ps, 1 ); + FOR( Word16 c = 0; c < hTonalMDCTConc->nSamplesCore; c++ ) + { + powerSpectrum[c] = L_shr( powerSpectrum[c], 1 ); // q_ps -1 + move32(); + } - powerSpectrum_exp = sub( 31, add( q_ps, 1 ) ); + /* adding guard bit */ + q_sf = sub( q_sf, 1 ); + FOR( Word16 c = 0; c < FDNS_NPTS; c++ ) + { + scaleFactors[c] = L_shr( scaleFactors[c], 1 ); // q_sf - 1 + move32(); + } - nBands = psychParamsCurrent->nBands; - move16(); - } + sns_shape_spectrum_fx( powerSpectrum, &q_ps, psychParamsCurrent, scaleFactors, q_sf, hTonalMDCTConc->nSamplesCore, NULL ); - Word16 exp_left = powerSpectrum_exp; - move16(); - Word16 exp_right = exp1; - move16(); + powerSpectrum_exp = sub( 31, add( q_ps, 1 ) ); - FOR( Word16 c = hTonalMDCTConc->nSamplesCore; c < nSamples; c++ ) - { - powerSpectrum[c] = Mpy_32_16_1( powerSpectrum[c], hTonalMDCTConc->secondLastBlockData.scaleFactors[nBands - 1] ); // Q31 -(exp_right + scaleFactors_exp[]) - move32(); - } - exp_right = add( exp_right, hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[nBands - 1] ); + nBands = psychParamsCurrent->nBands; + move16(); + } - Word16 max_e = s_max( exp_right, exp_left ); - FOR( Word16 c = 0; c < max_nSamples; c++ ) - { - test(); - test(); - test(); - test(); - IF( GE_16( c, hTonalMDCTConc->nSamplesCore ) && LT_16( c, nSamples ) && GT_16( max_e, exp_right ) ) + Word16 exp_left = powerSpectrum_exp; + move16(); + Word16 exp_right = exp1; + move16(); + + FOR( Word16 c = hTonalMDCTConc->nSamplesCore; c < nSamples; c++ ) { - powerSpectrum[c] = L_shr( powerSpectrum[c], sub( max_e, exp_right ) ); // Q31-max_e + powerSpectrum[c] = Mpy_32_16_1( powerSpectrum[c], hTonalMDCTConc->secondLastBlockData.scaleFactors[nBands - 1] ); // Q31 -(exp_right + scaleFactors_exp[]) move32(); } - ELSE IF( ( LT_16( c, hTonalMDCTConc->nSamplesCore ) || GT_16( c, nSamples ) ) && GT_16( max_e, exp_left ) ) + exp_right = add( exp_right, hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[nBands - 1] ); + + Word16 max_e = s_max( exp_right, exp_left ); +#ifdef HARMONIZE_2553_TonalConceal_Apply + FOR( Word16 c = 0; c < s_max( hTonalMDCTConc->nNonZeroSamples, hTonalMDCTConc->nSamplesCore ); c++ ) +#else + FOR( Word16 c = 0; c < max_nSamples; c++ ) +#endif { - powerSpectrum[c] = L_shr( powerSpectrum[c], sub( max_e, exp_left ) ); // Q31-max_e - move32(); + test(); + test(); + test(); + test(); + IF( GE_16( c, hTonalMDCTConc->nSamplesCore ) && LT_16( c, nSamples ) && GT_16( max_e, exp_right ) ) + { + powerSpectrum[c] = L_shr( powerSpectrum[c], sub( max_e, exp_right ) ); // Q31-max_e + move32(); + } + ELSE IF( ( LT_16( c, hTonalMDCTConc->nSamplesCore ) || GT_16( c, nSamples ) ) && GT_16( max_e, exp_left ) ) + { + powerSpectrum[c] = L_shr( powerSpectrum[c], sub( max_e, exp_left ) ); // Q31-max_e + move32(); + } } + powerSpectrum_exp = max_e; + move16(); } - powerSpectrum_exp = max_e; - move16(); +#ifdef HARMONIZE_2553_TonalConceal_Apply + ELSE + { + + mdct_shaping_16( hTonalMDCTConc->secondLastPowerSpectrum, hTonalMDCTConc->nSamplesCore, nSamples, + hTonalMDCTConc->secondLastBlockData.scaleFactors, hTonalMDCTConc->secondLastBlockData.scaleFactors_exp, + hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e, powerSpectrum ); + + powerSpectrum_exp = add( add( hTonalMDCTConc->secondLastPowerSpectrum_exp, hTonalMDCTConc->secondLastBlockData.gain_tcx_exp ), hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e ); + } + exp = sub( mdctSpectrum_exp, add( powerSpectrum_exp, 1 ) ); +#endif phaseDiff = hTonalMDCTConc->pTCI->phaseDiff; /* if multiple frame loss occurs use the phase from the last frame and continue rotating */ pCurrentPhase = hTonalMDCTConc->pTCI->phase_currentFramePredicted; @@ -2658,7 +2824,12 @@ void TonalMDCTConceal_Apply_ivas_fx( /* getCosWord16 returns 1Q14*/ mdctSpectrum[l] = Mpy_32_16_1( powerSpectrum[l], getCosWord16( extract_l( currentPhase ) ) ); move32(); +#ifdef HARMONIZE_2553_TonalConceal_Apply + mdctSpectrum[l] = L_shr( mdctSpectrum[l], exp ); + move32(); +#else mdctSpectrum[l] = L_shr( mdctSpectrum[l], sub( mdctSpectrum_exp, add( powerSpectrum_exp, 1 ) ) ); +#endif } } } @@ -2669,6 +2840,7 @@ void TonalMDCTConceal_Apply_ivas_fx( return; } +#ifndef HARMONIZE_2553_TonalConceal_SaveTimeSignal void TonalMDCTConceal_SaveTimeSignal_fx( TonalMDCTConcealPtr hTonalMDCTConc, Word16 *timeSignal, // Qx @@ -2688,9 +2860,15 @@ void TonalMDCTConceal_SaveTimeSignal_fx( return; } +#endif +#ifdef HARMONIZE_2553_TonalConceal_SaveTimeSignal +void TonalMDCTConceal_SaveTimeSignal_fx( + Word16 element_mode, +#else void TonalMDCTConceal_SaveTimeSignal_ivas_fx( +#endif TonalMDCTConcealPtr hTonalMDCTConc, Word16 *timeSignal, // q_timeSignal Word16 q_timeSignal, @@ -2704,15 +2882,25 @@ void TonalMDCTConceal_SaveTimeSignal_ivas_fx( Word16 exp, len; len = shr( hTonalMDCTConc->nSamples, 1 ); Copy( hTonalMDCTConc->lastPcmOut + len, hTonalMDCTConc->secondLastPcmOut, len ); - exp = sub( q_timeSignal, hTonalMDCTConc->q_lastPcmOut ); - IF( exp != 0 ) +#ifdef HARMONIZE_2553_TonalConceal_SaveTimeSignal + IF( GT_16( element_mode, EVS_MONO ) ) +#endif { - Scale_sig( hTonalMDCTConc->secondLastPcmOut, len, exp ); // q_timeSignal + exp = sub( q_timeSignal, hTonalMDCTConc->q_lastPcmOut ); + IF( exp != 0 ) + { + Scale_sig( hTonalMDCTConc->secondLastPcmOut, len, exp ); // q_timeSignal + } } } Copy( timeSignal, hTonalMDCTConc->lastPcmOut, hTonalMDCTConc->nSamples ); - hTonalMDCTConc->q_lastPcmOut = q_timeSignal; - move16(); +#ifdef HARMONIZE_2553_TonalConceal_SaveTimeSignal + IF( GT_16( element_mode, EVS_MONO ) ) +#endif + { + hTonalMDCTConc->q_lastPcmOut = q_timeSignal; + move16(); + } } return;