Fri Jun 19 12:10:54 2009

Asterisk developer's documentation


ulaw.c File Reference

u-Law to Signed linear conversion More...

#include "asterisk.h"
#include "asterisk/ulaw.h"

Go to the source code of this file.

Defines

#define BIAS   0x84
#define CLIP   32635

Functions

void ast_ulaw_init (void)
 Set up mu-law conversion table.
static unsigned char linear2ulaw (short sample)

Variables

unsigned char __ast_lin2mu [16384]
 converts signed linear to mulaw
short __ast_mulaw [256]


Detailed Description

u-Law to Signed linear conversion

Author:
Mark Spencer <markster@digium.com>

Definition in file ulaw.c.


Define Documentation

#define BIAS   0x84

define the add-in bias for 16 bit samples

Definition at line 41 of file ulaw.c.

Referenced by linear2ulaw().

#define CLIP   32635

Definition at line 42 of file ulaw.c.

Referenced by linear2ulaw().


Function Documentation

void ast_ulaw_init ( void   ) 

Set up mu-law conversion table.

To init the ulaw to slinear conversion stuff, this needs to be run.

Definition at line 170 of file ulaw.c.

References AST_LIN2MU, ast_log(), AST_MULAW, AST_ULAW_STEP, f, linear2ulaw(), LOG_NOTICE, and LOG_WARNING.

Referenced by load_module(), and main().

00171 {
00172    int i;
00173    
00174    /*
00175     *  Set up mu-law conversion table
00176     */
00177 #ifndef G711_NEW_ALGORITHM
00178    for (i = 0;i < 256;i++) {
00179       short mu,e,f,y;
00180       static short etab[]={0,132,396,924,1980,4092,8316,16764};
00181       
00182       mu = 255-i;
00183       e = (mu & 0x70)/16;
00184       f = mu & 0x0f;
00185       y = f * (1 << (e + 3));
00186       y += etab[e];
00187       if (mu & 0x80) y = -y;
00188       __ast_mulaw[i] = y;
00189    }
00190    /* set up the reverse (mu-law) conversion table */
00191    for (i = -32768; i < 32768; i++) {
00192       __ast_lin2mu[((unsigned short)i) >> 2] = linear2ulaw(i);
00193    }
00194 #else
00195    
00196    for (i = 0; i < 256; i++) {
00197       __ast_mulaw[i] = ulaw2linear(i);
00198    }
00199    /* set up the reverse (mu-law) conversion table */
00200    for (i = 0; i <= 32768; i += AST_ULAW_STEP) {
00201       AST_LIN2MU_LOOKUP(i) = linear2ulaw(i, 0 /* half-cooked */);
00202    }
00203 #endif
00204    
00205 #ifdef TEST_CODING_TABLES
00206    for (i = -32768; i < 32768; ++i) {
00207 #ifndef G711_NEW_ALGORITHM
00208       unsigned char e1 = linear2ulaw(i);
00209 #else
00210       unsigned char e1 = linear2ulaw(i, 1);
00211 #endif
00212       short d1 = ulaw2linear(e1);
00213       unsigned char e2 = AST_LIN2MU(i);
00214       short d2 = ulaw2linear(e2);
00215       short d3 = AST_MULAW(e1);
00216       
00217       if (e1 != e2 || d1 != d3 || d2 != d3) {
00218          ast_log(LOG_WARNING, "u-Law coding tables test failed on %d: e1=%u, e2=%u, d1=%d, d2=%d\n",
00219                i, (unsigned)e1, (unsigned)e2, (int)d1, (int)d2);
00220       }
00221    }
00222    ast_log(LOG_NOTICE, "u-Law coding table test complete.\n");
00223 #endif /* TEST_CODING_TABLES */
00224    
00225 #ifdef TEST_TANDEM_TRANSCODING
00226    /* tandem transcoding test */
00227    for (i = -32768; i < 32768; ++i) {
00228       unsigned char e1 = AST_LIN2MU(i);
00229       short d1 = AST_MULAW(e1);
00230       unsigned char e2 = AST_LIN2MU(d1);
00231       short d2 = AST_MULAW(e2);
00232       unsigned char e3 = AST_LIN2MU(d2);
00233       short d3 = AST_MULAW(e3);
00234       
00235       if (i < 0 && e1 == 0x7f && e2 == 0xff && e3 == 0xff)
00236          continue; /* known and normal negative 0 case */
00237       
00238       if (e1 != e2 || e2 != e3 || d1 != d2 || d2 != d3) {
00239          ast_log(LOG_WARNING, "u-Law tandem transcoding test failed on %d: e1=%u, e2=%u, d1=%d, d2=%d, d3=%d\n",
00240                i, (unsigned)e1, (unsigned)e2, (int)d1, (int)d2, (int)d3);
00241       }
00242    }
00243    ast_log(LOG_NOTICE, "u-Law tandem transcoding test complete.\n");
00244 #endif /* TEST_TANDEM_TRANSCODING */
00245 }

static unsigned char linear2ulaw ( short  sample  )  [static]

Definition at line 49 of file ulaw.c.

References BIAS, and CLIP.

Referenced by ast_ulaw_init().

00050 {
00051    static int exp_lut[256] = {
00052       0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,
00053       4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
00054       5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
00055       5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
00056       6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
00057       6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
00058       6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
00059       6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
00060       7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00061       7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00062       7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00063       7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00064       7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00065       7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00066       7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00067       7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 };
00068    int sign, exponent, mantissa;
00069    unsigned char ulawbyte;
00070    
00071    /* Get the sample into sign-magnitude. */
00072    sign = (sample >> 8) & 0x80;          /* set aside the sign */
00073    if (sign != 0)
00074       sample = -sample;              /* get magnitude */
00075    if (sample > CLIP)
00076       sample = CLIP;             /* clip the magnitude */
00077    
00078    /* Convert from 16 bit linear to ulaw. */
00079    sample = sample + BIAS;
00080    exponent = exp_lut[(sample >> 7) & 0xFF];
00081    mantissa = (sample >> (exponent + 3)) & 0x0F;
00082    ulawbyte = ~(sign | (exponent << 4) | mantissa);
00083    
00084 #ifdef ZEROTRAP
00085    if (ulawbyte == 0)
00086       ulawbyte = 0x02;   /* optional CCITT trap */
00087 #endif
00088    
00089    return ulawbyte;
00090 }


Variable Documentation

unsigned char __ast_lin2mu[16384]

converts signed linear to mulaw

Definition at line 46 of file ulaw.c.

short __ast_mulaw[256]

help

Definition at line 47 of file ulaw.c.


Generated on Fri Jun 19 12:10:54 2009 for Asterisk - the Open Source PBX by  doxygen 1.4.7