Use scaleValuesSaturate() to avoid integer overflows in QmfTransposerApply(). am: e5a14d0a33

Original change: https://googleplex-android-review.googlesource.com/c/platform/external/aac/+/14471060

Change-Id: Idd546b91b3986a8b6cc24aee7dd74f34c04d3c98
This commit is contained in:
Fraunhofer IIS FDK 2021-05-07 21:49:52 +00:00 committed by Automerger Merge Worker
commit 877f2d687c
1 changed files with 20 additions and 35 deletions

View File

@ -1,7 +1,7 @@
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
Software License for The Fraunhofer FDK AAC Codec Library for Android Software License for The Fraunhofer FDK AAC Codec Library for Android
© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten © Copyright 1995 - 2021 Fraunhofer-Gesellschaft zur Förderung der angewandten
Forschung e.V. All rights reserved. Forschung e.V. All rights reserved.
1. INTRODUCTION 1. INTRODUCTION
@ -1400,42 +1400,27 @@ void QmfTransposerApply(HANDLE_HBE_TRANSPOSER hQmfTransposer,
if (shift_ov != 0) { if (shift_ov != 0) {
for (i = 0; i < HBE_MAX_OUT_SLOTS; i++) { for (i = 0; i < HBE_MAX_OUT_SLOTS; i++) {
for (band = 0; band < QMF_SYNTH_CHANNELS; band++) { scaleValuesSaturate(&hQmfTransposer->qmfHBEBufReal_F[i][0],
if (shift_ov >= 0) { QMF_SYNTH_CHANNELS, shift_ov);
hQmfTransposer->qmfHBEBufReal_F[i][band] <<= shift_ov; scaleValuesSaturate(&hQmfTransposer->qmfHBEBufImag_F[i][0],
hQmfTransposer->qmfHBEBufImag_F[i][band] <<= shift_ov; QMF_SYNTH_CHANNELS, shift_ov);
} else {
hQmfTransposer->qmfHBEBufReal_F[i][band] >>= (-shift_ov);
hQmfTransposer->qmfHBEBufImag_F[i][band] >>= (-shift_ov);
}
}
}
} }
if ((keepStatesSyncedMode == KEEP_STATES_SYNCED_OFF) && shift_ov != 0) { if (keepStatesSyncedMode == KEEP_STATES_SYNCED_OFF) {
int nBands =
fMax(0, hQmfTransposer->stopBand - hQmfTransposer->startBand);
for (i = timeStep * firstSlotOffsset; i < ov_len; i++) { for (i = timeStep * firstSlotOffsset; i < ov_len; i++) {
for (band = hQmfTransposer->startBand; band < hQmfTransposer->stopBand; scaleValuesSaturate(&ppQmfBufferOutReal_F[i][hQmfTransposer->startBand],
band++) { nBands, shift_ov);
if (shift_ov >= 0) { scaleValuesSaturate(&ppQmfBufferOutImag_F[i][hQmfTransposer->startBand],
ppQmfBufferOutReal_F[i][band] <<= shift_ov; nBands, shift_ov);
ppQmfBufferOutImag_F[i][band] <<= shift_ov;
} else {
ppQmfBufferOutReal_F[i][band] >>= (-shift_ov);
ppQmfBufferOutImag_F[i][band] >>= (-shift_ov);
}
}
} }
/* shift lpc filterstates */ /* shift lpc filterstates */
for (i = 0; i < timeStep * firstSlotOffsset + LPC_ORDER; i++) { for (i = 0; i < timeStep * firstSlotOffsset + LPC_ORDER; i++) {
for (band = 0; band < (64); band++) { scaleValuesSaturate(&lpcFilterStatesReal[i][0], (64), shift_ov);
if (shift_ov >= 0) { scaleValuesSaturate(&lpcFilterStatesImag[i][0], (64), shift_ov);
lpcFilterStatesReal[i][band] <<= shift_ov;
lpcFilterStatesImag[i][band] <<= shift_ov;
} else {
lpcFilterStatesReal[i][band] >>= (-shift_ov);
lpcFilterStatesImag[i][band] >>= (-shift_ov);
}
} }
} }
} }