Wed Aug 18 22:34:34 2010

Asterisk developer's documentation


ulaw.c File Reference

u-Law to Signed linear conversion More...

#include "asterisk.h"
#include "asterisk/ulaw.h"
#include "asterisk/logger.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 42 of file ulaw.c.

Referenced by linear2ulaw().

#define CLIP   32635

Definition at line 43 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 171 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().

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

static unsigned char linear2ulaw ( short  sample  )  [static]

Definition at line 50 of file ulaw.c.

References BIAS, and CLIP.

Referenced by ast_ulaw_init().

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


Variable Documentation

unsigned char __ast_lin2mu[16384]

converts signed linear to mulaw

Definition at line 47 of file ulaw.c.

short __ast_mulaw[256]

help

Definition at line 48 of file ulaw.c.


Generated on Wed Aug 18 22:34:34 2010 for Asterisk - the Open Source PBX by  doxygen 1.4.7