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, int full_coding) |
| static short | ulaw2linear (unsigned char ulawbyte) |
Variables | |
| unsigned char | __ast_lin2mu [AST_ULAW_TAB_SIZE] |
| converts signed linear to mulaw | |
| short | __ast_mulaw [256] |
u-Law to Signed linear conversion
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 |
Definition at line 47 of file ulaw.c.
Referenced by linear2ulaw().
| 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_LIN2MU_LOOKUP, ast_log(), AST_MULAW, AST_ULAW_STEP, f, linear2ulaw(), LOG_NOTICE, LOG_WARNING, and ulaw2linear().
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, | |
| int | full_coding | |||
| ) | [static] |
Definition at line 102 of file ulaw.c.
References ast_ulaw_get_sign_mag(), BIAS, and CLIP.
Referenced by ast_ulaw_init().
00103 { 00104 static const unsigned exp_lut[256] = { 00105 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3, 00106 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, 00107 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 00108 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 00109 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 00110 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 00111 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 00112 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 00113 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 00114 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 00115 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 00116 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 00117 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 00118 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 00119 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 00120 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 }; 00121 unsigned sign, exponent, mantissa, mag; 00122 unsigned char ulawbyte; 00123 00124 /* Get the sample into sign-magnitude. */ 00125 ast_ulaw_get_sign_mag(sample, &sign, &mag); 00126 if (mag > CLIP) 00127 mag = CLIP; /* clip the magnitude */ 00128 00129 sign = (sample >> 8) & 0x80; /* set aside the sign */ 00130 if (sign != 0) 00131 sample = -sample; /* get magnitude */ 00132 if (sample > CLIP) 00133 sample = CLIP; /* clip the magnitude */ 00134 00135 /* Convert from 16 bit linear to ulaw. */ 00136 mag += BIAS; 00137 exponent = exp_lut[(mag >> 7) & 0xFF]; 00138 mantissa = (mag >> (exponent + 3)) & 0x0F; 00139 00140 if (full_coding) { 00141 /* full encoding, with sign and xform */ 00142 ulawbyte = ~(sign | (exponent << 4) | mantissa); 00143 #ifdef ZEROTRAP 00144 if (ulawbyte == 0) 00145 ulawbyte = 0x02; /* optional CCITT trap */ 00146 #endif 00147 } else { 00148 /* half-cooked coding -- mantissa+exponent only (for lookup tab) */ 00149 ulawbyte = (exponent << 4) | mantissa; 00150 } 00151 00152 return ulawbyte; 00153 }
| static short ulaw2linear | ( | unsigned char | ulawbyte | ) | [inline, static] |
Definition at line 155 of file ulaw.c.
Referenced by ast_ulaw_init().
00156 { 00157 unsigned exponent, mantissa; 00158 short sample; 00159 static const short etab[]={0,132,396,924,1980,4092,8316,16764}; 00160 00161 ulawbyte = ~ulawbyte; 00162 exponent = (ulawbyte & 0x70) >> 4; 00163 mantissa = ulawbyte & 0x0f; 00164 sample = mantissa << (exponent + 3); 00165 sample += etab[exponent]; 00166 if (ulawbyte & 0x80) 00167 sample = -sample; 00168 return sample; 00169 }
| unsigned char __ast_lin2mu[AST_ULAW_TAB_SIZE] |
| short __ast_mulaw[256] |
1.6.1