#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 46 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 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.
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 }
unsigned char __ast_lin2mu[16384] |
short __ast_mulaw[256] |