49 static __inline__ int16_t saturate(int32_t amp)
54 amp16 = (int16_t) amp;
71 s->band[band].d[0] = d;
72 s->band[band].r[0] = saturate(s->band[band].s + d);
75 s->band[band].p[0] = saturate(s->band[band].sz + d);
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);
82 wd2 = (s->band[band].sg[0] == s->band[band].sg[1]) ? -wd1 : wd1;
85 wd3 = (wd2 >> 7) + ((s->band[band].sg[0] == s->band[band].sg[2]) ? 128 : -128);
86 wd3 += (s->band[band].a[2]*32512) >> 15;
89 else if (wd3 < -12288)
91 s->band[band].ap[2] = wd3;
94 s->band[band].sg[0] = s->band[band].p[0] >> 15;
95 s->band[band].sg[1] = s->band[band].p[1] >> 15;
96 wd1 = (s->band[band].sg[0] == s->band[band].sg[1]) ? 192 : -192;
97 wd2 = (s->band[band].a[1]*32640) >> 15;
99 s->band[band].ap[1] = saturate(wd1 + wd2);
100 wd3 = saturate(15360 - s->band[band].ap[2]);
101 if (s->band[band].ap[1] > wd3)
102 s->band[band].ap[1] = wd3;
103 else if (s->band[band].ap[1] < -wd3)
104 s->band[band].ap[1] = -wd3;
107 wd1 = (d == 0) ? 0 : 128;
108 s->band[band].sg[0] = d >> 15;
109 for (i = 1; i < 7; i++)
111 s->band[band].sg[i] = s->band[band].d[i] >> 15;
112 wd2 = (s->band[band].sg[i] == s->band[band].sg[0]) ? wd1 : -wd1;
113 wd3 = (s->band[band].b[i]*32640) >> 15;
114 s->band[band].bp[i] = saturate(wd2 + wd3);
118 for (i = 6; i > 0; i--)
120 s->band[band].d[i] = s->band[band].d[i - 1];
121 s->band[band].b[i] = s->band[band].bp[i];
124 for (i = 2; i > 0; i--)
126 s->band[band].r[i] = s->band[band].r[i - 1];
127 s->band[band].p[i] = s->band[band].p[i - 1];
128 s->band[band].a[i] = s->band[band].ap[i];
132 wd1 = saturate(s->band[band].r[1] + s->band[band].r[1]);
133 wd1 = (s->band[band].a[1]*wd1) >> 15;
134 wd2 = saturate(s->band[band].r[2] + s->band[band].r[2]);
135 wd2 = (s->band[band].a[2]*wd2) >> 15;
136 s->band[band].sp = saturate(wd1 + wd2);
139 s->band[band].sz = 0;
140 for (i = 6; i > 0; i--)
142 wd1 = saturate(s->band[band].d[i] + s->band[band].d[i]);
143 s->band[band].sz += (s->band[band].b[i]*wd1) >> 15;
145 s->band[band].sz = saturate(s->band[band].sz);
148 s->band[band].s = saturate(s->band[band].sp + s->band[band].sz);
159 memset(s, 0,
sizeof(*s));
162 else if (rate == 56000)
166 if ((options & G722_SAMPLE_RATE_8000))
187 static const int q6[32] =
189 0, 35, 72, 110, 150, 190, 233, 276,
190 323, 370, 422, 473, 530, 587, 650, 714,
191 786, 858, 940, 1023, 1121, 1219, 1339, 1458,
192 1612, 1765, 1980, 2195, 2557, 2919, 0, 0
194 static const int iln[32] =
196 0, 63, 62, 31, 30, 29, 28, 27,
197 26, 25, 24, 23, 22, 21, 20, 19,
198 18, 17, 16, 15, 14, 13, 12, 11,
199 10, 9, 8, 7, 6, 5, 4, 0
201 static const int ilp[32] =
203 0, 61, 60, 59, 58, 57, 56, 55,
204 54, 53, 52, 51, 50, 49, 48, 47,
205 46, 45, 44, 43, 42, 41, 40, 39,
206 38, 37, 36, 35, 34, 33, 32, 0
208 static const int wl[8] =
210 -60, -30, 58, 172, 334, 538, 1198, 3042
212 static const int rl42[16] =
214 0, 7, 6, 5, 4, 3, 2, 1, 7, 6, 5, 4, 3, 2, 1, 0
216 static const int ilb[32] =
218 2048, 2093, 2139, 2186, 2233, 2282, 2332,
219 2383, 2435, 2489, 2543, 2599, 2656, 2714,
220 2774, 2834, 2896, 2960, 3025, 3091, 3158,
221 3228, 3298, 3371, 3444, 3520, 3597, 3676,
222 3756, 3838, 3922, 4008
224 static const int qm4[16] =
226 0, -20456, -12896, -8968,
227 -6288, -4240, -2584, -1200,
228 20456, 12896, 8968, 6288,
231 static const int qm2[4] =
233 -7408, -1616, 7408, 1616
235 static const int qmf_coeffs[12] =
237 3, -11, 12, 32, -210, 951, 3876, -805, 362, -156, 53, -11,
239 static const int ihn[3] = {0, 1, 0};
240 static const int ihp[3] = {0, 3, 2};
241 static const int wh[3] = {0, -214, 798};
242 static const int rh2[4] = {2, 1, 2, 1};
271 for (j = 0; j < len; )
276 xhigh = amp[j++] >> 1;
282 xlow = amp[j++] >> 1;
288 for (i = 0; i < 22; i++)
289 s->
x[i] = s->
x[i + 2];
296 for (i = 0; i < 12; i++)
298 sumodd += s->
x[2*i]*qmf_coeffs[i];
299 sumeven += s->
x[2*i + 1]*qmf_coeffs[11 - i];
301 xlow = (sumeven + sumodd) >> 14;
302 xhigh = (sumeven - sumodd) >> 14;
306 el = saturate(xlow - s->band[0].s);
309 wd = (el >= 0) ? el : -(el + 1);
311 for (i = 1; i < 30; i++)
313 wd1 = (q6[i]*s->band[0].det) >> 12;
317 ilow = (el < 0) ? iln[i] : ilp[i];
322 dlow = (s->band[0].det*wd2) >> 15;
326 wd = (s->band[0].nb*127) >> 7;
327 s->band[0].nb = wd + wl[il4];
328 if (s->band[0].nb < 0)
330 else if (s->band[0].nb > 18432)
331 s->band[0].nb = 18432;
334 wd1 = (s->band[0].nb >> 6) & 31;
335 wd2 = 8 - (s->band[0].nb >> 11);
336 wd3 = (wd2 < 0) ? (ilb[wd1] << -wd2) : (ilb[wd1] >> wd2);
337 s->band[0].det = wd3 << 2;
349 eh = saturate(xhigh - s->band[1].s);
352 wd = (eh >= 0) ? eh : -(eh + 1);
353 wd1 = (564*s->band[1].det) >> 12;
354 mih = (wd >= wd1) ? 2 : 1;
355 ihigh = (eh < 0) ? ihn[mih] : ihp[mih];
359 dhigh = (s->band[1].det*wd2) >> 15;
363 wd = (s->band[1].nb*127) >> 7;
364 s->band[1].nb = wd + wh[ih2];
365 if (s->band[1].nb < 0)
367 else if (s->band[1].nb > 22528)
368 s->band[1].nb = 22528;
371 wd1 = (s->band[1].nb >> 6) & 31;
372 wd2 = 10 - (s->band[1].nb >> 11);
373 wd3 = (wd2 < 0) ? (ilb[wd1] << -wd2) : (ilb[wd1] >> wd2);
374 s->band[1].det = wd3 << 2;
383 s->out_buffer |= (code << s->out_bits);
385 if (s->out_bits >= 8)
387 g722_data[g722_bytes++] = (uint8_t) (s->out_buffer & 0xFF);
394 g722_data[g722_bytes++] = (uint8_t) code;