Chromium Code Reviews| Index: webrtc/modules/audio_processing/agc/legacy/digital_agc.c | 
| diff --git a/webrtc/modules/audio_processing/agc/legacy/digital_agc.c b/webrtc/modules/audio_processing/agc/legacy/digital_agc.c | 
| index 2ca967a4aae1a0d0a00758b4861a4838b1d11d46..8ad91278b0840e57a9ded287ef517e51f1d9fd25 100644 | 
| --- a/webrtc/modules/audio_processing/agc/legacy/digital_agc.c | 
| +++ b/webrtc/modules/audio_processing/agc/legacy/digital_agc.c | 
| @@ -187,14 +187,12 @@ int32_t WebRtcAgc_CalculateGainTable(int32_t* gainTable, // Q16 | 
| numFIX -= (int32_t)logApprox * diffGain; // Q14 | 
| // Calculate ratio | 
| - // Shift |numFIX| as much as possible. | 
| - // Ensure we avoid wrap-around in |den| as well. | 
| - if (numFIX > (den >> 8)) // |den| is Q8. | 
| 
 
minyue-webrtc
2016/05/21 12:33:37
Two problems were with this part
1. if |numFIX| i
 
 | 
| - { | 
| - zeros = WebRtcSpl_NormW32(numFIX); | 
| - } else { | 
| - zeros = WebRtcSpl_NormW32(den) + 8; | 
| - } | 
| + // 1) Shift |numFIX| as much as possible. Since we later add |den| / 2 to | 
| + // |numFIX| before dividing |den| to round the ratio, we use |numFIX| *2 to | 
| + // calculate the bit for shifting. | 
| + // 2) Ensure we avoid wrap-around in |den| as well. | 
| + zeros = WEBRTC_SPL_MIN(WebRtcSpl_NormW32(numFIX * 2), | 
| 
 
peah-webrtc
2016/05/23 04:59:37
The norm computation is on some platforms fairly c
 
peah-webrtc
2016/05/23 04:59:37
How do you know that numFIX * 2 does not overflow?
 
minyue-webrtc
2016/05/23 07:40:48
Good question, after a second thought, I see that
 
 | 
| + WebRtcSpl_NormW32(den) + 8); | 
| numFIX *= 1 << zeros; // Q(14+zeros) | 
| // Shift den so we end up in Qy1 |