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