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(G722DecoderState *s, int band, int d);
66
block4(G722DecoderState * s,int band,int d)67 static void block4(G722DecoderState *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(G722DecoderState * s,int rate,int options)157 G722DecoderState* WebRtc_g722_decode_init(G722DecoderState* s,
158 int rate,
159 int options) {
160 s = s ? s : malloc(sizeof(*s));
161 memset(s, 0, sizeof(*s));
162 if (rate == 48000)
163 s->bits_per_sample = 6;
164 else if (rate == 56000)
165 s->bits_per_sample = 7;
166 else
167 s->bits_per_sample = 8;
168 if ((options & G722_SAMPLE_RATE_8000))
169 s->eight_k = TRUE;
170 if ((options & G722_PACKED) && s->bits_per_sample != 8)
171 s->packed = TRUE;
172 else
173 s->packed = FALSE;
174 s->band[0].det = 32;
175 s->band[1].det = 8;
176 return s;
177 }
178 /*- End of function --------------------------------------------------------*/
179
WebRtc_g722_decode_release(G722DecoderState * s)180 int WebRtc_g722_decode_release(G722DecoderState *s)
181 {
182 free(s);
183 return 0;
184 }
185 /*- End of function --------------------------------------------------------*/
186
WebRtc_g722_decode(G722DecoderState * s,int16_t amp[],const uint8_t g722_data[],size_t len)187 size_t WebRtc_g722_decode(G722DecoderState *s, int16_t amp[],
188 const uint8_t g722_data[], size_t len)
189 {
190 static const int wl[8] = {-60, -30, 58, 172, 334, 538, 1198, 3042 };
191 static const int rl42[16] = {0, 7, 6, 5, 4, 3, 2, 1,
192 7, 6, 5, 4, 3, 2, 1, 0 };
193 static const int ilb[32] =
194 {
195 2048, 2093, 2139, 2186, 2233, 2282, 2332,
196 2383, 2435, 2489, 2543, 2599, 2656, 2714,
197 2774, 2834, 2896, 2960, 3025, 3091, 3158,
198 3228, 3298, 3371, 3444, 3520, 3597, 3676,
199 3756, 3838, 3922, 4008
200 };
201 static const int wh[3] = {0, -214, 798};
202 static const int rh2[4] = {2, 1, 2, 1};
203 static const int qm2[4] = {-7408, -1616, 7408, 1616};
204 static const int qm4[16] =
205 {
206 0, -20456, -12896, -8968,
207 -6288, -4240, -2584, -1200,
208 20456, 12896, 8968, 6288,
209 4240, 2584, 1200, 0
210 };
211 static const int qm5[32] =
212 {
213 -280, -280, -23352, -17560,
214 -14120, -11664, -9752, -8184,
215 -6864, -5712, -4696, -3784,
216 -2960, -2208, -1520, -880,
217 23352, 17560, 14120, 11664,
218 9752, 8184, 6864, 5712,
219 4696, 3784, 2960, 2208,
220 1520, 880, 280, -280
221 };
222 static const int qm6[64] =
223 {
224 -136, -136, -136, -136,
225 -24808, -21904, -19008, -16704,
226 -14984, -13512, -12280, -11192,
227 -10232, -9360, -8576, -7856,
228 -7192, -6576, -6000, -5456,
229 -4944, -4464, -4008, -3576,
230 -3168, -2776, -2400, -2032,
231 -1688, -1360, -1040, -728,
232 24808, 21904, 19008, 16704,
233 14984, 13512, 12280, 11192,
234 10232, 9360, 8576, 7856,
235 7192, 6576, 6000, 5456,
236 4944, 4464, 4008, 3576,
237 3168, 2776, 2400, 2032,
238 1688, 1360, 1040, 728,
239 432, 136, -432, -136
240 };
241 static const int qmf_coeffs[12] =
242 {
243 3, -11, 12, 32, -210, 951, 3876, -805, 362, -156, 53, -11,
244 };
245
246 int dlowt;
247 int rlow;
248 int ihigh;
249 int dhigh;
250 int rhigh;
251 int xout1;
252 int xout2;
253 int wd1;
254 int wd2;
255 int wd3;
256 int code;
257 size_t outlen;
258 int i;
259 size_t j;
260
261 outlen = 0;
262 rhigh = 0;
263 for (j = 0; j < len; )
264 {
265 if (s->packed)
266 {
267 /* Unpack the code bits */
268 if (s->in_bits < s->bits_per_sample)
269 {
270 s->in_buffer |= (g722_data[j++] << s->in_bits);
271 s->in_bits += 8;
272 }
273 code = s->in_buffer & ((1 << s->bits_per_sample) - 1);
274 s->in_buffer >>= s->bits_per_sample;
275 s->in_bits -= s->bits_per_sample;
276 }
277 else
278 {
279 code = g722_data[j++];
280 }
281
282 switch (s->bits_per_sample)
283 {
284 default:
285 case 8:
286 wd1 = code & 0x3F;
287 ihigh = (code >> 6) & 0x03;
288 wd2 = qm6[wd1];
289 wd1 >>= 2;
290 break;
291 case 7:
292 wd1 = code & 0x1F;
293 ihigh = (code >> 5) & 0x03;
294 wd2 = qm5[wd1];
295 wd1 >>= 1;
296 break;
297 case 6:
298 wd1 = code & 0x0F;
299 ihigh = (code >> 4) & 0x03;
300 wd2 = qm4[wd1];
301 break;
302 }
303 /* Block 5L, LOW BAND INVQBL */
304 wd2 = (s->band[0].det*wd2) >> 15;
305 /* Block 5L, RECONS */
306 rlow = s->band[0].s + wd2;
307 /* Block 6L, LIMIT */
308 if (rlow > 16383)
309 rlow = 16383;
310 else if (rlow < -16384)
311 rlow = -16384;
312
313 /* Block 2L, INVQAL */
314 wd2 = qm4[wd1];
315 dlowt = (s->band[0].det*wd2) >> 15;
316
317 /* Block 3L, LOGSCL */
318 wd2 = rl42[wd1];
319 wd1 = (s->band[0].nb*127) >> 7;
320 wd1 += wl[wd2];
321 if (wd1 < 0)
322 wd1 = 0;
323 else if (wd1 > 18432)
324 wd1 = 18432;
325 s->band[0].nb = wd1;
326
327 /* Block 3L, SCALEL */
328 wd1 = (s->band[0].nb >> 6) & 31;
329 wd2 = 8 - (s->band[0].nb >> 11);
330 wd3 = (wd2 < 0) ? (ilb[wd1] << -wd2) : (ilb[wd1] >> wd2);
331 s->band[0].det = wd3 << 2;
332
333 block4(s, 0, dlowt);
334
335 if (!s->eight_k)
336 {
337 /* Block 2H, INVQAH */
338 wd2 = qm2[ihigh];
339 dhigh = (s->band[1].det*wd2) >> 15;
340 /* Block 5H, RECONS */
341 rhigh = dhigh + s->band[1].s;
342 /* Block 6H, LIMIT */
343 if (rhigh > 16383)
344 rhigh = 16383;
345 else if (rhigh < -16384)
346 rhigh = -16384;
347
348 /* Block 2H, INVQAH */
349 wd2 = rh2[ihigh];
350 wd1 = (s->band[1].nb*127) >> 7;
351 wd1 += wh[wd2];
352 if (wd1 < 0)
353 wd1 = 0;
354 else if (wd1 > 22528)
355 wd1 = 22528;
356 s->band[1].nb = wd1;
357
358 /* Block 3H, SCALEH */
359 wd1 = (s->band[1].nb >> 6) & 31;
360 wd2 = 10 - (s->band[1].nb >> 11);
361 wd3 = (wd2 < 0) ? (ilb[wd1] << -wd2) : (ilb[wd1] >> wd2);
362 s->band[1].det = wd3 << 2;
363
364 block4(s, 1, dhigh);
365 }
366
367 if (s->itu_test_mode)
368 {
369 amp[outlen++] = (int16_t) (rlow << 1);
370 amp[outlen++] = (int16_t) (rhigh << 1);
371 }
372 else
373 {
374 if (s->eight_k)
375 {
376 amp[outlen++] = (int16_t) (rlow << 1);
377 }
378 else
379 {
380 /* Apply the receive QMF */
381 for (i = 0; i < 22; i++)
382 s->x[i] = s->x[i + 2];
383 s->x[22] = rlow + rhigh;
384 s->x[23] = rlow - rhigh;
385
386 xout1 = 0;
387 xout2 = 0;
388 for (i = 0; i < 12; i++)
389 {
390 xout2 += s->x[2*i]*qmf_coeffs[i];
391 xout1 += s->x[2*i + 1]*qmf_coeffs[11 - i];
392 }
393 /* We shift by 12 to allow for the QMF filters (DC gain = 4096), less 1
394 to allow for the 15 bit input to the G.722 algorithm. */
395 /* WebRtc, tlegrand: added saturation */
396 amp[outlen++] = saturate(xout1 >> 11);
397 amp[outlen++] = saturate(xout2 >> 11);
398 }
399 }
400 }
401 return outlen;
402 }
403 /*- End of function --------------------------------------------------------*/
404 /*- End of file ------------------------------------------------------------*/
405