Thu Sep 7 01:03:40 2017

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 46 of file ulaw.c.

Referenced by linear2ulaw().

#define CLIP   32635

Definition at line 47 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 175 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().

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

static unsigned char linear2ulaw ( short  sample  )  [static]

Definition at line 54 of file ulaw.c.

References BIAS, and CLIP.

Referenced by ast_ulaw_init().

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


Variable Documentation

unsigned char __ast_lin2mu[16384]

converts signed linear to mulaw

Definition at line 51 of file ulaw.c.

short __ast_mulaw[256]

help

Definition at line 52 of file ulaw.c.


Generated on 7 Sep 2017 for Asterisk - The Open Source Telephony Project by  doxygen 1.6.1