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  * All rights reserved.
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU Lesser General Public License version 2.1,
14  * as published by the Free Software Foundation.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public
22  * License along with this program; if not, write to the Free Software
23  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24  *
25  * Based in part on a single channel G.722 codec which is:
26  *
27  * Copyright (c) CMU 1993
28  * Computer Science, Speech Group
29  * Chengxiang Lu and Alex Hauptmann
30  *
31  * $Id: g722_decode.c,v 1.24 2008/07/02 14:48:25 steveu Exp $
32  */
33 
34 /*! \file */
35 
36 #if defined(HAVE_CONFIG_H)
37 #include <config.h>
38 #endif
39 
40 #include <inttypes.h>
41 #include <memory.h>
42 #include <stdlib.h>
43 #include "floating_fudge.h"
44 #if defined(HAVE_TGMATH_H)
45 #include <tgmath.h>
46 #endif
47 #if defined(HAVE_MATH_H)
48 #include <math.h>
49 #endif
50 
51 #include "spandsp/telephony.h"
52 #include "spandsp/dc_restore.h"
53 #include "spandsp/g722.h"
54 
55 static void block4(g722_decode_state_t *s, int band, int d);
56 
block4(g722_decode_state_t * s,int band,int d)57 static void block4(g722_decode_state_t *s, int band, int d)
58 {
59     int wd1;
60     int wd2;
61     int wd3;
62     int i;
63 
64     /* Block 4, RECONS */
65     s->band[band].d[0] = d;
66     s->band[band].r[0] = saturate(s->band[band].s + d);
67 
68     /* Block 4, PARREC */
69     s->band[band].p[0] = saturate(s->band[band].sz + d);
70 
71     /* Block 4, UPPOL2 */
72     for (i = 0;  i < 3;  i++)
73         s->band[band].sg[i] = s->band[band].p[i] >> 15;
74     wd1 = saturate(s->band[band].a[1] << 2);
75 
76     wd2 = (s->band[band].sg[0] == s->band[band].sg[1])  ?  -wd1  :  wd1;
77     if (wd2 > 32767)
78         wd2 = 32767;
79     wd3 = (s->band[band].sg[0] == s->band[band].sg[2])  ?  128  :  -128;
80     wd3 += (wd2 >> 7);
81     wd3 += (s->band[band].a[2]*32512) >> 15;
82     if (wd3 > 12288)
83         wd3 = 12288;
84     else if (wd3 < -12288)
85         wd3 = -12288;
86     s->band[band].ap[2] = wd3;
87 
88     /* Block 4, UPPOL1 */
89     s->band[band].sg[0] = s->band[band].p[0] >> 15;
90     s->band[band].sg[1] = s->band[band].p[1] >> 15;
91     wd1 = (s->band[band].sg[0] == s->band[band].sg[1])  ?  192  :  -192;
92     wd2 = (s->band[band].a[1]*32640) >> 15;
93 
94     s->band[band].ap[1] = saturate(wd1 + wd2);
95     wd3 = saturate(15360 - s->band[band].ap[2]);
96     if (s->band[band].ap[1] > wd3)
97         s->band[band].ap[1] = wd3;
98     else if (s->band[band].ap[1] < -wd3)
99         s->band[band].ap[1] = -wd3;
100 
101     /* Block 4, UPZERO */
102     wd1 = (d == 0)  ?  0  :  128;
103     s->band[band].sg[0] = d >> 15;
104     for (i = 1;  i < 7;  i++)
105     {
106         s->band[band].sg[i] = s->band[band].d[i] >> 15;
107         wd2 = (s->band[band].sg[i] == s->band[band].sg[0])  ?  wd1  :  -wd1;
108         wd3 = (s->band[band].b[i]*32640) >> 15;
109         s->band[band].bp[i] = saturate(wd2 + wd3);
110     }
111 
112     /* Block 4, DELAYA */
113     for (i = 6;  i > 0;  i--)
114     {
115         s->band[band].d[i] = s->band[band].d[i - 1];
116         s->band[band].b[i] = s->band[band].bp[i];
117     }
118 
119     for (i = 2;  i > 0;  i--)
120     {
121         s->band[band].r[i] = s->band[band].r[i - 1];
122         s->band[band].p[i] = s->band[band].p[i - 1];
123         s->band[band].a[i] = s->band[band].ap[i];
124     }
125 
126     /* Block 4, FILTEP */
127     wd1 = saturate(s->band[band].r[1] + s->band[band].r[1]);
128     wd1 = (s->band[band].a[1]*wd1) >> 15;
129     wd2 = saturate(s->band[band].r[2] + s->band[band].r[2]);
130     wd2 = (s->band[band].a[2]*wd2) >> 15;
131     s->band[band].sp = saturate(wd1 + wd2);
132 
133     /* Block 4, FILTEZ */
134     s->band[band].sz = 0;
135     for (i = 6;  i > 0;  i--)
136     {
137         wd1 = saturate(s->band[band].d[i] + s->band[band].d[i]);
138         s->band[band].sz += (s->band[band].b[i]*wd1) >> 15;
139     }
140     s->band[band].sz = saturate(s->band[band].sz);
141 
142     /* Block 4, PREDIC */
143     s->band[band].s = saturate(s->band[band].sp + s->band[band].sz);
144 }
145 /*- End of function --------------------------------------------------------*/
146 
g722_decode_init(g722_decode_state_t * s,int rate,int options)147 g722_decode_state_t *g722_decode_init(g722_decode_state_t *s, int rate, int options)
148 {
149     if (s == NULL)
150     {
151         if ((s = (g722_decode_state_t *) malloc(sizeof(*s))) == NULL)
152             return NULL;
153     }
154     memset(s, 0, sizeof(*s));
155     if (rate == 48000)
156         s->bits_per_sample = 6;
157     else if (rate == 56000)
158         s->bits_per_sample = 7;
159     else
160         s->bits_per_sample = 8;
161     if ((options & G722_SAMPLE_RATE_8000))
162         s->eight_k = TRUE;
163     if ((options & G722_PACKED)  &&  s->bits_per_sample != 8)
164         s->packed = TRUE;
165     else
166         s->packed = FALSE;
167     s->band[0].det = 32;
168     s->band[1].det = 8;
169     return s;
170 }
171 /*- End of function --------------------------------------------------------*/
172 
g722_decode_release(g722_decode_state_t * s)173 int g722_decode_release(g722_decode_state_t *s)
174 {
175     free(s);
176     return 0;
177 }
178 /*- End of function --------------------------------------------------------*/
179 
g722_decode(g722_decode_state_t * s,int16_t amp[],const uint8_t g722_data[],int len)180 int g722_decode(g722_decode_state_t *s, int16_t amp[], const uint8_t g722_data[], int len)
181 {
182     static const int wl[8] =
183     {
184         -60, -30, 58, 172, 334, 538, 1198, 3042
185     };
186     static const int rl42[16] =
187     {
188         0, 7, 6, 5, 4, 3, 2, 1, 7, 6, 5, 4, 3,  2, 1, 0
189     };
190     static const int ilb[32] =
191     {
192         2048, 2093, 2139, 2186, 2233, 2282, 2332,
193         2383, 2435, 2489, 2543, 2599, 2656, 2714,
194         2774, 2834, 2896, 2960, 3025, 3091, 3158,
195         3228, 3298, 3371, 3444, 3520, 3597, 3676,
196         3756, 3838, 3922, 4008
197     };
198     static const int wh[3] =
199     {
200         0, -214, 798
201     };
202     static const int rh2[4] =
203     {
204         2, 1, 2, 1
205     };
206     static const int qm2[4] =
207     {
208         -7408, -1616,  7408,   1616
209     };
210     static const int qm4[16] =
211     {
212               0, -20456, -12896,  -8968,
213           -6288,  -4240,  -2584,  -1200,
214           20456,  12896,   8968,   6288,
215            4240,   2584,   1200,      0
216     };
217     static const int qm5[32] =
218     {
219            -280,   -280, -23352, -17560,
220          -14120, -11664,  -9752,  -8184,
221           -6864,  -5712,  -4696,  -3784,
222           -2960,  -2208,  -1520,   -880,
223           23352,  17560,  14120,  11664,
224            9752,   8184,   6864,   5712,
225            4696,   3784,   2960,   2208,
226            1520,    880,    280,   -280
227     };
228     static const int qm6[64] =
229     {
230            -136,   -136,   -136,   -136,
231          -24808, -21904, -19008, -16704,
232          -14984, -13512, -12280, -11192,
233          -10232,  -9360,  -8576,  -7856,
234           -7192,  -6576,  -6000,  -5456,
235           -4944,  -4464,  -4008,  -3576,
236           -3168,  -2776,  -2400,  -2032,
237           -1688,  -1360,  -1040,   -728,
238           24808,  21904,  19008,  16704,
239           14984,  13512,  12280,  11192,
240           10232,   9360,   8576,   7856,
241            7192,   6576,   6000,   5456,
242            4944,   4464,   4008,   3576,
243            3168,   2776,   2400,   2032,
244            1688,   1360,   1040,    728,
245             432,    136,   -432,   -136
246     };
247     static const int qmf_coeffs[12] =
248     {
249            3,  -11,   12,   32, -210,  951, 3876, -805,  362, -156,   53,  -11,
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;
382             }
383             else
384             {
385                 /* Apply the receive QMF */
386                 memcpy(s->x, &s->x[2], 22*sizeof(s->x[0]));
387                 s->x[22] = rlow + rhigh;
388                 s->x[23] = rlow - rhigh;
389 
390                 xout1 = 0;
391                 xout2 = 0;
392                 for (i = 0;  i < 12;  i++)
393                 {
394                     xout2 += s->x[2*i]*qmf_coeffs[i];
395                     xout1 += s->x[2*i + 1]*qmf_coeffs[11 - i];
396                 }
397                 amp[outlen++] = (int16_t) (xout1 >> 12);
398                 amp[outlen++] = (int16_t) (xout2 >> 12);
399             }
400         }
401     }
402     return outlen;
403 }
404 /*- End of function --------------------------------------------------------*/
405 /*- End of file ------------------------------------------------------------*/
406