Fixes opus_pcm_soft_clip() returning values slightly larger than +/-1 with -ffast...
authorJean-Marc Valin <jmvalin@jmvalin.ca>
Fri, 15 Jul 2016 14:57:21 +0000 (10:57 -0400)
committerJean-Marc Valin <jmvalin@jmvalin.ca>
Fri, 15 Jul 2016 14:57:21 +0000 (10:57 -0400)
src/opus.c

index b7b0ea0..2b47cda 100644 (file)
@@ -104,6 +104,10 @@ OPUS_EXPORT void opus_pcm_soft_clip(float *_x, int N, int C, float *declip_mem)
 
          /* Compute a such that maxval + a*maxval^2 = 1 */
          a=(maxval-1)/(maxval*maxval);
+         /* Slightly boost "a" by 2^-24. This is just enough to ensure -ffast-math
+            does not cause output values larger than +/-1, but small enough not
+            to matter even for 24-bit output.  */
+         a += a*6e-8;
          if (x[i*C]>0)
             a = -a;
          /* Apply soft clipping */