summaryrefslogtreecommitdiffstats
path: root/libSBRenc/src/env_est.cpp
diff options
context:
space:
mode:
authorJean-Michel Trivi <jmtrivi@google.com>2012-09-09 11:48:51 -0700
committerJean-Michel Trivi <jmtrivi@google.com>2012-09-09 11:52:09 -0700
commit381d69840ad3af2259f0b7ef49236f9ee9c76b76 (patch)
tree059754bb7c5ff151506ac52a2962d532a180b5bc /libSBRenc/src/env_est.cpp
parentfef220869b4e5bf9241369d3379b389136c2f174 (diff)
downloadfdk-aac-dabplus-381d69840ad3af2259f0b7ef49236f9ee9c76b76.tar.gz
fdk-aac-dabplus-381d69840ad3af2259f0b7ef49236f9ee9c76b76.tar.bz2
fdk-aac-dabplus-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 'libSBRenc/src/env_est.cpp')
-rw-r--r--libSBRenc/src/env_est.cpp20
1 files changed, 13 insertions, 7 deletions
diff --git a/libSBRenc/src/env_est.cpp b/libSBRenc/src/env_est.cpp
index 9423f27..a9a7881 100644
--- a/libSBRenc/src/env_est.cpp
+++ b/libSBRenc/src/env_est.cpp
@@ -536,13 +536,18 @@ mhLoweringEnergy(FIXP_DBL nrg, INT M)
\return void
****************************************************************************/
-static FIXP_DBL
-nmhLoweringEnergy(FIXP_DBL nrg, FIXP_DBL nrgSum, INT M)
+static FIXP_DBL nmhLoweringEnergy(
+ FIXP_DBL nrg,
+ const FIXP_DBL nrgSum,
+ const INT nrgSum_scale,
+ const INT M
+ )
{
if (nrg>FL2FXCONST_DBL(0)) {
int sc=0;
/* gain = nrgSum / (nrg*(M+1)) */
FIXP_DBL gain = fMult(fDivNorm(nrgSum, nrg, &sc), GetInvInt(M+1));
+ sc += nrgSum_scale;
/* reduce nrg if gain smaller 1.f */
if ( !((sc>=0) && ( gain > ((FIXP_DBL)MAXVAL_DBL>>sc) )) ) {
@@ -616,6 +621,7 @@ calculateSbrEnvelope (FIXP_DBL **RESTRICT YBufferLeft, /*! energy buffer left *
FIXP_DBL pNrgLeft[QMF_MAX_TIME_SLOTS];
FIXP_DBL pNrgRight[QMF_MAX_TIME_SLOTS];
+ int envNrg_scale;
FIXP_DBL envNrgLeft = FL2FXCONST_DBL(0.0f);
FIXP_DBL envNrgRight = FL2FXCONST_DBL(0.0f);
int missingHarmonic[QMF_MAX_TIME_SLOTS];
@@ -625,6 +631,7 @@ calculateSbrEnvelope (FIXP_DBL **RESTRICT YBufferLeft, /*! energy buffer left *
stop_pos = timeStep * frame_info->borders[i + 1];
freq_res = frame_info->freqRes[i];
no_of_bands = h_con->nSfb[freq_res];
+ envNrg_scale = DFRACT_BITS-fNormz((FIXP_DBL)no_of_bands);
if (i == short_env) {
stop_pos -= fixMax(2, timeStep); /* consider at least 2 QMF slots less for short envelopes (envelopes just before transients) */
@@ -762,9 +769,8 @@ calculateSbrEnvelope (FIXP_DBL **RESTRICT YBufferLeft, /*! energy buffer left *
/* save energies */
pNrgLeft[j] = nrgLeft;
pNrgRight[j] = nrgRight;
- envNrgLeft += nrgLeft;
- envNrgRight += nrgRight;
-
+ envNrgLeft += (nrgLeft>>envNrg_scale);
+ envNrgRight += (nrgRight>>envNrg_scale);
} /* j */
for (j = 0; j < no_of_bands; j++) {
@@ -777,9 +783,9 @@ calculateSbrEnvelope (FIXP_DBL **RESTRICT YBufferLeft, /*! energy buffer left *
if(!missingHarmonic[j] && h_sbr->fLevelProtect) {
/* in case of missing energy in base band,
reduce reference energy to prevent overflows in decoder output */
- nrgLeft = nmhLoweringEnergy(nrgLeft, envNrgLeft, no_of_bands);
+ nrgLeft = nmhLoweringEnergy(nrgLeft, envNrgLeft, envNrg_scale, no_of_bands);
if (stereoMode == SBR_COUPLING) {
- nrgRight = nmhLoweringEnergy(nrgRight, envNrgRight, no_of_bands);
+ nrgRight = nmhLoweringEnergy(nrgRight, envNrgRight, envNrg_scale, no_of_bands);
}
}