Asterisk - The Open Source Telephony Project GIT-master-1f1c5bb
Macros | Functions
g722_decode.c File Reference
#include <stdio.h>
#include <inttypes.h>
#include <memory.h>
#include <stdlib.h>
#include "g722.h"
Include dependency graph for g722_decode.c:

Go to the source code of this file.

Macros

#define FALSE   0
 
#define TRUE   (!FALSE)
 

Functions

static void block4 (g722_decode_state_t *s, int band, int d)
 
int g722_decode (g722_decode_state_t *s, int16_t amp[], const uint8_t g722_data[], int len)
 
g722_decode_state_tg722_decode_init (g722_decode_state_t *s, int rate, int options)
 
int g722_decode_release (g722_decode_state_t *s)
 
static __inline__ int16_t saturate (int32_t amp)
 

Macro Definition Documentation

◆ FALSE

#define FALSE   0

Definition at line 41 of file g722_decode.c.

◆ TRUE

#define TRUE   (!FALSE)

Definition at line 44 of file g722_decode.c.

Function Documentation

◆ block4()

static void block4 ( g722_decode_state_t s,
int  band,
int  d 
)
static

Definition at line 63 of file g722_decode.c.

64{
65 int wd1;
66 int wd2;
67 int wd3;
68 int i;
69
70 /* Block 4, RECONS */
71 s->band[band].d[0] = d;
72 s->band[band].r[0] = saturate(s->band[band].s + d);
73
74 /* Block 4, PARREC */
75 s->band[band].p[0] = saturate(s->band[band].sz + d);
76
77 /* Block 4, UPPOL2 */
78 for (i = 0; i < 3; i++)
79 s->band[band].sg[i] = s->band[band].p[i] >> 15;
80 wd1 = saturate(s->band[band].a[1] << 2);
81
82 wd2 = (s->band[band].sg[0] == s->band[band].sg[1]) ? -wd1 : wd1;
83 if (wd2 > 32767)
84 wd2 = 32767;
85 wd3 = (s->band[band].sg[0] == s->band[band].sg[2]) ? 128 : -128;
86 wd3 += (wd2 >> 7);
87 wd3 += (s->band[band].a[2]*32512) >> 15;
88 if (wd3 > 12288)
89 wd3 = 12288;
90 else if (wd3 < -12288)
91 wd3 = -12288;
92 s->band[band].ap[2] = wd3;
93
94 /* Block 4, UPPOL1 */
95 s->band[band].sg[0] = s->band[band].p[0] >> 15;
96 s->band[band].sg[1] = s->band[band].p[1] >> 15;
97 wd1 = (s->band[band].sg[0] == s->band[band].sg[1]) ? 192 : -192;
98 wd2 = (s->band[band].a[1]*32640) >> 15;
99
100 s->band[band].ap[1] = saturate(wd1 + wd2);
101 wd3 = saturate(15360 - s->band[band].ap[2]);
102 if (s->band[band].ap[1] > wd3)
103 s->band[band].ap[1] = wd3;
104 else if (s->band[band].ap[1] < -wd3)
105 s->band[band].ap[1] = -wd3;
106
107 /* Block 4, UPZERO */
108 wd1 = (d == 0) ? 0 : 128;
109 s->band[band].sg[0] = d >> 15;
110 for (i = 1; i < 7; i++)
111 {
112 s->band[band].sg[i] = s->band[band].d[i] >> 15;
113 wd2 = (s->band[band].sg[i] == s->band[band].sg[0]) ? wd1 : -wd1;
114 wd3 = (s->band[band].b[i]*32640) >> 15;
115 s->band[band].bp[i] = saturate(wd2 + wd3);
116 }
117
118 /* Block 4, DELAYA */
119 for (i = 6; i > 0; i--)
120 {
121 s->band[band].d[i] = s->band[band].d[i - 1];
122 s->band[band].b[i] = s->band[band].bp[i];
123 }
124
125 for (i = 2; i > 0; i--)
126 {
127 s->band[band].r[i] = s->band[band].r[i - 1];
128 s->band[band].p[i] = s->band[band].p[i - 1];
129 s->band[band].a[i] = s->band[band].ap[i];
130 }
131
132 /* Block 4, FILTEP */
133 wd1 = saturate(s->band[band].r[1] + s->band[band].r[1]);
134 wd1 = (s->band[band].a[1]*wd1) >> 15;
135 wd2 = saturate(s->band[band].r[2] + s->band[band].r[2]);
136 wd2 = (s->band[band].a[2]*wd2) >> 15;
137 s->band[band].sp = saturate(wd1 + wd2);
138
139 /* Block 4, FILTEZ */
140 s->band[band].sz = 0;
141 for (i = 6; i > 0; i--)
142 {
143 wd1 = saturate(s->band[band].d[i] + s->band[band].d[i]);
144 s->band[band].sz += (s->band[band].b[i]*wd1) >> 15;
145 }
146 s->band[band].sz = saturate(s->band[band].sz);
147
148 /* Block 4, PREDIC */
149 s->band[band].s = saturate(s->band[band].sp + s->band[band].sz);
150}
static __inline__ int16_t saturate(int32_t amp)
Definition: g722_decode.c:47
struct g722_decode_state_t::@149 band[2]
static struct test_val d

References g722_decode_state_t::a, g722_decode_state_t::ap, g722_decode_state_t::b, g722_decode_state_t::band, g722_decode_state_t::bp, g722_decode_state_t::d, d, g722_decode_state_t::p, g722_decode_state_t::r, g722_decode_state_t::s, saturate(), g722_decode_state_t::sg, g722_decode_state_t::sp, and g722_decode_state_t::sz.

Referenced by g722_decode().

◆ g722_decode()

int g722_decode ( g722_decode_state_t s,
int16_t  amp[],
const uint8_t  g722_data[],
int  len 
)

Definition at line 186 of file g722_decode.c.

187{
188 static const int wl[8] = {-60, -30, 58, 172, 334, 538, 1198, 3042 };
189 static const int rl42[16] = {0, 7, 6, 5, 4, 3, 2, 1, 7, 6, 5, 4, 3, 2, 1, 0 };
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] = {0, -214, 798};
199 static const int rh2[4] = {2, 1, 2, 1};
200 static const int qm2[4] = {-7408, -1616, 7408, 1616};
201 static const int qm4[16] =
202 {
203 0, -20456, -12896, -8968,
204 -6288, -4240, -2584, -1200,
205 20456, 12896, 8968, 6288,
206 4240, 2584, 1200, 0
207 };
208 static const int qm5[32] =
209 {
210 -280, -280, -23352, -17560,
211 -14120, -11664, -9752, -8184,
212 -6864, -5712, -4696, -3784,
213 -2960, -2208, -1520, -880,
214 23352, 17560, 14120, 11664,
215 9752, 8184, 6864, 5712,
216 4696, 3784, 2960, 2208,
217 1520, 880, 280, -280
218 };
219 static const int qm6[64] =
220 {
221 -136, -136, -136, -136,
222 -24808, -21904, -19008, -16704,
223 -14984, -13512, -12280, -11192,
224 -10232, -9360, -8576, -7856,
225 -7192, -6576, -6000, -5456,
226 -4944, -4464, -4008, -3576,
227 -3168, -2776, -2400, -2032,
228 -1688, -1360, -1040, -728,
229 24808, 21904, 19008, 16704,
230 14984, 13512, 12280, 11192,
231 10232, 9360, 8576, 7856,
232 7192, 6576, 6000, 5456,
233 4944, 4464, 4008, 3576,
234 3168, 2776, 2400, 2032,
235 1688, 1360, 1040, 728,
236 432, 136, -432, -136
237 };
238 static const int qmf_coeffs[12] =
239 {
240 3, -11, 12, 32, -210, 951, 3876, -805, 362, -156, 53, -11,
241 };
242
243 int dlowt;
244 int rlow;
245 int ihigh;
246 int dhigh;
247 int rhigh;
248 int xout1;
249 int xout2;
250 int wd1;
251 int wd2;
252 int wd3;
253 int code;
254 int outlen;
255 int i;
256 int j;
257
258 outlen = 0;
259 rhigh = 0;
260 for (j = 0; j < len; )
261 {
262 if (s->packed)
263 {
264 /* Unpack the code bits */
265 if (s->in_bits < s->bits_per_sample)
266 {
267 s->in_buffer |= (g722_data[j++] << s->in_bits);
268 s->in_bits += 8;
269 }
270 code = s->in_buffer & ((1 << s->bits_per_sample) - 1);
271 s->in_buffer >>= s->bits_per_sample;
272 s->in_bits -= s->bits_per_sample;
273 }
274 else
275 {
276 code = g722_data[j++];
277 }
278
279 switch (s->bits_per_sample)
280 {
281 default:
282 case 8:
283 wd1 = code & 0x3F;
284 ihigh = (code >> 6) & 0x03;
285 wd2 = qm6[wd1];
286 wd1 >>= 2;
287 break;
288 case 7:
289 wd1 = code & 0x1F;
290 ihigh = (code >> 5) & 0x03;
291 wd2 = qm5[wd1];
292 wd1 >>= 1;
293 break;
294 case 6:
295 wd1 = code & 0x0F;
296 ihigh = (code >> 4) & 0x03;
297 wd2 = qm4[wd1];
298 break;
299 }
300 /* Block 5L, LOW BAND INVQBL */
301 wd2 = (s->band[0].det*wd2) >> 15;
302 /* Block 5L, RECONS */
303 rlow = s->band[0].s + wd2;
304 /* Block 6L, LIMIT */
305 if (rlow > 16383)
306 rlow = 16383;
307 else if (rlow < -16384)
308 rlow = -16384;
309
310 /* Block 2L, INVQAL */
311 wd2 = qm4[wd1];
312 dlowt = (s->band[0].det*wd2) >> 15;
313
314 /* Block 3L, LOGSCL */
315 wd2 = rl42[wd1];
316 wd1 = (s->band[0].nb*127) >> 7;
317 wd1 += wl[wd2];
318 if (wd1 < 0)
319 wd1 = 0;
320 else if (wd1 > 18432)
321 wd1 = 18432;
322 s->band[0].nb = wd1;
323
324 /* Block 3L, SCALEL */
325 wd1 = (s->band[0].nb >> 6) & 31;
326 wd2 = 8 - (s->band[0].nb >> 11);
327 wd3 = (wd2 < 0) ? (ilb[wd1] << -wd2) : (ilb[wd1] >> wd2);
328 s->band[0].det = wd3 << 2;
329
330 block4(s, 0, dlowt);
331
332 if (!s->eight_k)
333 {
334 /* Block 2H, INVQAH */
335 wd2 = qm2[ihigh];
336 dhigh = (s->band[1].det*wd2) >> 15;
337 /* Block 5H, RECONS */
338 rhigh = dhigh + s->band[1].s;
339 /* Block 6H, LIMIT */
340 if (rhigh > 16383)
341 rhigh = 16383;
342 else if (rhigh < -16384)
343 rhigh = -16384;
344
345 /* Block 2H, INVQAH */
346 wd2 = rh2[ihigh];
347 wd1 = (s->band[1].nb*127) >> 7;
348 wd1 += wh[wd2];
349 if (wd1 < 0)
350 wd1 = 0;
351 else if (wd1 > 22528)
352 wd1 = 22528;
353 s->band[1].nb = wd1;
354
355 /* Block 3H, SCALEH */
356 wd1 = (s->band[1].nb >> 6) & 31;
357 wd2 = 10 - (s->band[1].nb >> 11);
358 wd3 = (wd2 < 0) ? (ilb[wd1] << -wd2) : (ilb[wd1] >> wd2);
359 s->band[1].det = wd3 << 2;
360
361 block4(s, 1, dhigh);
362 }
363
364 if (s->itu_test_mode)
365 {
366 amp[outlen++] = (int16_t) (rlow << 1);
367 amp[outlen++] = (int16_t) (rhigh << 1);
368 }
369 else
370 {
371 if (s->eight_k)
372 {
373 amp[outlen++] = (int16_t) (rlow << 1);
374 }
375 else
376 {
377 /* Apply the receive QMF */
378 for (i = 0; i < 22; i++)
379 s->x[i] = s->x[i + 2];
380 s->x[22] = rlow + rhigh;
381 s->x[23] = rlow - rhigh;
382
383 xout1 = 0;
384 xout2 = 0;
385 for (i = 0; i < 12; i++)
386 {
387 xout2 += s->x[2*i]*qmf_coeffs[i];
388 xout1 += s->x[2*i + 1]*qmf_coeffs[11 - i];
389 }
390 amp[outlen++] = (int16_t) (xout1 >> 11);
391 amp[outlen++] = (int16_t) (xout2 >> 11);
392 }
393 }
394 }
395 return outlen;
396}
short int16_t
Definition: db.h:59
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
static void block4(g722_decode_state_t *s, int band, int d)
Definition: g722_decode.c:63
int bits_per_sample
Definition: g722.h:104
unsigned int in_buffer
Definition: g722.h:126
int itu_test_mode
Definition: g722.h:98

References g722_decode_state_t::band, g722_decode_state_t::bits_per_sample, block4(), g722_decode_state_t::det, g722_decode_state_t::eight_k, g722_decode_state_t::in_bits, g722_decode_state_t::in_buffer, g722_decode_state_t::itu_test_mode, len(), g722_decode_state_t::nb, g722_decode_state_t::packed, g722_decode_state_t::s, and g722_decode_state_t::x.

Referenced by g722tolin_framein().

◆ g722_decode_init()

g722_decode_state_t * g722_decode_init ( g722_decode_state_t s,
int  rate,
int  options 
)

Definition at line 153 of file g722_decode.c.

154{
155 if (s == NULL)
156 {
157 if ((s = (g722_decode_state_t *) malloc(sizeof(*s))) == NULL)
158 return NULL;
159 }
160 memset(s, 0, sizeof(*s));
161 if (rate == 48000)
162 s->bits_per_sample = 6;
163 else if (rate == 56000)
164 s->bits_per_sample = 7;
165 else
166 s->bits_per_sample = 8;
168 s->eight_k = TRUE;
169 if ((options & G722_PACKED) && s->bits_per_sample != 8)
170 s->packed = TRUE;
171 else
172 s->packed = FALSE;
173 s->band[0].det = 32;
174 s->band[1].det = 8;
175 return s;
176}
@ G722_PACKED
Definition: g722.h:46
@ G722_SAMPLE_RATE_8000
Definition: g722.h:45
#define TRUE
Definition: g722_decode.c:44
#define FALSE
Definition: g722_decode.c:41
char * malloc()
#define NULL
Definition: resample.c:96
static struct test_options options

References g722_decode_state_t::band, g722_decode_state_t::bits_per_sample, g722_decode_state_t::det, g722_decode_state_t::eight_k, FALSE, G722_PACKED, G722_SAMPLE_RATE_8000, malloc(), NULL, options, g722_decode_state_t::packed, and TRUE.

Referenced by g722tolin16_new(), and g722tolin_new().

◆ g722_decode_release()

int g722_decode_release ( g722_decode_state_t s)

Definition at line 179 of file g722_decode.c.

180{
181 free(s);
182 return 0;
183}
void free()

References free().

◆ saturate()

static __inline__ int16_t saturate ( int32_t  amp)
static

Definition at line 47 of file g722_decode.c.

48{
49 int16_t amp16;
50
51 /* Hopefully this is optimised for the common case - not clipping */
52 amp16 = (int16_t) amp;
53 if (amp == amp16)
54 return amp16;
55 if (amp > INT16_MAX)
56 return INT16_MAX;
57 return INT16_MIN;
58}
#define INT16_MAX
Definition: g722.h:50
#define INT16_MIN
Definition: g722.h:53

References INT16_MAX, and INT16_MIN.

Referenced by block4().