#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] |
Definition in file ulaw.c.
#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 |
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.
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 }
unsigned char __ast_lin2mu[16384] |
short __ast_mulaw[256] |