1
0
mirror of https://github.com/mstorsjo/fdk-aac.git synced 2025-06-05 22:39:13 +02:00

Prevent too large shift exponents in SpatialDecReshapeBBEnv().

Bug: 146937858
Test: atest DecoderTestXheAac ; atest DecoderTestAacDrc
Change-Id: I9fbe0b364ae4d329c6e5cc1109a111ef5def552d
This commit is contained in:
Fraunhofer IIS FDK
2019-11-13 16:09:14 +01:00
committed by Jean-Michel Trivi
parent 5d09563196
commit 86f7d2b69a

View File

@@ -284,11 +284,14 @@ shapeBBEnv(FIXP_DBL *pHybOutputRealDry, FIXP_DBL *pHybOutputImagDry,
} }
} else { } else {
for (qs = 0; qs < cplxBands; qs++) { for (qs = 0; qs < cplxBands; qs++) {
pHybOutputRealDry[qs] = fMultDiv2(pHybOutputRealDry[qs], dryFac) << scale; pHybOutputRealDry[qs] = SATURATE_LEFT_SHIFT(
pHybOutputImagDry[qs] = fMultDiv2(pHybOutputImagDry[qs], dryFac) << scale; fMultDiv2(pHybOutputRealDry[qs], dryFac), scale, DFRACT_BITS);
pHybOutputImagDry[qs] = SATURATE_LEFT_SHIFT(
fMultDiv2(pHybOutputImagDry[qs], dryFac), scale, DFRACT_BITS);
} }
for (; qs < hybBands; qs++) { for (; qs < hybBands; qs++) {
pHybOutputRealDry[qs] = fMultDiv2(pHybOutputRealDry[qs], dryFac) << scale; pHybOutputRealDry[qs] = SATURATE_LEFT_SHIFT(
fMultDiv2(pHybOutputRealDry[qs], dryFac), scale, DFRACT_BITS);
} }
} }
} }
@@ -614,14 +617,16 @@ void SpatialDecReshapeBBEnv(spatialDec *self, const SPATIAL_BS_FRAME *frame,
fixMax(3, fixMax(dryFacSF, slotAmpSF)); /* scale is at least with 3 fixMax(3, fixMax(dryFacSF, slotAmpSF)); /* scale is at least with 3
bits to avoid overflows bits to avoid overflows
when calculating dryFac */ when calculating dryFac */
dryFac = dryFac >> (scale - dryFacSF); dryFac = dryFac >> fixMin(scale - dryFacSF, DFRACT_BITS - 1);
slotAmp_ratio = slotAmp_ratio >> (scale - slotAmpSF); slotAmp_ratio =
slotAmp_ratio >> fixMin(scale - slotAmpSF, DFRACT_BITS - 1);
/* limit dryFac */ /* limit dryFac */
dryFac = fixMax( dryFac = fixMax(
FL2FXCONST_DBL(0.25f) >> (INT)fixMin(2 * scale, DFRACT_BITS - 1), FL2FXCONST_DBL(0.25f) >> (INT)fixMin(2 * scale, DFRACT_BITS - 1),
fMult(dryFac, slotAmp_ratio) - (slotAmp_ratio >> scale) + fMult(dryFac, slotAmp_ratio) -
(dryFac >> scale)); (slotAmp_ratio >> fixMin(scale, DFRACT_BITS - 1)) +
(dryFac >> fixMin(scale, DFRACT_BITS - 1)));
dryFac = fixMin( dryFac = fixMin(
FL2FXCONST_DBL(0.50f) >> (INT)fixMin(2 * scale - 3, DFRACT_BITS - 1), FL2FXCONST_DBL(0.50f) >> (INT)fixMin(2 * scale - 3, DFRACT_BITS - 1),
dryFac); /* reduce shift bits by 3, because upper dryFac); /* reduce shift bits by 3, because upper
@@ -635,8 +640,8 @@ void SpatialDecReshapeBBEnv(spatialDec *self, const SPATIAL_BS_FRAME *frame,
/* shaping */ /* shaping */
shapeBBEnv(&self->hybOutputRealDry__FDK[ch][6], shapeBBEnv(&self->hybOutputRealDry__FDK[ch][6],
&self->hybOutputImagDry__FDK[ch][6], dryFac, scale, cplxBands, &self->hybOutputImagDry__FDK[ch][6], dryFac,
hybBands); fixMin(scale, DFRACT_BITS - 1), cplxBands, hybBands);
} }
} }
} }