Index: webrtc/modules/audio_coding/codecs/ilbc/smooth.c |
diff --git a/webrtc/modules/audio_coding/codecs/ilbc/smooth.c b/webrtc/modules/audio_coding/codecs/ilbc/smooth.c |
index 58b37ee31cc99a4959c8f1f1b5d4ea93521bdd96..269331cce4d4b7d00f4daccc0c9819ee6afd5c97 100644 |
--- a/webrtc/modules/audio_coding/codecs/ilbc/smooth.c |
+++ b/webrtc/modules/audio_coding/codecs/ilbc/smooth.c |
@@ -31,7 +31,7 @@ void WebRtcIlbcfix_Smooth( |
int16_t *surround /* (i) The approximation from the |
surrounding sequences */ |
) { |
- int16_t maxtot, scale, scale1, scale2; |
+ int16_t scale, scale1, scale2; |
int16_t A, B, C, denomW16; |
int32_t B_W32, denom, num; |
int32_t errs; |
@@ -40,18 +40,21 @@ void WebRtcIlbcfix_Smooth( |
int16_t w11prim; |
int16_t bitsw00, bitsw10, bitsw11; |
int32_t w11w00, w10w10, w00w00; |
- int16_t max1, max2; |
+ uint32_t max1, max2, max12; |
/* compute some inner products (ensure no overflow by first calculating proper scale factor) */ |
w00 = w10 = w11 = 0; |
- max1=WebRtcSpl_MaxAbsValueW16(current, ENH_BLOCKL); |
- max2=WebRtcSpl_MaxAbsValueW16(surround, ENH_BLOCKL); |
- maxtot=WEBRTC_SPL_MAX(max1, max2); |
- |
- scale=WebRtcSpl_GetSizeInBits(maxtot); |
- scale = (int16_t)(2 * scale) - 26; |
+ // Calculate a right shift that will let us sum ENH_BLOCKL pairwise products |
+ // of values from the two sequences without overflowing an int32_t. (The +1 |
+ // in max1 and max2 are because WebRtcSpl_MaxAbsValueW16 will return 2**15 - |
+ // 1 if the input array contains -2**15.) |
+ max1 = WebRtcSpl_MaxAbsValueW16(current, ENH_BLOCKL) + 1; |
+ max2 = WebRtcSpl_MaxAbsValueW16(surround, ENH_BLOCKL) + 1; |
+ max12 = WEBRTC_SPL_MAX(max1, max2); |
+ scale = (64 - 31) - |
+ WebRtcSpl_CountLeadingZeros64((max12 * max12) * (uint64_t)ENH_BLOCKL); |
scale=WEBRTC_SPL_MAX(0, scale); |
w00=WebRtcSpl_DotProductWithScale(current,current,ENH_BLOCKL,scale); |