Fixes integer overflow in SILK VAD for 10-ms frames
authorJean-Marc Valin <jmvalin@jmvalin.ca>
Fri, 16 Feb 2018 17:36:44 +0000 (12:36 -0500)
committerJean-Marc Valin <jmvalin@jmvalin.ca>
Sun, 18 Feb 2018 07:17:07 +0000 (02:17 -0500)
Reported by Chandrakala Madhira on the mailing list

silk/VAD.c

index 0a782af..8b92965 100644 (file)
@@ -252,15 +252,14 @@ opus_int silk_VAD_GetSA_Q8_c(                                   /* O    Return v
         speech_nrg += ( b + 1 ) * silk_RSHIFT( Xnrg[ b ] - psSilk_VAD->NL[ b ], 4 );
     }
 
+    if( psEncC->frame_length == 20 * psEncC->fs_kHz ) {
+        speech_nrg = silk_RSHIFT32( speech_nrg, 1 );
+    }
     /* Power scaling */
     if( speech_nrg <= 0 ) {
         SA_Q15 = silk_RSHIFT( SA_Q15, 1 );
-    } else if( speech_nrg < 32768 ) {
-        if( psEncC->frame_length == 10 * psEncC->fs_kHz ) {
-            speech_nrg = silk_LSHIFT_SAT32( speech_nrg, 16 );
-        } else {
-            speech_nrg = silk_LSHIFT_SAT32( speech_nrg, 15 );
-        }
+    } else if( speech_nrg < 16384 ) {
+        speech_nrg = silk_LSHIFT32( speech_nrg, 16 );
 
         /* square-root */
         speech_nrg = silk_SQRT_APPROX( speech_nrg );