Merge branch 'plugin-move-rtp-opus'
[platform/upstream/gst-plugins-good.git] / gst / law / mulaw-conversion.c
index fa4db3c..15cde17 100644 (file)
 
 #include <glib.h>
 
-#define ZEROTRAP               /* turn on the trap as per the MIL-STD */
-#define BIAS 0x84              /* define the add-in bias for 16 bit samples */
+#include "mulaw-conversion.h"
+
+#undef ZEROTRAP                 /* turn on the trap as per the MIL-STD */
+#define BIAS 0x84               /* define the add-in bias for 16 bit samples */
 #define CLIP 32635
 
 void
 mulaw_encode (gint16 * in, guint8 * out, gint numsamples)
 {
-  static gint16 exp_lut[256] = { 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+  static const gint16 exp_lut[256] = {
+    0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
@@ -49,18 +52,23 @@ mulaw_encode (gint16 * in, guint8 * out, gint numsamples)
     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
   };
-  gint16 sign, exponent, mantissa, i;
+  gint16 sign, exponent, mantissa;
   gint16 sample;
   guint8 ulawbyte;
+  gint i;
 
   for (i = 0; i < numsamples; i++) {
     sample = in[i];
       /** get the sample into sign-magnitude **/
-    sign = (sample >> 8) & 0x80;       /* set aside the sign */
-    if (sign != 0)
-      sample = -sample;                /* get magnitude */
-    if (sample > CLIP)
-      sample = CLIP;           /* clip the magnitude */
+    sign = (sample >> 8) & 0x80;        /* set aside the sign */
+    if (sign != 0) {
+      sample = -sample;         /* get magnitude */
+    }
+    /* sample can be zero because we can overflow in the inversion,
+     * checking against the unsigned version solves this */
+    if (((guint16) sample) > CLIP)
+      sample = CLIP;            /* clip the magnitude */
+
       /** convert from 16 bit linear to ulaw **/
     sample = sample + BIAS;
     exponent = exp_lut[(sample >> 7) & 0xFF];
@@ -68,7 +76,7 @@ mulaw_encode (gint16 * in, guint8 * out, gint numsamples)
     ulawbyte = ~(sign | (exponent << 4) | mantissa);
 #ifdef ZEROTRAP
     if (ulawbyte == 0)
-      ulawbyte = 0x02;         /* optional CCITT trap */
+      ulawbyte = 0x02;          /* optional CCITT trap */
 #endif
     out[i] = ulawbyte;
   }
@@ -93,10 +101,12 @@ mulaw_encode (gint16 * in, guint8 * out, gint numsamples)
 void
 mulaw_decode (guint8 * in, gint16 * out, gint numsamples)
 {
-  static gint16 exp_lut[8] = { 0, 132, 396, 924, 1980, 4092, 8316, 16764 };
+  static const gint16 exp_lut[8] =
+      { 0, 132, 396, 924, 1980, 4092, 8316, 16764 };
   gint16 sign, exponent, mantissa;
   guint8 ulawbyte;
-  gint16 linear, i;
+  gint16 linear;
+  gint i;
 
   for (i = 0; i < numsamples; i++) {
     ulawbyte = in[i];