• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * SpanDSP - a series of DSP components for telephony
3  *
4  * g722_decode.c - The ITU G.722 codec, decode part.
5  *
6  * Written by Steve Underwood <steveu@coppice.org>
7  *
8  * Copyright (C) 2005 Steve Underwood
9  *
10  *  Despite my general liking of the GPL, I place my own contributions
11  *  to this code in the public domain for the benefit of all mankind -
12  *  even the slimy ones who might try to proprietize my work and use it
13  *  to my detriment.
14  *
15  * Based in part on a single channel G.722 codec which is:
16  *
17  * Copyright (c) CMU 1993
18  * Computer Science, Speech Group
19  * Chengxiang Lu and Alex Hauptmann
20  *
21  * $Id: g722_decode.c,v 1.15 2006/07/07 16:37:49 steveu Exp $
22  *
23  * Modifications for WebRtc, 2011/04/28, by tlegrand:
24  * -Removed usage of inttypes.h and tgmath.h
25  * -Changed to use WebRtc types
26  * -Changed __inline__ to __inline
27  * -Added saturation check on output
28  */
29 
30 /*! \file */
31 
32 
33 #ifdef HAVE_CONFIG_H
34 #include <config.h>
35 #endif
36 
37 #include <memory.h>
38 #include <stdio.h>
39 #include <stdlib.h>
40 
41 #include "g722_enc_dec.h"
42 #include "webrtc/typedefs.h"
43 
44 #if !defined(FALSE)
45 #define FALSE 0
46 #endif
47 #if !defined(TRUE)
48 #define TRUE (!FALSE)
49 #endif
50 
saturate(int32_t amp)51 static __inline int16_t saturate(int32_t amp)
52 {
53     int16_t amp16;
54 
55     /* Hopefully this is optimised for the common case - not clipping */
56     amp16 = (int16_t) amp;
57     if (amp == amp16)
58         return amp16;
59     if (amp > WEBRTC_INT16_MAX)
60         return  WEBRTC_INT16_MAX;
61     return  WEBRTC_INT16_MIN;
62 }
63 /*- End of function --------------------------------------------------------*/
64 
65 static void block4(g722_decode_state_t *s, int band, int d);
66 
block4(g722_decode_state_t * s,int band,int d)67 static void block4(g722_decode_state_t *s, int band, int d)
68 {
69     int wd1;
70     int wd2;
71     int wd3;
72     int i;
73 
74     /* Block 4, RECONS */
75     s->band[band].d[0] = d;
76     s->band[band].r[0] = saturate(s->band[band].s + d);
77 
78     /* Block 4, PARREC */
79     s->band[band].p[0] = saturate(s->band[band].sz + d);
80 
81     /* Block 4, UPPOL2 */
82     for (i = 0;  i < 3;  i++)
83         s->band[band].sg[i] = s->band[band].p[i] >> 15;
84     wd1 = saturate(s->band[band].a[1] << 2);
85 
86     wd2 = (s->band[band].sg[0] == s->band[band].sg[1])  ?  -wd1  :  wd1;
87     if (wd2 > 32767)
88         wd2 = 32767;
89     wd3 = (s->band[band].sg[0] == s->band[band].sg[2])  ?  128  :  -128;
90     wd3 += (wd2 >> 7);
91     wd3 += (s->band[band].a[2]*32512) >> 15;
92     if (wd3 > 12288)
93         wd3 = 12288;
94     else if (wd3 < -12288)
95         wd3 = -12288;
96     s->band[band].ap[2] = wd3;
97 
98     /* Block 4, UPPOL1 */
99     s->band[band].sg[0] = s->band[band].p[0] >> 15;
100     s->band[band].sg[1] = s->band[band].p[1] >> 15;
101     wd1 = (s->band[band].sg[0] == s->band[band].sg[1])  ?  192  :  -192;
102     wd2 = (s->band[band].a[1]*32640) >> 15;
103 
104     s->band[band].ap[1] = saturate(wd1 + wd2);
105     wd3 = saturate(15360 - s->band[band].ap[2]);
106     if (s->band[band].ap[1] > wd3)
107         s->band[band].ap[1] = wd3;
108     else if (s->band[band].ap[1] < -wd3)
109         s->band[band].ap[1] = -wd3;
110 
111     /* Block 4, UPZERO */
112     wd1 = (d == 0)  ?  0  :  128;
113     s->band[band].sg[0] = d >> 15;
114     for (i = 1;  i < 7;  i++)
115     {
116         s->band[band].sg[i] = s->band[band].d[i] >> 15;
117         wd2 = (s->band[band].sg[i] == s->band[band].sg[0])  ?  wd1  :  -wd1;
118         wd3 = (s->band[band].b[i]*32640) >> 15;
119         s->band[band].bp[i] = saturate(wd2 + wd3);
120     }
121 
122     /* Block 4, DELAYA */
123     for (i = 6;  i > 0;  i--)
124     {
125         s->band[band].d[i] = s->band[band].d[i - 1];
126         s->band[band].b[i] = s->band[band].bp[i];
127     }
128 
129     for (i = 2;  i > 0;  i--)
130     {
131         s->band[band].r[i] = s->band[band].r[i - 1];
132         s->band[band].p[i] = s->band[band].p[i - 1];
133         s->band[band].a[i] = s->band[band].ap[i];
134     }
135 
136     /* Block 4, FILTEP */
137     wd1 = saturate(s->band[band].r[1] + s->band[band].r[1]);
138     wd1 = (s->band[band].a[1]*wd1) >> 15;
139     wd2 = saturate(s->band[band].r[2] + s->band[band].r[2]);
140     wd2 = (s->band[band].a[2]*wd2) >> 15;
141     s->band[band].sp = saturate(wd1 + wd2);
142 
143     /* Block 4, FILTEZ */
144     s->band[band].sz = 0;
145     for (i = 6;  i > 0;  i--)
146     {
147         wd1 = saturate(s->band[band].d[i] + s->band[band].d[i]);
148         s->band[band].sz += (s->band[band].b[i]*wd1) >> 15;
149     }
150     s->band[band].sz = saturate(s->band[band].sz);
151 
152     /* Block 4, PREDIC */
153     s->band[band].s = saturate(s->band[band].sp + s->band[band].sz);
154 }
155 /*- End of function --------------------------------------------------------*/
156 
WebRtc_g722_decode_init(g722_decode_state_t * s,int rate,int options)157 g722_decode_state_t *WebRtc_g722_decode_init(g722_decode_state_t *s,
158                                              int rate,
159                                              int options)
160 {
161     if (s == NULL)
162     {
163         if ((s = (g722_decode_state_t *) malloc(sizeof(*s))) == NULL)
164             return NULL;
165     }
166     memset(s, 0, sizeof(*s));
167     if (rate == 48000)
168         s->bits_per_sample = 6;
169     else if (rate == 56000)
170         s->bits_per_sample = 7;
171     else
172         s->bits_per_sample = 8;
173     if ((options & G722_SAMPLE_RATE_8000))
174         s->eight_k = TRUE;
175     if ((options & G722_PACKED)  &&  s->bits_per_sample != 8)
176         s->packed = TRUE;
177     else
178         s->packed = FALSE;
179     s->band[0].det = 32;
180     s->band[1].det = 8;
181     return s;
182 }
183 /*- End of function --------------------------------------------------------*/
184 
WebRtc_g722_decode_release(g722_decode_state_t * s)185 int WebRtc_g722_decode_release(g722_decode_state_t *s)
186 {
187     free(s);
188     return 0;
189 }
190 /*- End of function --------------------------------------------------------*/
191 
WebRtc_g722_decode(g722_decode_state_t * s,int16_t amp[],const uint8_t g722_data[],int len)192 int WebRtc_g722_decode(g722_decode_state_t *s, int16_t amp[],
193                        const uint8_t g722_data[], int len)
194 {
195     static const int wl[8] = {-60, -30, 58, 172, 334, 538, 1198, 3042 };
196     static const int rl42[16] = {0, 7, 6, 5, 4, 3, 2, 1,
197                                  7, 6, 5, 4, 3,  2, 1, 0 };
198     static const int ilb[32] =
199     {
200         2048, 2093, 2139, 2186, 2233, 2282, 2332,
201         2383, 2435, 2489, 2543, 2599, 2656, 2714,
202         2774, 2834, 2896, 2960, 3025, 3091, 3158,
203         3228, 3298, 3371, 3444, 3520, 3597, 3676,
204         3756, 3838, 3922, 4008
205     };
206     static const int wh[3] = {0, -214, 798};
207     static const int rh2[4] = {2, 1, 2, 1};
208     static const int qm2[4] = {-7408, -1616,  7408,   1616};
209     static const int qm4[16] =
210     {
211               0, -20456, -12896,  -8968,
212           -6288,  -4240,  -2584,  -1200,
213           20456,  12896,   8968,   6288,
214            4240,   2584,   1200,      0
215     };
216     static const int qm5[32] =
217     {
218            -280,   -280, -23352, -17560,
219          -14120, -11664,  -9752,  -8184,
220           -6864,  -5712,  -4696,  -3784,
221           -2960,  -2208,  -1520,   -880,
222           23352,  17560,  14120,  11664,
223            9752,   8184,   6864,   5712,
224            4696,   3784,   2960,   2208,
225            1520,    880,    280,   -280
226     };
227     static const int qm6[64] =
228     {
229            -136,   -136,   -136,   -136,
230          -24808, -21904, -19008, -16704,
231          -14984, -13512, -12280, -11192,
232          -10232,  -9360,  -8576,  -7856,
233           -7192,  -6576,  -6000,  -5456,
234           -4944,  -4464,  -4008,  -3576,
235           -3168,  -2776,  -2400,  -2032,
236           -1688,  -1360,  -1040,   -728,
237           24808,  21904,  19008,  16704,
238           14984,  13512,  12280,  11192,
239           10232,   9360,   8576,   7856,
240            7192,   6576,   6000,   5456,
241            4944,   4464,   4008,   3576,
242            3168,   2776,   2400,   2032,
243            1688,   1360,   1040,    728,
244             432,    136,   -432,   -136
245     };
246     static const int qmf_coeffs[12] =
247     {
248            3,  -11,   12,   32, -210,  951, 3876, -805,  362, -156,   53,  -11,
249     };
250 
251     int dlowt;
252     int rlow;
253     int ihigh;
254     int dhigh;
255     int rhigh;
256     int xout1;
257     int xout2;
258     int wd1;
259     int wd2;
260     int wd3;
261     int code;
262     int outlen;
263     int i;
264     int j;
265 
266     outlen = 0;
267     rhigh = 0;
268     for (j = 0;  j < len;  )
269     {
270         if (s->packed)
271         {
272             /* Unpack the code bits */
273             if (s->in_bits < s->bits_per_sample)
274             {
275                 s->in_buffer |= (g722_data[j++] << s->in_bits);
276                 s->in_bits += 8;
277             }
278             code = s->in_buffer & ((1 << s->bits_per_sample) - 1);
279             s->in_buffer >>= s->bits_per_sample;
280             s->in_bits -= s->bits_per_sample;
281         }
282         else
283         {
284             code = g722_data[j++];
285         }
286 
287         switch (s->bits_per_sample)
288         {
289         default:
290         case 8:
291             wd1 = code & 0x3F;
292             ihigh = (code >> 6) & 0x03;
293             wd2 = qm6[wd1];
294             wd1 >>= 2;
295             break;
296         case 7:
297             wd1 = code & 0x1F;
298             ihigh = (code >> 5) & 0x03;
299             wd2 = qm5[wd1];
300             wd1 >>= 1;
301             break;
302         case 6:
303             wd1 = code & 0x0F;
304             ihigh = (code >> 4) & 0x03;
305             wd2 = qm4[wd1];
306             break;
307         }
308         /* Block 5L, LOW BAND INVQBL */
309         wd2 = (s->band[0].det*wd2) >> 15;
310         /* Block 5L, RECONS */
311         rlow = s->band[0].s + wd2;
312         /* Block 6L, LIMIT */
313         if (rlow > 16383)
314             rlow = 16383;
315         else if (rlow < -16384)
316             rlow = -16384;
317 
318         /* Block 2L, INVQAL */
319         wd2 = qm4[wd1];
320         dlowt = (s->band[0].det*wd2) >> 15;
321 
322         /* Block 3L, LOGSCL */
323         wd2 = rl42[wd1];
324         wd1 = (s->band[0].nb*127) >> 7;
325         wd1 += wl[wd2];
326         if (wd1 < 0)
327             wd1 = 0;
328         else if (wd1 > 18432)
329             wd1 = 18432;
330         s->band[0].nb = wd1;
331 
332         /* Block 3L, SCALEL */
333         wd1 = (s->band[0].nb >> 6) & 31;
334         wd2 = 8 - (s->band[0].nb >> 11);
335         wd3 = (wd2 < 0)  ?  (ilb[wd1] << -wd2)  :  (ilb[wd1] >> wd2);
336         s->band[0].det = wd3 << 2;
337 
338         block4(s, 0, dlowt);
339 
340         if (!s->eight_k)
341         {
342             /* Block 2H, INVQAH */
343             wd2 = qm2[ihigh];
344             dhigh = (s->band[1].det*wd2) >> 15;
345             /* Block 5H, RECONS */
346             rhigh = dhigh + s->band[1].s;
347             /* Block 6H, LIMIT */
348             if (rhigh > 16383)
349                 rhigh = 16383;
350             else if (rhigh < -16384)
351                 rhigh = -16384;
352 
353             /* Block 2H, INVQAH */
354             wd2 = rh2[ihigh];
355             wd1 = (s->band[1].nb*127) >> 7;
356             wd1 += wh[wd2];
357             if (wd1 < 0)
358                 wd1 = 0;
359             else if (wd1 > 22528)
360                 wd1 = 22528;
361             s->band[1].nb = wd1;
362 
363             /* Block 3H, SCALEH */
364             wd1 = (s->band[1].nb >> 6) & 31;
365             wd2 = 10 - (s->band[1].nb >> 11);
366             wd3 = (wd2 < 0)  ?  (ilb[wd1] << -wd2)  :  (ilb[wd1] >> wd2);
367             s->band[1].det = wd3 << 2;
368 
369             block4(s, 1, dhigh);
370         }
371 
372         if (s->itu_test_mode)
373         {
374             amp[outlen++] = (int16_t) (rlow << 1);
375             amp[outlen++] = (int16_t) (rhigh << 1);
376         }
377         else
378         {
379             if (s->eight_k)
380             {
381                 amp[outlen++] = (int16_t) (rlow << 1);
382             }
383             else
384             {
385                 /* Apply the receive QMF */
386                 for (i = 0;  i < 22;  i++)
387                     s->x[i] = s->x[i + 2];
388                 s->x[22] = rlow + rhigh;
389                 s->x[23] = rlow - rhigh;
390 
391                 xout1 = 0;
392                 xout2 = 0;
393                 for (i = 0;  i < 12;  i++)
394                 {
395                     xout2 += s->x[2*i]*qmf_coeffs[i];
396                     xout1 += s->x[2*i + 1]*qmf_coeffs[11 - i];
397                 }
398                 /* We shift by 12 to allow for the QMF filters (DC gain = 4096), less 1
399                    to allow for the 15 bit input to the G.722 algorithm. */
400                 /* WebRtc, tlegrand: added saturation */
401                 amp[outlen++] = saturate(xout1 >> 11);
402                 amp[outlen++] = saturate(xout2 >> 11);
403             }
404         }
405     }
406     return outlen;
407 }
408 /*- End of function --------------------------------------------------------*/
409 /*- End of file ------------------------------------------------------------*/
410