xref: /aosp_15_r20/external/webrtc/modules/third_party/g711/g711.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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