From 0702a8bf1d124c32e4dbc6c72a514ea52a35f6de Mon Sep 17 00:00:00 2001 From: arpi_esp Date: Fri, 11 May 2001 01:20:22 +0000 Subject: [PATCH] uLaw support git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@757 b3059339-0415-0410-9bf9-f77b7e298cf2 --- alaw.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/alaw.c b/alaw.c index de8c43962c..41a45d0267 100644 --- a/alaw.c +++ b/alaw.c @@ -6,7 +6,52 @@ #define xaBYTE char #define xaUBYTE unsigned char -xaULONG long xa_alaw_2_sign[256]; +//xaULONG long xa_alaw_2_sign[256]; +xaULONG xa_alaw_2_sign[256]; +xaULONG xa_ulaw_2_sign[256]; + +/* +** This routine converts from ulaw to 16 bit linear. +** +** Craig Reese: IDA/Supercomputing Research Center +** 29 September 1989 +** +** 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 +*/ + +xaLONG XA_uLaw_to_Signed( ulawbyte ) +xaUBYTE ulawbyte; +{ + static int exp_lut[8] = { 0, 132, 396, 924, 1980, 4092, 8316, 16764 }; + int sign, exponent, mantissa, sample; + + ulawbyte = ~ ulawbyte; + sign = ( ulawbyte & 0x80 ); + exponent = ( ulawbyte >> 4 ) & 0x07; + mantissa = ulawbyte & 0x0F; + sample = exp_lut[exponent] + ( mantissa << ( exponent + 3 ) ); + if ( sign != 0 ) sample = -sample; + + return sample; +} + +void Gen_uLaw_2_Signed() +{ xaULONG i; + for(i=0;i<256;i++) + { xaUBYTE data = (xaUBYTE)(i); + xaLONG d = XA_uLaw_to_Signed( data ); + xa_ulaw_2_sign[i] = (xaULONG)((xaULONG)(d) & 0xffff); + } +} + + void Gen_aLaw_2_Signed() { xaULONG i;