mirror of https://github.com/mstorsjo/fdk-aac.git
Overcome potential integer overflows in M/S module for complex prediction.
Bug: 131430997 Test: atest DecoderTestXheAac ; atest DecoderTestAacDrc Change-Id: Ic0648203b6a61ebff8bcc93c4b1099e033bc6860
This commit is contained in:
parent
40d2a1d8b0
commit
1b4a3bedbb
|
@ -989,7 +989,7 @@ void CJointStereo_ApplyMS(
|
||||||
} /* if ( pJointStereoData->complex_coef == 1 ) */
|
} /* if ( pJointStereoData->complex_coef == 1 ) */
|
||||||
|
|
||||||
/* 4. upmix process */
|
/* 4. upmix process */
|
||||||
INT pred_dir = cplxPredictionData->pred_dir ? -1 : 1;
|
LONG pred_dir = cplxPredictionData->pred_dir ? -1 : 1;
|
||||||
/* 0.1 in Q-3.34 */
|
/* 0.1 in Q-3.34 */
|
||||||
const FIXP_DBL pointOne = 0x66666666; /* 0.8 */
|
const FIXP_DBL pointOne = 0x66666666; /* 0.8 */
|
||||||
/* Shift value for the downmix */
|
/* Shift value for the downmix */
|
||||||
|
@ -1039,34 +1039,24 @@ void CJointStereo_ApplyMS(
|
||||||
the downmix. "dmx_re" and "specL" are two different pointers
|
the downmix. "dmx_re" and "specL" are two different pointers
|
||||||
pointing to separate arrays, which may or may not contain the
|
pointing to separate arrays, which may or may not contain the
|
||||||
same data (with different scaling).
|
same data (with different scaling).
|
||||||
|
|
||||||
|
specL[i] = + (specL[i] + side);
|
||||||
|
specR[i] = -/+ (specL[i] - side);
|
||||||
*/
|
*/
|
||||||
|
FIXP_DBL side, left, right;
|
||||||
|
|
||||||
/* help1: alpha_re[i] * dmx_re[i] */
|
side = fMultAddDiv2(fMultDiv2(alpha_re_tmp, *p2dmxRe++),
|
||||||
FIXP_DBL help1 = fMultDiv2(alpha_re_tmp, *p2dmxRe++);
|
alpha_im_tmp, (*p2dmxIm++) << shift_dmx);
|
||||||
|
side = ((*p2CoeffR) >> 2) -
|
||||||
|
(FIXP_DBL)SATURATE_SHIFT(side, -(help3_shift - 2),
|
||||||
|
DFRACT_BITS - 2);
|
||||||
|
|
||||||
/* tmp: dmx_im[i] */
|
left = ((*p2CoeffL) >> 2) + side;
|
||||||
FIXP_DBL tmp = (*p2dmxIm++) << shift_dmx;
|
right = ((*p2CoeffL) >> 2) - side;
|
||||||
|
right = (FIXP_DBL)((LONG)right * pred_dir);
|
||||||
|
|
||||||
/* help2: alpha_im[i] * dmx_im[i] */
|
*p2CoeffL++ = SATURATE_LEFT_SHIFT_ALT(left, 2, DFRACT_BITS);
|
||||||
FIXP_DBL help2 = fMultDiv2(alpha_im_tmp, tmp);
|
*p2CoeffR++ = SATURATE_LEFT_SHIFT_ALT(right, 2, DFRACT_BITS);
|
||||||
|
|
||||||
/* help3: alpha_re[i] * dmx_re[i] + alpha_im[i] * dmx_im[i] */
|
|
||||||
FIXP_DBL help3 = help1 + help2;
|
|
||||||
|
|
||||||
/* side (= help4) = specR[i] - (dmx_re[i] * specL[i] + alpha_im[i]
|
|
||||||
* * dmx_im[i]) */
|
|
||||||
FIXP_DBL help4 = *p2CoeffR - scaleValue(help3, help3_shift);
|
|
||||||
|
|
||||||
/* We calculate the left and right output by using the helper
|
|
||||||
* function */
|
|
||||||
/* specR[i] = -/+ (specL[i] - side); */
|
|
||||||
*p2CoeffR =
|
|
||||||
(FIXP_DBL)((LONG)(*p2CoeffL - help4) * (LONG)pred_dir);
|
|
||||||
p2CoeffR++;
|
|
||||||
|
|
||||||
/* specL[i] = specL[i] + side; */
|
|
||||||
*p2CoeffL = *p2CoeffL + help4;
|
|
||||||
p2CoeffL++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue