| Index: webrtc/modules/audio_coding/codecs/ilbc/my_corr.c
|
| diff --git a/webrtc/modules/audio_coding/codecs/ilbc/my_corr.c b/webrtc/modules/audio_coding/codecs/ilbc/my_corr.c
|
| index bd6ff561c2c5643e8961f2e0ab1f2594205a801a..80847b6099cd856aaccf5c00c8ed4d4c31295389 100644
|
| --- a/webrtc/modules/audio_coding/codecs/ilbc/my_corr.c
|
| +++ b/webrtc/modules/audio_coding/codecs/ilbc/my_corr.c
|
| @@ -29,25 +29,26 @@ void WebRtcIlbcfix_MyCorr(
|
| const int16_t* seq2, /* (i) second sequence */
|
| size_t dim2 /* (i) dimension seq2 */
|
| ){
|
| - int16_t max;
|
| + uint32_t max1, max2;
|
| size_t loops;
|
| - int scale;
|
| -
|
| - /* Calculate correlation between the two sequences. Scale the
|
| - result of the multiplcication to maximum 26 bits in order
|
| - to avoid overflow */
|
| - max=WebRtcSpl_MaxAbsValueW16(seq1, dim1);
|
| - scale=WebRtcSpl_GetSizeInBits(max);
|
| -
|
| - scale = 2 * scale - 26;
|
| - if (scale<0) {
|
| - scale=0;
|
| + int right_shift;
|
| +
|
| + // Calculate a right shift that will let us sum dim2 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(seq1, dim1) + 1;
|
| + max2 = WebRtcSpl_MaxAbsValueW16(seq2, dim2) + 1;
|
| + right_shift =
|
| + (64 - 31) - WebRtcSpl_CountLeadingZeros64((max1 * max2) * (uint64_t)dim2);
|
| + if (right_shift < 0) {
|
| + right_shift = 0;
|
| }
|
|
|
| loops=dim1-dim2+1;
|
|
|
| /* Calculate the cross correlations */
|
| - WebRtcSpl_CrossCorrelation(corr, seq2, seq1, dim2, loops, scale, 1);
|
| + WebRtcSpl_CrossCorrelation(corr, seq2, seq1, dim2, loops, right_shift, 1);
|
|
|
| return;
|
| }
|
|
|