Fixes the stereo_analysis() fixed-point overflow issue properly
authorJean-Marc Valin <jmvalin@jmvalin.ca>
Wed, 16 May 2012 21:47:17 +0000 (17:47 -0400)
committerJean-Marc Valin <jmvalin@jmvalin.ca>
Wed, 16 May 2012 21:50:17 +0000 (17:50 -0400)
celt/celt.c
src/opus_decoder.c

index 8c9105b..7a4ce77 100644 (file)
@@ -860,14 +860,14 @@ static int stereo_analysis(const CELTMode *m, const celt_norm *X,
       int j;
       for (j=m->eBands[i]<<LM;j<m->eBands[i+1]<<LM;j++)
       {
-         opus_val16 L, R, M, S;
-         L = X[j];
-         R = X[N0+j];
-         M = L+R;
-         S = L-R;
+         opus_val32 L, R, M, 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));
+         L = EXTEND32(X[j]);
+         R = EXTEND32(X[N0+j]);
+         M = ADD32(L, R);
+         S = SUB32(L, R);
+         sumLR = ADD32(sumLR, ADD32(ABS32(L), ABS32(R)));
+         sumMS = ADD32(sumMS, ADD32(ABS32(M), ABS32(S)));
       }
    }
    sumMS = MULT16_32_Q15(QCONST16(0.707107f, 15), sumMS);
index e7941f1..24869e7 100644 (file)
@@ -69,7 +69,7 @@ struct OpusDecoder {
 #ifdef FIXED_POINT
 static inline opus_int16 SAT16(opus_int32 x) {
    return x > 32767 ? 32767 : x < -32768 ? -32768 : (opus_int16)x;
-};
+}
 #endif