a-Law to Signed linear conversion More...
#include "asterisk.h"#include "asterisk/alaw.h"#include "asterisk/logger.h"
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 | |
a-Law to Signed linear conversion
Definition in file alaw.c.
| 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 }
| short __ast_alaw[256] |
| unsigned char __ast_lin2a[AST_ALAW_TAB_SIZE] |
1.6.1