From 1a9e8539d38d4bd79fd9717ad8d97b7e95ea264f Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin <jmvalin@jmvalin.ca> Date: Thu, 10 May 2012 12:36:46 -0400 Subject: [PATCH] Fixes two fixed-point overflow issues One in SILK, one in CELT, none of them causing real harm in practice it seems --- celt/celt.c | 5 +++-- silk/fixed/prefilter_FIX.c | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/celt/celt.c b/celt/celt.c index 3b1b4f6d6..8c9105bdd 100644 --- a/celt/celt.c +++ b/celt/celt.c @@ -865,8 +865,9 @@ static int stereo_analysis(const CELTMode *m, const celt_norm *X, 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); diff --git a/silk/fixed/prefilter_FIX.c b/silk/fixed/prefilter_FIX.c index 1b54d142d..a96f5118b 100644 --- a/silk/fixed/prefilter_FIX.c +++ b/silk/fixed/prefilter_FIX.c @@ -135,9 +135,9 @@ void silk_prefilter_FIX( 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 ]; -- GitLab