Merge branch 'plugin-move-rtp-opus'
[platform/upstream/gst-plugins-good.git] / gst / law / mulaw-conversion.c
index e921fb8..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)
+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,
-                               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,
-                               6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
-                               6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
-                               6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
-                               6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
-                               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,
-                               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,
-                               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,
-                               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 sample;
-    guint8 ulawbyte;
+  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,
+    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+    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,
+    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,
+    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,
+    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;
+  gint16 sample;
+  guint8 ulawbyte;
+  gint i;
 
-    for(i=0;i<numsamples;i++) {
-      sample=in[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];
-      mantissa = (sample >> (exponent+3)) & 0x0F;
-      ulawbyte = ~(sign | (exponent << 4) | mantissa);
+    sample = sample + BIAS;
+    exponent = exp_lut[(sample >> 7) & 0xFF];
+    mantissa = (sample >> (exponent + 3)) & 0x0F;
+    ulawbyte = ~(sign | (exponent << 4) | mantissa);
 #ifdef ZEROTRAP
-      if (ulawbyte == 0 ) ulawbyte = 0x02;  /* optional CCITT trap */
+    if (ulawbyte == 0)
+      ulawbyte = 0x02;          /* optional CCITT trap */
 #endif
-      out[i]=ulawbyte;
-    }
+    out[i] = ulawbyte;
+  }
 }
 
 /*
@@ -87,20 +99,24 @@ mulaw_encode(gint16* in, guint8* out, gint numsamples)
  */
 
 void
-mulaw_decode(guint8* in,gint16* out,gint numsamples)
+mulaw_decode (guint8 * in, gint16 * out, gint numsamples)
 {
-    static gint16 exp_lut[8]={0,132,396,924,1980,4092,8316,16764};
-    gint16 sign, exponent, mantissa;
-    guint8 ulawbyte;
-    gint16 linear,i;
-    for(i=0;i<numsamples;i++) {
-      ulawbyte=in[i];
-      ulawbyte = ~ulawbyte;
-      sign = (ulawbyte & 0x80);
-      exponent = (ulawbyte >> 4) & 0x07;
-      mantissa = ulawbyte & 0x0F;
-      linear = exp_lut[exponent] + (mantissa << (exponent+3));
-      if (sign != 0) linear = -linear;
-      out[i]=linear;
-    }
+  static const gint16 exp_lut[8] =
+      { 0, 132, 396, 924, 1980, 4092, 8316, 16764 };
+  gint16 sign, exponent, mantissa;
+  guint8 ulawbyte;
+  gint16 linear;
+  gint i;
+
+  for (i = 0; i < numsamples; i++) {
+    ulawbyte = in[i];
+    ulawbyte = ~ulawbyte;
+    sign = (ulawbyte & 0x80);
+    exponent = (ulawbyte >> 4) & 0x07;
+    mantissa = ulawbyte & 0x0F;
+    linear = exp_lut[exponent] + (mantissa << (exponent + 3));
+    if (sign != 0)
+      linear = -linear;
+    out[i] = linear;
+  }
 }