summaryrefslogtreecommitdiffstats
path: root/gst/law/mulaw-conversion.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2001-12-22 23:27:31 +0000
committerAndy Wingo <wingo@pobox.com>2001-12-22 23:27:31 +0000
commit185612aae3b8acae2b32e0e6561691a7c640cd0d (patch)
tree7cd1990c3df5c63f402f3e0bdf6b51b3ed58fc41 /gst/law/mulaw-conversion.c
parent87dab192cf5792f847a22e0c3e9afe78553739b5 (diff)
Initial revision
Original commit message from CVS: Initial revision
Diffstat (limited to 'gst/law/mulaw-conversion.c')
-rw-r--r--gst/law/mulaw-conversion.c102
1 files changed, 102 insertions, 0 deletions
diff --git a/gst/law/mulaw-conversion.c b/gst/law/mulaw-conversion.c
new file mode 100644
index 00000000..ad3fcce6
--- /dev/null
+++ b/gst/law/mulaw-conversion.c
@@ -0,0 +1,102 @@
+/*
+ * This routine converts from linear to ulaw
+ * 29 September 1989
+ *
+ * Craig Reese: IDA/Supercomputing Research Center
+ * Joe Campbell: Department of Defense
+ *
+ * References:
+ * 1) CCITT Recommendation G.711 (very difficult to follow)
+ * 2) "A New Digital Technique for Implementation of Any
+ * Continuous PCM Companding Law," Villeret, Michel,
+ * et al. 1973 IEEE Int. Conf. on Communications, Vol 1,
+ * 1973, pg. 11.12-11.17
+ * 3) MIL-STD-188-113,"Interoperability and Performance Standards
+ * for Analog-to_Digital Conversion Techniques,"
+ * 17 February 1987
+ *
+ * Input: Signed 16 bit linear sample
+ * Output: 8 bit ulaw sample
+ */
+
+#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 */
+#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,
+ 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;
+
+ 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 */
+ /** 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);
+#ifdef ZEROTRAP
+ if (ulawbyte == 0 ) ulawbyte = 0x02; /* optional CCITT trap */
+#endif
+ out[i]=ulawbyte;
+ }
+}
+
+/*
+ * This routine converts from ulaw to 16 bit linear
+ * 29 September 1989
+ *
+ * Craig Reese: IDA/Supercomputing Research Center
+ *
+ * References:
+ * 1) CCITT Recommendation G.711 (very difficult to follow)
+ * 2) MIL-STD-188-113,"Interoperability and Performance Standards
+ * for Analog-to_Digital Conversion Techniques,"
+ * 17 February 1987
+ *
+ * Input: 8 bit ulaw sample
+ * Output: signed 16 bit linear sample
+ */
+
+void
+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;
+ }
+}