aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2020-01-17 04:06:03 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2020-01-17 04:06:03 +0000
commit2dc3e5c1f26f578d4c09590cf3f1e01ec8c68105 (patch)
treed8d44cea21a91be5298acac5dd6439d5cea71b90
parent29c3f50d140d9cb10ed40aa39ce5057bfe1f2f32 (diff)
parent1020e48d6e76506ac85a7678fe950ce7245d3aea (diff)
downloadfdk-aac-2dc3e5c1f26f578d4c09590cf3f1e01ec8c68105.tar.gz
fdk-aac-2dc3e5c1f26f578d4c09590cf3f1e01ec8c68105.tar.bz2
fdk-aac-2dc3e5c1f26f578d4c09590cf3f1e01ec8c68105.zip
Snap for 6142138 from 1020e48d6e76506ac85a7678fe950ce7245d3aea to rvc-release
Change-Id: Icb323d1007194553c9b7494024ae7fab252696ee
-rw-r--r--libAACdec/src/conceal.cpp4
-rw-r--r--libFDK/include/fixpoint_math.h26
-rw-r--r--libFDK/src/FDK_bitbuffer.cpp9
-rw-r--r--libMpegTPDec/src/tpdec_lib.cpp13
-rw-r--r--libSACdec/src/sac_reshapeBBEnv.cpp174
-rw-r--r--libSACdec/src/sac_stp.cpp41
-rw-r--r--libSACdec/src/sac_tsd.cpp28
7 files changed, 138 insertions, 157 deletions
diff --git a/libAACdec/src/conceal.cpp b/libAACdec/src/conceal.cpp
index 5895cb8..ae98874 100644
--- a/libAACdec/src/conceal.cpp
+++ b/libAACdec/src/conceal.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
@@ -1618,7 +1618,7 @@ static void CConcealment_ApplyRandomSign(int randomPhase, FIXP_DBL *spec,
}
if (packedSign & 0x1) {
- spec[i] = -spec[i];
+ spec[i] = -fMax(spec[i], (FIXP_DBL)(MINVAL_DBL + 1));
}
packedSign >>= 1;
diff --git a/libFDK/include/fixpoint_math.h b/libFDK/include/fixpoint_math.h
index 93aea19..373eec1 100644
--- a/libFDK/include/fixpoint_math.h
+++ b/libFDK/include/fixpoint_math.h
@@ -171,6 +171,19 @@ extern const FIXP_DBL invSqrtTab[SQRT_VALUES];
* \return non-zero if (a_m*2^a_e) < (b_m*2^b_e), 0 otherwise
*/
FDK_INLINE INT fIsLessThan(FIXP_DBL a_m, INT a_e, FIXP_DBL b_m, INT b_e) {
+ INT n;
+
+ n = fixnorm_D(a_m);
+ a_m <<= n;
+ a_e -= n;
+
+ n = fixnorm_D(b_m);
+ b_m <<= n;
+ b_e -= n;
+
+ if (a_m == (FIXP_DBL)0) a_e = b_e;
+ if (b_m == (FIXP_DBL)0) b_e = a_e;
+
if (a_e > b_e) {
return ((b_m >> fMin(a_e - b_e, DFRACT_BITS - 1)) > a_m);
} else {
@@ -179,6 +192,19 @@ FDK_INLINE INT fIsLessThan(FIXP_DBL a_m, INT a_e, FIXP_DBL b_m, INT b_e) {
}
FDK_INLINE INT fIsLessThan(FIXP_SGL a_m, INT a_e, FIXP_SGL b_m, INT b_e) {
+ INT n;
+
+ n = fixnorm_S(a_m);
+ a_m <<= n;
+ a_e -= n;
+
+ n = fixnorm_S(b_m);
+ b_m <<= n;
+ b_e -= n;
+
+ if (a_m == (FIXP_SGL)0) a_e = b_e;
+ if (b_m == (FIXP_SGL)0) b_e = a_e;
+
if (a_e > b_e) {
return ((b_m >> fMin(a_e - b_e, FRACT_BITS - 1)) > a_m);
} else {
diff --git a/libFDK/src/FDK_bitbuffer.cpp b/libFDK/src/FDK_bitbuffer.cpp
index 98905ea..9b7f5b8 100644
--- a/libFDK/src/FDK_bitbuffer.cpp
+++ b/libFDK/src/FDK_bitbuffer.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
@@ -368,7 +368,10 @@ void FDK_Feed(HANDLE_FDK_BITBUF hBitBuf, const UCHAR *RESTRICT inputBuffer,
UINT bTotal = 0;
- UINT bToRead = (hBitBuf->bufBits - hBitBuf->ValidBits) >> 3;
+ UINT bToRead =
+ fMin(hBitBuf->bufBits,
+ (UINT)fMax(0, ((INT)hBitBuf->bufBits - (INT)hBitBuf->ValidBits))) >>
+ 3;
UINT noOfBytes =
fMin(bToRead,
*bytesValid); //(bToRead < *bytesValid) ? bToRead : *bytesValid ;
@@ -384,7 +387,7 @@ void FDK_Feed(HANDLE_FDK_BITBUF hBitBuf, const UCHAR *RESTRICT inputBuffer,
bToRead * sizeof(UCHAR));
/* add noOfBits to number of valid bits in buffer */
- hBitBuf->ValidBits += bToRead << 3;
+ hBitBuf->ValidBits = (UINT)((INT)hBitBuf->ValidBits + (INT)(bToRead << 3));
bTotal += bToRead;
inputBuffer += bToRead;
diff --git a/libMpegTPDec/src/tpdec_lib.cpp b/libMpegTPDec/src/tpdec_lib.cpp
index ede64c9..7bebbaa 100644
--- a/libMpegTPDec/src/tpdec_lib.cpp
+++ b/libMpegTPDec/src/tpdec_lib.cpp
@@ -482,7 +482,8 @@ TRANSPORTDEC_ERROR transportDec_InBandConfig(HANDLE_TRANSPORTDEC hTp,
for (int i = 0; i < 2; i++) {
if (i > 0) {
- FDKpushBack(hBs, newConfigLength * 8 - FDKgetValidBits(hBs));
+ FDKpushBack(hBs,
+ (INT)newConfigLength * 8 - (INT)FDKgetValidBits(hBs));
configMode = AC_CM_ALLOC_MEM;
}
/* config transport decoder */
@@ -980,6 +981,9 @@ static TRANSPORTDEC_ERROR transportDec_readHeader(
CLatmDemux_GetNrOfSubFrames(&hTp->parser.latm);
if (hTp->transportFmt == TT_MP4_LOAS) {
syncLayerFrameBits -= startPos - (INT)FDKgetValidBits(hBs) - (13);
+ if (syncLayerFrameBits <= 0) {
+ err = TRANSPORTDEC_SYNC_ERROR;
+ }
}
}
} else {
@@ -1270,8 +1274,9 @@ static TRANSPORTDEC_ERROR synchronization(HANDLE_TRANSPORTDEC hTp,
if (!(hTp->flags & (TPDEC_LOST_FRAMES_PENDING | TPDEC_IGNORE_BUFFERFULLNESS |
TPDEC_SYNCOK)) &&
err == TRANSPORTDEC_OK) {
- err = additionalHoldOffNeeded(hTp, transportDec_GetBufferFullness(hTp),
- FDKgetValidBits(hBs) - syncLayerFrameBits);
+ err =
+ additionalHoldOffNeeded(hTp, transportDec_GetBufferFullness(hTp),
+ (INT)FDKgetValidBits(hBs) - syncLayerFrameBits);
if (err == TRANSPORTDEC_NOT_ENOUGH_BITS) {
hTp->holdOffFrames++;
}
@@ -1469,7 +1474,7 @@ TRANSPORTDEC_ERROR transportDec_ReadAccessUnit(const HANDLE_TRANSPORTDEC hTp,
for (i = 0; i < 2; i++) {
if (i > 0) {
- FDKpushBack(hBs, bsStart - FDKgetValidBits(hBs));
+ FDKpushBack(hBs, bsStart - (INT)FDKgetValidBits(hBs));
configMode = AC_CM_ALLOC_MEM;
}
diff --git a/libSACdec/src/sac_reshapeBBEnv.cpp b/libSACdec/src/sac_reshapeBBEnv.cpp
index 87c0ac6..588c866 100644
--- a/libSACdec/src/sac_reshapeBBEnv.cpp
+++ b/libSACdec/src/sac_reshapeBBEnv.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
@@ -162,75 +162,59 @@ static inline void getSlotNrgHQ(FIXP_DBL *RESTRICT pReal,
FIXP_DBL nrg;
/* qs = 12, 13, 14 */
- slotNrg[0] = ((fPow2Div2((*pReal++) << maxValSF) +
- fPow2Div2((*pImag++) << maxValSF)) >>
- (SF_FACTOR_SLOT - 1));
- slotNrg[1] = ((fPow2Div2((*pReal++) << maxValSF) +
- fPow2Div2((*pImag++) << maxValSF)) >>
- (SF_FACTOR_SLOT - 1));
- slotNrg[2] = ((fPow2Div2((*pReal++) << maxValSF) +
- fPow2Div2((*pImag++) << maxValSF)) >>
- (SF_FACTOR_SLOT - 1));
+ slotNrg[0] = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
+ (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
+ slotNrg[1] = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
+ (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
+ slotNrg[2] = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
+ (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
/* qs = 15 */
- slotNrg[3] = ((fPow2Div2((*pReal++) << maxValSF) +
- fPow2Div2((*pImag++) << maxValSF)) >>
- (SF_FACTOR_SLOT - 1));
+ slotNrg[3] = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
+ (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
/* qs = 16, 17 */
- nrg = ((fPow2Div2((*pReal++) << maxValSF) +
- fPow2Div2((*pImag++) << maxValSF)) >>
- (SF_FACTOR_SLOT - 1));
- slotNrg[4] = nrg + ((fPow2Div2((*pReal++) << maxValSF) +
- fPow2Div2((*pImag++) << maxValSF)) >>
- (SF_FACTOR_SLOT - 1));
+ nrg = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
+ (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
+ slotNrg[4] =
+ nrg + ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
+ (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
/* qs = 18, 19, 20 */
- nrg = ((fPow2Div2((*pReal++) << maxValSF) +
- fPow2Div2((*pImag++) << maxValSF)) >>
- (SF_FACTOR_SLOT - 1));
- nrg += ((fPow2Div2((*pReal++) << maxValSF) +
- fPow2Div2((*pImag++) << maxValSF)) >>
- (SF_FACTOR_SLOT - 1));
- slotNrg[5] = nrg + ((fPow2Div2((*pReal++) << maxValSF) +
- fPow2Div2((*pImag++) << maxValSF)) >>
- (SF_FACTOR_SLOT - 1));
+ nrg = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
+ (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
+ nrg += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
+ (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
+ slotNrg[5] =
+ nrg + ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
+ (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
/* qs = 21, 22 */
- nrg = ((fPow2Div2((*pReal++) << maxValSF) +
- fPow2Div2((*pImag++) << maxValSF)) >>
- (SF_FACTOR_SLOT - 1));
- slotNrg[6] = nrg + ((fPow2Div2((*pReal++) << maxValSF) +
- fPow2Div2((*pImag++) << maxValSF)) >>
- (SF_FACTOR_SLOT - 1));
+ nrg = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
+ (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
+ slotNrg[6] =
+ nrg + ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
+ (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
/* qs = 23, 24 */
if (hybBands > 23) {
- slotNrg[6] += ((fPow2Div2((*pReal++) << maxValSF) +
- fPow2Div2((*pImag++) << maxValSF)) >>
- (SF_FACTOR_SLOT - 1));
- slotNrg[6] += ((fPow2Div2((*pReal++) << maxValSF) +
- fPow2Div2((*pImag++) << maxValSF)) >>
- (SF_FACTOR_SLOT - 1));
+ slotNrg[6] += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
+ (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
+ slotNrg[6] += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
+ (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
/* qs = 25, 26, 29, 28, 29 */
- nrg = ((fPow2Div2((*pReal++) << maxValSF) +
- fPow2Div2((*pImag++) << maxValSF)) >>
- (SF_FACTOR_SLOT - 1));
- nrg += ((fPow2Div2((*pReal++) << maxValSF) +
- fPow2Div2((*pImag++) << maxValSF)) >>
- (SF_FACTOR_SLOT - 1));
- nrg += ((fPow2Div2((*pReal++) << maxValSF) +
- fPow2Div2((*pImag++) << maxValSF)) >>
- (SF_FACTOR_SLOT - 1));
- nrg += ((fPow2Div2((*pReal++) << maxValSF) +
- fPow2Div2((*pImag++) << maxValSF)) >>
- (SF_FACTOR_SLOT - 1));
- slotNrg[7] = nrg + ((fPow2Div2((*pReal++) << maxValSF) +
- fPow2Div2((*pImag++) << maxValSF)) >>
- (SF_FACTOR_SLOT - 1));
+ nrg = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
+ (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
+ nrg += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
+ (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
+ nrg += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
+ (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
+ nrg += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
+ (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
+ slotNrg[7] =
+ nrg + ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
+ (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
/* qs = 30 ... min(41,hybBands-1) */
- nrg = ((fPow2Div2((*pReal++) << maxValSF) +
- fPow2Div2((*pImag++) << maxValSF)) >>
- (SF_FACTOR_SLOT - 1));
+ nrg = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
+ (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
for (qs = 31; qs < hybBands; qs++) {
- nrg += ((fPow2Div2((*pReal++) << maxValSF) +
- fPow2Div2((*pImag++) << maxValSF)) >>
- (SF_FACTOR_SLOT - 1));
+ nrg += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) +
+ (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1)));
}
slotNrg[8] = nrg;
} else {
@@ -239,49 +223,22 @@ static inline void getSlotNrgHQ(FIXP_DBL *RESTRICT pReal,
}
}
-static inline INT getMaxValDmx(FIXP_DBL *RESTRICT pReal,
- FIXP_DBL *RESTRICT pImag, INT cplxBands,
- INT hybBands) {
- INT qs, clz;
- FIXP_DBL maxVal = FL2FXCONST_DBL(0.0f);
-
- for (qs = 12; qs < cplxBands; qs++) {
- maxVal |= fAbs(pReal[qs]);
- maxVal |= fAbs(pImag[qs]);
- }
- for (; qs < hybBands; qs++) {
- maxVal |= fAbs(pReal[qs]);
- }
-
- clz = fixMax(0, CntLeadingZeros(maxVal) - 1);
-
- return (clz);
-}
-
-static inline INT getMaxValDryWet(FIXP_DBL *RESTRICT pReal,
- FIXP_DBL *RESTRICT pImag,
- FIXP_DBL *RESTRICT pHybOutputRealDry,
- FIXP_DBL *RESTRICT pHybOutputImagDry,
- FIXP_DBL *RESTRICT pHybOutputRealWet,
- FIXP_DBL *RESTRICT pHybOutputImagWet,
- INT cplxBands, INT hybBands) {
- INT qs, clz;
- FIXP_DBL maxVal = FL2FXCONST_DBL(0.0f);
+static inline void combineDryWet(FIXP_DBL *RESTRICT pReal,
+ FIXP_DBL *RESTRICT pImag,
+ FIXP_DBL *RESTRICT pHybOutputRealDry,
+ FIXP_DBL *RESTRICT pHybOutputImagDry,
+ FIXP_DBL *RESTRICT pHybOutputRealWet,
+ FIXP_DBL *RESTRICT pHybOutputImagWet,
+ INT cplxBands, INT hybBands) {
+ INT qs;
for (qs = 12; qs < cplxBands; qs++) {
- pReal[qs] = pHybOutputRealDry[qs] + pHybOutputRealWet[qs];
- maxVal |= fAbs(pReal[qs]);
- pImag[qs] = pHybOutputImagDry[qs] + pHybOutputImagWet[qs];
- maxVal |= fAbs(pImag[qs]);
+ pReal[qs] = (pHybOutputRealDry[qs] >> 1) + (pHybOutputRealWet[qs] >> 1);
+ pImag[qs] = (pHybOutputImagDry[qs] >> 1) + (pHybOutputImagWet[qs] >> 1);
}
for (; qs < hybBands; qs++) {
- pReal[qs] = pHybOutputRealDry[qs] + pHybOutputRealWet[qs];
- maxVal |= fAbs(pReal[qs]);
+ pReal[qs] = (pHybOutputRealDry[qs] >> 1) + (pHybOutputRealWet[qs] >> 1);
}
-
- clz = fixMax(0, CntLeadingZeros(maxVal) - 1);
-
- return (clz);
}
static inline void slotAmp(FIXP_DBL *RESTRICT slotAmp_dry,
@@ -386,15 +343,18 @@ static void extractBBEnv(spatialDec *self, INT inp, INT start, INT channels,
prevChOffs = ch;
pReal = pScratchBuffer;
pImag = pScratchBuffer + 42;
- clz = getMaxValDryWet(
- pReal, pImag, self->hybOutputRealDry__FDK[ch],
- self->hybOutputImagDry__FDK[ch], self->hybOutputRealWet__FDK[ch],
- self->hybOutputImagWet__FDK[ch], cplxBands, hybBands);
+ combineDryWet(pReal, pImag, self->hybOutputRealDry__FDK[ch],
+ self->hybOutputImagDry__FDK[ch],
+ self->hybOutputRealWet__FDK[ch],
+ self->hybOutputImagWet__FDK[ch], cplxBands, hybBands);
+ clz = fMin(getScalefactor(&pReal[12], fMax(0, hybBands - 12)),
+ getScalefactor(&pImag[12], fMax(0, cplxBands - 12)));
} else {
prevChOffs = ch + self->numOutputChannels;
pReal = self->hybInputReal__FDK[ch];
pImag = self->hybInputImag__FDK[ch];
- clz = getMaxValDmx(pReal, pImag, cplxBands, hybBands);
+ clz = fMin(getScalefactor(&pReal[12], fMax(0, hybBands - 12)),
+ getScalefactor(&pImag[12], fMax(0, cplxBands - 12)));
}
partNrg = partNrgPrev = pBBEnvState->partNrgPrev__FDK[prevChOffs];
@@ -411,8 +371,10 @@ static void extractBBEnv(spatialDec *self, INT inp, INT start, INT channels,
SF_FACTOR_SLOT */
}
- slotNrgSF = 2 * (staticScale - clz) + SF_FACTOR_SLOT;
- frameNrgSF = 2 * (staticScale - clz) + SF_FACTOR_SLOT;
+ slotNrgSF = 2 * (staticScale - clz + ((inp == INP_DRY_WET) ? 1 : 0)) +
+ SF_FACTOR_SLOT;
+ frameNrgSF = 2 * (staticScale - clz + ((inp == INP_DRY_WET) ? 1 : 0)) +
+ SF_FACTOR_SLOT;
partNrgSF = fixMax(slotNrgSF - SF_ALPHA1 + 1,
pPartNrgPrevSF[0] - pPartNrgPrev2SF[0] + 1);
diff --git a/libSACdec/src/sac_stp.cpp b/libSACdec/src/sac_stp.cpp
index 6ac5a56..bb66277 100644
--- a/libSACdec/src/sac_stp.cpp
+++ b/libSACdec/src/sac_stp.cpp
@@ -206,29 +206,6 @@ struct STP_DEC {
int update_old_ener;
};
-inline void combineSignalReal(FIXP_DBL *hybOutputRealDry,
- FIXP_DBL *hybOutputRealWet, int bands) {
- int n;
-
- for (n = bands - 1; n >= 0; n--) {
- *hybOutputRealDry = *hybOutputRealDry + *hybOutputRealWet;
- hybOutputRealDry++, hybOutputRealWet++;
- }
-}
-
-inline void combineSignalRealScale1(FIXP_DBL *hybOutputRealDry,
- FIXP_DBL *hybOutputRealWet, FIXP_DBL scaleX,
- int bands) {
- int n;
-
- for (n = bands - 1; n >= 0; n--) {
- *hybOutputRealDry =
- *hybOutputRealDry +
- (fMultDiv2(*hybOutputRealWet, scaleX) << (SF_SCALE + 1));
- hybOutputRealDry++, hybOutputRealWet++;
- }
-}
-
inline void combineSignalCplx(FIXP_DBL *hybOutputRealDry,
FIXP_DBL *hybOutputImagDry,
FIXP_DBL *hybOutputRealWet,
@@ -236,8 +213,8 @@ inline void combineSignalCplx(FIXP_DBL *hybOutputRealDry,
int n;
for (n = bands - 1; n >= 0; n--) {
- *hybOutputRealDry = *hybOutputRealDry + *hybOutputRealWet;
- *hybOutputImagDry = *hybOutputImagDry + *hybOutputImagWet;
+ *hybOutputRealDry = fAddSaturate(*hybOutputRealDry, *hybOutputRealWet);
+ *hybOutputImagDry = fAddSaturate(*hybOutputImagDry, *hybOutputImagWet);
hybOutputRealDry++, hybOutputRealWet++;
hybOutputImagDry++, hybOutputImagWet++;
}
@@ -253,12 +230,14 @@ inline void combineSignalCplxScale1(FIXP_DBL *hybOutputRealDry,
FIXP_DBL scaleY;
for (n = bands - 1; n >= 0; n--) {
scaleY = fMultDiv2(scaleX, *pBP);
- *hybOutputRealDry =
- *hybOutputRealDry +
- (fMultDiv2(*hybOutputRealWet, scaleY) << (SF_SCALE + 2));
- *hybOutputImagDry =
- *hybOutputImagDry +
- (fMultDiv2(*hybOutputImagWet, scaleY) << (SF_SCALE + 2));
+ *hybOutputRealDry = SATURATE_LEFT_SHIFT(
+ (*hybOutputRealDry >> 1) +
+ (fMultDiv2(*hybOutputRealWet, scaleY) << (SF_SCALE + 1)),
+ 1, DFRACT_BITS);
+ *hybOutputImagDry = SATURATE_LEFT_SHIFT(
+ (*hybOutputImagDry >> 1) +
+ (fMultDiv2(*hybOutputImagWet, scaleY) << (SF_SCALE + 1)),
+ 1, DFRACT_BITS);
hybOutputRealDry++, hybOutputRealWet++;
hybOutputImagDry++, hybOutputImagWet++;
pBP++;
diff --git a/libSACdec/src/sac_tsd.cpp b/libSACdec/src/sac_tsd.cpp
index 30acca8..a07447b 100644
--- a/libSACdec/src/sac_tsd.cpp
+++ b/libSACdec/src/sac_tsd.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
@@ -123,12 +123,15 @@ static const UCHAR nBitsTsdCW_64slots[64] = {
RAM_ALIGN
LNK_SECTION_CONSTDATA
-static const FIXP_STP phiTsd[8] = {
- STCP(0x7fffffff, 0x00000000), STCP(0x5a82799a, 0x5a82799a),
- STCP(0x00000000, 0x7fffffff), STCP(0xa57d8666, 0x5a82799a),
- STCP(0x80000000, 0x00000000), STCP(0xa57d8666, 0xa57d8666),
- STCP(0x00000000, 0x80000000), STCP(0x5a82799a, 0xa57d8666),
-};
+static const FIXP_DPK phiTsd[8] = {
+ {{(FIXP_DBL)0x7fffffff, (FIXP_DBL)0x00000000}},
+ {{(FIXP_DBL)0x5a82799a, (FIXP_DBL)0x5a82799a}},
+ {{(FIXP_DBL)0x00000000, (FIXP_DBL)0x7fffffff}},
+ {{(FIXP_DBL)0xa57d8666, (FIXP_DBL)0x5a82799a}},
+ {{(FIXP_DBL)0x80000000, (FIXP_DBL)0x00000000}},
+ {{(FIXP_DBL)0xa57d8666, (FIXP_DBL)0xa57d8666}},
+ {{(FIXP_DBL)0x00000000, (FIXP_DBL)0x80000000}},
+ {{(FIXP_DBL)0x5a82799a, (FIXP_DBL)0xa57d8666}}};
/*** Static Functions ***/
static void longmult1(USHORT a[], USHORT b, USHORT d[], int len) {
@@ -333,16 +336,19 @@ void TsdApply(const int numHybridBands, const TSD_DATA *pTsdData, int *pTsdTs,
if (isTrSlot(pTsdData, ts)) {
int k;
- const FIXP_STP *phi = &phiTsd[pTsdData->bsTsdTrPhaseData[ts]];
+ const FIXP_DPK *phi = &phiTsd[pTsdData->bsTsdTrPhaseData[ts]];
FDK_ASSERT((pTsdData->bsTsdTrPhaseData[ts] >= 0) &&
(pTsdData->bsTsdTrPhaseData[ts] < 8));
/* d = d_nonTr + v_direct * exp(j * bsTsdTrPhaseData[ts]/4 * pi ) */
for (k = TSD_START_BAND; k < numHybridBands; k++) {
FIXP_DBL tempReal, tempImag;
- cplxMult(&tempReal, &tempImag, pVdirectReal[k], pVdirectImag[k], *phi);
- pDnonTrReal[k] += tempReal;
- pDnonTrImag[k] += tempImag;
+ cplxMultDiv2(&tempReal, &tempImag, pVdirectReal[k], pVdirectImag[k],
+ *phi);
+ pDnonTrReal[k] = SATURATE_LEFT_SHIFT(
+ (pDnonTrReal[k] >> 2) + (tempReal >> 1), 2, DFRACT_BITS);
+ pDnonTrImag[k] = SATURATE_LEFT_SHIFT(
+ (pDnonTrImag[k] >> 2) + (tempImag >> 1), 2, DFRACT_BITS);
}
}