2 * SpanDSP - a series of DSP components for telephony
4 * g722_decode.c - The ITU G.722 codec, decode part.
6 * Written by Steve Underwood <steveu@coppice.org>
8 * Copyright (C) 2005 Steve Underwood
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
15 * Based in part on a single channel G.722 codec which is:
17 * Copyright (c) CMU 1993
18 * Computer Science, Speech Group
19 * Chengxiang Lu and Alex Hauptmann
21 * $Id: g722_decode.c,v 1.15 2006/07/07 16:37:49 steveu Exp $
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
41 #include "g722_enc_dec.h"
42 #include "webrtc/typedefs.h"
51 static __inline int16_t saturate(int32_t amp)
55 /* Hopefully this is optimised for the common case - not clipping */
56 amp16 = (int16_t) amp;
59 if (amp > WEBRTC_INT16_MAX)
60 return WEBRTC_INT16_MAX;
61 return WEBRTC_INT16_MIN;
63 /*- End of function --------------------------------------------------------*/
65 static void block4(g722_decode_state_t *s, int band, int d);
67 static void block4(g722_decode_state_t *s, int band, int d)
75 s->band[band].d[0] = d;
76 s->band[band].r[0] = saturate(s->band[band].s + d);
79 s->band[band].p[0] = saturate(s->band[band].sz + d);
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);
86 wd2 = (s->band[band].sg[0] == s->band[band].sg[1]) ? -wd1 : wd1;
89 wd3 = (s->band[band].sg[0] == s->band[band].sg[2]) ? 128 : -128;
91 wd3 += (s->band[band].a[2]*32512) >> 15;
94 else if (wd3 < -12288)
96 s->band[band].ap[2] = wd3;
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;
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;
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++)
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);
122 /* Block 4, DELAYA */
123 for (i = 6; i > 0; i--)
125 s->band[band].d[i] = s->band[band].d[i - 1];
126 s->band[band].b[i] = s->band[band].bp[i];
129 for (i = 2; i > 0; i--)
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];
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);
143 /* Block 4, FILTEZ */
144 s->band[band].sz = 0;
145 for (i = 6; i > 0; i--)
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;
150 s->band[band].sz = saturate(s->band[band].sz);
152 /* Block 4, PREDIC */
153 s->band[band].s = saturate(s->band[band].sp + s->band[band].sz);
155 /*- End of function --------------------------------------------------------*/
157 g722_decode_state_t *WebRtc_g722_decode_init(g722_decode_state_t *s,
163 if ((s = (g722_decode_state_t *) malloc(sizeof(*s))) == NULL)
166 memset(s, 0, sizeof(*s));
168 s->bits_per_sample = 6;
169 else if (rate == 56000)
170 s->bits_per_sample = 7;
172 s->bits_per_sample = 8;
173 if ((options & G722_SAMPLE_RATE_8000))
175 if ((options & G722_PACKED) && s->bits_per_sample != 8)
183 /*- End of function --------------------------------------------------------*/
185 int WebRtc_g722_decode_release(g722_decode_state_t *s)
190 /*- End of function --------------------------------------------------------*/
192 int WebRtc_g722_decode(g722_decode_state_t *s, int16_t amp[],
193 const uint8_t g722_data[], int len)
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] =
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
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] =
211 0, -20456, -12896, -8968,
212 -6288, -4240, -2584, -1200,
213 20456, 12896, 8968, 6288,
216 static const int qm5[32] =
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,
227 static const int qm6[64] =
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,
246 static const int qmf_coeffs[12] =
248 3, -11, 12, 32, -210, 951, 3876, -805, 362, -156, 53, -11,
268 for (j = 0; j < len; )
272 /* Unpack the code bits */
273 if (s->in_bits < s->bits_per_sample)
275 s->in_buffer |= (g722_data[j++] << s->in_bits);
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;
284 code = g722_data[j++];
287 switch (s->bits_per_sample)
292 ihigh = (code >> 6) & 0x03;
298 ihigh = (code >> 5) & 0x03;
304 ihigh = (code >> 4) & 0x03;
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 */
315 else if (rlow < -16384)
318 /* Block 2L, INVQAL */
320 dlowt = (s->band[0].det*wd2) >> 15;
322 /* Block 3L, LOGSCL */
324 wd1 = (s->band[0].nb*127) >> 7;
328 else if (wd1 > 18432)
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;
342 /* Block 2H, INVQAH */
344 dhigh = (s->band[1].det*wd2) >> 15;
345 /* Block 5H, RECONS */
346 rhigh = dhigh + s->band[1].s;
347 /* Block 6H, LIMIT */
350 else if (rhigh < -16384)
353 /* Block 2H, INVQAH */
355 wd1 = (s->band[1].nb*127) >> 7;
359 else if (wd1 > 22528)
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;
372 if (s->itu_test_mode)
374 amp[outlen++] = (int16_t) (rlow << 1);
375 amp[outlen++] = (int16_t) (rhigh << 1);
381 amp[outlen++] = (int16_t) (rlow << 1);
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;
393 for (i = 0; i < 12; i++)
395 xout2 += s->x[2*i]*qmf_coeffs[i];
396 xout1 += s->x[2*i + 1]*qmf_coeffs[11 - i];
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);
408 /*- End of function --------------------------------------------------------*/
409 /*- End of file ------------------------------------------------------------*/