Loading lib_com/options.h +0 −1 Original line number Diff line number Diff line Loading @@ -86,7 +86,6 @@ #define HARMONIZE_TBE2 /* VA: basop issue 2399: Remove duplicated code: TBE, step 2 */ #define HARMONIZE_2427_GETPLC /* FhG: basop issue : 2427 Harmonizing getPLCDecision functions:*/ #define HARM_FD_BWE /* VA: harmonize core-coder FD BWE function duplications */ #define FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT /* FhG: basop issue 2411: harmonize TNSAnalysis*_fx(), DetectTnsFilt*_fx()*/ #define HARMONIZE_READ_DECODE_TNS /* FhG basop 2389: Harm between two pairs of functions. */ #define FIX_FLOAT_1526_DIRAC_MEM_LEAK /* FhG: float issue 1526: potential memory leak in DirAC handles in case of format switching */ #define FIX_2437_HARMONIZE_ENCODERINDEX /* FhG: basop issue 2437 EncoderIndex_ivas_fx() and EncoderIndex_fx()*/ Loading lib_enc/cod_tcx_fx.c +0 −98 Original line number Diff line number Diff line Loading @@ -135,96 +135,7 @@ void HBAutocorrelation_fx( } } #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT void TNSAnalysis_fx( TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ Word16 L_frame, /* input: frame length */ Word16 L_spec, Word16 tcxMode, /* input: TCX mode for the frame/subframe - TCX20 | TCX10 | TCX 5 (meaning 2 x TCX 5) */ Word8 isAfterACELP, /* input: Flag indicating if the last frame was ACELP. For the second TCX subframe it should be 0 */ Word32 spectrum[], /* input: MDCT spectrum Qx*/ STnsData *pTnsData, /* output: Tns data */ Word8 *pfUseTns, /* output: Flag indicating if TNS is used */ Word16 *predictionGain /*Q7*/ ) { Word32 buff[8]; Word16 tmp = 0; /* initialization only to avoid compiler warning, not counted */ Word16 tmp2 = 0; /* initialization only to avoid compiler warning, not counted */ move16(); move16(); /* Init TNS */ *pfUseTns = 0; move16(); IF( hTcxCfg->fIsTNSAllowed != 0 ) { hTcxCfg->pCurrentTnsConfig = &hTcxCfg->tnsConfig[( tcxMode - TCX_20 ) == 0][isAfterACELP]; L_spec = hTcxCfg->pCurrentTnsConfig->iFilterBorders[0]; move16(); /*-----------------------------------------------------------* * Temporal Noise Shaping analysis * *-----------------------------------------------------------*/ IF( EQ_16( tcxMode, TCX_5 ) ) { tmp = shr( L_frame, 2 ); /* rearrange LF sub-window lines prior to TNS analysis & filtering */ tmp2 = shr( L_spec, 1 ); IF( LT_16( tmp2, tmp ) ) { Copy32( spectrum + 8, spectrum + 16, sub( tmp2, 8 ) ); Copy32( spectrum + tmp, spectrum + 8, 8 ); Copy32( spectrum + tmp + 8, spectrum + tmp2 + 8, sub( tmp2, 8 ) ); } ELSE { Copy32( spectrum + tmp, buff, 8 ); Copy32( spectrum + 8, spectrum + 16, sub( tmp, 8 ) ); Copy32( buff, spectrum + 8, 8 ); } } move16(); *pfUseTns = (Word8) DetectTnsFilt_fx( hTcxCfg->pCurrentTnsConfig, spectrum, pTnsData, predictionGain ); /* If TNS should be used then get the residual after applying it inplace in spectrum */ IF( *pfUseTns != 0 ) { ApplyTnsFilter( hTcxCfg->pCurrentTnsConfig, pTnsData, spectrum, 1 ); } IF( EQ_16( tcxMode, TCX_5 ) ) { /* undo rearrangement of LF sub-window lines prior to TNS analysis */ IF( LT_16( tmp2, tmp ) ) { Copy32( spectrum + tmp2 + 8, spectrum + tmp + 8, sub( tmp2, 8 ) ); Copy32( spectrum + 8, spectrum + tmp, 8 ); Copy32( spectrum + 16, spectrum + 8, sub( tmp2, 8 ) ); set32_fx( spectrum + tmp2, 0, sub( tmp, tmp2 ) ); set32_fx( spectrum + tmp + tmp2, 0, sub( tmp, tmp2 ) ); } ELSE { Copy32( spectrum + 8, buff, 8 ); Copy32( spectrum + 16, spectrum + 8, sub( tmp, 8 ) ); Copy32( buff, spectrum + tmp, 8 ); } } } } #endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT void TNSAnalysis_ivas_fx( #else void TNSAnalysis_fx( #endif // FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ Word16 L_frame, /* i : frame length */ Word16 L_spec, /* i : length of the spectrum */ Loading Loading @@ -280,13 +191,8 @@ void TNSAnalysis_fx( } move16(); #ifdef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT *pfUseTns = (Word8) DetectTnsFilt_fx( hTcxCfg->pCurrentTnsConfig, spectrum, pTnsData, hTranDet, (Word8) NE_16( transform_type, TCX_20 ), ltp_gain, predictionGain ); #else *pfUseTns = (Word8) DetectTnsFilt_ivas_fx( hTcxCfg->pCurrentTnsConfig, spectrum, pTnsData, hTranDet, (Word8) NE_16( transform_type, TCX_20 ), ltp_gain, predictionGain ); #endif // FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT /* If TNS should be used then get the residual after applying it inplace in spectrum */ IF( *pfUseTns != 0 ) Loading Loading @@ -3859,11 +3765,7 @@ void coder_tcx_fx( { SetTnsConfig( hTcxCfg, sub( L_frame_glob, st->L_frame ) == 0, st->last_core == 0 ); #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT TNSAnalysis_fx( hTcxCfg, L_frame, L_spec, TCX_20, st->last_core == 0, spectrum, hTcxEnc->tnsData, hTcxEnc->fUseTns, &st->hIGFEnc->tns_predictionGain ); #else TNSAnalysis_fx( hTcxCfg, L_frame, L_spec, TCX_20, st->last_core == 0, spectrum, st->hTranDet, -32768, hTcxEnc->tnsData, hTcxEnc->fUseTns, &st->hIGFEnc->tns_predictionGain ); #endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT } ELSE { Loading lib_enc/ext_sig_ana_fx.c +0 −16 Original line number Diff line number Diff line Loading @@ -406,18 +406,10 @@ void core_signal_analysis_high_bitrate_fx( { test(); test(); #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT TNSAnalysis_fx( st->hTcxCfg, L_frameTCX, st->hTcxCfg->tcx_coded_lines, transform_type[frameno], ( frameno == 0 ) && ( st->last_core == ACELP_CORE ), spectrum[frameno], &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL ); #else TNSAnalysis_fx( st->hTcxCfg, L_frameTCX, st->hTcxCfg->tcx_coded_lines, transform_type[frameno], ( frameno == 0 ) && ( st->last_core == ACELP_CORE ), spectrum[frameno], st->hTranDet, -32768, &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL ); #endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT { EncodeTnsData_fx( st->hTcxCfg->pCurrentTnsConfig, &hTcxEnc->tnsData[frameno], Loading Loading @@ -1207,19 +1199,11 @@ void core_signal_analysis_high_bitrate_ivas_fx( test(); IF( ( frameno == 0 ) && ( st->last_core == ACELP_CORE ) ) { #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT TNSAnalysis_ivas_fx( st->hTcxCfg, L_frameTCX, st->hTcxCfg->tcx_coded_lines, transform_type[frameno], 1, hTcxEnc->spectrum_fx[frameno], st->hTranDet, -32768, &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL ); #else TNSAnalysis_fx( st->hTcxCfg, L_frameTCX, st->hTcxCfg->tcx_coded_lines, transform_type[frameno], 1, hTcxEnc->spectrum_fx[frameno], st->hTranDet, -32768, &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL ); #endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT } ELSE { #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT TNSAnalysis_ivas_fx( st->hTcxCfg, L_frameTCX, st->hTcxCfg->tcx_coded_lines, transform_type[frameno], 0, hTcxEnc->spectrum_fx[frameno], st->hTranDet, -32768, &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL ); #else TNSAnalysis_fx( st->hTcxCfg, L_frameTCX, st->hTcxCfg->tcx_coded_lines, transform_type[frameno], 0, hTcxEnc->spectrum_fx[frameno], st->hTranDet, -32768, &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL ); #endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT } IF( st->hTcxCfg->fIsTNSAllowed ) Loading lib_enc/prot_fx_enc.h +0 −29 Original line number Diff line number Diff line Loading @@ -1463,20 +1463,8 @@ void CalculateTnsFilt_fx( const Word16 pSpectrum_e, STnsData *pTnsData /* o : TNS data struct */ ); #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT Word16 DetectTnsFilt_fx( STnsConfig const *pTnsConfig, Word32 const pSpectrum[], STnsData *pTnsData, Word16 *predictionGain ); #endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT #ifdef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT Word16 DetectTnsFilt_fx( #else Word16 DetectTnsFilt_ivas_fx( #endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT STnsConfig const *pTnsConfig, /* i : TNS Configuration struct */ Word32 const pSpectrum[], /* i : MDCT spectrum Q=Qx */ STnsData *pTnsData, /* o : TNS data struct */ Loading Loading @@ -2676,25 +2664,8 @@ void IGFEncResetTCX10BitCounter_fx( const IGF_ENC_INSTANCE_HANDLE hInstance /**< in: | instance handle of IGF Encoder */ ); #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT void TNSAnalysis_fx( TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ Word16 L_frame, /* i : frame length */ Word16 L_spec, Word16 tcxMode, /* i : TCX mode for the frame/subframe - TCX20 | TCX10 | TCX 5 (meaning 2 x TCX 5) */ Word8 isAfterACELP, /* i : Flag indicating if the last frame was ACELP. For the second TCX subframe it should be 0 */ Word32 spectrum[], /* i : MDCT spectrum */ STnsData *pTnsData, /* o : Tns data */ Word8 *pfUseTns, /* o : Flag indicating if TNS is used */ Word16 *predictionGain ); #endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT void TNSAnalysis_ivas_fx( #else void TNSAnalysis_fx( #endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ Word16 L_frame, /* i : frame length */ Word16 L_spec, /* i : length of the spectrum */ Loading lib_enc/tns_base_enc_fx.c +0 −261 Original line number Diff line number Diff line Loading @@ -50,259 +50,6 @@ typedef Word32 ( *TLinearPredictionFilter )( Word16 order, Word16 const parCoeff /********************************/ #define MAX_SUBDIVISIONS 3 #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT Word16 DetectTnsFilt_fx( STnsConfig const *pTnsConfig, Word32 const pSpectrum[], STnsData *pTnsData, Word16 *predictionGain ) { Word16 facs[TNS_MAX_NUM_OF_FILTERS][MAX_SUBDIVISIONS]; Word16 facs_e[TNS_MAX_NUM_OF_FILTERS][MAX_SUBDIVISIONS]; /* exponents of facs[][] */ Word16 shifts[TNS_MAX_NUM_OF_FILTERS][MAX_SUBDIVISIONS]; Word16 iFilter = 0; move16(); ResetTnsData( pTnsData ); IF( pTnsConfig->maxOrder <= 0 ) { return 0; } /* Calculate norms for each spectrum part */ FOR( iFilter = 0; iFilter < pTnsConfig->nMaxFilters; iFilter++ ) { Word16 idx0; Word16 idx1; Word16 nSubdivisions; Word16 iSubdivisions; move16(); move16(); move16(); idx0 = pTnsConfig->iFilterBorders[iFilter + 1]; idx1 = pTnsConfig->iFilterBorders[iFilter]; nSubdivisions = pTnsConfig->pTnsParameters[iFilter].nSubdivisions; assert( pTnsConfig->pTnsParameters[iFilter].nSubdivisions <= MAX_SUBDIVISIONS ); FOR( iSubdivisions = 0; iSubdivisions < nSubdivisions; iSubdivisions++ ) { Word16 iStartLine; Word16 iEndLine; Word16 tmp, headroom, shift; Word32 L_tmp, tmp32; /* iStartLine = idx0 + (idx1-idx0)*iSubdivisions/nSubdivisions; iEndLine = idx0 + (idx1-idx0)*(iSubdivisions+1)/nSubdivisions; */ assert( ( nSubdivisions == 1 ) || ( nSubdivisions == 3 ) ); tmp = sub( idx1, idx0 ); iStartLine = imult1616( tmp, iSubdivisions ); iEndLine = add( iStartLine, tmp ); IF( EQ_16( nSubdivisions, 3 ) ) { iStartLine = mult( iStartLine, 0x2AAB ); } iStartLine = add( iStartLine, idx0 ); IF( EQ_16( nSubdivisions, 3 ) ) { iEndLine = mult( iEndLine, 0x2AAB ); } iEndLine = add( iEndLine, idx0 ); /*norms[iFilter][iSubdivisions] = norm2FLOAT(pSpectrum+iStartLine, iEndLine-iStartLine);*/ headroom = getScaleFactor32( &pSpectrum[iStartLine], sub( iEndLine, iStartLine ) ); /* Calculate norm of spectrum band */ L_tmp = Norm32Norm( pSpectrum + iStartLine, headroom, sub( iEndLine, iStartLine ), &shift ); /* Check threshold HLM_MIN_NRG */ BASOP_SATURATE_WARNING_OFF_EVS; tmp32 = L_sub( L_shl_sat( L_tmp, s_min( 31, sub( shift, 24 - 31 * 2 ) ) ), 3277l /*HLM_MIN_NRG Q7*/ ); BASOP_SATURATE_WARNING_ON_EVS; /* get pre-shift for autocorrelation */ tmp = sub( shift, norm_l( L_tmp ) ); /* exponent for normalized L_tmp */ tmp = shr( sub( 1, tmp ), 1 ); /* pre-shift to apply before autocorrelation */ shifts[iFilter][iSubdivisions] = s_min( tmp, headroom ); move16(); /* calc normalization factor */ facs[iFilter][iSubdivisions] = 0; move16(); facs_e[iFilter][iSubdivisions] = 0; move16(); if ( tmp32 > 0 ) { facs[iFilter][iSubdivisions] = 0x7FFF; move16(); /* normalization not needed for one subdivision */ } test(); IF( ( tmp32 > 0 ) && ( GT_16( nSubdivisions, 1 ) ) ) { move16(); facs_e[iFilter][iSubdivisions] = shl( sub( tmp, shifts[iFilter][iSubdivisions] ), 1 ); tmp = sub( 1, shl( tmp, 1 ) ); /* exponent of autocorrelation */ L_tmp = L_shl_sat( L_tmp, sub( shift, tmp ) ); /* shift L_tmp to that exponent */ /* calc factor (with 2 bits headroom for sum of 3 subdivisions) */ move16(); facs[iFilter][iSubdivisions] = div_s( 0x2000, round_fx_sat( L_tmp ) ); /* L_tmp is >= 0x2000000 */ } } } /* Calculate normalized autocorrelation for spectrum subdivision and get TNS filter parameters based on it */ FOR( iFilter = 0; iFilter < pTnsConfig->nMaxFilters; iFilter++ ) { #define RXX_E ( 3 ) Word32 rxx[TNS_MAX_FILTER_ORDER + 1]; Word16 idx0; Word16 idx1; Word16 spectrumLength; STnsFilter *pFilter; Word16 nSubdivisions; Word16 iSubdivisions; Word16 tmpbuf[325]; set32_fx( rxx, 0, TNS_MAX_FILTER_ORDER + 1 ); move16(); move16(); move16(); idx0 = pTnsConfig->iFilterBorders[iFilter + 1]; idx1 = pTnsConfig->iFilterBorders[iFilter]; spectrumLength = sub( idx1, idx0 ); pFilter = pTnsData->filter + iFilter; nSubdivisions = pTnsConfig->pTnsParameters[iFilter].nSubdivisions; FOR( iSubdivisions = 0; iSubdivisions < nSubdivisions; iSubdivisions++ ) { Word16 iStartLine, n, i; Word16 iEndLine; const Word16 *pWindow; Word16 lag, shift; Word32 L_tmp; IF( facs[iFilter][iSubdivisions] == 0 ) { BREAK; } /* iStartLine = idx0 + (idx1-idx0)*iSubdivisions/nSubdivisions; iEndLine = idx0 + (idx1-idx0)*(iSubdivisions+1)/nSubdivisions; */ assert( ( nSubdivisions == 1 ) || ( nSubdivisions == 3 ) ); iStartLine = imult1616( spectrumLength, iSubdivisions ); iEndLine = add( iStartLine, spectrumLength ); IF( EQ_16( nSubdivisions, 3 ) ) { iStartLine = mult( iStartLine, 0x2AAB ); } iStartLine = add( iStartLine, idx0 ); IF( EQ_16( nSubdivisions, 3 ) ) { iEndLine = mult( iEndLine, 0x2AAB ); } iEndLine = add( iEndLine, idx0 ); move16(); shift = shifts[iFilter][iSubdivisions]; move16(); pWindow = tnsAcfWindow_fx; n = sub( iEndLine, iStartLine ); assert( n < (Word16) ( sizeof( tmpbuf ) / sizeof( Word16 ) ) ); FOR( i = 0; i < n; i++ ) { tmpbuf[i] = round_fx_sat( L_shl( pSpectrum[iStartLine + i], shift ) ); move16(); } FOR( lag = 0; lag <= pTnsConfig->maxOrder; lag++ ) { n = sub( sub( iEndLine, lag ), iStartLine ); L_tmp = L_deposit_l( 0 ); FOR( i = 0; i < n; i++ ) { L_tmp = L_mac0_sat( L_tmp, tmpbuf[i], tmpbuf[i + lag] ); } IF( lag != 0 ) L_tmp = Mpy_32_16_1( L_tmp, *pWindow++ ); L_tmp = Mpy_32_16_1( L_tmp, facs[iFilter][iSubdivisions] ); L_tmp = L_shl( L_tmp, facs_e[iFilter][iSubdivisions] ); rxx[lag] = L_add( rxx[lag], L_tmp ); move32(); } } IF( EQ_16( iSubdivisions, nSubdivisions ) ) /* meaning there is no subdivision with low energy */ { pFilter->spectrumLength = spectrumLength; move16(); /* Limit the maximum order to spectrum length/4 */ GetFilterParameters( rxx, s_min( pTnsConfig->maxOrder, shr( pFilter->spectrumLength, 2 ) ), pFilter ); } } if ( predictionGain ) { assert( pTnsConfig->nMaxFilters == 1 ); move16(); *predictionGain = pTnsData->filter->predictionGain; } /* We check the filter's decisions in the opposite direction */ FOR( iFilter = sub( pTnsConfig->nMaxFilters, 1 ); iFilter >= 0; iFilter-- ) { STnsFilter *pFilter; struct TnsParameters const *pTnsParameters; move16(); move16(); pFilter = pTnsData->filter + iFilter; pTnsParameters = pTnsConfig->pTnsParameters + iFilter; IF( s_or( (Word16) GT_16( pFilter->predictionGain, pTnsParameters->minPredictionGain ), sub( pFilter->avgSqrCoef, pTnsParameters->minAvgSqrCoef ) > 0 ) ) { move16(); pTnsData->nFilters = add( pTnsData->nFilters, 1 ); } ELSE IF( pTnsData->nFilters > 0 ) /* If a previous filter is turned on */ { /* Since TNS filter of order 0 is not allowed we haved to signal in the stream filter of order 1 with the 0th coefficient equal to 0 */ ClearTnsFilterCoefficients( pFilter ); move16(); move16(); pFilter->order = 1; pTnsData->nFilters = add( pTnsData->nFilters, 1 ); } ELSE { ClearTnsFilterCoefficients( pFilter ); } } return ( pTnsData->nFilters > 0 ); } #endif // FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT void CalculateTnsFilt_fx( STnsConfig const *pTnsConfig, /* i : TNS Configuration struct */ const Word32 pSpectrum[], /* i : MDCT spectrum */ Loading Loading @@ -410,11 +157,7 @@ void CalculateTnsFilt_fx( return; } #ifdef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT Word16 DetectTnsFilt_fx( #else Word16 DetectTnsFilt_ivas_fx( #endif // FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT STnsConfig const *pTnsConfig, /* i : TNS Configuration struct */ Word32 const pSpectrum[], /* i : MDCT spectrum Q=Qx */ Loading Loading @@ -637,11 +380,7 @@ Word16 DetectTnsFilt_ivas_fx( } /* We check the filter's decisions in the opposite direction */ #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT FOR( iFilter = ( pTnsConfig->nMaxFilters - 1 ); iFilter >= 0; iFilter-- ) #else FOR( iFilter = sub( pTnsConfig->nMaxFilters, 1 ); iFilter >= 0; iFilter-- ) #endif // FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT { STnsFilter *pFilter; struct TnsParameters const *pTnsParameters; Loading Loading
lib_com/options.h +0 −1 Original line number Diff line number Diff line Loading @@ -86,7 +86,6 @@ #define HARMONIZE_TBE2 /* VA: basop issue 2399: Remove duplicated code: TBE, step 2 */ #define HARMONIZE_2427_GETPLC /* FhG: basop issue : 2427 Harmonizing getPLCDecision functions:*/ #define HARM_FD_BWE /* VA: harmonize core-coder FD BWE function duplications */ #define FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT /* FhG: basop issue 2411: harmonize TNSAnalysis*_fx(), DetectTnsFilt*_fx()*/ #define HARMONIZE_READ_DECODE_TNS /* FhG basop 2389: Harm between two pairs of functions. */ #define FIX_FLOAT_1526_DIRAC_MEM_LEAK /* FhG: float issue 1526: potential memory leak in DirAC handles in case of format switching */ #define FIX_2437_HARMONIZE_ENCODERINDEX /* FhG: basop issue 2437 EncoderIndex_ivas_fx() and EncoderIndex_fx()*/ Loading
lib_enc/cod_tcx_fx.c +0 −98 Original line number Diff line number Diff line Loading @@ -135,96 +135,7 @@ void HBAutocorrelation_fx( } } #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT void TNSAnalysis_fx( TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ Word16 L_frame, /* input: frame length */ Word16 L_spec, Word16 tcxMode, /* input: TCX mode for the frame/subframe - TCX20 | TCX10 | TCX 5 (meaning 2 x TCX 5) */ Word8 isAfterACELP, /* input: Flag indicating if the last frame was ACELP. For the second TCX subframe it should be 0 */ Word32 spectrum[], /* input: MDCT spectrum Qx*/ STnsData *pTnsData, /* output: Tns data */ Word8 *pfUseTns, /* output: Flag indicating if TNS is used */ Word16 *predictionGain /*Q7*/ ) { Word32 buff[8]; Word16 tmp = 0; /* initialization only to avoid compiler warning, not counted */ Word16 tmp2 = 0; /* initialization only to avoid compiler warning, not counted */ move16(); move16(); /* Init TNS */ *pfUseTns = 0; move16(); IF( hTcxCfg->fIsTNSAllowed != 0 ) { hTcxCfg->pCurrentTnsConfig = &hTcxCfg->tnsConfig[( tcxMode - TCX_20 ) == 0][isAfterACELP]; L_spec = hTcxCfg->pCurrentTnsConfig->iFilterBorders[0]; move16(); /*-----------------------------------------------------------* * Temporal Noise Shaping analysis * *-----------------------------------------------------------*/ IF( EQ_16( tcxMode, TCX_5 ) ) { tmp = shr( L_frame, 2 ); /* rearrange LF sub-window lines prior to TNS analysis & filtering */ tmp2 = shr( L_spec, 1 ); IF( LT_16( tmp2, tmp ) ) { Copy32( spectrum + 8, spectrum + 16, sub( tmp2, 8 ) ); Copy32( spectrum + tmp, spectrum + 8, 8 ); Copy32( spectrum + tmp + 8, spectrum + tmp2 + 8, sub( tmp2, 8 ) ); } ELSE { Copy32( spectrum + tmp, buff, 8 ); Copy32( spectrum + 8, spectrum + 16, sub( tmp, 8 ) ); Copy32( buff, spectrum + 8, 8 ); } } move16(); *pfUseTns = (Word8) DetectTnsFilt_fx( hTcxCfg->pCurrentTnsConfig, spectrum, pTnsData, predictionGain ); /* If TNS should be used then get the residual after applying it inplace in spectrum */ IF( *pfUseTns != 0 ) { ApplyTnsFilter( hTcxCfg->pCurrentTnsConfig, pTnsData, spectrum, 1 ); } IF( EQ_16( tcxMode, TCX_5 ) ) { /* undo rearrangement of LF sub-window lines prior to TNS analysis */ IF( LT_16( tmp2, tmp ) ) { Copy32( spectrum + tmp2 + 8, spectrum + tmp + 8, sub( tmp2, 8 ) ); Copy32( spectrum + 8, spectrum + tmp, 8 ); Copy32( spectrum + 16, spectrum + 8, sub( tmp2, 8 ) ); set32_fx( spectrum + tmp2, 0, sub( tmp, tmp2 ) ); set32_fx( spectrum + tmp + tmp2, 0, sub( tmp, tmp2 ) ); } ELSE { Copy32( spectrum + 8, buff, 8 ); Copy32( spectrum + 16, spectrum + 8, sub( tmp, 8 ) ); Copy32( buff, spectrum + tmp, 8 ); } } } } #endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT void TNSAnalysis_ivas_fx( #else void TNSAnalysis_fx( #endif // FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ Word16 L_frame, /* i : frame length */ Word16 L_spec, /* i : length of the spectrum */ Loading Loading @@ -280,13 +191,8 @@ void TNSAnalysis_fx( } move16(); #ifdef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT *pfUseTns = (Word8) DetectTnsFilt_fx( hTcxCfg->pCurrentTnsConfig, spectrum, pTnsData, hTranDet, (Word8) NE_16( transform_type, TCX_20 ), ltp_gain, predictionGain ); #else *pfUseTns = (Word8) DetectTnsFilt_ivas_fx( hTcxCfg->pCurrentTnsConfig, spectrum, pTnsData, hTranDet, (Word8) NE_16( transform_type, TCX_20 ), ltp_gain, predictionGain ); #endif // FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT /* If TNS should be used then get the residual after applying it inplace in spectrum */ IF( *pfUseTns != 0 ) Loading Loading @@ -3859,11 +3765,7 @@ void coder_tcx_fx( { SetTnsConfig( hTcxCfg, sub( L_frame_glob, st->L_frame ) == 0, st->last_core == 0 ); #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT TNSAnalysis_fx( hTcxCfg, L_frame, L_spec, TCX_20, st->last_core == 0, spectrum, hTcxEnc->tnsData, hTcxEnc->fUseTns, &st->hIGFEnc->tns_predictionGain ); #else TNSAnalysis_fx( hTcxCfg, L_frame, L_spec, TCX_20, st->last_core == 0, spectrum, st->hTranDet, -32768, hTcxEnc->tnsData, hTcxEnc->fUseTns, &st->hIGFEnc->tns_predictionGain ); #endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT } ELSE { Loading
lib_enc/ext_sig_ana_fx.c +0 −16 Original line number Diff line number Diff line Loading @@ -406,18 +406,10 @@ void core_signal_analysis_high_bitrate_fx( { test(); test(); #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT TNSAnalysis_fx( st->hTcxCfg, L_frameTCX, st->hTcxCfg->tcx_coded_lines, transform_type[frameno], ( frameno == 0 ) && ( st->last_core == ACELP_CORE ), spectrum[frameno], &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL ); #else TNSAnalysis_fx( st->hTcxCfg, L_frameTCX, st->hTcxCfg->tcx_coded_lines, transform_type[frameno], ( frameno == 0 ) && ( st->last_core == ACELP_CORE ), spectrum[frameno], st->hTranDet, -32768, &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL ); #endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT { EncodeTnsData_fx( st->hTcxCfg->pCurrentTnsConfig, &hTcxEnc->tnsData[frameno], Loading Loading @@ -1207,19 +1199,11 @@ void core_signal_analysis_high_bitrate_ivas_fx( test(); IF( ( frameno == 0 ) && ( st->last_core == ACELP_CORE ) ) { #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT TNSAnalysis_ivas_fx( st->hTcxCfg, L_frameTCX, st->hTcxCfg->tcx_coded_lines, transform_type[frameno], 1, hTcxEnc->spectrum_fx[frameno], st->hTranDet, -32768, &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL ); #else TNSAnalysis_fx( st->hTcxCfg, L_frameTCX, st->hTcxCfg->tcx_coded_lines, transform_type[frameno], 1, hTcxEnc->spectrum_fx[frameno], st->hTranDet, -32768, &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL ); #endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT } ELSE { #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT TNSAnalysis_ivas_fx( st->hTcxCfg, L_frameTCX, st->hTcxCfg->tcx_coded_lines, transform_type[frameno], 0, hTcxEnc->spectrum_fx[frameno], st->hTranDet, -32768, &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL ); #else TNSAnalysis_fx( st->hTcxCfg, L_frameTCX, st->hTcxCfg->tcx_coded_lines, transform_type[frameno], 0, hTcxEnc->spectrum_fx[frameno], st->hTranDet, -32768, &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL ); #endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT } IF( st->hTcxCfg->fIsTNSAllowed ) Loading
lib_enc/prot_fx_enc.h +0 −29 Original line number Diff line number Diff line Loading @@ -1463,20 +1463,8 @@ void CalculateTnsFilt_fx( const Word16 pSpectrum_e, STnsData *pTnsData /* o : TNS data struct */ ); #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT Word16 DetectTnsFilt_fx( STnsConfig const *pTnsConfig, Word32 const pSpectrum[], STnsData *pTnsData, Word16 *predictionGain ); #endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT #ifdef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT Word16 DetectTnsFilt_fx( #else Word16 DetectTnsFilt_ivas_fx( #endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT STnsConfig const *pTnsConfig, /* i : TNS Configuration struct */ Word32 const pSpectrum[], /* i : MDCT spectrum Q=Qx */ STnsData *pTnsData, /* o : TNS data struct */ Loading Loading @@ -2676,25 +2664,8 @@ void IGFEncResetTCX10BitCounter_fx( const IGF_ENC_INSTANCE_HANDLE hInstance /**< in: | instance handle of IGF Encoder */ ); #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT void TNSAnalysis_fx( TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ Word16 L_frame, /* i : frame length */ Word16 L_spec, Word16 tcxMode, /* i : TCX mode for the frame/subframe - TCX20 | TCX10 | TCX 5 (meaning 2 x TCX 5) */ Word8 isAfterACELP, /* i : Flag indicating if the last frame was ACELP. For the second TCX subframe it should be 0 */ Word32 spectrum[], /* i : MDCT spectrum */ STnsData *pTnsData, /* o : Tns data */ Word8 *pfUseTns, /* o : Flag indicating if TNS is used */ Word16 *predictionGain ); #endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT void TNSAnalysis_ivas_fx( #else void TNSAnalysis_fx( #endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ Word16 L_frame, /* i : frame length */ Word16 L_spec, /* i : length of the spectrum */ Loading
lib_enc/tns_base_enc_fx.c +0 −261 Original line number Diff line number Diff line Loading @@ -50,259 +50,6 @@ typedef Word32 ( *TLinearPredictionFilter )( Word16 order, Word16 const parCoeff /********************************/ #define MAX_SUBDIVISIONS 3 #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT Word16 DetectTnsFilt_fx( STnsConfig const *pTnsConfig, Word32 const pSpectrum[], STnsData *pTnsData, Word16 *predictionGain ) { Word16 facs[TNS_MAX_NUM_OF_FILTERS][MAX_SUBDIVISIONS]; Word16 facs_e[TNS_MAX_NUM_OF_FILTERS][MAX_SUBDIVISIONS]; /* exponents of facs[][] */ Word16 shifts[TNS_MAX_NUM_OF_FILTERS][MAX_SUBDIVISIONS]; Word16 iFilter = 0; move16(); ResetTnsData( pTnsData ); IF( pTnsConfig->maxOrder <= 0 ) { return 0; } /* Calculate norms for each spectrum part */ FOR( iFilter = 0; iFilter < pTnsConfig->nMaxFilters; iFilter++ ) { Word16 idx0; Word16 idx1; Word16 nSubdivisions; Word16 iSubdivisions; move16(); move16(); move16(); idx0 = pTnsConfig->iFilterBorders[iFilter + 1]; idx1 = pTnsConfig->iFilterBorders[iFilter]; nSubdivisions = pTnsConfig->pTnsParameters[iFilter].nSubdivisions; assert( pTnsConfig->pTnsParameters[iFilter].nSubdivisions <= MAX_SUBDIVISIONS ); FOR( iSubdivisions = 0; iSubdivisions < nSubdivisions; iSubdivisions++ ) { Word16 iStartLine; Word16 iEndLine; Word16 tmp, headroom, shift; Word32 L_tmp, tmp32; /* iStartLine = idx0 + (idx1-idx0)*iSubdivisions/nSubdivisions; iEndLine = idx0 + (idx1-idx0)*(iSubdivisions+1)/nSubdivisions; */ assert( ( nSubdivisions == 1 ) || ( nSubdivisions == 3 ) ); tmp = sub( idx1, idx0 ); iStartLine = imult1616( tmp, iSubdivisions ); iEndLine = add( iStartLine, tmp ); IF( EQ_16( nSubdivisions, 3 ) ) { iStartLine = mult( iStartLine, 0x2AAB ); } iStartLine = add( iStartLine, idx0 ); IF( EQ_16( nSubdivisions, 3 ) ) { iEndLine = mult( iEndLine, 0x2AAB ); } iEndLine = add( iEndLine, idx0 ); /*norms[iFilter][iSubdivisions] = norm2FLOAT(pSpectrum+iStartLine, iEndLine-iStartLine);*/ headroom = getScaleFactor32( &pSpectrum[iStartLine], sub( iEndLine, iStartLine ) ); /* Calculate norm of spectrum band */ L_tmp = Norm32Norm( pSpectrum + iStartLine, headroom, sub( iEndLine, iStartLine ), &shift ); /* Check threshold HLM_MIN_NRG */ BASOP_SATURATE_WARNING_OFF_EVS; tmp32 = L_sub( L_shl_sat( L_tmp, s_min( 31, sub( shift, 24 - 31 * 2 ) ) ), 3277l /*HLM_MIN_NRG Q7*/ ); BASOP_SATURATE_WARNING_ON_EVS; /* get pre-shift for autocorrelation */ tmp = sub( shift, norm_l( L_tmp ) ); /* exponent for normalized L_tmp */ tmp = shr( sub( 1, tmp ), 1 ); /* pre-shift to apply before autocorrelation */ shifts[iFilter][iSubdivisions] = s_min( tmp, headroom ); move16(); /* calc normalization factor */ facs[iFilter][iSubdivisions] = 0; move16(); facs_e[iFilter][iSubdivisions] = 0; move16(); if ( tmp32 > 0 ) { facs[iFilter][iSubdivisions] = 0x7FFF; move16(); /* normalization not needed for one subdivision */ } test(); IF( ( tmp32 > 0 ) && ( GT_16( nSubdivisions, 1 ) ) ) { move16(); facs_e[iFilter][iSubdivisions] = shl( sub( tmp, shifts[iFilter][iSubdivisions] ), 1 ); tmp = sub( 1, shl( tmp, 1 ) ); /* exponent of autocorrelation */ L_tmp = L_shl_sat( L_tmp, sub( shift, tmp ) ); /* shift L_tmp to that exponent */ /* calc factor (with 2 bits headroom for sum of 3 subdivisions) */ move16(); facs[iFilter][iSubdivisions] = div_s( 0x2000, round_fx_sat( L_tmp ) ); /* L_tmp is >= 0x2000000 */ } } } /* Calculate normalized autocorrelation for spectrum subdivision and get TNS filter parameters based on it */ FOR( iFilter = 0; iFilter < pTnsConfig->nMaxFilters; iFilter++ ) { #define RXX_E ( 3 ) Word32 rxx[TNS_MAX_FILTER_ORDER + 1]; Word16 idx0; Word16 idx1; Word16 spectrumLength; STnsFilter *pFilter; Word16 nSubdivisions; Word16 iSubdivisions; Word16 tmpbuf[325]; set32_fx( rxx, 0, TNS_MAX_FILTER_ORDER + 1 ); move16(); move16(); move16(); idx0 = pTnsConfig->iFilterBorders[iFilter + 1]; idx1 = pTnsConfig->iFilterBorders[iFilter]; spectrumLength = sub( idx1, idx0 ); pFilter = pTnsData->filter + iFilter; nSubdivisions = pTnsConfig->pTnsParameters[iFilter].nSubdivisions; FOR( iSubdivisions = 0; iSubdivisions < nSubdivisions; iSubdivisions++ ) { Word16 iStartLine, n, i; Word16 iEndLine; const Word16 *pWindow; Word16 lag, shift; Word32 L_tmp; IF( facs[iFilter][iSubdivisions] == 0 ) { BREAK; } /* iStartLine = idx0 + (idx1-idx0)*iSubdivisions/nSubdivisions; iEndLine = idx0 + (idx1-idx0)*(iSubdivisions+1)/nSubdivisions; */ assert( ( nSubdivisions == 1 ) || ( nSubdivisions == 3 ) ); iStartLine = imult1616( spectrumLength, iSubdivisions ); iEndLine = add( iStartLine, spectrumLength ); IF( EQ_16( nSubdivisions, 3 ) ) { iStartLine = mult( iStartLine, 0x2AAB ); } iStartLine = add( iStartLine, idx0 ); IF( EQ_16( nSubdivisions, 3 ) ) { iEndLine = mult( iEndLine, 0x2AAB ); } iEndLine = add( iEndLine, idx0 ); move16(); shift = shifts[iFilter][iSubdivisions]; move16(); pWindow = tnsAcfWindow_fx; n = sub( iEndLine, iStartLine ); assert( n < (Word16) ( sizeof( tmpbuf ) / sizeof( Word16 ) ) ); FOR( i = 0; i < n; i++ ) { tmpbuf[i] = round_fx_sat( L_shl( pSpectrum[iStartLine + i], shift ) ); move16(); } FOR( lag = 0; lag <= pTnsConfig->maxOrder; lag++ ) { n = sub( sub( iEndLine, lag ), iStartLine ); L_tmp = L_deposit_l( 0 ); FOR( i = 0; i < n; i++ ) { L_tmp = L_mac0_sat( L_tmp, tmpbuf[i], tmpbuf[i + lag] ); } IF( lag != 0 ) L_tmp = Mpy_32_16_1( L_tmp, *pWindow++ ); L_tmp = Mpy_32_16_1( L_tmp, facs[iFilter][iSubdivisions] ); L_tmp = L_shl( L_tmp, facs_e[iFilter][iSubdivisions] ); rxx[lag] = L_add( rxx[lag], L_tmp ); move32(); } } IF( EQ_16( iSubdivisions, nSubdivisions ) ) /* meaning there is no subdivision with low energy */ { pFilter->spectrumLength = spectrumLength; move16(); /* Limit the maximum order to spectrum length/4 */ GetFilterParameters( rxx, s_min( pTnsConfig->maxOrder, shr( pFilter->spectrumLength, 2 ) ), pFilter ); } } if ( predictionGain ) { assert( pTnsConfig->nMaxFilters == 1 ); move16(); *predictionGain = pTnsData->filter->predictionGain; } /* We check the filter's decisions in the opposite direction */ FOR( iFilter = sub( pTnsConfig->nMaxFilters, 1 ); iFilter >= 0; iFilter-- ) { STnsFilter *pFilter; struct TnsParameters const *pTnsParameters; move16(); move16(); pFilter = pTnsData->filter + iFilter; pTnsParameters = pTnsConfig->pTnsParameters + iFilter; IF( s_or( (Word16) GT_16( pFilter->predictionGain, pTnsParameters->minPredictionGain ), sub( pFilter->avgSqrCoef, pTnsParameters->minAvgSqrCoef ) > 0 ) ) { move16(); pTnsData->nFilters = add( pTnsData->nFilters, 1 ); } ELSE IF( pTnsData->nFilters > 0 ) /* If a previous filter is turned on */ { /* Since TNS filter of order 0 is not allowed we haved to signal in the stream filter of order 1 with the 0th coefficient equal to 0 */ ClearTnsFilterCoefficients( pFilter ); move16(); move16(); pFilter->order = 1; pTnsData->nFilters = add( pTnsData->nFilters, 1 ); } ELSE { ClearTnsFilterCoefficients( pFilter ); } } return ( pTnsData->nFilters > 0 ); } #endif // FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT void CalculateTnsFilt_fx( STnsConfig const *pTnsConfig, /* i : TNS Configuration struct */ const Word32 pSpectrum[], /* i : MDCT spectrum */ Loading Loading @@ -410,11 +157,7 @@ void CalculateTnsFilt_fx( return; } #ifdef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT Word16 DetectTnsFilt_fx( #else Word16 DetectTnsFilt_ivas_fx( #endif // FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT STnsConfig const *pTnsConfig, /* i : TNS Configuration struct */ Word32 const pSpectrum[], /* i : MDCT spectrum Q=Qx */ Loading Loading @@ -637,11 +380,7 @@ Word16 DetectTnsFilt_ivas_fx( } /* We check the filter's decisions in the opposite direction */ #ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT FOR( iFilter = ( pTnsConfig->nMaxFilters - 1 ); iFilter >= 0; iFilter-- ) #else FOR( iFilter = sub( pTnsConfig->nMaxFilters, 1 ); iFilter >= 0; iFilter-- ) #endif // FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT { STnsFilter *pFilter; struct TnsParameters const *pTnsParameters; Loading