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