1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * SpanDSP - a series of DSP components for telephony
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker * g711.h - In line A-law and u-law conversion routines
5*d9f75844SAndroid Build Coastguard Worker *
6*d9f75844SAndroid Build Coastguard Worker * Written by Steve Underwood <[email protected]>
7*d9f75844SAndroid Build Coastguard Worker *
8*d9f75844SAndroid Build Coastguard Worker * Copyright (C) 2001 Steve Underwood
9*d9f75844SAndroid Build Coastguard Worker *
10*d9f75844SAndroid Build Coastguard Worker * Despite my general liking of the GPL, I place this code in the
11*d9f75844SAndroid Build Coastguard Worker * public domain for the benefit of all mankind - even the slimy
12*d9f75844SAndroid Build Coastguard Worker * ones who might try to proprietize my work and use it to my
13*d9f75844SAndroid Build Coastguard Worker * detriment.
14*d9f75844SAndroid Build Coastguard Worker *
15*d9f75844SAndroid Build Coastguard Worker * $Id: g711.h,v 1.1 2006/06/07 15:46:39 steveu Exp $
16*d9f75844SAndroid Build Coastguard Worker *
17*d9f75844SAndroid Build Coastguard Worker * Modifications for WebRtc, 2011/04/28, by tlegrand:
18*d9f75844SAndroid Build Coastguard Worker * -Changed to use WebRtc types
19*d9f75844SAndroid Build Coastguard Worker * -Changed __inline__ to __inline
20*d9f75844SAndroid Build Coastguard Worker * -Two changes to make implementation bitexact with ITU-T reference
21*d9f75844SAndroid Build Coastguard Worker * implementation
22*d9f75844SAndroid Build Coastguard Worker */
23*d9f75844SAndroid Build Coastguard Worker
24*d9f75844SAndroid Build Coastguard Worker /*! \page g711_page A-law and mu-law handling
25*d9f75844SAndroid Build Coastguard Worker Lookup tables for A-law and u-law look attractive, until you consider the impact
26*d9f75844SAndroid Build Coastguard Worker on the CPU cache. If it causes a substantial area of your processor cache to get
27*d9f75844SAndroid Build Coastguard Worker hit too often, cache sloshing will severely slow things down. The main reason
28*d9f75844SAndroid Build Coastguard Worker these routines are slow in C, is the lack of direct access to the CPU's "find
29*d9f75844SAndroid Build Coastguard Worker the first 1" instruction. A little in-line assembler fixes that, and the
30*d9f75844SAndroid Build Coastguard Worker conversion routines can be faster than lookup tables, in most real world usage.
31*d9f75844SAndroid Build Coastguard Worker A "find the first 1" instruction is available on most modern CPUs, and is a
32*d9f75844SAndroid Build Coastguard Worker much underused feature.
33*d9f75844SAndroid Build Coastguard Worker
34*d9f75844SAndroid Build Coastguard Worker If an assembly language method of bit searching is not available, these routines
35*d9f75844SAndroid Build Coastguard Worker revert to a method that can be a little slow, so the cache thrashing might not
36*d9f75844SAndroid Build Coastguard Worker seem so bad :(
37*d9f75844SAndroid Build Coastguard Worker
38*d9f75844SAndroid Build Coastguard Worker Feel free to submit patches to add fast "find the first 1" support for your own
39*d9f75844SAndroid Build Coastguard Worker favourite processor.
40*d9f75844SAndroid Build Coastguard Worker
41*d9f75844SAndroid Build Coastguard Worker Look up tables are used for transcoding between A-law and u-law, since it is
42*d9f75844SAndroid Build Coastguard Worker difficult to achieve the precise transcoding procedure laid down in the G.711
43*d9f75844SAndroid Build Coastguard Worker specification by other means.
44*d9f75844SAndroid Build Coastguard Worker */
45*d9f75844SAndroid Build Coastguard Worker
46*d9f75844SAndroid Build Coastguard Worker #ifndef MODULES_THIRD_PARTY_G711_G711_H_
47*d9f75844SAndroid Build Coastguard Worker #define MODULES_THIRD_PARTY_G711_G711_H_
48*d9f75844SAndroid Build Coastguard Worker
49*d9f75844SAndroid Build Coastguard Worker #ifdef __cplusplus
50*d9f75844SAndroid Build Coastguard Worker extern "C" {
51*d9f75844SAndroid Build Coastguard Worker #endif
52*d9f75844SAndroid Build Coastguard Worker
53*d9f75844SAndroid Build Coastguard Worker #include <stdint.h>
54*d9f75844SAndroid Build Coastguard Worker
55*d9f75844SAndroid Build Coastguard Worker #if defined(__i386__)
56*d9f75844SAndroid Build Coastguard Worker /*! \brief Find the bit position of the highest set bit in a word
57*d9f75844SAndroid Build Coastguard Worker \param bits The word to be searched
58*d9f75844SAndroid Build Coastguard Worker \return The bit number of the highest set bit, or -1 if the word is zero. */
top_bit(unsigned int bits)59*d9f75844SAndroid Build Coastguard Worker static __inline__ int top_bit(unsigned int bits) {
60*d9f75844SAndroid Build Coastguard Worker int res;
61*d9f75844SAndroid Build Coastguard Worker
62*d9f75844SAndroid Build Coastguard Worker __asm__ __volatile__(
63*d9f75844SAndroid Build Coastguard Worker " movl $-1,%%edx;\n"
64*d9f75844SAndroid Build Coastguard Worker " bsrl %%eax,%%edx;\n"
65*d9f75844SAndroid Build Coastguard Worker : "=d"(res)
66*d9f75844SAndroid Build Coastguard Worker : "a"(bits));
67*d9f75844SAndroid Build Coastguard Worker return res;
68*d9f75844SAndroid Build Coastguard Worker }
69*d9f75844SAndroid Build Coastguard Worker
70*d9f75844SAndroid Build Coastguard Worker /*! \brief Find the bit position of the lowest set bit in a word
71*d9f75844SAndroid Build Coastguard Worker \param bits The word to be searched
72*d9f75844SAndroid Build Coastguard Worker \return The bit number of the lowest set bit, or -1 if the word is zero. */
bottom_bit(unsigned int bits)73*d9f75844SAndroid Build Coastguard Worker static __inline__ int bottom_bit(unsigned int bits) {
74*d9f75844SAndroid Build Coastguard Worker int res;
75*d9f75844SAndroid Build Coastguard Worker
76*d9f75844SAndroid Build Coastguard Worker __asm__ __volatile__(
77*d9f75844SAndroid Build Coastguard Worker " movl $-1,%%edx;\n"
78*d9f75844SAndroid Build Coastguard Worker " bsfl %%eax,%%edx;\n"
79*d9f75844SAndroid Build Coastguard Worker : "=d"(res)
80*d9f75844SAndroid Build Coastguard Worker : "a"(bits));
81*d9f75844SAndroid Build Coastguard Worker return res;
82*d9f75844SAndroid Build Coastguard Worker }
83*d9f75844SAndroid Build Coastguard Worker #elif defined(__x86_64__)
84*d9f75844SAndroid Build Coastguard Worker static __inline__ int top_bit(unsigned int bits) {
85*d9f75844SAndroid Build Coastguard Worker int res;
86*d9f75844SAndroid Build Coastguard Worker
87*d9f75844SAndroid Build Coastguard Worker __asm__ __volatile__(
88*d9f75844SAndroid Build Coastguard Worker " movq $-1,%%rdx;\n"
89*d9f75844SAndroid Build Coastguard Worker " bsrq %%rax,%%rdx;\n"
90*d9f75844SAndroid Build Coastguard Worker : "=d"(res)
91*d9f75844SAndroid Build Coastguard Worker : "a"(bits));
92*d9f75844SAndroid Build Coastguard Worker return res;
93*d9f75844SAndroid Build Coastguard Worker }
94*d9f75844SAndroid Build Coastguard Worker
95*d9f75844SAndroid Build Coastguard Worker static __inline__ int bottom_bit(unsigned int bits) {
96*d9f75844SAndroid Build Coastguard Worker int res;
97*d9f75844SAndroid Build Coastguard Worker
98*d9f75844SAndroid Build Coastguard Worker __asm__ __volatile__(
99*d9f75844SAndroid Build Coastguard Worker " movq $-1,%%rdx;\n"
100*d9f75844SAndroid Build Coastguard Worker " bsfq %%rax,%%rdx;\n"
101*d9f75844SAndroid Build Coastguard Worker : "=d"(res)
102*d9f75844SAndroid Build Coastguard Worker : "a"(bits));
103*d9f75844SAndroid Build Coastguard Worker return res;
104*d9f75844SAndroid Build Coastguard Worker }
105*d9f75844SAndroid Build Coastguard Worker #else
106*d9f75844SAndroid Build Coastguard Worker static __inline int top_bit(unsigned int bits) {
107*d9f75844SAndroid Build Coastguard Worker int i;
108*d9f75844SAndroid Build Coastguard Worker
109*d9f75844SAndroid Build Coastguard Worker if (bits == 0) {
110*d9f75844SAndroid Build Coastguard Worker return -1;
111*d9f75844SAndroid Build Coastguard Worker }
112*d9f75844SAndroid Build Coastguard Worker i = 0;
113*d9f75844SAndroid Build Coastguard Worker if (bits & 0xFFFF0000) {
114*d9f75844SAndroid Build Coastguard Worker bits &= 0xFFFF0000;
115*d9f75844SAndroid Build Coastguard Worker i += 16;
116*d9f75844SAndroid Build Coastguard Worker }
117*d9f75844SAndroid Build Coastguard Worker if (bits & 0xFF00FF00) {
118*d9f75844SAndroid Build Coastguard Worker bits &= 0xFF00FF00;
119*d9f75844SAndroid Build Coastguard Worker i += 8;
120*d9f75844SAndroid Build Coastguard Worker }
121*d9f75844SAndroid Build Coastguard Worker if (bits & 0xF0F0F0F0) {
122*d9f75844SAndroid Build Coastguard Worker bits &= 0xF0F0F0F0;
123*d9f75844SAndroid Build Coastguard Worker i += 4;
124*d9f75844SAndroid Build Coastguard Worker }
125*d9f75844SAndroid Build Coastguard Worker if (bits & 0xCCCCCCCC) {
126*d9f75844SAndroid Build Coastguard Worker bits &= 0xCCCCCCCC;
127*d9f75844SAndroid Build Coastguard Worker i += 2;
128*d9f75844SAndroid Build Coastguard Worker }
129*d9f75844SAndroid Build Coastguard Worker if (bits & 0xAAAAAAAA) {
130*d9f75844SAndroid Build Coastguard Worker bits &= 0xAAAAAAAA;
131*d9f75844SAndroid Build Coastguard Worker i += 1;
132*d9f75844SAndroid Build Coastguard Worker }
133*d9f75844SAndroid Build Coastguard Worker return i;
134*d9f75844SAndroid Build Coastguard Worker }
135*d9f75844SAndroid Build Coastguard Worker
136*d9f75844SAndroid Build Coastguard Worker static __inline int bottom_bit(unsigned int bits) {
137*d9f75844SAndroid Build Coastguard Worker int i;
138*d9f75844SAndroid Build Coastguard Worker
139*d9f75844SAndroid Build Coastguard Worker if (bits == 0) {
140*d9f75844SAndroid Build Coastguard Worker return -1;
141*d9f75844SAndroid Build Coastguard Worker }
142*d9f75844SAndroid Build Coastguard Worker i = 32;
143*d9f75844SAndroid Build Coastguard Worker if (bits & 0x0000FFFF) {
144*d9f75844SAndroid Build Coastguard Worker bits &= 0x0000FFFF;
145*d9f75844SAndroid Build Coastguard Worker i -= 16;
146*d9f75844SAndroid Build Coastguard Worker }
147*d9f75844SAndroid Build Coastguard Worker if (bits & 0x00FF00FF) {
148*d9f75844SAndroid Build Coastguard Worker bits &= 0x00FF00FF;
149*d9f75844SAndroid Build Coastguard Worker i -= 8;
150*d9f75844SAndroid Build Coastguard Worker }
151*d9f75844SAndroid Build Coastguard Worker if (bits & 0x0F0F0F0F) {
152*d9f75844SAndroid Build Coastguard Worker bits &= 0x0F0F0F0F;
153*d9f75844SAndroid Build Coastguard Worker i -= 4;
154*d9f75844SAndroid Build Coastguard Worker }
155*d9f75844SAndroid Build Coastguard Worker if (bits & 0x33333333) {
156*d9f75844SAndroid Build Coastguard Worker bits &= 0x33333333;
157*d9f75844SAndroid Build Coastguard Worker i -= 2;
158*d9f75844SAndroid Build Coastguard Worker }
159*d9f75844SAndroid Build Coastguard Worker if (bits & 0x55555555) {
160*d9f75844SAndroid Build Coastguard Worker bits &= 0x55555555;
161*d9f75844SAndroid Build Coastguard Worker i -= 1;
162*d9f75844SAndroid Build Coastguard Worker }
163*d9f75844SAndroid Build Coastguard Worker return i;
164*d9f75844SAndroid Build Coastguard Worker }
165*d9f75844SAndroid Build Coastguard Worker #endif
166*d9f75844SAndroid Build Coastguard Worker
167*d9f75844SAndroid Build Coastguard Worker /* N.B. It is tempting to use look-up tables for A-law and u-law conversion.
168*d9f75844SAndroid Build Coastguard Worker * However, you should consider the cache footprint.
169*d9f75844SAndroid Build Coastguard Worker *
170*d9f75844SAndroid Build Coastguard Worker * A 64K byte table for linear to x-law and a 512 byte table for x-law to
171*d9f75844SAndroid Build Coastguard Worker * linear sound like peanuts these days, and shouldn't an array lookup be
172*d9f75844SAndroid Build Coastguard Worker * real fast? No! When the cache sloshes as badly as this one will, a tight
173*d9f75844SAndroid Build Coastguard Worker * calculation may be better. The messiest part is normally finding the
174*d9f75844SAndroid Build Coastguard Worker * segment, but a little inline assembly can fix that on an i386, x86_64
175*d9f75844SAndroid Build Coastguard Worker * and many other modern processors.
176*d9f75844SAndroid Build Coastguard Worker */
177*d9f75844SAndroid Build Coastguard Worker
178*d9f75844SAndroid Build Coastguard Worker /*
179*d9f75844SAndroid Build Coastguard Worker * Mu-law is basically as follows:
180*d9f75844SAndroid Build Coastguard Worker *
181*d9f75844SAndroid Build Coastguard Worker * Biased Linear Input Code Compressed Code
182*d9f75844SAndroid Build Coastguard Worker * ------------------------ ---------------
183*d9f75844SAndroid Build Coastguard Worker * 00000001wxyza 000wxyz
184*d9f75844SAndroid Build Coastguard Worker * 0000001wxyzab 001wxyz
185*d9f75844SAndroid Build Coastguard Worker * 000001wxyzabc 010wxyz
186*d9f75844SAndroid Build Coastguard Worker * 00001wxyzabcd 011wxyz
187*d9f75844SAndroid Build Coastguard Worker * 0001wxyzabcde 100wxyz
188*d9f75844SAndroid Build Coastguard Worker * 001wxyzabcdef 101wxyz
189*d9f75844SAndroid Build Coastguard Worker * 01wxyzabcdefg 110wxyz
190*d9f75844SAndroid Build Coastguard Worker * 1wxyzabcdefgh 111wxyz
191*d9f75844SAndroid Build Coastguard Worker *
192*d9f75844SAndroid Build Coastguard Worker * Each biased linear code has a leading 1 which identifies the segment
193*d9f75844SAndroid Build Coastguard Worker * number. The value of the segment number is equal to 7 minus the number
194*d9f75844SAndroid Build Coastguard Worker * of leading 0's. The quantization interval is directly available as the
195*d9f75844SAndroid Build Coastguard Worker * four bits wxyz. * The trailing bits (a - h) are ignored.
196*d9f75844SAndroid Build Coastguard Worker *
197*d9f75844SAndroid Build Coastguard Worker * Ordinarily the complement of the resulting code word is used for
198*d9f75844SAndroid Build Coastguard Worker * transmission, and so the code word is complemented before it is returned.
199*d9f75844SAndroid Build Coastguard Worker *
200*d9f75844SAndroid Build Coastguard Worker * For further information see John C. Bellamy's Digital Telephony, 1982,
201*d9f75844SAndroid Build Coastguard Worker * John Wiley & Sons, pps 98-111 and 472-476.
202*d9f75844SAndroid Build Coastguard Worker */
203*d9f75844SAndroid Build Coastguard Worker
204*d9f75844SAndroid Build Coastguard Worker //#define ULAW_ZEROTRAP /* turn on the trap as per the MIL-STD
205*d9f75844SAndroid Build Coastguard Worker //*/
206*d9f75844SAndroid Build Coastguard Worker #define ULAW_BIAS 0x84 /* Bias for linear code. */
207*d9f75844SAndroid Build Coastguard Worker
208*d9f75844SAndroid Build Coastguard Worker /*! \brief Encode a linear sample to u-law
209*d9f75844SAndroid Build Coastguard Worker \param linear The sample to encode.
210*d9f75844SAndroid Build Coastguard Worker \return The u-law value.
211*d9f75844SAndroid Build Coastguard Worker */
linear_to_ulaw(int linear)212*d9f75844SAndroid Build Coastguard Worker static __inline uint8_t linear_to_ulaw(int linear) {
213*d9f75844SAndroid Build Coastguard Worker uint8_t u_val;
214*d9f75844SAndroid Build Coastguard Worker int mask;
215*d9f75844SAndroid Build Coastguard Worker int seg;
216*d9f75844SAndroid Build Coastguard Worker
217*d9f75844SAndroid Build Coastguard Worker /* Get the sign and the magnitude of the value. */
218*d9f75844SAndroid Build Coastguard Worker if (linear < 0) {
219*d9f75844SAndroid Build Coastguard Worker /* WebRtc, tlegrand: -1 added to get bitexact to reference implementation */
220*d9f75844SAndroid Build Coastguard Worker linear = ULAW_BIAS - linear - 1;
221*d9f75844SAndroid Build Coastguard Worker mask = 0x7F;
222*d9f75844SAndroid Build Coastguard Worker } else {
223*d9f75844SAndroid Build Coastguard Worker linear = ULAW_BIAS + linear;
224*d9f75844SAndroid Build Coastguard Worker mask = 0xFF;
225*d9f75844SAndroid Build Coastguard Worker }
226*d9f75844SAndroid Build Coastguard Worker
227*d9f75844SAndroid Build Coastguard Worker seg = top_bit(linear | 0xFF) - 7;
228*d9f75844SAndroid Build Coastguard Worker
229*d9f75844SAndroid Build Coastguard Worker /*
230*d9f75844SAndroid Build Coastguard Worker * Combine the sign, segment, quantization bits,
231*d9f75844SAndroid Build Coastguard Worker * and complement the code word.
232*d9f75844SAndroid Build Coastguard Worker */
233*d9f75844SAndroid Build Coastguard Worker if (seg >= 8)
234*d9f75844SAndroid Build Coastguard Worker u_val = (uint8_t)(0x7F ^ mask);
235*d9f75844SAndroid Build Coastguard Worker else
236*d9f75844SAndroid Build Coastguard Worker u_val = (uint8_t)(((seg << 4) | ((linear >> (seg + 3)) & 0xF)) ^ mask);
237*d9f75844SAndroid Build Coastguard Worker #ifdef ULAW_ZEROTRAP
238*d9f75844SAndroid Build Coastguard Worker /* Optional ITU trap */
239*d9f75844SAndroid Build Coastguard Worker if (u_val == 0)
240*d9f75844SAndroid Build Coastguard Worker u_val = 0x02;
241*d9f75844SAndroid Build Coastguard Worker #endif
242*d9f75844SAndroid Build Coastguard Worker return u_val;
243*d9f75844SAndroid Build Coastguard Worker }
244*d9f75844SAndroid Build Coastguard Worker
245*d9f75844SAndroid Build Coastguard Worker /*! \brief Decode an u-law sample to a linear value.
246*d9f75844SAndroid Build Coastguard Worker \param ulaw The u-law sample to decode.
247*d9f75844SAndroid Build Coastguard Worker \return The linear value.
248*d9f75844SAndroid Build Coastguard Worker */
ulaw_to_linear(uint8_t ulaw)249*d9f75844SAndroid Build Coastguard Worker static __inline int16_t ulaw_to_linear(uint8_t ulaw) {
250*d9f75844SAndroid Build Coastguard Worker int t;
251*d9f75844SAndroid Build Coastguard Worker
252*d9f75844SAndroid Build Coastguard Worker /* Complement to obtain normal u-law value. */
253*d9f75844SAndroid Build Coastguard Worker ulaw = ~ulaw;
254*d9f75844SAndroid Build Coastguard Worker /*
255*d9f75844SAndroid Build Coastguard Worker * Extract and bias the quantization bits. Then
256*d9f75844SAndroid Build Coastguard Worker * shift up by the segment number and subtract out the bias.
257*d9f75844SAndroid Build Coastguard Worker */
258*d9f75844SAndroid Build Coastguard Worker t = (((ulaw & 0x0F) << 3) + ULAW_BIAS) << (((int)ulaw & 0x70) >> 4);
259*d9f75844SAndroid Build Coastguard Worker return (int16_t)((ulaw & 0x80) ? (ULAW_BIAS - t) : (t - ULAW_BIAS));
260*d9f75844SAndroid Build Coastguard Worker }
261*d9f75844SAndroid Build Coastguard Worker
262*d9f75844SAndroid Build Coastguard Worker /*
263*d9f75844SAndroid Build Coastguard Worker * A-law is basically as follows:
264*d9f75844SAndroid Build Coastguard Worker *
265*d9f75844SAndroid Build Coastguard Worker * Linear Input Code Compressed Code
266*d9f75844SAndroid Build Coastguard Worker * ----------------- ---------------
267*d9f75844SAndroid Build Coastguard Worker * 0000000wxyza 000wxyz
268*d9f75844SAndroid Build Coastguard Worker * 0000001wxyza 001wxyz
269*d9f75844SAndroid Build Coastguard Worker * 000001wxyzab 010wxyz
270*d9f75844SAndroid Build Coastguard Worker * 00001wxyzabc 011wxyz
271*d9f75844SAndroid Build Coastguard Worker * 0001wxyzabcd 100wxyz
272*d9f75844SAndroid Build Coastguard Worker * 001wxyzabcde 101wxyz
273*d9f75844SAndroid Build Coastguard Worker * 01wxyzabcdef 110wxyz
274*d9f75844SAndroid Build Coastguard Worker * 1wxyzabcdefg 111wxyz
275*d9f75844SAndroid Build Coastguard Worker *
276*d9f75844SAndroid Build Coastguard Worker * For further information see John C. Bellamy's Digital Telephony, 1982,
277*d9f75844SAndroid Build Coastguard Worker * John Wiley & Sons, pps 98-111 and 472-476.
278*d9f75844SAndroid Build Coastguard Worker */
279*d9f75844SAndroid Build Coastguard Worker
280*d9f75844SAndroid Build Coastguard Worker #define ALAW_AMI_MASK 0x55
281*d9f75844SAndroid Build Coastguard Worker
282*d9f75844SAndroid Build Coastguard Worker /*! \brief Encode a linear sample to A-law
283*d9f75844SAndroid Build Coastguard Worker \param linear The sample to encode.
284*d9f75844SAndroid Build Coastguard Worker \return The A-law value.
285*d9f75844SAndroid Build Coastguard Worker */
linear_to_alaw(int linear)286*d9f75844SAndroid Build Coastguard Worker static __inline uint8_t linear_to_alaw(int linear) {
287*d9f75844SAndroid Build Coastguard Worker int mask;
288*d9f75844SAndroid Build Coastguard Worker int seg;
289*d9f75844SAndroid Build Coastguard Worker
290*d9f75844SAndroid Build Coastguard Worker if (linear >= 0) {
291*d9f75844SAndroid Build Coastguard Worker /* Sign (bit 7) bit = 1 */
292*d9f75844SAndroid Build Coastguard Worker mask = ALAW_AMI_MASK | 0x80;
293*d9f75844SAndroid Build Coastguard Worker } else {
294*d9f75844SAndroid Build Coastguard Worker /* Sign (bit 7) bit = 0 */
295*d9f75844SAndroid Build Coastguard Worker mask = ALAW_AMI_MASK;
296*d9f75844SAndroid Build Coastguard Worker /* WebRtc, tlegrand: Changed from -8 to -1 to get bitexact to reference
297*d9f75844SAndroid Build Coastguard Worker * implementation */
298*d9f75844SAndroid Build Coastguard Worker linear = -linear - 1;
299*d9f75844SAndroid Build Coastguard Worker }
300*d9f75844SAndroid Build Coastguard Worker
301*d9f75844SAndroid Build Coastguard Worker /* Convert the scaled magnitude to segment number. */
302*d9f75844SAndroid Build Coastguard Worker seg = top_bit(linear | 0xFF) - 7;
303*d9f75844SAndroid Build Coastguard Worker if (seg >= 8) {
304*d9f75844SAndroid Build Coastguard Worker if (linear >= 0) {
305*d9f75844SAndroid Build Coastguard Worker /* Out of range. Return maximum value. */
306*d9f75844SAndroid Build Coastguard Worker return (uint8_t)(0x7F ^ mask);
307*d9f75844SAndroid Build Coastguard Worker }
308*d9f75844SAndroid Build Coastguard Worker /* We must be just a tiny step below zero */
309*d9f75844SAndroid Build Coastguard Worker return (uint8_t)(0x00 ^ mask);
310*d9f75844SAndroid Build Coastguard Worker }
311*d9f75844SAndroid Build Coastguard Worker /* Combine the sign, segment, and quantization bits. */
312*d9f75844SAndroid Build Coastguard Worker return (uint8_t)(((seg << 4) | ((linear >> ((seg) ? (seg + 3) : 4)) & 0x0F)) ^
313*d9f75844SAndroid Build Coastguard Worker mask);
314*d9f75844SAndroid Build Coastguard Worker }
315*d9f75844SAndroid Build Coastguard Worker
316*d9f75844SAndroid Build Coastguard Worker /*! \brief Decode an A-law sample to a linear value.
317*d9f75844SAndroid Build Coastguard Worker \param alaw The A-law sample to decode.
318*d9f75844SAndroid Build Coastguard Worker \return The linear value.
319*d9f75844SAndroid Build Coastguard Worker */
alaw_to_linear(uint8_t alaw)320*d9f75844SAndroid Build Coastguard Worker static __inline int16_t alaw_to_linear(uint8_t alaw) {
321*d9f75844SAndroid Build Coastguard Worker int i;
322*d9f75844SAndroid Build Coastguard Worker int seg;
323*d9f75844SAndroid Build Coastguard Worker
324*d9f75844SAndroid Build Coastguard Worker alaw ^= ALAW_AMI_MASK;
325*d9f75844SAndroid Build Coastguard Worker i = ((alaw & 0x0F) << 4);
326*d9f75844SAndroid Build Coastguard Worker seg = (((int)alaw & 0x70) >> 4);
327*d9f75844SAndroid Build Coastguard Worker if (seg)
328*d9f75844SAndroid Build Coastguard Worker i = (i + 0x108) << (seg - 1);
329*d9f75844SAndroid Build Coastguard Worker else
330*d9f75844SAndroid Build Coastguard Worker i += 8;
331*d9f75844SAndroid Build Coastguard Worker return (int16_t)((alaw & 0x80) ? i : -i);
332*d9f75844SAndroid Build Coastguard Worker }
333*d9f75844SAndroid Build Coastguard Worker
334*d9f75844SAndroid Build Coastguard Worker /*! \brief Transcode from A-law to u-law, using the procedure defined in G.711.
335*d9f75844SAndroid Build Coastguard Worker \param alaw The A-law sample to transcode.
336*d9f75844SAndroid Build Coastguard Worker \return The best matching u-law value.
337*d9f75844SAndroid Build Coastguard Worker */
338*d9f75844SAndroid Build Coastguard Worker uint8_t alaw_to_ulaw(uint8_t alaw);
339*d9f75844SAndroid Build Coastguard Worker
340*d9f75844SAndroid Build Coastguard Worker /*! \brief Transcode from u-law to A-law, using the procedure defined in G.711.
341*d9f75844SAndroid Build Coastguard Worker \param alaw The u-law sample to transcode.
342*d9f75844SAndroid Build Coastguard Worker \return The best matching A-law value.
343*d9f75844SAndroid Build Coastguard Worker */
344*d9f75844SAndroid Build Coastguard Worker uint8_t ulaw_to_alaw(uint8_t ulaw);
345*d9f75844SAndroid Build Coastguard Worker
346*d9f75844SAndroid Build Coastguard Worker #ifdef __cplusplus
347*d9f75844SAndroid Build Coastguard Worker }
348*d9f75844SAndroid Build Coastguard Worker #endif
349*d9f75844SAndroid Build Coastguard Worker
350*d9f75844SAndroid Build Coastguard Worker #endif /* MODULES_THIRD_PARTY_G711_G711_H_ */
351