Thu Apr 3 08:20:28 2014

Asterisk developer's documentation


alaw.c File Reference

a-Law to Signed linear conversion More...

#include "asterisk.h"
#include "asterisk/alaw.h"
#include "asterisk/logger.h"
Include dependency graph for alaw.c:

Go to the source code of this file.

Functions

static short alaw2linear (unsigned char alawbyte)
void ast_alaw_init (void)
 To init the alaw to slinear conversion stuff, this needs to be run.
static unsigned char linear2alaw (short sample, int full_coding)

Variables

short __ast_alaw [256]
unsigned char __ast_lin2a [AST_ALAW_TAB_SIZE]
 converts signed linear to alaw

Detailed Description

a-Law to Signed linear conversion

Author:
Mark Spencer <markster@digium.com>

Definition in file alaw.c.


Function Documentation

static short alaw2linear ( unsigned char  alawbyte  )  [inline, static]

Definition at line 128 of file alaw.c.

References AST_ALAW_AMI_MASK.

Referenced by ast_alaw_init().

00129 {
00130    unsigned exponent, mantissa;
00131    short sample;
00132 
00133    alawbyte ^= AST_ALAW_AMI_MASK;
00134    exponent = (alawbyte & 0x70) >> 4;
00135    mantissa = alawbyte & 0x0f;
00136    sample = (mantissa << 4) + 8 /* rounding error */;
00137    if (exponent)
00138       sample = (sample + 0x100) << (exponent - 1);
00139    if (!(alawbyte & 0x80))
00140       sample = -sample;
00141    return sample;
00142 }

void ast_alaw_init ( void   ) 

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

Definition at line 154 of file alaw.c.

References alaw2linear(), AST_ALAW, AST_ALAW_STEP, AST_LIN2A, ast_log(), linear2alaw(), LOG_NOTICE, and LOG_WARNING.

Referenced by main().

00155 {
00156    int i;
00157    /*
00158     *  Set up mu-law conversion table
00159     */
00160 #ifndef G711_NEW_ALGORITHM
00161    for (i = 0; i < 256; i++) {
00162       __ast_alaw[i] = alaw2linear(i);
00163    }
00164    /* set up the reverse (mu-law) conversion table */
00165    for (i = -32768; i < 32768; i++) {
00166       __ast_lin2a[((unsigned short)i) >> 3] = linear2alaw(i);
00167    }
00168 #else
00169    for (i = 0; i < 256; i++) {
00170       __ast_alaw[i] = alaw2linear(i);
00171    }
00172    /* set up the reverse (a-law) conversion table */
00173    for (i = 0; i <= 32768; i += AST_ALAW_STEP) {
00174       AST_LIN2A_LOOKUP(i) = linear2alaw(i, 0 /* half-cooked */);
00175    }
00176 #endif
00177 
00178 #ifdef TEST_CODING_TABLES
00179    for (i = -32768; i < 32768; ++i) {
00180 #ifndef G711_NEW_ALGORITHM
00181       unsigned char e1 = linear2alaw(i);
00182 #else
00183       unsigned char e1 = linear2alaw(i, 1);
00184 #endif
00185       short d1 = alaw2linear(e1);
00186       unsigned char e2 = AST_LIN2A(i);
00187       short d2 = alaw2linear(e2);
00188       short d3 = AST_ALAW(e1);
00189 
00190       if (e1 != e2 || d1 != d3 || d2 != d3) {
00191          ast_log(LOG_WARNING, "a-Law coding tables test failed on %d: e1=%u, e2=%u, d1=%d, d2=%d\n",
00192                i, (unsigned)e1, (unsigned)e2, (int)d1, (int)d2);
00193       }
00194    }
00195    ast_log(LOG_NOTICE, "a-Law coding tables test complete.\n");
00196 #endif /* TEST_CODING_TABLES */
00197 
00198 #ifdef TEST_TANDEM_TRANSCODING
00199    /* tandem transcoding test */
00200    for (i = -32768; i < 32768; ++i) {
00201       unsigned char e1 = AST_LIN2A(i);
00202       short d1 = AST_ALAW(e1);
00203       unsigned char e2 = AST_LIN2A(d1);
00204       short d2 = AST_ALAW(e2);
00205       unsigned char e3 = AST_LIN2A(d2);
00206       short d3 = AST_ALAW(e3);
00207 
00208       if (e1 != e2 || e2 != e3 || d1 != d2 || d2 != d3) {
00209          ast_log(LOG_WARNING, "a-Law tandem transcoding test failed on %d: e1=%u, e2=%u, d1=%d, d2=%d, d3=%d\n",
00210                i, (unsigned)e1, (unsigned)e2, (int)d1, (int)d2, (int)d3);
00211       }
00212    }
00213    ast_log(LOG_NOTICE, "a-Law tandem transcoding test complete.\n");
00214 #endif /* TEST_TANDEM_TRANSCODING */
00215 
00216 }

static unsigned char linear2alaw ( short  sample,
int  full_coding 
) [static]

Definition at line 70 of file alaw.c.

References AST_ALAW_AMI_MASK.

Referenced by ast_alaw_init().

00071 {
00072    static const unsigned exp_lut[128] = {
00073       1,1,2,2,3,3,3,3,
00074       4,4,4,4,4,4,4,4,
00075       5,5,5,5,5,5,5,5,
00076       5,5,5,5,5,5,5,5,
00077       6,6,6,6,6,6,6,6,
00078       6,6,6,6,6,6,6,6,
00079       6,6,6,6,6,6,6,6,
00080       6,6,6,6,6,6,6,6,
00081       7,7,7,7,7,7,7,7,
00082       7,7,7,7,7,7,7,7,
00083       7,7,7,7,7,7,7,7,
00084       7,7,7,7,7,7,7,7,
00085       7,7,7,7,7,7,7,7,
00086       7,7,7,7,7,7,7,7,
00087       7,7,7,7,7,7,7,7,
00088       7,7,7,7,7,7,7,7 };
00089    unsigned sign, exponent, mantissa, mag;
00090    unsigned char alawbyte;
00091 
00092    ast_alaw_get_sign_mag(sample, &sign, &mag);
00093    if (mag > 32767)
00094       mag = 32767;        /* clip the magnitude for -32768 */
00095 
00096    exponent = exp_lut[(mag >> 8) & 0x7f];
00097    mantissa = (mag >> (exponent + 3)) & 0x0f;
00098    if (mag < 0x100)
00099       exponent = 0;
00100 
00101    if (full_coding) {
00102       /* full encoding, with sign and xform */
00103       alawbyte = (unsigned char)(sign | (exponent << 4) | mantissa);
00104       alawbyte ^= AST_ALAW_AMI_MASK;
00105    } else {
00106       /* half-cooked coding -- mantissa+exponent only (for lookup tab) */
00107       alawbyte = (exponent << 4) | mantissa;
00108    }
00109    return alawbyte;
00110 }


Variable Documentation

short __ast_alaw[256]

help

Definition at line 152 of file alaw.c.

unsigned char __ast_lin2a[AST_ALAW_TAB_SIZE]

converts signed linear to alaw

Definition at line 150 of file alaw.c.


Generated on 3 Apr 2014 for Asterisk - The Open Source Telephony Project by  doxygen 1.6.1