Mercurial > mplayer.hg
comparison libmpcodecs/native/xa_gsm.c @ 5603:5f4485862a72
native codecs files moved to libmpcodecs/native/
author | arpi |
---|---|
date | Sat, 13 Apr 2002 18:04:24 +0000 |
parents | xa/xa_gsm.c@a6c5a537f30a |
children | 51f695c0e35f |
comparison
equal
deleted
inserted
replaced
5602:628c85c15c7b | 5603:5f4485862a72 |
---|---|
1 | |
2 /* | |
3 Written by Mark Podlipec <podlipec@ici.net>. | |
4 | |
5 Most of this code comes from a GSM 06.10 library by | |
6 Jutta Degener and Carsten Bormann, available via | |
7 <http://www.pobox.com/~jutta/toast.html>. | |
8 | |
9 That library is distributed with the following copyright: | |
10 | |
11 Copyright 1992 by Jutta Degener and Carsten Bormann, | |
12 Technische Universitaet Berlin | |
13 | |
14 Any use of this software is permitted provided that this notice is not | |
15 removed and that neither the authors nor the Technische Universitaet Berlin | |
16 are deemed to have made any representations as to the suitability of this | |
17 software for any purpose nor are held responsible for any defects of | |
18 this software. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. | |
19 | |
20 As a matter of courtesy, the authors request to be informed about uses | |
21 this software has found, about bugs in this software, and about any | |
22 improvements that may be of general interest. | |
23 | |
24 Berlin, 15.09.1992 | |
25 Jutta Degener | |
26 Carsten Bormann | |
27 */ | |
28 | |
29 | |
30 #include <stdio.h> | |
31 #include <string.h> | |
32 #include <assert.h> /* POD optional */ | |
33 #include "xa_gsm_int.h" | |
34 | |
35 //void XA_MSGSM_Decoder(); | |
36 static void GSM_Decode(); | |
37 static void Gsm_RPE_Decoding(); | |
38 | |
39 //static short gsm_buf[320]; | |
40 static XA_GSM_STATE gsm_state; | |
41 | |
42 unsigned char xa_sign_2_ulaw[256]; | |
43 | |
44 unsigned char XA_Signed_To_uLaw(long ch) | |
45 { | |
46 long mask; | |
47 if (ch < 0) { ch = -ch; mask = 0x7f; } | |
48 else { mask = 0xff; } | |
49 if (ch < 32) { ch = 0xF0 | (15 - (ch / 2)); } | |
50 else if (ch < 96) { ch = 0xE0 | (15 - (ch - 32) / 4); } | |
51 else if (ch < 224) { ch = 0xD0 | (15 - (ch - 96) / 8); } | |
52 else if (ch < 480) { ch = 0xC0 | (15 - (ch - 224) / 16); } | |
53 else if (ch < 992) { ch = 0xB0 | (15 - (ch - 480) / 32); } | |
54 else if (ch < 2016) { ch = 0xA0 | (15 - (ch - 992) / 64); } | |
55 else if (ch < 4064) { ch = 0x90 | (15 - (ch - 2016) / 128); } | |
56 else if (ch < 8160) { ch = 0x80 | (15 - (ch - 4064) / 256); } | |
57 else { ch = 0x80; } | |
58 return (mask & ch); | |
59 } | |
60 | |
61 void Gen_Signed_2_uLaw() | |
62 { | |
63 unsigned long i; | |
64 for(i=0;i<256;i++) | |
65 { unsigned char d; | |
66 char ch = i; | |
67 long chr = ch; | |
68 d = XA_Signed_To_uLaw(chr * 16); | |
69 xa_sign_2_ulaw[i] = d; | |
70 } | |
71 } | |
72 | |
73 | |
74 void GSM_Init() | |
75 { | |
76 memset((char *)(&gsm_state), 0, sizeof(XA_GSM_STATE)); | |
77 gsm_state.nrp = 40; | |
78 Gen_Signed_2_uLaw(); | |
79 } | |
80 | |
81 | |
82 /* Table 4.3b Quantization levels of the LTP gain quantizer | |
83 */ | |
84 /* bc 0 1 2 3 */ | |
85 static word gsm_QLB[4] = { 3277, 11469, 21299, 32767 }; | |
86 | |
87 /* Table 4.6 Normalized direct mantissa used to compute xM/xmax | |
88 */ | |
89 /* i 0 1 2 3 4 5 6 7 */ | |
90 static word gsm_FAC[8] = { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 }; | |
91 | |
92 | |
93 | |
94 /****************/ | |
95 #define saturate(x) \ | |
96 ((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x)) | |
97 | |
98 /****************/ | |
99 static word gsm_sub (a,b) | |
100 word a; | |
101 word b; | |
102 { | |
103 longword diff = (longword)a - (longword)b; | |
104 return saturate(diff); | |
105 } | |
106 | |
107 /****************/ | |
108 static word gsm_asr (a,n) | |
109 word a; | |
110 int n; | |
111 { | |
112 if (n >= 16) return -(a < 0); | |
113 if (n <= -16) return 0; | |
114 if (n < 0) return a << -n; | |
115 | |
116 # ifdef SASR | |
117 return a >> n; | |
118 # else | |
119 if (a >= 0) return a >> n; | |
120 else return -(word)( -(uword)a >> n ); | |
121 # endif | |
122 } | |
123 | |
124 /****************/ | |
125 static word gsm_asl (a,n) | |
126 word a; | |
127 int n; | |
128 { | |
129 if (n >= 16) return 0; | |
130 if (n <= -16) return -(a < 0); | |
131 if (n < 0) return gsm_asr(a, -n); | |
132 return a << n; | |
133 } | |
134 | |
135 | |
136 /* | |
137 * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische | |
138 * Universitaet Berlin. See the accompanying file "COPYRIGHT" for | |
139 * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. | |
140 */ | |
141 | |
142 /**** 4.2.17 */ | |
143 static void RPE_grid_positioning(Mc,xMp,ep) | |
144 word Mc; /* grid position IN */ | |
145 register word * xMp; /* [0..12] IN */ | |
146 register word * ep; /* [0..39] OUT */ | |
147 /* | |
148 * This procedure computes the reconstructed long term residual signal | |
149 * ep[0..39] for the LTP analysis filter. The inputs are the Mc | |
150 * which is the grid position selection and the xMp[0..12] decoded | |
151 * RPE samples which are upsampled by a factor of 3 by inserting zero | |
152 * values. | |
153 */ | |
154 { | |
155 int i = 13; | |
156 | |
157 assert(0 <= Mc && Mc <= 3); | |
158 | |
159 switch (Mc) { | |
160 case 3: *ep++ = 0; | |
161 case 2: do { | |
162 *ep++ = 0; | |
163 case 1: *ep++ = 0; | |
164 case 0: *ep++ = *xMp++; | |
165 } while (--i); | |
166 } | |
167 while (++Mc < 4) *ep++ = 0; | |
168 | |
169 /* | |
170 | |
171 int i, k; | |
172 for (k = 0; k <= 39; k++) ep[k] = 0; | |
173 for (i = 0; i <= 12; i++) { | |
174 ep[ Mc + (3*i) ] = xMp[i]; | |
175 } | |
176 */ | |
177 } | |
178 | |
179 | |
180 /**** 4.2.16 */ | |
181 static void APCM_inverse_quantization (xMc,mant,exp,xMp) | |
182 register word * xMc; /* [0..12] IN */ | |
183 word mant; | |
184 word exp; | |
185 register word * xMp; /* [0..12] OUT */ | |
186 /* | |
187 * This part is for decoding the RPE sequence of coded xMc[0..12] | |
188 * samples to obtain the xMp[0..12] array. Table 4.6 is used to get | |
189 * the mantissa of xmaxc (FAC[0..7]). | |
190 */ | |
191 { | |
192 int i; | |
193 word temp, temp1, temp2, temp3; | |
194 longword ltmp; | |
195 | |
196 assert( mant >= 0 && mant <= 7 ); | |
197 | |
198 temp1 = gsm_FAC[ mant ]; /* see 4.2-15 for mant */ | |
199 temp2 = gsm_sub( 6, exp ); /* see 4.2-15 for exp */ | |
200 temp3 = gsm_asl( 1, gsm_sub( temp2, 1 )); | |
201 | |
202 for (i = 13; i--;) { | |
203 | |
204 assert( *xMc <= 7 && *xMc >= 0 ); /* 3 bit unsigned */ | |
205 | |
206 /* temp = gsm_sub( *xMc++ << 1, 7 ); */ | |
207 temp = (*xMc++ << 1) - 7; /* restore sign */ | |
208 assert( temp <= 7 && temp >= -7 ); /* 4 bit signed */ | |
209 | |
210 temp <<= 12; /* 16 bit signed */ | |
211 temp = GSM_MULT_R( temp1, temp ); | |
212 temp = GSM_ADD( temp, temp3 ); | |
213 *xMp++ = gsm_asr( temp, temp2 ); | |
214 } | |
215 } | |
216 | |
217 | |
218 /**** 4.12.15 */ | |
219 static void APCM_quantization_xmaxc_to_exp_mant (xmaxc,exp_out,mant_out) | |
220 word xmaxc; /* IN */ | |
221 word * exp_out; /* OUT */ | |
222 word * mant_out; /* OUT */ | |
223 { | |
224 word exp, mant; | |
225 | |
226 /* Compute exponent and mantissa of the decoded version of xmaxc | |
227 */ | |
228 | |
229 exp = 0; | |
230 if (xmaxc > 15) exp = SASR(xmaxc, 3) - 1; | |
231 mant = xmaxc - (exp << 3); | |
232 | |
233 if (mant == 0) { | |
234 exp = -4; | |
235 mant = 7; | |
236 } | |
237 else { | |
238 while (mant <= 7) { | |
239 mant = mant << 1 | 1; | |
240 exp--; | |
241 } | |
242 mant -= 8; | |
243 } | |
244 | |
245 assert( exp >= -4 && exp <= 6 ); | |
246 assert( mant >= 0 && mant <= 7 ); | |
247 | |
248 *exp_out = exp; | |
249 *mant_out = mant; | |
250 } | |
251 | |
252 static void Gsm_RPE_Decoding (S, xmaxcr, Mcr, xMcr, erp) | |
253 XA_GSM_STATE * S; | |
254 word xmaxcr; | |
255 word Mcr; | |
256 word * xMcr; /* [0..12], 3 bits IN */ | |
257 word * erp; /* [0..39] OUT */ | |
258 | |
259 { | |
260 word exp, mant; | |
261 word xMp[ 13 ]; | |
262 | |
263 APCM_quantization_xmaxc_to_exp_mant( xmaxcr, &exp, &mant ); | |
264 APCM_inverse_quantization( xMcr, mant, exp, xMp ); | |
265 RPE_grid_positioning( Mcr, xMp, erp ); | |
266 | |
267 } | |
268 | |
269 | |
270 /* | |
271 * 4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER | |
272 */ | |
273 | |
274 static void Postprocessing(S,s) | |
275 XA_GSM_STATE * S; | |
276 register word * s; | |
277 { | |
278 register int k; | |
279 register word msr = S->msr; | |
280 register longword ltmp; /* for GSM_ADD */ | |
281 register word tmp; | |
282 | |
283 for (k = 160; k--; s++) | |
284 { | |
285 tmp = GSM_MULT_R( msr, 28180 ); | |
286 msr = GSM_ADD(*s, tmp); /* Deemphasis */ | |
287 *s = GSM_ADD(msr, msr) & 0xFFF8; /* Truncation & Upscaling */ | |
288 } | |
289 S->msr = msr; | |
290 } | |
291 | |
292 /**** 4.3.2 */ | |
293 void Gsm_Long_Term_Synthesis_Filtering (S,Ncr,bcr,erp,drp) | |
294 XA_GSM_STATE * S; | |
295 word Ncr; | |
296 word bcr; | |
297 register word * erp; /* [0..39] IN */ | |
298 register word * drp; /* [-120..-1] IN, [-120..40] OUT */ | |
299 | |
300 /* | |
301 * This procedure uses the bcr and Ncr parameter to realize the | |
302 * long term synthesis filtering. The decoding of bcr needs | |
303 * table 4.3b. | |
304 */ | |
305 { | |
306 register longword ltmp; /* for ADD */ | |
307 register int k; | |
308 word brp, drpp, Nr; | |
309 | |
310 /* Check the limits of Nr. | |
311 */ | |
312 Nr = Ncr < 40 || Ncr > 120 ? S->nrp : Ncr; | |
313 S->nrp = Nr; | |
314 assert(Nr >= 40 && Nr <= 120); | |
315 | |
316 /* Decoding of the LTP gain bcr | |
317 */ | |
318 brp = gsm_QLB[ bcr ]; | |
319 | |
320 /* Computation of the reconstructed short term residual | |
321 * signal drp[0..39] | |
322 */ | |
323 assert(brp != MIN_WORD); | |
324 | |
325 for (k = 0; k <= 39; k++) { | |
326 drpp = GSM_MULT_R( brp, drp[ k - Nr ] ); | |
327 drp[k] = GSM_ADD( erp[k], drpp ); | |
328 } | |
329 | |
330 /* | |
331 * Update of the reconstructed short term residual signal | |
332 * drp[ -1..-120 ] | |
333 */ | |
334 | |
335 for (k = 0; k <= 119; k++) drp[ -120 + k ] = drp[ -80 + k ]; | |
336 } | |
337 | |
338 static void Short_term_synthesis_filtering (S,rrp,k,wt,sr) | |
339 XA_GSM_STATE *S; | |
340 register word *rrp; /* [0..7] IN */ | |
341 register int k; /* k_end - k_start */ | |
342 register word *wt; /* [0..k-1] IN */ | |
343 register word *sr; /* [0..k-1] OUT */ | |
344 { | |
345 register word * v = S->v; | |
346 register int i; | |
347 register word sri, tmp1, tmp2; | |
348 register longword ltmp; /* for GSM_ADD & GSM_SUB */ | |
349 | |
350 while (k--) { | |
351 sri = *wt++; | |
352 for (i = 8; i--;) { | |
353 | |
354 /* sri = GSM_SUB( sri, gsm_mult_r( rrp[i], v[i] ) ); | |
355 */ | |
356 tmp1 = rrp[i]; | |
357 tmp2 = v[i]; | |
358 tmp2 = ( tmp1 == MIN_WORD && tmp2 == MIN_WORD | |
359 ? MAX_WORD | |
360 : 0x0FFFF & (( (longword)tmp1 * (longword)tmp2 | |
361 + 16384) >> 15)) ; | |
362 | |
363 sri = GSM_SUB( sri, tmp2 ); | |
364 | |
365 /* v[i+1] = GSM_ADD( v[i], gsm_mult_r( rrp[i], sri ) ); | |
366 */ | |
367 tmp1 = ( tmp1 == MIN_WORD && sri == MIN_WORD | |
368 ? MAX_WORD | |
369 : 0x0FFFF & (( (longword)tmp1 * (longword)sri | |
370 + 16384) >> 15)) ; | |
371 | |
372 v[i+1] = GSM_ADD( v[i], tmp1); | |
373 } | |
374 *sr++ = v[0] = sri; | |
375 } | |
376 } | |
377 | |
378 /* 4.2.8 */ | |
379 | |
380 static void Decoding_of_the_coded_Log_Area_Ratios (LARc,LARpp) | |
381 word * LARc; /* coded log area ratio [0..7] IN */ | |
382 word * LARpp; /* out: decoded .. */ | |
383 { | |
384 register word temp1 /* , temp2 */; | |
385 register long ltmp; /* for GSM_ADD */ | |
386 | |
387 /* This procedure requires for efficient implementation | |
388 * two tables. | |
389 * | |
390 * INVA[1..8] = integer( (32768 * 8) / real_A[1..8]) | |
391 * MIC[1..8] = minimum value of the LARc[1..8] | |
392 */ | |
393 | |
394 /* Compute the LARpp[1..8] | |
395 */ | |
396 | |
397 /* for (i = 1; i <= 8; i++, B++, MIC++, INVA++, LARc++, LARpp++) { | |
398 * | |
399 * temp1 = GSM_ADD( *LARc, *MIC ) << 10; | |
400 * temp2 = *B << 1; | |
401 * temp1 = GSM_SUB( temp1, temp2 ); | |
402 * | |
403 * assert(*INVA != MIN_WORD); | |
404 * | |
405 * temp1 = GSM_MULT_R( *INVA, temp1 ); | |
406 * *LARpp = GSM_ADD( temp1, temp1 ); | |
407 * } | |
408 */ | |
409 | |
410 #undef STEP | |
411 #define STEP( B, MIC, INVA ) \ | |
412 temp1 = GSM_ADD( *LARc++, MIC ) << 10; \ | |
413 temp1 = GSM_SUB( temp1, B << 1 ); \ | |
414 temp1 = GSM_MULT_R( INVA, temp1 ); \ | |
415 *LARpp++ = GSM_ADD( temp1, temp1 ); | |
416 | |
417 STEP( 0, -32, 13107 ); | |
418 STEP( 0, -32, 13107 ); | |
419 STEP( 2048, -16, 13107 ); | |
420 STEP( -2560, -16, 13107 ); | |
421 | |
422 STEP( 94, -8, 19223 ); | |
423 STEP( -1792, -8, 17476 ); | |
424 STEP( -341, -4, 31454 ); | |
425 STEP( -1144, -4, 29708 ); | |
426 | |
427 /* NOTE: the addition of *MIC is used to restore | |
428 * the sign of *LARc. | |
429 */ | |
430 } | |
431 | |
432 /* 4.2.9 */ | |
433 /* Computation of the quantized reflection coefficients | |
434 */ | |
435 | |
436 /* 4.2.9.1 Interpolation of the LARpp[1..8] to get the LARp[1..8] | |
437 */ | |
438 | |
439 /* | |
440 * Within each frame of 160 analyzed speech samples the short term | |
441 * analysis and synthesis filters operate with four different sets of | |
442 * coefficients, derived from the previous set of decoded LARs(LARpp(j-1)) | |
443 * and the actual set of decoded LARs (LARpp(j)) | |
444 * | |
445 * (Initial value: LARpp(j-1)[1..8] = 0.) | |
446 */ | |
447 | |
448 static void Coefficients_0_12 (LARpp_j_1, LARpp_j, LARp) | |
449 register word * LARpp_j_1; | |
450 register word * LARpp_j; | |
451 register word * LARp; | |
452 { | |
453 register int i; | |
454 register longword ltmp; | |
455 | |
456 for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) { | |
457 *LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 )); | |
458 *LARp = GSM_ADD( *LARp, SASR( *LARpp_j_1, 1)); | |
459 } | |
460 } | |
461 | |
462 static void Coefficients_13_26 (LARpp_j_1, LARpp_j, LARp) | |
463 register word * LARpp_j_1; | |
464 register word * LARpp_j; | |
465 register word * LARp; | |
466 { | |
467 register int i; | |
468 register longword ltmp; | |
469 for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) { | |
470 *LARp = GSM_ADD( SASR( *LARpp_j_1, 1), SASR( *LARpp_j, 1 )); | |
471 } | |
472 } | |
473 | |
474 static void Coefficients_27_39 (LARpp_j_1, LARpp_j, LARp) | |
475 register word * LARpp_j_1; | |
476 register word * LARpp_j; | |
477 register word * LARp; | |
478 { | |
479 register int i; | |
480 register longword ltmp; | |
481 | |
482 for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) { | |
483 *LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 )); | |
484 *LARp = GSM_ADD( *LARp, SASR( *LARpp_j, 1 )); | |
485 } | |
486 } | |
487 | |
488 | |
489 static void Coefficients_40_159 (LARpp_j, LARp) | |
490 register word * LARpp_j; | |
491 register word * LARp; | |
492 { | |
493 register int i; | |
494 | |
495 for (i = 1; i <= 8; i++, LARp++, LARpp_j++) | |
496 *LARp = *LARpp_j; | |
497 } | |
498 /* 4.2.9.2 */ | |
499 | |
500 static void LARp_to_rp (LARp) | |
501 register word * LARp; /* [0..7] IN/OUT */ | |
502 /* | |
503 * The input of this procedure is the interpolated LARp[0..7] array. | |
504 * The reflection coefficients, rp[i], are used in the analysis | |
505 * filter and in the synthesis filter. | |
506 */ | |
507 { | |
508 register int i; | |
509 register word temp; | |
510 register longword ltmp; | |
511 | |
512 for (i = 1; i <= 8; i++, LARp++) { | |
513 | |
514 /* temp = GSM_ABS( *LARp ); | |
515 * | |
516 * if (temp < 11059) temp <<= 1; | |
517 * else if (temp < 20070) temp += 11059; | |
518 * else temp = GSM_ADD( temp >> 2, 26112 ); | |
519 * | |
520 * *LARp = *LARp < 0 ? -temp : temp; | |
521 */ | |
522 | |
523 if (*LARp < 0) { | |
524 temp = *LARp == MIN_WORD ? MAX_WORD : -(*LARp); | |
525 *LARp = - ((temp < 11059) ? temp << 1 | |
526 : ((temp < 20070) ? temp + 11059 | |
527 : GSM_ADD( temp >> 2, 26112 ))); | |
528 } else { | |
529 temp = *LARp; | |
530 *LARp = (temp < 11059) ? temp << 1 | |
531 : ((temp < 20070) ? temp + 11059 | |
532 : GSM_ADD( temp >> 2, 26112 )); | |
533 } | |
534 } | |
535 } | |
536 | |
537 | |
538 | |
539 | |
540 | |
541 /**** */ | |
542 static void Gsm_Short_Term_Synthesis_Filter (S, LARcr, wt, s) | |
543 XA_GSM_STATE * S; | |
544 word * LARcr; /* received log area ratios [0..7] IN */ | |
545 word * wt; /* received d [0..159] IN */ | |
546 word * s; /* signal s [0..159] OUT */ | |
547 { | |
548 word * LARpp_j = S->LARpp[ S->j ]; | |
549 word * LARpp_j_1 = S->LARpp[ S->j ^=1 ]; | |
550 | |
551 word LARp[8]; | |
552 | |
553 #undef FILTER | |
554 #if defined(FAST) && defined(USE_FLOAT_MUL) | |
555 | |
556 # define FILTER (* (S->fast \ | |
557 ? Fast_Short_term_synthesis_filtering \ | |
558 : Short_term_synthesis_filtering )) | |
559 #else | |
560 # define FILTER Short_term_synthesis_filtering | |
561 #endif | |
562 | |
563 Decoding_of_the_coded_Log_Area_Ratios( LARcr, LARpp_j ); | |
564 | |
565 Coefficients_0_12( LARpp_j_1, LARpp_j, LARp ); | |
566 LARp_to_rp( LARp ); | |
567 FILTER( S, LARp, 13, wt, s ); | |
568 | |
569 Coefficients_13_26( LARpp_j_1, LARpp_j, LARp); | |
570 LARp_to_rp( LARp ); | |
571 FILTER( S, LARp, 14, wt + 13, s + 13 ); | |
572 | |
573 Coefficients_27_39( LARpp_j_1, LARpp_j, LARp); | |
574 LARp_to_rp( LARp ); | |
575 FILTER( S, LARp, 13, wt + 27, s + 27 ); | |
576 | |
577 Coefficients_40_159( LARpp_j, LARp ); | |
578 LARp_to_rp( LARp ); | |
579 FILTER(S, LARp, 120, wt + 40, s + 40); | |
580 } | |
581 | |
582 | |
583 | |
584 | |
585 static void GSM_Decode(S,LARcr, Ncr,bcr,Mcr,xmaxcr,xMcr,s) | |
586 XA_GSM_STATE *S; | |
587 word *LARcr; /* [0..7] IN */ | |
588 word *Ncr; /* [0..3] IN */ | |
589 word *bcr; /* [0..3] IN */ | |
590 word *Mcr; /* [0..3] IN */ | |
591 word *xmaxcr; /* [0..3] IN */ | |
592 word *xMcr; /* [0..13*4] IN */ | |
593 word *s; /* [0..159] OUT */ | |
594 { | |
595 int j, k; | |
596 word erp[40], wt[160]; | |
597 word *drp = S->dp0 + 120; | |
598 | |
599 for (j=0; j <= 3; j++, xmaxcr++, bcr++, Ncr++, Mcr++, xMcr += 13) | |
600 { | |
601 Gsm_RPE_Decoding( S, *xmaxcr, *Mcr, xMcr, erp ); | |
602 Gsm_Long_Term_Synthesis_Filtering( S, *Ncr, *bcr, erp, drp ); | |
603 for (k = 0; k <= 39; k++) wt[ j * 40 + k ] = drp[ k ]; | |
604 } | |
605 | |
606 Gsm_Short_Term_Synthesis_Filter( S, LARcr, wt, s ); | |
607 Postprocessing(S, s); | |
608 } | |
609 | |
610 | |
611 | |
612 /****-------------------------------------------------------------------**** | |
613 **** Podlipec: For AVI/WAV files GSM 6.10 combines two 33 bytes frames | |
614 **** into one 65 byte frame. | |
615 ****-------------------------------------------------------------------****/ | |
616 void XA_MSGSM_Decoder(unsigned char *ibuf,unsigned short *obuf) | |
617 { word sr; | |
618 word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4]; | |
619 | |
620 sr = *ibuf++; | |
621 | |
622 LARc[0] = sr & 0x3f; sr >>= 6; | |
623 sr |= (word)*ibuf++ << 2; | |
624 LARc[1] = sr & 0x3f; sr >>= 6; | |
625 sr |= (word)*ibuf++ << 4; | |
626 LARc[2] = sr & 0x1f; sr >>= 5; | |
627 LARc[3] = sr & 0x1f; sr >>= 5; | |
628 sr |= (word)*ibuf++ << 2; | |
629 LARc[4] = sr & 0xf; sr >>= 4; | |
630 LARc[5] = sr & 0xf; sr >>= 4; | |
631 sr |= (word)*ibuf++ << 2; /* 5 */ | |
632 LARc[6] = sr & 0x7; sr >>= 3; | |
633 LARc[7] = sr & 0x7; sr >>= 3; | |
634 sr |= (word)*ibuf++ << 4; | |
635 Nc[0] = sr & 0x7f; sr >>= 7; | |
636 bc[0] = sr & 0x3; sr >>= 2; | |
637 Mc[0] = sr & 0x3; sr >>= 2; | |
638 sr |= (word)*ibuf++ << 1; | |
639 xmaxc[0] = sr & 0x3f; sr >>= 6; | |
640 xmc[0] = sr & 0x7; sr >>= 3; | |
641 sr = *ibuf++; | |
642 xmc[1] = sr & 0x7; sr >>= 3; | |
643 xmc[2] = sr & 0x7; sr >>= 3; | |
644 sr |= (word)*ibuf++ << 2; | |
645 xmc[3] = sr & 0x7; sr >>= 3; | |
646 xmc[4] = sr & 0x7; sr >>= 3; | |
647 xmc[5] = sr & 0x7; sr >>= 3; | |
648 sr |= (word)*ibuf++ << 1; /* 10 */ | |
649 xmc[6] = sr & 0x7; sr >>= 3; | |
650 xmc[7] = sr & 0x7; sr >>= 3; | |
651 xmc[8] = sr & 0x7; sr >>= 3; | |
652 sr = *ibuf++; | |
653 xmc[9] = sr & 0x7; sr >>= 3; | |
654 xmc[10] = sr & 0x7; sr >>= 3; | |
655 sr |= (word)*ibuf++ << 2; | |
656 xmc[11] = sr & 0x7; sr >>= 3; | |
657 xmc[12] = sr & 0x7; sr >>= 3; | |
658 sr |= (word)*ibuf++ << 4; | |
659 Nc[1] = sr & 0x7f; sr >>= 7; | |
660 bc[1] = sr & 0x3; sr >>= 2; | |
661 Mc[1] = sr & 0x3; sr >>= 2; | |
662 sr |= (word)*ibuf++ << 1; | |
663 xmaxc[1] = sr & 0x3f; sr >>= 6; | |
664 xmc[13] = sr & 0x7; sr >>= 3; | |
665 sr = *ibuf++; /* 15 */ | |
666 xmc[14] = sr & 0x7; sr >>= 3; | |
667 xmc[15] = sr & 0x7; sr >>= 3; | |
668 sr |= (word)*ibuf++ << 2; | |
669 xmc[16] = sr & 0x7; sr >>= 3; | |
670 xmc[17] = sr & 0x7; sr >>= 3; | |
671 xmc[18] = sr & 0x7; sr >>= 3; | |
672 sr |= (word)*ibuf++ << 1; | |
673 xmc[19] = sr & 0x7; sr >>= 3; | |
674 xmc[20] = sr & 0x7; sr >>= 3; | |
675 xmc[21] = sr & 0x7; sr >>= 3; | |
676 sr = *ibuf++; | |
677 xmc[22] = sr & 0x7; sr >>= 3; | |
678 xmc[23] = sr & 0x7; sr >>= 3; | |
679 sr |= (word)*ibuf++ << 2; | |
680 xmc[24] = sr & 0x7; sr >>= 3; | |
681 xmc[25] = sr & 0x7; sr >>= 3; | |
682 sr |= (word)*ibuf++ << 4; /* 20 */ | |
683 Nc[2] = sr & 0x7f; sr >>= 7; | |
684 bc[2] = sr & 0x3; sr >>= 2; | |
685 Mc[2] = sr & 0x3; sr >>= 2; | |
686 sr |= (word)*ibuf++ << 1; | |
687 xmaxc[2] = sr & 0x3f; sr >>= 6; | |
688 xmc[26] = sr & 0x7; sr >>= 3; | |
689 sr = *ibuf++; | |
690 xmc[27] = sr & 0x7; sr >>= 3; | |
691 xmc[28] = sr & 0x7; sr >>= 3; | |
692 sr |= (word)*ibuf++ << 2; | |
693 xmc[29] = sr & 0x7; sr >>= 3; | |
694 xmc[30] = sr & 0x7; sr >>= 3; | |
695 xmc[31] = sr & 0x7; sr >>= 3; | |
696 sr |= (word)*ibuf++ << 1; | |
697 xmc[32] = sr & 0x7; sr >>= 3; | |
698 xmc[33] = sr & 0x7; sr >>= 3; | |
699 xmc[34] = sr & 0x7; sr >>= 3; | |
700 sr = *ibuf++; /* 25 */ | |
701 xmc[35] = sr & 0x7; sr >>= 3; | |
702 xmc[36] = sr & 0x7; sr >>= 3; | |
703 sr |= (word)*ibuf++ << 2; | |
704 xmc[37] = sr & 0x7; sr >>= 3; | |
705 xmc[38] = sr & 0x7; sr >>= 3; | |
706 sr |= (word)*ibuf++ << 4; | |
707 Nc[3] = sr & 0x7f; sr >>= 7; | |
708 bc[3] = sr & 0x3; sr >>= 2; | |
709 Mc[3] = sr & 0x3; sr >>= 2; | |
710 sr |= (word)*ibuf++ << 1; | |
711 xmaxc[3] = sr & 0x3f; sr >>= 6; | |
712 xmc[39] = sr & 0x7; sr >>= 3; | |
713 sr = *ibuf++; | |
714 xmc[40] = sr & 0x7; sr >>= 3; | |
715 xmc[41] = sr & 0x7; sr >>= 3; | |
716 sr |= (word)*ibuf++ << 2; /* 30 */ | |
717 xmc[42] = sr & 0x7; sr >>= 3; | |
718 xmc[43] = sr & 0x7; sr >>= 3; | |
719 xmc[44] = sr & 0x7; sr >>= 3; | |
720 sr |= (word)*ibuf++ << 1; | |
721 xmc[45] = sr & 0x7; sr >>= 3; | |
722 xmc[46] = sr & 0x7; sr >>= 3; | |
723 xmc[47] = sr & 0x7; sr >>= 3; | |
724 sr = *ibuf++; | |
725 xmc[48] = sr & 0x7; sr >>= 3; | |
726 xmc[49] = sr & 0x7; sr >>= 3; | |
727 sr |= (word)*ibuf++ << 2; | |
728 xmc[50] = sr & 0x7; sr >>= 3; | |
729 xmc[51] = sr & 0x7; sr >>= 3; | |
730 | |
731 GSM_Decode(&gsm_state, LARc, Nc, bc, Mc, xmaxc, xmc, obuf); | |
732 | |
733 /* | |
734 carry = sr & 0xf; | |
735 sr = carry; | |
736 */ | |
737 /* 2nd frame */ | |
738 sr &= 0xf; | |
739 sr |= (word)*ibuf++ << 4; /* 1 */ | |
740 LARc[0] = sr & 0x3f; sr >>= 6; | |
741 LARc[1] = sr & 0x3f; sr >>= 6; | |
742 sr = *ibuf++; | |
743 LARc[2] = sr & 0x1f; sr >>= 5; | |
744 sr |= (word)*ibuf++ << 3; | |
745 LARc[3] = sr & 0x1f; sr >>= 5; | |
746 LARc[4] = sr & 0xf; sr >>= 4; | |
747 sr |= (word)*ibuf++ << 2; | |
748 LARc[5] = sr & 0xf; sr >>= 4; | |
749 LARc[6] = sr & 0x7; sr >>= 3; | |
750 LARc[7] = sr & 0x7; sr >>= 3; | |
751 sr = *ibuf++; /* 5 */ | |
752 Nc[0] = sr & 0x7f; sr >>= 7; | |
753 sr |= (word)*ibuf++ << 1; | |
754 bc[0] = sr & 0x3; sr >>= 2; | |
755 Mc[0] = sr & 0x3; sr >>= 2; | |
756 sr |= (word)*ibuf++ << 5; | |
757 xmaxc[0] = sr & 0x3f; sr >>= 6; | |
758 xmc[0] = sr & 0x7; sr >>= 3; | |
759 xmc[1] = sr & 0x7; sr >>= 3; | |
760 sr |= (word)*ibuf++ << 1; | |
761 xmc[2] = sr & 0x7; sr >>= 3; | |
762 xmc[3] = sr & 0x7; sr >>= 3; | |
763 xmc[4] = sr & 0x7; sr >>= 3; | |
764 sr = *ibuf++; | |
765 xmc[5] = sr & 0x7; sr >>= 3; | |
766 xmc[6] = sr & 0x7; sr >>= 3; | |
767 sr |= (word)*ibuf++ << 2; /* 10 */ | |
768 xmc[7] = sr & 0x7; sr >>= 3; | |
769 xmc[8] = sr & 0x7; sr >>= 3; | |
770 xmc[9] = sr & 0x7; sr >>= 3; | |
771 sr |= (word)*ibuf++ << 1; | |
772 xmc[10] = sr & 0x7; sr >>= 3; | |
773 xmc[11] = sr & 0x7; sr >>= 3; | |
774 xmc[12] = sr & 0x7; sr >>= 3; | |
775 sr = *ibuf++; | |
776 Nc[1] = sr & 0x7f; sr >>= 7; | |
777 sr |= (word)*ibuf++ << 1; | |
778 bc[1] = sr & 0x3; sr >>= 2; | |
779 Mc[1] = sr & 0x3; sr >>= 2; | |
780 sr |= (word)*ibuf++ << 5; | |
781 xmaxc[1] = sr & 0x3f; sr >>= 6; | |
782 xmc[13] = sr & 0x7; sr >>= 3; | |
783 xmc[14] = sr & 0x7; sr >>= 3; | |
784 sr |= (word)*ibuf++ << 1; /* 15 */ | |
785 xmc[15] = sr & 0x7; sr >>= 3; | |
786 xmc[16] = sr & 0x7; sr >>= 3; | |
787 xmc[17] = sr & 0x7; sr >>= 3; | |
788 sr = *ibuf++; | |
789 xmc[18] = sr & 0x7; sr >>= 3; | |
790 xmc[19] = sr & 0x7; sr >>= 3; | |
791 sr |= (word)*ibuf++ << 2; | |
792 xmc[20] = sr & 0x7; sr >>= 3; | |
793 xmc[21] = sr & 0x7; sr >>= 3; | |
794 xmc[22] = sr & 0x7; sr >>= 3; | |
795 sr |= (word)*ibuf++ << 1; | |
796 xmc[23] = sr & 0x7; sr >>= 3; | |
797 xmc[24] = sr & 0x7; sr >>= 3; | |
798 xmc[25] = sr & 0x7; sr >>= 3; | |
799 sr = *ibuf++; | |
800 Nc[2] = sr & 0x7f; sr >>= 7; | |
801 sr |= (word)*ibuf++ << 1; /* 20 */ | |
802 bc[2] = sr & 0x3; sr >>= 2; | |
803 Mc[2] = sr & 0x3; sr >>= 2; | |
804 sr |= (word)*ibuf++ << 5; | |
805 xmaxc[2] = sr & 0x3f; sr >>= 6; | |
806 xmc[26] = sr & 0x7; sr >>= 3; | |
807 xmc[27] = sr & 0x7; sr >>= 3; | |
808 sr |= (word)*ibuf++ << 1; | |
809 xmc[28] = sr & 0x7; sr >>= 3; | |
810 xmc[29] = sr & 0x7; sr >>= 3; | |
811 xmc[30] = sr & 0x7; sr >>= 3; | |
812 sr = *ibuf++; | |
813 xmc[31] = sr & 0x7; sr >>= 3; | |
814 xmc[32] = sr & 0x7; sr >>= 3; | |
815 sr |= (word)*ibuf++ << 2; | |
816 xmc[33] = sr & 0x7; sr >>= 3; | |
817 xmc[34] = sr & 0x7; sr >>= 3; | |
818 xmc[35] = sr & 0x7; sr >>= 3; | |
819 sr |= (word)*ibuf++ << 1; /* 25 */ | |
820 xmc[36] = sr & 0x7; sr >>= 3; | |
821 xmc[37] = sr & 0x7; sr >>= 3; | |
822 xmc[38] = sr & 0x7; sr >>= 3; | |
823 sr = *ibuf++; | |
824 Nc[3] = sr & 0x7f; sr >>= 7; | |
825 sr |= (word)*ibuf++ << 1; | |
826 bc[3] = sr & 0x3; sr >>= 2; | |
827 Mc[3] = sr & 0x3; sr >>= 2; | |
828 sr |= (word)*ibuf++ << 5; | |
829 xmaxc[3] = sr & 0x3f; sr >>= 6; | |
830 xmc[39] = sr & 0x7; sr >>= 3; | |
831 xmc[40] = sr & 0x7; sr >>= 3; | |
832 sr |= (word)*ibuf++ << 1; | |
833 xmc[41] = sr & 0x7; sr >>= 3; | |
834 xmc[42] = sr & 0x7; sr >>= 3; | |
835 xmc[43] = sr & 0x7; sr >>= 3; | |
836 sr = (word)*ibuf++; /* 30 */ | |
837 xmc[44] = sr & 0x7; sr >>= 3; | |
838 xmc[45] = sr & 0x7; sr >>= 3; | |
839 sr |= (word)*ibuf++ << 2; | |
840 xmc[46] = sr & 0x7; sr >>= 3; | |
841 xmc[47] = sr & 0x7; sr >>= 3; | |
842 xmc[48] = sr & 0x7; sr >>= 3; | |
843 sr |= (word)*ibuf++ << 1; | |
844 xmc[49] = sr & 0x7; sr >>= 3; | |
845 xmc[50] = sr & 0x7; sr >>= 3; | |
846 xmc[51] = sr & 0x7; sr >>= 3; | |
847 | |
848 GSM_Decode(&gsm_state, LARc, Nc, bc, Mc, xmaxc, xmc, &obuf[160]); | |
849 | |
850 /* Return number of source bytes consumed and output samples produced */ | |
851 // *icnt = 65; | |
852 // *ocnt = 320; | |
853 return; | |
854 } | |
855 | |
856 #define GSM_MAGIC 0xd | |
857 | |
858 void XA_GSM_Decoder(unsigned char *ibuf,unsigned short *obuf) | |
859 { word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4]; | |
860 | |
861 /* Sanity */ | |
862 if (((*ibuf >> 4) & 0x0F) != GSM_MAGIC) | |
863 { int i; | |
864 for(i=0;i<160;i++) obuf[i] = 0; | |
865 // *icnt = 33; | |
866 // *ocnt = 160; | |
867 return; | |
868 } | |
869 | |
870 LARc[0] = (*ibuf++ & 0xF) << 2; /* 1 */ | |
871 LARc[0] |= (*ibuf >> 6) & 0x3; | |
872 LARc[1] = *ibuf++ & 0x3F; | |
873 LARc[2] = (*ibuf >> 3) & 0x1F; | |
874 LARc[3] = (*ibuf++ & 0x7) << 2; | |
875 LARc[3] |= (*ibuf >> 6) & 0x3; | |
876 LARc[4] = (*ibuf >> 2) & 0xF; | |
877 LARc[5] = (*ibuf++ & 0x3) << 2; | |
878 LARc[5] |= (*ibuf >> 6) & 0x3; | |
879 LARc[6] = (*ibuf >> 3) & 0x7; | |
880 LARc[7] = *ibuf++ & 0x7; | |
881 | |
882 Nc[0] = (*ibuf >> 1) & 0x7F; | |
883 | |
884 bc[0] = (*ibuf++ & 0x1) << 1; | |
885 bc[0] |= (*ibuf >> 7) & 0x1; | |
886 | |
887 Mc[0] = (*ibuf >> 5) & 0x3; | |
888 | |
889 xmaxc[0] = (*ibuf++ & 0x1F) << 1; | |
890 xmaxc[0] |= (*ibuf >> 7) & 0x1; | |
891 | |
892 xmc[0] = (*ibuf >> 4) & 0x7; | |
893 xmc[1] = (*ibuf >> 1) & 0x7; | |
894 xmc[2] = (*ibuf++ & 0x1) << 2; | |
895 xmc[2] |= (*ibuf >> 6) & 0x3; | |
896 xmc[3] = (*ibuf >> 3) & 0x7; | |
897 xmc[4] = *ibuf++ & 0x7; | |
898 xmc[5] = (*ibuf >> 5) & 0x7; | |
899 xmc[6] = (*ibuf >> 2) & 0x7; | |
900 xmc[7] = (*ibuf++ & 0x3) << 1; /* 10 */ | |
901 xmc[7] |= (*ibuf >> 7) & 0x1; | |
902 xmc[8] = (*ibuf >> 4) & 0x7; | |
903 xmc[9] = (*ibuf >> 1) & 0x7; | |
904 xmc[10] = (*ibuf++ & 0x1) << 2; | |
905 xmc[10] |= (*ibuf >> 6) & 0x3; | |
906 xmc[11] = (*ibuf >> 3) & 0x7; | |
907 xmc[12] = *ibuf++ & 0x7; | |
908 | |
909 Nc[1] = (*ibuf >> 1) & 0x7F; | |
910 | |
911 bc[1] = (*ibuf++ & 0x1) << 1; | |
912 bc[1] |= (*ibuf >> 7) & 0x1; | |
913 | |
914 Mc[1] = (*ibuf >> 5) & 0x3; | |
915 | |
916 xmaxc[1] = (*ibuf++ & 0x1F) << 1; | |
917 xmaxc[1] |= (*ibuf >> 7) & 0x1; | |
918 | |
919 | |
920 xmc[13] = (*ibuf >> 4) & 0x7; | |
921 xmc[14] = (*ibuf >> 1) & 0x7; | |
922 xmc[15] = (*ibuf++ & 0x1) << 2; | |
923 xmc[15] |= (*ibuf >> 6) & 0x3; | |
924 xmc[16] = (*ibuf >> 3) & 0x7; | |
925 xmc[17] = *ibuf++ & 0x7; | |
926 xmc[18] = (*ibuf >> 5) & 0x7; | |
927 xmc[19] = (*ibuf >> 2) & 0x7; | |
928 xmc[20] = (*ibuf++ & 0x3) << 1; | |
929 xmc[20] |= (*ibuf >> 7) & 0x1; | |
930 xmc[21] = (*ibuf >> 4) & 0x7; | |
931 xmc[22] = (*ibuf >> 1) & 0x7; | |
932 xmc[23] = (*ibuf++ & 0x1) << 2; | |
933 xmc[23] |= (*ibuf >> 6) & 0x3; | |
934 xmc[24] = (*ibuf >> 3) & 0x7; | |
935 xmc[25] = *ibuf++ & 0x7; | |
936 | |
937 Nc[2] = (*ibuf >> 1) & 0x7F; | |
938 | |
939 bc[2] = (*ibuf++ & 0x1) << 1; /* 20 */ | |
940 bc[2] |= (*ibuf >> 7) & 0x1; | |
941 | |
942 Mc[2] = (*ibuf >> 5) & 0x3; | |
943 | |
944 xmaxc[2] = (*ibuf++ & 0x1F) << 1; | |
945 xmaxc[2] |= (*ibuf >> 7) & 0x1; | |
946 | |
947 | |
948 xmc[26] = (*ibuf >> 4) & 0x7; | |
949 xmc[27] = (*ibuf >> 1) & 0x7; | |
950 xmc[28] = (*ibuf++ & 0x1) << 2; | |
951 xmc[28] |= (*ibuf >> 6) & 0x3; | |
952 xmc[29] = (*ibuf >> 3) & 0x7; | |
953 xmc[30] = *ibuf++ & 0x7; | |
954 xmc[31] = (*ibuf >> 5) & 0x7; | |
955 xmc[32] = (*ibuf >> 2) & 0x7; | |
956 xmc[33] = (*ibuf++ & 0x3) << 1; | |
957 xmc[33] |= (*ibuf >> 7) & 0x1; | |
958 xmc[34] = (*ibuf >> 4) & 0x7; | |
959 xmc[35] = (*ibuf >> 1) & 0x7; | |
960 xmc[36] = (*ibuf++ & 0x1) << 2; | |
961 xmc[36] |= (*ibuf >> 6) & 0x3; | |
962 xmc[37] = (*ibuf >> 3) & 0x7; | |
963 xmc[38] = *ibuf++ & 0x7; | |
964 | |
965 Nc[3] = (*ibuf >> 1) & 0x7F; | |
966 | |
967 bc[3] = (*ibuf++ & 0x1) << 1; | |
968 bc[3] |= (*ibuf >> 7) & 0x1; | |
969 | |
970 Mc[3] = (*ibuf >> 5) & 0x3; | |
971 | |
972 xmaxc[3] = (*ibuf++ & 0x1F) << 1; | |
973 xmaxc[3] |= (*ibuf >> 7) & 0x1; | |
974 | |
975 xmc[39] = (*ibuf >> 4) & 0x7; | |
976 xmc[40] = (*ibuf >> 1) & 0x7; | |
977 xmc[41] = (*ibuf++ & 0x1) << 2; | |
978 xmc[41] |= (*ibuf >> 6) & 0x3; | |
979 xmc[42] = (*ibuf >> 3) & 0x7; | |
980 xmc[43] = *ibuf++ & 0x7; /* 30 */ | |
981 xmc[44] = (*ibuf >> 5) & 0x7; | |
982 xmc[45] = (*ibuf >> 2) & 0x7; | |
983 xmc[46] = (*ibuf++ & 0x3) << 1; | |
984 xmc[46] |= (*ibuf >> 7) & 0x1; | |
985 xmc[47] = (*ibuf >> 4) & 0x7; | |
986 xmc[48] = (*ibuf >> 1) & 0x7; | |
987 xmc[49] = (*ibuf++ & 0x1) << 2; | |
988 xmc[49] |= (*ibuf >> 6) & 0x3; | |
989 xmc[50] = (*ibuf >> 3) & 0x7; | |
990 xmc[51] = *ibuf & 0x7; /* 33 */ | |
991 | |
992 GSM_Decode(&gsm_state, LARc, Nc, bc, Mc, xmaxc, xmc, obuf); | |
993 | |
994 /* Return number of source bytes consumed and output samples produced */ | |
995 // *icnt = 33; | |
996 // *ocnt = 160; | |
997 } |