From b7d2e0b236a00429d7f6acc69b0c9d3fcdcdaed7 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 19 May 2004 20:04:10 +0000 Subject: gst/law/mulaw-conversion.c: Fix overflow bug in ulaw encoding. Original commit message from CVS: * gst/law/mulaw-conversion.c: (mulaw_encode): Fix overflow bug in ulaw encoding. --- gst/law/mulaw-conversion.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'gst/law') diff --git a/gst/law/mulaw-conversion.c b/gst/law/mulaw-conversion.c index a05d7bdc..5cee8436 100644 --- a/gst/law/mulaw-conversion.c +++ b/gst/law/mulaw-conversion.c @@ -25,7 +25,7 @@ #include -#define ZEROTRAP /* turn on the trap as per the MIL-STD */ +/* #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 @@ -57,10 +57,14 @@ mulaw_encode (gint16 * in, guint8 * out, gint numsamples) sample = in[i]; /** get the sample into sign-magnitude **/ sign = (sample >> 8) & 0x80; /* set aside the sign */ - if (sign != 0) + if (sign != 0) { sample = -sample; /* get magnitude */ - if (sample > CLIP) + } + /* 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]; -- cgit