diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | gst/law/mulaw-conversion.c | 10 |
2 files changed, 12 insertions, 3 deletions
@@ -1,3 +1,8 @@ +2004-05-19 Wim Taymans <wim@fluendo.com> + + * gst/law/mulaw-conversion.c: (mulaw_encode): + Fix overflow bug in ulaw encoding. + 2004-05-19 Benjamin Otte <in7y118@public.uni-hamburg.de> * ext/mad/gstmad.c: (gst_mad_handle_event): 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 <glib.h> -#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]; |