ref: 1a9e8539d38d4bd79fd9717ad8d97b7e95ea264f
parent: 9faea25d29ab18e4d67e50f58da47a5f1753d738
author: Jean-Marc Valin <[email protected]>
date: Thu May 10 08:36:46 EDT 2012
Fixes two fixed-point overflow issues One in SILK, one in CELT, none of them causing real harm in practice it seems
--- a/celt/celt.c
+++ b/celt/celt.c
@@ -865,8 +865,9 @@
R = X[N0+j];
M = L+R;
S = L-R;
- sumLR += EXTEND32(ABS16(L)) + EXTEND32(ABS16(R));
- sumMS += EXTEND32(ABS16(M)) + EXTEND32(ABS16(S));
+ /* We cast to 32-bit first because of the -32768 case */
+ sumLR += ABS32(EXTEND32(L)) + ABS32(EXTEND32(R));
+ sumMS += ABS32(EXTEND32(M)) + ABS32(EXTEND32(S));
}
}
sumMS = MULT16_32_Q15(QCONST16(0.707107f, 15), sumMS);
--- a/silk/fixed/prefilter_FIX.c
+++ b/silk/fixed/prefilter_FIX.c
@@ -135,9 +135,9 @@
tmp_32 = silk_SMULWB( tmp_32, -psEncCtrl->GainsPre_Q14[ k ] ); /* Q24 */
tmp_32 = silk_RSHIFT_ROUND( tmp_32, 14 ); /* Q10 */
B_Q10[ 1 ]= silk_SAT16( tmp_32 );
- x_filt_Q12[ 0 ] = silk_SMLABB( silk_SMULBB( st_res_Q2[ 0 ], B_Q10[ 0 ] ), P->sHarmHP_Q2, B_Q10[ 1 ] );
+ x_filt_Q12[ 0 ] = silk_MLA( silk_MUL( st_res_Q2[ 0 ], B_Q10[ 0 ] ), P->sHarmHP_Q2, B_Q10[ 1 ] );
for( j = 1; j < psEnc->sCmn.subfr_length; j++ ) {
- x_filt_Q12[ j ] = silk_SMLABB( silk_SMULBB( st_res_Q2[ j ], B_Q10[ 0 ] ), st_res_Q2[ j - 1 ], B_Q10[ 1 ] );
+ x_filt_Q12[ j ] = silk_MLA( silk_MUL( st_res_Q2[ j ], B_Q10[ 0 ] ), st_res_Q2[ j - 1 ], B_Q10[ 1 ] );
}
P->sHarmHP_Q2 = st_res_Q2[ psEnc->sCmn.subfr_length - 1 ];