Remove status_response callbacks where they are not needed.
[asterisk/asterisk.git] / main / ulaw.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 1999 - 2005, Digium, Inc.
5  *
6  * Mark Spencer <markster@digium.com>
7  *
8  * See http://www.asterisk.org for more information about
9  * the Asterisk project. Please do not directly contact
10  * any of the maintainers of this project for assistance;
11  * the project provides a web site, mailing lists and IRC
12  * channels for your use.
13  *
14  * This program is free software, distributed under the terms of
15  * the GNU General Public License Version 2. See the LICENSE file
16  * at the top of the source tree.
17  */
18
19 /*! \file
20  *
21  * \brief u-Law to Signed linear conversion
22  *
23  * \author Mark Spencer <markster@digium.com> 
24  */
25
26 #include "asterisk.h"
27
28 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
29
30 #include "asterisk/ulaw.h"
31 #include "asterisk/logger.h"
32
33 #if 0
34 /* ZEROTRAP is the military recommendation to improve the encryption
35  * of u-Law traffic. It is irrelevant with modern encryption systems
36  * like AES, and will simply degrade the signal quality.
37  * ZEROTRAP is not implemented in AST_LIN2MU and so the coding table
38  * tests will fail if you use it */
39 #define ZEROTRAP    /*!< turn on the trap as per the MIL-STD */
40 #endif
41
42 #define BIAS 0x84   /*!< define the add-in bias for 16 bit samples */
43 #define CLIP 32635
44
45 #ifndef G711_NEW_ALGORITHM
46
47 unsigned char __ast_lin2mu[16384];
48 short __ast_mulaw[256];
49
50 static unsigned char linear2ulaw(short sample)
51 {
52         static int exp_lut[256] = {
53                 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,
54                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
55                 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
56                 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
57                 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
58                 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
59                 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
60                 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
61                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
62                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
63                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
64                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
65                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
66                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
67                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
68                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 };
69         int sign, exponent, mantissa;
70         unsigned char ulawbyte;
71         
72         /* Get the sample into sign-magnitude. */
73         sign = (sample >> 8) & 0x80;          /* set aside the sign */
74         if (sign != 0)
75                 sample = -sample;              /* get magnitude */
76         if (sample > CLIP)
77                 sample = CLIP;             /* clip the magnitude */
78         
79         /* Convert from 16 bit linear to ulaw. */
80         sample = sample + BIAS;
81         exponent = exp_lut[(sample >> 7) & 0xFF];
82         mantissa = (sample >> (exponent + 3)) & 0x0F;
83         ulawbyte = ~(sign | (exponent << 4) | mantissa);
84         
85 #ifdef ZEROTRAP
86         if (ulawbyte == 0)
87                 ulawbyte = 0x02;   /* optional CCITT trap */
88 #endif
89         
90         return ulawbyte;
91 }
92
93 #else
94
95 unsigned char __ast_lin2mu[AST_ULAW_TAB_SIZE];
96 short __ast_mulaw[256];
97
98 static unsigned char linear2ulaw(short sample, int full_coding)
99 {
100         static const unsigned exp_lut[256] = {
101                 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,
102                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
103                 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
104                 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
105                 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
106                 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
107                 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
108                 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
109                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
110                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
111                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
112                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
113                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
114                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
115                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
116                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 };
117         unsigned sign, exponent, mantissa, mag;
118         unsigned char ulawbyte;
119         
120         /* Get the sample into sign-magnitude. */
121         ast_ulaw_get_sign_mag(sample, &sign, &mag);
122         if (mag > CLIP)
123                 mag = CLIP;                /* clip the magnitude */
124         
125         sign = (sample >> 8) & 0x80;          /* set aside the sign */
126         if (sign != 0) 
127                 sample = -sample;              /* get magnitude */
128         if (sample > CLIP)
129                 sample = CLIP;             /* clip the magnitude */
130         
131         /* Convert from 16 bit linear to ulaw. */
132         mag += BIAS;
133         exponent = exp_lut[(mag >> 7) & 0xFF];
134         mantissa = (mag >> (exponent + 3)) & 0x0F;
135         
136         if (full_coding) {
137                 /* full encoding, with sign and xform */
138                 ulawbyte = ~(sign | (exponent << 4) | mantissa);
139 #ifdef ZEROTRAP
140                 if (ulawbyte == 0)
141                         ulawbyte = 0x02;   /* optional CCITT trap */
142 #endif
143         } else {
144                 /* half-cooked coding -- mantissa+exponent only (for lookup tab) */
145                 ulawbyte = (exponent << 4) | mantissa;
146         }
147
148         return ulawbyte;
149 }
150         
151 static inline short ulaw2linear(unsigned char ulawbyte)
152 {
153         unsigned exponent, mantissa;
154         short sample;
155         static const short etab[]={0,132,396,924,1980,4092,8316,16764};
156         
157         ulawbyte = ~ulawbyte;
158         exponent = (ulawbyte & 0x70) >> 4;
159         mantissa = ulawbyte & 0x0f;
160         sample = mantissa << (exponent + 3);
161         sample += etab[exponent];
162         if (ulawbyte & 0x80)
163                 sample = -sample;
164         return sample;
165 }
166 #endif
167
168 /*!
169  * \brief  Set up mu-law conversion table
170  */
171 void ast_ulaw_init(void)
172 {
173         int i;
174         
175         /*
176          *  Set up mu-law conversion table
177          */
178 #ifndef G711_NEW_ALGORITHM
179         for (i = 0;i < 256;i++) {
180                 short mu,e,f,y;
181                 static const short etab[]={0,132,396,924,1980,4092,8316,16764};
182                 
183                 mu = 255-i;
184                 e = (mu & 0x70)/16;
185                 f = mu & 0x0f;
186                 y = f * (1 << (e + 3));
187                 y += etab[e];
188                 if (mu & 0x80) y = -y;
189                 __ast_mulaw[i] = y;
190         }
191         /* set up the reverse (mu-law) conversion table */
192         for (i = -32768; i < 32768; i++) {
193                 __ast_lin2mu[((unsigned short)i) >> 2] = linear2ulaw(i);
194         }
195 #else
196         
197         for (i = 0; i < 256; i++) {
198                 __ast_mulaw[i] = ulaw2linear(i);
199         }
200         /* set up the reverse (mu-law) conversion table */
201         for (i = 0; i <= 32768; i += AST_ULAW_STEP) {
202                 AST_LIN2MU_LOOKUP(i) = linear2ulaw(i, 0 /* half-cooked */);
203         }
204 #endif
205         
206 #ifdef TEST_CODING_TABLES
207         for (i = -32768; i < 32768; ++i) {
208 #ifndef G711_NEW_ALGORITHM
209                 unsigned char e1 = linear2ulaw(i);
210 #else
211                 unsigned char e1 = linear2ulaw(i, 1);
212 #endif
213                 short d1 = ulaw2linear(e1);
214                 unsigned char e2 = AST_LIN2MU(i);
215                 short d2 = ulaw2linear(e2);
216                 short d3 = AST_MULAW(e1);
217                 
218                 if (e1 != e2 || d1 != d3 || d2 != d3) {
219                         ast_log(LOG_WARNING, "u-Law coding tables test failed on %d: e1=%u, e2=%u, d1=%d, d2=%d\n",
220                                         i, (unsigned)e1, (unsigned)e2, (int)d1, (int)d2);
221                 }
222         }
223         ast_log(LOG_NOTICE, "u-Law coding table test complete.\n");
224 #endif /* TEST_CODING_TABLES */
225         
226 #ifdef TEST_TANDEM_TRANSCODING
227         /* tandem transcoding test */
228         for (i = -32768; i < 32768; ++i) {
229                 unsigned char e1 = AST_LIN2MU(i);
230                 short d1 = AST_MULAW(e1);
231                 unsigned char e2 = AST_LIN2MU(d1);
232                 short d2 = AST_MULAW(e2);
233                 unsigned char e3 = AST_LIN2MU(d2);
234                 short d3 = AST_MULAW(e3);
235                 
236                 if (i < 0 && e1 == 0x7f && e2 == 0xff && e3 == 0xff)
237                         continue; /* known and normal negative 0 case */
238                 
239                 if (e1 != e2 || e2 != e3 || d1 != d2 || d2 != d3) {
240                         ast_log(LOG_WARNING, "u-Law tandem transcoding test failed on %d: e1=%u, e2=%u, d1=%d, d2=%d, d3=%d\n",
241                                         i, (unsigned)e1, (unsigned)e2, (int)d1, (int)d2, (int)d3);
242                 }
243         }
244         ast_log(LOG_NOTICE, "u-Law tandem transcoding test complete.\n");
245 #endif /* TEST_TANDEM_TRANSCODING */
246 }
247