aboutsummaryrefslogtreecommitdiffstats
path: root/libSBRdec
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2019-12-31 04:20:18 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2019-12-31 04:20:18 +0000
commitd2ffcd68adb7f00254255e81dec205ffa67a8758 (patch)
tree45c8b795b34a9ce7fb67908b735acd88bb80f823 /libSBRdec
parentcdc84f84e9fb9399ce410ce3c05332ffd442aad0 (diff)
parent47b23c88cfe81bbcc9ff0c8de1608283de18a475 (diff)
downloadfdk-aac-d2ffcd68adb7f00254255e81dec205ffa67a8758.tar.gz
fdk-aac-d2ffcd68adb7f00254255e81dec205ffa67a8758.tar.bz2
fdk-aac-d2ffcd68adb7f00254255e81dec205ffa67a8758.zip
Snap for 6104206 from 47b23c88cfe81bbcc9ff0c8de1608283de18a475 to rvc-release
Change-Id: I37ae8a78b271948e025a2e6c071453480dcc9a52
Diffstat (limited to 'libSBRdec')
-rw-r--r--libSBRdec/src/env_calc.cpp102
-rw-r--r--libSBRdec/src/lpp_tran.cpp11
-rw-r--r--libSBRdec/src/pvc_dec.cpp25
3 files changed, 97 insertions, 41 deletions
diff --git a/libSBRdec/src/env_calc.cpp b/libSBRdec/src/env_calc.cpp
index 41c9e88..81f03f3 100644
--- a/libSBRdec/src/env_calc.cpp
+++ b/libSBRdec/src/env_calc.cpp
@@ -151,6 +151,9 @@ amm-info@iis.fraunhofer.de
#include "genericStds.h" /* need FDKpow() for debug outputs */
+#define MAX_SFB_NRG_HEADROOM (1)
+#define MAX_VAL_NRG_HEADROOM ((((FIXP_DBL)MAXVAL_DBL) >> MAX_SFB_NRG_HEADROOM))
+
typedef struct {
FIXP_DBL nrgRef[MAX_FREQ_COEFFS];
FIXP_DBL nrgEst[MAX_FREQ_COEFFS];
@@ -986,7 +989,8 @@ void calculateSbrEnvelope(
*/
if (!useLP)
adj_e = h_sbr_cal_env->filtBufferNoise_e -
- getScalefactor(h_sbr_cal_env->filtBufferNoise, noSubbands);
+ getScalefactor(h_sbr_cal_env->filtBufferNoise, noSubbands) +
+ (INT)MAX_SFB_NRG_HEADROOM;
/*
Scan for maximum reference energy to be able
@@ -1006,7 +1010,7 @@ void calculateSbrEnvelope(
- Smoothing can smear high gains of the previous envelope into the
current
*/
- maxSfbNrg_e += 6;
+ maxSfbNrg_e += (6 + MAX_SFB_NRG_HEADROOM);
adj_e = maxSfbNrg_e;
// final_e should not exist for PVC fixfix framing
@@ -1032,7 +1036,7 @@ void calculateSbrEnvelope(
- Smoothing can smear high gains of the previous envelope into the
current
*/
- maxSfbNrg_e += 6;
+ maxSfbNrg_e += (6 + MAX_SFB_NRG_HEADROOM);
if (borders[i] < hHeaderData->numberTimeSlots)
/* This envelope affects timeslots that belong to the output frame */
@@ -2426,6 +2430,9 @@ static void adjustTimeSlot_EldGrid(
const FIXP_DBL *p_harmonicPhaseX = &harmonicPhaseX[harmIndex][0];
const INT *p_harmonicPhase = &harmonicPhase[harmIndex][0];
+ const FIXP_DBL max_val = MAX_VAL_NRG_HEADROOM >> scale_change;
+ const FIXP_DBL min_val = -max_val;
+
*(ptrReal - 1) = fAddSaturate(
*(ptrReal - 1),
SATURATE_SHIFT(fMultDiv2(p_harmonicPhaseX[lowSubband & 1], pSineLevel[0]),
@@ -2438,7 +2445,8 @@ static void adjustTimeSlot_EldGrid(
FIXP_DBL sineLevel_curr = *pSineLevel++;
phaseIndex = (phaseIndex + 1) & (SBR_NF_NO_RANDOM_VAL - 1);
- signalReal = fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change);
+ signalReal = fMax(fMin(fMultDiv2(*ptrReal, *pGain++), max_val), min_val)
+ << scale_change;
sbNoise = *pNoiseLevel++;
if (((INT)sineLevel_curr | noNoiseFlag) == 0) {
signalReal +=
@@ -2472,7 +2480,8 @@ static void adjustTimeSlot_EldGrid(
FIXP_DBL sineLevel_curr = *pSineLevel++;
phaseIndex = (phaseIndex + 1) & (SBR_NF_NO_RANDOM_VAL - 1);
- signalReal = fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change);
+ signalReal = fMax(fMin(fMultDiv2(*ptrReal, *pGain++), max_val), min_val)
+ << scale_change;
sbNoise = *pNoiseLevel++;
if (((INT)sineLevel_curr | noNoiseFlag) == 0) {
signalReal +=
@@ -2512,6 +2521,8 @@ static void adjustTimeSlotLC(
FIXP_DBL signalReal, sineLevel, sineLevelNext, sineLevelPrev;
int tone_count = 0;
int sineSign = 1;
+ const FIXP_DBL max_val = MAX_VAL_NRG_HEADROOM >> scale_change;
+ const FIXP_DBL min_val = -max_val;
#define C1 ((FIXP_SGL)FL2FXCONST_SGL(2.f * 0.00815f))
#define C1_CLDFB ((FIXP_SGL)FL2FXCONST_SGL(2.f * 0.16773f))
@@ -2527,7 +2538,8 @@ static void adjustTimeSlotLC(
of the signal and should be carried out with full accuracy
(supplying #FRACT_BITS valid bits).
*/
- signalReal = fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change);
+ signalReal = fMax(fMin(fMultDiv2(*ptrReal, *pGain++), max_val), min_val)
+ << scale_change;
sineLevel = *pSineLevel++;
sineLevelNext = (noSubbands > 1) ? pSineLevel[0] : FL2FXCONST_DBL(0.0f);
@@ -2555,10 +2567,10 @@ static void adjustTimeSlotLC(
/* save switch and compare operations and reduce to XOR statement */
if (((harmIndex >> 1) & 0x1) ^ freqInvFlag) {
- *(ptrReal - 1) += tmp1;
+ *(ptrReal - 1) = fAddSaturate(*(ptrReal - 1), tmp1);
signalReal -= tmp2;
} else {
- *(ptrReal - 1) -= tmp1;
+ *(ptrReal - 1) = fAddSaturate(*(ptrReal - 1), -tmp1);
signalReal += tmp2;
}
*ptrReal++ = signalReal;
@@ -2589,7 +2601,9 @@ static void adjustTimeSlotLC(
/* The next multiplication constitutes the actual envelope adjustment of
* the signal. */
- signalReal += fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change);
+ signalReal +=
+ fMax(fMin(fMultDiv2(*ptrReal, *pGain++), max_val), min_val)
+ << scale_change;
pNoiseLevel++;
*ptrReal++ = signalReal;
@@ -2602,7 +2616,8 @@ static void adjustTimeSlotLC(
index++;
/* The next multiplication constitutes the actual envelope adjustment of
* the signal. */
- signalReal = fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change);
+ signalReal = fMax(fMin(fMultDiv2(*ptrReal, *pGain++), max_val), min_val)
+ << scale_change;
if (*pSineLevel++ != FL2FXCONST_DBL(0.0f))
tone_count++;
@@ -2630,7 +2645,8 @@ static void adjustTimeSlotLC(
index++;
/* The next multiplication constitutes the actual envelope adjustment of the
* signal. */
- signalReal = fMultDiv2(*ptrReal, *pGain) << ((int)scale_change);
+ signalReal = fMax(fMin(fMultDiv2(*ptrReal, *pGain), max_val), min_val)
+ << scale_change;
sineLevelPrev = fMultDiv2(pSineLevel[-1], FL2FX_SGL(0.0163f));
sineLevel = pSineLevel[0];
@@ -2699,6 +2715,9 @@ static void adjustTimeSlotHQ_GainAndNoise(
/*FL2FXCONST_SGL(1.0f) */ (FIXP_SGL)MAXVAL_SGL - smooth_ratio;
int index = *ptrPhaseIndex;
int shift;
+ FIXP_DBL max_val_noise = 0, min_val_noise = 0;
+ const FIXP_DBL max_val = MAX_VAL_NRG_HEADROOM >> scale_change;
+ const FIXP_DBL min_val = -max_val;
*ptrPhaseIndex = (index + noSubbands) & (SBR_NF_NO_RANDOM_VAL - 1);
@@ -2708,6 +2727,8 @@ static void adjustTimeSlotHQ_GainAndNoise(
shift = fixMin(DFRACT_BITS - 1, -filtBufferNoiseShift);
} else {
shift = fixMin(DFRACT_BITS - 1, filtBufferNoiseShift);
+ max_val_noise = MAX_VAL_NRG_HEADROOM >> shift;
+ min_val_noise = -max_val_noise;
}
if (smooth_ratio > FL2FXCONST_SGL(0.0f)) {
@@ -2723,8 +2744,10 @@ static void adjustTimeSlotHQ_GainAndNoise(
smoothedNoise = (fMultDiv2(smooth_ratio, filtBufferNoise[k]) >> shift) +
fMult(direct_ratio, noiseLevel[k]);
} else {
- smoothedNoise = (fMultDiv2(smooth_ratio, filtBufferNoise[k]) << shift) +
- fMult(direct_ratio, noiseLevel[k]);
+ smoothedNoise = fMultDiv2(smooth_ratio, filtBufferNoise[k]);
+ smoothedNoise =
+ (fMax(fMin(smoothedNoise, max_val_noise), min_val_noise) << shift) +
+ fMult(direct_ratio, noiseLevel[k]);
}
/*
@@ -2732,8 +2755,12 @@ static void adjustTimeSlotHQ_GainAndNoise(
of the signal and should be carried out with full accuracy
(supplying #DFRACT_BITS valid bits).
*/
- signalReal = fMultDiv2(*ptrReal, smoothedGain) << ((int)scale_change);
- signalImag = fMultDiv2(*ptrImag, smoothedGain) << ((int)scale_change);
+ signalReal =
+ fMax(fMin(fMultDiv2(*ptrReal, smoothedGain), max_val), min_val)
+ << scale_change;
+ signalImag =
+ fMax(fMin(fMultDiv2(*ptrImag, smoothedGain), max_val), min_val)
+ << scale_change;
index++;
@@ -2755,8 +2782,12 @@ static void adjustTimeSlotHQ_GainAndNoise(
} else {
for (k = 0; k < noSubbands; k++) {
smoothedGain = gain[k];
- signalReal = fMultDiv2(*ptrReal, smoothedGain) << scale_change;
- signalImag = fMultDiv2(*ptrImag, smoothedGain) << scale_change;
+ signalReal =
+ fMax(fMin(fMultDiv2(*ptrReal, smoothedGain), max_val), min_val)
+ << scale_change;
+ signalImag =
+ fMax(fMin(fMultDiv2(*ptrImag, smoothedGain), max_val), min_val)
+ << scale_change;
index++;
@@ -2862,6 +2893,9 @@ static void adjustTimeSlotHQ(
int freqInvFlag = (lowSubband & 1);
FIXP_DBL sineLevel;
int shift;
+ FIXP_DBL max_val_noise = 0, min_val_noise = 0;
+ const FIXP_DBL max_val = MAX_VAL_NRG_HEADROOM >> scale_change;
+ const FIXP_DBL min_val = -max_val;
*ptrPhaseIndex = (index + noSubbands) & (SBR_NF_NO_RANDOM_VAL - 1);
*ptrHarmIndex = (harmIndex + 1) & 3;
@@ -2877,10 +2911,13 @@ static void adjustTimeSlotHQ(
filtBufferNoiseShift +=
1; /* due to later use of fMultDiv2 instead of fMult */
- if (filtBufferNoiseShift < 0)
+ if (filtBufferNoiseShift < 0) {
shift = fixMin(DFRACT_BITS - 1, -filtBufferNoiseShift);
- else
+ } else {
shift = fixMin(DFRACT_BITS - 1, filtBufferNoiseShift);
+ max_val_noise = MAX_VAL_NRG_HEADROOM >> shift;
+ min_val_noise = -max_val_noise;
+ }
if (smooth_ratio > FL2FXCONST_SGL(0.0f)) {
for (k = 0; k < noSubbands; k++) {
@@ -2896,8 +2933,10 @@ static void adjustTimeSlotHQ(
smoothedNoise = (fMultDiv2(smooth_ratio, filtBufferNoise[k]) >> shift) +
fMult(direct_ratio, noiseLevel[k]);
} else {
- smoothedNoise = (fMultDiv2(smooth_ratio, filtBufferNoise[k]) << shift) +
- fMult(direct_ratio, noiseLevel[k]);
+ smoothedNoise = fMultDiv2(smooth_ratio, filtBufferNoise[k]);
+ smoothedNoise =
+ (fMax(fMin(smoothedNoise, max_val_noise), min_val_noise) << shift) +
+ fMult(direct_ratio, noiseLevel[k]);
}
/*
@@ -2905,8 +2944,12 @@ static void adjustTimeSlotHQ(
of the signal and should be carried out with full accuracy
(supplying #DFRACT_BITS valid bits).
*/
- signalReal = fMultDiv2(*ptrReal, smoothedGain) << ((int)scale_change);
- signalImag = fMultDiv2(*ptrImag, smoothedGain) << ((int)scale_change);
+ signalReal =
+ fMax(fMin(fMultDiv2(*ptrReal, smoothedGain), max_val), min_val)
+ << scale_change;
+ signalImag =
+ fMax(fMin(fMultDiv2(*ptrImag, smoothedGain), max_val), min_val)
+ << scale_change;
index++;
@@ -2959,8 +3002,12 @@ static void adjustTimeSlotHQ(
} else {
for (k = 0; k < noSubbands; k++) {
smoothedGain = gain[k];
- signalReal = fMultDiv2(*ptrReal, smoothedGain) << scale_change;
- signalImag = fMultDiv2(*ptrImag, smoothedGain) << scale_change;
+ signalReal =
+ fMax(fMin(fMultDiv2(*ptrReal, smoothedGain), max_val), min_val)
+ << scale_change;
+ signalImag =
+ fMax(fMin(fMultDiv2(*ptrImag, smoothedGain), max_val), min_val)
+ << scale_change;
index++;
@@ -3144,6 +3191,11 @@ ResetLimiterBands(
return SBRDEC_UNSUPPORTED_CONFIG;
}
+ /* Restrict maximum value of limiter band table */
+ if (workLimiterBandTable[tempNoLim] > highSubband) {
+ return SBRDEC_UNSUPPORTED_CONFIG;
+ }
+
/* Copy limiterbands from working buffer into final destination */
for (k = 0; k <= nBands; k++) {
limiterBandTable[k] = workLimiterBandTable[k];
diff --git a/libSBRdec/src/lpp_tran.cpp b/libSBRdec/src/lpp_tran.cpp
index 6acb626..93e1158 100644
--- a/libSBRdec/src/lpp_tran.cpp
+++ b/libSBRdec/src/lpp_tran.cpp
@@ -1014,8 +1014,8 @@ void lppTransposerHBE(
pSettings->nCols) +
lowBandShift);
- dynamicScale = fixMax(
- 0, dynamicScale - 1); /* one additional bit headroom to prevent -1.0 */
+ dynamicScale =
+ dynamicScale - 1; /* one additional bit headroom to prevent -1.0 */
/*
Scale temporal QMF buffer.
@@ -1194,6 +1194,9 @@ void lppTransposerHBE(
} else { /* bw <= 0 */
int descale = fixMin(DFRACT_BITS - 1, (LPC_SCALE_FACTOR + dynamicScale));
+ dynamicScale +=
+ 1; /* prevent negativ scale factor due to 'one additional bit
+ headroom' */
for (i = startSample; i < stopSample; i++) {
FIXP_DBL accu1, accu2;
@@ -1210,9 +1213,9 @@ void lppTransposerHBE(
dynamicScale;
qmfBufferReal[i][loBand] =
- (lowBandReal[LPC_ORDER + i] >> descale) + (accu1 << 1);
+ (lowBandReal[LPC_ORDER + i] >> descale) + (accu1 << (1 + 1));
qmfBufferImag[i][loBand] =
- (lowBandImag[LPC_ORDER + i] >> descale) + (accu2 << 1);
+ (lowBandImag[LPC_ORDER + i] >> descale) + (accu2 << (1 + 1));
}
} /* bw <= 0 */
diff --git a/libSBRdec/src/pvc_dec.cpp b/libSBRdec/src/pvc_dec.cpp
index b477122..e1e3c2c 100644
--- a/libSBRdec/src/pvc_dec.cpp
+++ b/libSBRdec/src/pvc_dec.cpp
@@ -1,7 +1,7 @@
/* -----------------------------------------------------------------------------
Software License for The Fraunhofer FDK AAC Codec Library for Android
-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
+© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
Forschung e.V. All rights reserved.
1. INTRODUCTION
@@ -534,7 +534,8 @@ void pvcDecodeTimeSlot(PVC_STATIC_DATA *pPvcStaticData,
for (ksg = ksg_start; ksg < PVC_NBLOW; ksg++) {
for (band = sg_borders[ksg]; band < sg_borders[ksg + 1]; band++) {
/* The division by 8 == (RATE*lbw) is required algorithmically */
- E[ksg] += (fPow2Div2(qmfR[band]) + fPow2Div2(qmfI[band])) >> 2;
+ E[ksg] +=
+ ((fPow2Div2(qmfR[band]) >> 1) + (fPow2Div2(qmfI[band]) >> 1)) >> 3;
}
}
}
@@ -542,7 +543,7 @@ void pvcDecodeTimeSlot(PVC_STATIC_DATA *pPvcStaticData,
if (E[ksg] > (FIXP_DBL)0) {
/* 10/log2(10) = 0.752574989159953 * 2^2 */
int exp_log;
- FIXP_DBL nrg = CalcLog2(E[ksg], 2 * qmfExponent, &exp_log);
+ FIXP_DBL nrg = CalcLog2(E[ksg], 2 * qmfExponent + 2, &exp_log);
nrg = fMult(nrg, FL2FXCONST_SGL(LOG10FAC));
nrg = scaleValue(nrg, exp_log - PVC_ESG_EXP + 2);
pEsg[ksg] = fMax(nrg, FL2FXCONST_DBL(-10.0 / (1 << PVC_ESG_EXP)));
@@ -603,22 +604,22 @@ void pvcDecodeTimeSlot(PVC_STATIC_DATA *pPvcStaticData,
E_high_exp[ksg] = 0;
/* residual part */
- accu = ((LONG)(SCHAR)*pTab2++) << (DFRACT_BITS - 8 - PVC_ESG_EXP +
+ accu = ((LONG)(SCHAR)*pTab2++) << (DFRACT_BITS - 8 - PVC_ESG_EXP - 2 +
pPvcDynamicData->pScalingCoef[3]);
/* linear combination of lower grouped energies part */
for (kb = 0; kb < PVC_NBLOW; kb++) {
predCoeff = (FIXP_SGL)(
(SHORT)(SCHAR)pTab1[kb * pPvcDynamicData->nbHigh + ksg] << 8);
- predCoeff_exp = pPvcDynamicData->pScalingCoef[kb] +
- 1; /* +1 to compensate for Div2 */
- accu += fMultDiv2(E[kb], predCoeff) << predCoeff_exp;
+ predCoeff_exp = -(pPvcDynamicData->pScalingCoef[kb] + 1 -
+ 2); /* +1 to compensate for Div2; -2 for accu */
+ accu += fMultDiv2(E[kb], predCoeff) >> predCoeff_exp;
}
/* convert back to linear domain */
accu = fMult(accu, FL2FXCONST_SGL(LOG10FAC_INV));
- accu = f2Pow(
- accu, PVC_ESG_EXP - 1,
- &predCoeff_exp); /* -1 compensates for exponent of LOG10FAC_INV */
+ accu = f2Pow(accu, PVC_ESG_EXP - 1 + 2,
+ &predCoeff_exp); /* -1 compensates for exponent of
+ LOG10FAC_INV; +2 for accu */
predictedEsgSlot[ksg] = accu;
E_high_exp[ksg] = predCoeff_exp;
if (predCoeff_exp > E_high_exp_max) {
@@ -628,8 +629,8 @@ void pvcDecodeTimeSlot(PVC_STATIC_DATA *pPvcStaticData,
/* rescale output vector according to largest exponent */
for (ksg = 0; ksg < pPvcDynamicData->nbHigh; ksg++) {
- int scale = E_high_exp[ksg] - E_high_exp_max;
- predictedEsgSlot[ksg] = scaleValue(predictedEsgSlot[ksg], scale);
+ int scale = fMin(E_high_exp_max - E_high_exp[ksg], DFRACT_BITS - 1);
+ predictedEsgSlot[ksg] = predictedEsgSlot[ksg] >> scale;
}
*predictedEsg_exp = E_high_exp_max;
}