diff options
author | Jean-Michel Trivi <jmtrivi@google.com> | 2012-09-09 11:48:51 -0700 |
---|---|---|
committer | Jean-Michel Trivi <jmtrivi@google.com> | 2012-09-09 11:52:09 -0700 |
commit | 381d69840ad3af2259f0b7ef49236f9ee9c76b76 (patch) | |
tree | 059754bb7c5ff151506ac52a2962d532a180b5bc /libAACenc/src/aacenc_tns.cpp | |
parent | fef220869b4e5bf9241369d3379b389136c2f174 (diff) | |
download | fdk-aac-381d69840ad3af2259f0b7ef49236f9ee9c76b76.tar.gz fdk-aac-381d69840ad3af2259f0b7ef49236f9ee9c76b76.tar.bz2 fdk-aac-381d69840ad3af2259f0b7ef49236f9ee9c76b76.zip |
Bug fixes in AAC decoder, AAC encoder, FDK library
Latest code drop from Fraunhofer:
* AAC-Decoder
- Expanded AAC-LD/ELD decoder TNS max band tables to avoid wrong data
access for sampling rates <22kHz and >48kHz.
Modified file(s):
libAACdec\src\aacdec_tns.cpp
libAACdec\src\aac_rom.h
libAACdec\src\aac_rom.cpp
- Fixed ELD synthesis QMF filterbank scaling for downsampled SBR.
Modified file(s):
libFDK\src\qmf.cpp
* AAC-Encoder
- Fixed bit rate limiting for lower limit as introduced in the Delivery 2012-05-11.
Modified file(s):
libAACenc\include\aacenc_lib.h
libAACenc\src\aacenc.h
libAACenc\src\aacenc.cpp
libSBRenc\src\sbr_rom.h
libSBRenc\src\sbr_rom.cpp
- Allow negative prediction gain as meaning that there is no coding gain.
Make use of scaleValueSaturate in gauss window calculation.
Modified file(s):
libAACenc\src\aacenc_tns.cpp
- Added energy saturation to prevent overflow in short blocks.
Modified file(s):
libAACenc\src\grp_data.cpp
- Perform scalefactor adaption in case quantized lines are out of valid range.
Modified file(s):
libAACenc\src\quantize.cpp
- Interrupt quantization loop when no spectral data is available.
Adjustments in bitreservoir adaption.
Modified file(s):
libAACenc\src\qc_main.cpp
- Indroduced dynamic scaling in none missing harmonic energy lowering compensation.
Modified file(s):
libSBRenc\src\env_est.cpp
* FDK-Library
- Fixed saturation for negative values in scaleValueSaturate.
Modified file(s):
libFDK\include\scale.h
Change-Id: If830ea65caef6b5554281e4b7a77a8b2e08825ce
Diffstat (limited to 'libAACenc/src/aacenc_tns.cpp')
-rw-r--r-- | libAACenc/src/aacenc_tns.cpp | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/libAACenc/src/aacenc_tns.cpp b/libAACenc/src/aacenc_tns.cpp index 933e4e7..00b2bca 100644 --- a/libAACenc/src/aacenc_tns.cpp +++ b/libAACenc/src/aacenc_tns.cpp @@ -1067,11 +1067,11 @@ static void FDKaacEnc_CalcGaussWindow( const INT timeResolution_e ) { - #define PI_SCALE (2) - #define PI_FIX FL2FXCONST_DBL(3.1416f/(float)(1<<PI_SCALE)) + #define PI_E (2) + #define PI_M FL2FXCONST_DBL(3.1416f/(float)(1<<PI_E)) - #define EULER_SCALE (2) - #define EULER_FIX FL2FXCONST_DBL(2.7183/(float)(1<<EULER_SCALE)) + #define EULER_E (2) + #define EULER_M FL2FXCONST_DBL(2.7183/(float)(1<<EULER_E)) #define COEFF_LOOP_SCALE (4) @@ -1083,9 +1083,9 @@ static void FDKaacEnc_CalcGaussWindow( * gaussExp = PI * samplingRate * 0.001f * timeResolution / transformResolution; * gaussExp = -0.5f * gaussExp * gaussExp; */ - gaussExp_m = fMultNorm(timeResolution, fMult(PI_FIX, fDivNorm( (FIXP_DBL)(samplingRate), (FIXP_DBL)(LONG)(transformResolution*1000.f), &e1)), &e2); + gaussExp_m = fMultNorm(timeResolution, fMult(PI_M, fDivNorm( (FIXP_DBL)(samplingRate), (FIXP_DBL)(LONG)(transformResolution*1000.f), &e1)), &e2); gaussExp_m = -fPow2Div2(gaussExp_m); - gaussExp_e = 2*(e1+e2+timeResolution_e+PI_SCALE); + gaussExp_e = 2*(e1+e2+timeResolution_e+PI_E); FDK_ASSERT( winSize < (1<<COEFF_LOOP_SCALE) ); @@ -1095,13 +1095,13 @@ static void FDKaacEnc_CalcGaussWindow( for( i=0; i<winSize; i++) { win[i] = fPow( - EULER_FIX, - EULER_SCALE, + EULER_M, + EULER_E, fMult(gaussExp_m, fPow2((i*FL2FXCONST_DBL(1.f/(float)(1<<COEFF_LOOP_SCALE)) + FL2FXCONST_DBL(.5f/(float)(1<<COEFF_LOOP_SCALE))))), gaussExp_e + 2*COEFF_LOOP_SCALE, &e1); - win[i] = scaleValue(win[i], e1); + win[i] = scaleValueSaturate(win[i], e1); } } @@ -1157,7 +1157,10 @@ static INT FDKaacEnc_AutoToParcor( workBuffer++; } - tmp = fMult((FIXP_DBL)((LONG)TNS_PREDGAIN_SCALE<<21), fDivNorm(autoCorr_0, input[0], &scale)); + tmp = fMult((FIXP_DBL)((LONG)TNS_PREDGAIN_SCALE<<21), fDivNorm(fAbs(autoCorr_0), fAbs(input[0]), &scale)); + if ( fMultDiv2(autoCorr_0, input[0])<FL2FXCONST_DBL(0.0f) ) { + tmp = -tmp; + } predictionGain = (LONG)scaleValue(tmp,scale-21); return (predictionGain); |