Mercurial > audlegacy
comparison Input/mpg123/layer3.c @ 0:cb178e5ad177 trunk
[svn] Import audacious source.
author | nenolod |
---|---|
date | Mon, 24 Oct 2005 03:06:47 -0700 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:cb178e5ad177 |
---|---|
1 | |
2 /* | |
3 * Mpeg Layer-3 audio decoder | |
4 * -------------------------- | |
5 * copyright (c) 1995-1999 by Michael Hipp. | |
6 * All rights reserved. See also 'README' | |
7 * | |
8 * Optimize-TODO: put short bands into the band-field without the stride of 3 reals | |
9 * Length-optimze: unify long and short band code where it is possible | |
10 */ | |
11 | |
12 #include <stdlib.h> | |
13 #include <math.h> | |
14 | |
15 #include "audacious/output.h" | |
16 | |
17 #include "mpg123.h" | |
18 #include "huffman.h" | |
19 #include "getbits.h" | |
20 | |
21 | |
22 static real ispow[8207]; | |
23 static real aa_ca[8], aa_cs[8]; | |
24 static real COS1[12][6]; | |
25 static real win[4][36]; | |
26 static real win1[4][36]; | |
27 static real gainpow2[256 + 118 + 4]; | |
28 real COS9[9]; | |
29 static real COS6_1, COS6_2; | |
30 real tfcos36[9]; | |
31 static real tfcos12[3]; | |
32 #define NEW_DCT9 | |
33 #ifdef NEW_DCT9 | |
34 static real cos9[3], cos18[3]; | |
35 #endif | |
36 | |
37 #ifdef USE_SIMD | |
38 # define DCT36 (fr->dct36) | |
39 #else | |
40 # define DCT36 mpg123_dct36 | |
41 #endif | |
42 | |
43 struct bandInfoStruct { | |
44 int longIdx[23]; | |
45 int longDiff[22]; | |
46 int shortIdx[14]; | |
47 int shortDiff[13]; | |
48 }; | |
49 | |
50 int longLimit[9][23]; | |
51 int shortLimit[9][14]; | |
52 | |
53 /* Used by the getbits macros */ | |
54 static unsigned long rval; | |
55 static unsigned char rval_uc; | |
56 | |
57 struct bandInfoStruct bandInfo[9] = { | |
58 /* MPEG 1.0 */ | |
59 {{0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90, 110, 134, 162, | |
60 196, 238, 288, 342, 418, 576}, | |
61 {4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10, 12, 16, 20, 24, 28, 34, 42, 50, 54, | |
62 76, 158}, | |
63 {0, 4 * 3, 8 * 3, 12 * 3, 16 * 3, 22 * 3, 30 * 3, 40 * 3, 52 * 3, | |
64 66 * 3, 84 * 3, 106 * 3, 136 * 3, 192 * 3}, | |
65 {4, 4, 4, 4, 6, 8, 10, 12, 14, 18, 22, 30, 56}}, | |
66 | |
67 {{0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, 72, 88, 106, 128, 156, | |
68 190, 230, 276, 330, 384, 576}, | |
69 {4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10, 12, 16, 18, 22, 28, 34, 40, 46, 54, | |
70 54, 192}, | |
71 {0, 4 * 3, 8 * 3, 12 * 3, 16 * 3, 22 * 3, 28 * 3, 38 * 3, 50 * 3, | |
72 64 * 3, 80 * 3, 100 * 3, 126 * 3, 192 * 3}, | |
73 {4, 4, 4, 4, 6, 6, 10, 12, 14, 16, 20, 26, 66}}, | |
74 | |
75 {{0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, 82, 102, 126, 156, 194, | |
76 240, 296, 364, 448, 550, 576}, | |
77 {4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12, 16, 20, 24, 30, 38, 46, 56, 68, | |
78 84, 102, 26}, | |
79 {0, 4 * 3, 8 * 3, 12 * 3, 16 * 3, 22 * 3, 30 * 3, 42 * 3, 58 * 3, | |
80 78 * 3, 104 * 3, 138 * 3, 180 * 3, 192 * 3}, | |
81 {4, 4, 4, 4, 6, 8, 12, 16, 20, 26, 34, 42, 12}}, | |
82 | |
83 /* MPEG 2.0 */ | |
84 {{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, | |
85 238, 284, 336, 396, 464, 522, 576}, | |
86 {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60, | |
87 68, 58, 54}, | |
88 {0, 4 * 3, 8 * 3, 12 * 3, 18 * 3, 24 * 3, 32 * 3, 42 * 3, 56 * 3, | |
89 74 * 3, 100 * 3, 132 * 3, 174 * 3, 192 * 3}, | |
90 {4, 4, 4, 6, 6, 8, 10, 14, 18, 26, 32, 42, 18}}, | |
91 /* | |
92 { {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576}, | |
93 {6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,52,64,70,76,36 } , | |
94 */ | |
95 /* changed 19th value fropm 330 to 332 */ | |
96 {{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 114, 136, 162, 194, | |
97 232, 278, 332, 394, 464, 540, 576}, | |
98 {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 18, 22, 26, 32, 38, 46, 54, 62, | |
99 70, 76, 36}, | |
100 {0, 4 * 3, 8 * 3, 12 * 3, 18 * 3, 26 * 3, 36 * 3, 48 * 3, 62 * 3, | |
101 80 * 3, 104 * 3, 136 * 3, 180 * 3, 192 * 3}, | |
102 {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 32, 44, 12}}, | |
103 | |
104 {{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, | |
105 238, 284, 336, 396, 464, 522, 576}, | |
106 {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60, | |
107 68, 58, 54}, | |
108 {0, 4 * 3, 8 * 3, 12 * 3, 18 * 3, 26 * 3, 36 * 3, 48 * 3, 62 * 3, | |
109 80 * 3, 104 * 3, 134 * 3, 174 * 3, 192 * 3}, | |
110 {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18}}, | |
111 /* MPEG 2.5 */ | |
112 {{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, | |
113 238, 284, 336, 396, 464, 522, 576}, | |
114 {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60, | |
115 68, 58, 54}, | |
116 {0, 12, 24, 36, 54, 78, 108, 144, 186, 240, 312, 402, 522, 576}, | |
117 {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18}}, | |
118 {{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, | |
119 238, 284, 336, 396, 464, 522, 576}, | |
120 {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60, | |
121 68, 58, 54}, | |
122 {0, 12, 24, 36, 54, 78, 108, 144, 186, 240, 312, 402, 522, 576}, | |
123 {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18}}, | |
124 {{0, 12, 24, 36, 48, 60, 72, 88, 108, 132, 160, 192, 232, 280, 336, | |
125 400, 476, 566, 568, 570, 572, 574, 576}, | |
126 {12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 76, 90, | |
127 2, 2, 2, 2, 2}, | |
128 {0, 24, 48, 72, 108, 156, 216, 288, 372, 480, 486, 492, 498, 576}, | |
129 {8, 8, 8, 12, 16, 20, 24, 28, 36, 2, 2, 2, 26}}, | |
130 }; | |
131 | |
132 static int mapbuf0[9][152]; | |
133 static int mapbuf1[9][156]; | |
134 static int mapbuf2[9][44]; | |
135 static int *map[9][3]; | |
136 static int *mapend[9][3]; | |
137 | |
138 static unsigned int n_slen2[512]; /* MPEG 2.0 slen for 'normal' mode */ | |
139 static unsigned int i_slen2[256]; /* MPEG 2.0 slen for intensity stereo */ | |
140 | |
141 static real tan1_1[16], tan2_1[16], tan1_2[16], tan2_2[16]; | |
142 static real pow1_1[2][16], pow2_1[2][16], pow1_2[2][16], pow2_2[2][16]; | |
143 | |
144 /* | |
145 * init tables for layer-3 | |
146 */ | |
147 void | |
148 mpg123_init_layer3(int down_sample_sblimit) | |
149 { | |
150 int i, j, k, l; | |
151 | |
152 for (i = -256; i < 118 + 4; i++) | |
153 gainpow2[i + 256] = pow((double) 2.0, -0.25 * (double) (i + 210)); | |
154 for (i = 0; i < 8207; i++) | |
155 ispow[i] = pow((double) i, (double) 4.0 / 3.0); | |
156 | |
157 for (i = 0; i < 8; i++) { | |
158 static double Ci[8] = | |
159 { -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, | |
160 -0.0037 | |
161 }; | |
162 double sq = sqrt(1.0 + Ci[i] * Ci[i]); | |
163 | |
164 aa_cs[i] = 1.0 / sq; | |
165 aa_ca[i] = Ci[i] / sq; | |
166 } | |
167 | |
168 for (i = 0; i < 18; i++) { | |
169 win[0][i] = win[1][i] = | |
170 0.5 * sin(M_PI / 72.0 * (double) (2 * (i + 0) + 1)) / | |
171 cos(M_PI * (double) (2 * (i + 0) + 19) / 72.0); | |
172 win[0][i + 18] = win[3][i + 18] = | |
173 0.5 * sin(M_PI / 72.0 * (double) (2 * (i + 18) + 1)) / | |
174 cos(M_PI * (double) (2 * (i + 18) + 19) / 72.0); | |
175 } | |
176 for (i = 0; i < 6; i++) { | |
177 win[1][i + 18] = | |
178 0.5 / cos(M_PI * (double) (2 * (i + 18) + 19) / 72.0); | |
179 win[3][i + 12] = | |
180 0.5 / cos(M_PI * (double) (2 * (i + 12) + 19) / 72.0); | |
181 win[1][i + 24] = | |
182 0.5 * sin(M_PI / 24.0 * (double) (2 * i + 13)) / cos(M_PI * | |
183 (double) | |
184 (2 * | |
185 (i + | |
186 24) + | |
187 19) / 72.0); | |
188 win[1][i + 30] = win[3][i] = 0.0; | |
189 win[3][i + 6] = | |
190 0.5 * sin(M_PI / 24.0 * (double) (2 * i + 1)) / cos(M_PI * | |
191 (double) (2 | |
192 * | |
193 (i | |
194 + | |
195 6) | |
196 + | |
197 19) | |
198 / 72.0); | |
199 } | |
200 | |
201 for (i = 0; i < 9; i++) | |
202 COS9[i] = cos(M_PI / 18.0 * (double) i); | |
203 | |
204 for (i = 0; i < 9; i++) | |
205 tfcos36[i] = 0.5 / cos(M_PI * (double) (i * 2 + 1) / 36.0); | |
206 for (i = 0; i < 3; i++) | |
207 tfcos12[i] = 0.5 / cos(M_PI * (double) (i * 2 + 1) / 12.0); | |
208 | |
209 COS6_1 = cos(M_PI / 6.0 * (double) 1); | |
210 COS6_2 = cos(M_PI / 6.0 * (double) 2); | |
211 | |
212 #ifdef NEW_DCT9 | |
213 cos9[0] = cos(1.0 * M_PI / 9.0); | |
214 cos9[1] = cos(5.0 * M_PI / 9.0); | |
215 cos9[2] = cos(7.0 * M_PI / 9.0); | |
216 cos18[0] = cos(1.0 * M_PI / 18.0); | |
217 cos18[1] = cos(11.0 * M_PI / 18.0); | |
218 cos18[2] = cos(13.0 * M_PI / 18.0); | |
219 #endif | |
220 | |
221 for (i = 0; i < 12; i++) { | |
222 win[2][i] = | |
223 0.5 * sin(M_PI / 24.0 * (double) (2 * i + 1)) / cos(M_PI * | |
224 (double) (2 | |
225 * | |
226 i | |
227 + 7) | |
228 / 24.0); | |
229 for (j = 0; j < 6; j++) | |
230 COS1[i][j] = | |
231 cos(M_PI / 24.0 * (double) ((2 * i + 7) * (2 * j + 1))); | |
232 } | |
233 | |
234 for (j = 0; j < 4; j++) { | |
235 static int len[4] = { 36, 36, 12, 36 }; | |
236 | |
237 for (i = 0; i < len[j]; i += 2) | |
238 win1[j][i] = +win[j][i]; | |
239 for (i = 1; i < len[j]; i += 2) | |
240 win1[j][i] = -win[j][i]; | |
241 } | |
242 | |
243 for (i = 0; i < 16; i++) { | |
244 double t = tan((double) i * M_PI / 12.0); | |
245 | |
246 tan1_1[i] = t / (1.0 + t); | |
247 tan2_1[i] = 1.0 / (1.0 + t); | |
248 tan1_2[i] = M_SQRT2 * t / (1.0 + t); | |
249 tan2_2[i] = M_SQRT2 / (1.0 + t); | |
250 | |
251 for (j = 0; j < 2; j++) { | |
252 double base = pow(2.0, -0.25 * (j + 1.0)); | |
253 double p1 = 1.0, p2 = 1.0; | |
254 | |
255 if (i > 0) { | |
256 if (i & 1) | |
257 p1 = pow(base, (i + 1.0) * 0.5); | |
258 else | |
259 p2 = pow(base, i * 0.5); | |
260 } | |
261 pow1_1[j][i] = p1; | |
262 pow2_1[j][i] = p2; | |
263 pow1_2[j][i] = M_SQRT2 * p1; | |
264 pow2_2[j][i] = M_SQRT2 * p2; | |
265 } | |
266 } | |
267 | |
268 for (j = 0; j < 9; j++) { | |
269 struct bandInfoStruct *bi = &bandInfo[j]; | |
270 int *mp; | |
271 int cb, lwin; | |
272 int *bdf; | |
273 | |
274 mp = map[j][0] = mapbuf0[j]; | |
275 bdf = bi->longDiff; | |
276 for (i = 0, cb = 0; cb < 8; cb++, i += *bdf++) { | |
277 *mp++ = (*bdf) >> 1; | |
278 *mp++ = i; | |
279 *mp++ = 3; | |
280 *mp++ = cb; | |
281 } | |
282 bdf = bi->shortDiff + 3; | |
283 for (cb = 3; cb < 13; cb++) { | |
284 int l = (*bdf++) >> 1; | |
285 | |
286 for (lwin = 0; lwin < 3; lwin++) { | |
287 *mp++ = l; | |
288 *mp++ = i + lwin; | |
289 *mp++ = lwin; | |
290 *mp++ = cb; | |
291 } | |
292 i += 6 * l; | |
293 } | |
294 mapend[j][0] = mp; | |
295 | |
296 mp = map[j][1] = mapbuf1[j]; | |
297 bdf = bi->shortDiff + 0; | |
298 for (i = 0, cb = 0; cb < 13; cb++) { | |
299 int l = (*bdf++) >> 1; | |
300 | |
301 for (lwin = 0; lwin < 3; lwin++) { | |
302 *mp++ = l; | |
303 *mp++ = i + lwin; | |
304 *mp++ = lwin; | |
305 *mp++ = cb; | |
306 } | |
307 i += 6 * l; | |
308 } | |
309 mapend[j][1] = mp; | |
310 | |
311 mp = map[j][2] = mapbuf2[j]; | |
312 bdf = bi->longDiff; | |
313 for (cb = 0; cb < 22; cb++) { | |
314 *mp++ = (*bdf++) >> 1; | |
315 *mp++ = cb; | |
316 } | |
317 mapend[j][2] = mp; | |
318 | |
319 } | |
320 | |
321 for (j = 0; j < 9; j++) { | |
322 for (i = 0; i < 23; i++) { | |
323 longLimit[j][i] = (bandInfo[j].longIdx[i] - 1 + 8) / 18 + 1; | |
324 if (longLimit[j][i] > (down_sample_sblimit)) | |
325 longLimit[j][i] = down_sample_sblimit; | |
326 } | |
327 for (i = 0; i < 14; i++) { | |
328 shortLimit[j][i] = (bandInfo[j].shortIdx[i] - 1) / 18 + 1; | |
329 if (shortLimit[j][i] > (down_sample_sblimit)) | |
330 shortLimit[j][i] = down_sample_sblimit; | |
331 } | |
332 } | |
333 | |
334 for (i = 0; i < 5; i++) { | |
335 for (j = 0; j < 6; j++) { | |
336 for (k = 0; k < 6; k++) { | |
337 int n = k + j * 6 + i * 36; | |
338 | |
339 i_slen2[n] = i | (j << 3) | (k << 6) | (3 << 12); | |
340 } | |
341 } | |
342 } | |
343 for (i = 0; i < 4; i++) { | |
344 for (j = 0; j < 4; j++) { | |
345 for (k = 0; k < 4; k++) { | |
346 int n = k + j * 4 + i * 16; | |
347 | |
348 i_slen2[n + 180] = i | (j << 3) | (k << 6) | (4 << 12); | |
349 } | |
350 } | |
351 } | |
352 for (i = 0; i < 4; i++) { | |
353 for (j = 0; j < 3; j++) { | |
354 int n = j + i * 3; | |
355 | |
356 i_slen2[n + 244] = i | (j << 3) | (5 << 12); | |
357 n_slen2[n + 500] = i | (j << 3) | (2 << 12) | (1 << 15); | |
358 } | |
359 } | |
360 | |
361 for (i = 0; i < 5; i++) { | |
362 for (j = 0; j < 5; j++) { | |
363 for (k = 0; k < 4; k++) { | |
364 for (l = 0; l < 4; l++) { | |
365 int n = l + k * 4 + j * 16 + i * 80; | |
366 | |
367 n_slen2[n] = | |
368 i | (j << 3) | (k << 6) | (l << 9) | (0 << 12); | |
369 } | |
370 } | |
371 } | |
372 } | |
373 for (i = 0; i < 5; i++) { | |
374 for (j = 0; j < 5; j++) { | |
375 for (k = 0; k < 4; k++) { | |
376 int n = k + j * 4 + i * 20; | |
377 | |
378 n_slen2[n + 400] = i | (j << 3) | (k << 6) | (1 << 12); | |
379 } | |
380 } | |
381 } | |
382 } | |
383 | |
384 /* | |
385 * read additional side information (for MPEG 1 and MPEG 2) | |
386 */ | |
387 static int | |
388 III_get_side_info(struct III_sideinfo *si, int stereo, | |
389 int ms_stereo, long sfreq, int single, int lsf) | |
390 { | |
391 int ch, gr; | |
392 int powdiff = (single == 3) ? 4 : 0; | |
393 | |
394 static const int tabs[2][5] = { {2, 9, 5, 3, 4}, {1, 8, 1, 2, 9} }; | |
395 const int *tab = tabs[lsf]; | |
396 | |
397 si->main_data_begin = mpg123_getbits(tab[1]); | |
398 if (stereo == 1) | |
399 si->private_bits = mpg123_getbits_fast(tab[2]); | |
400 else | |
401 si->private_bits = mpg123_getbits_fast(tab[3]); | |
402 | |
403 if (!lsf) { | |
404 for (ch = 0; ch < stereo; ch++) { | |
405 si->ch[ch].gr[0].scfsi = -1; | |
406 si->ch[ch].gr[1].scfsi = mpg123_getbits_fast(4); | |
407 } | |
408 } | |
409 | |
410 for (gr = 0; gr < tab[0]; gr++) { | |
411 for (ch = 0; ch < stereo; ch++) { | |
412 register struct gr_info_s *gr_info = &(si->ch[ch].gr[gr]); | |
413 | |
414 gr_info->part2_3_length = mpg123_getbits(12); | |
415 gr_info->big_values = mpg123_getbits(9); | |
416 if (gr_info->big_values > 288) { | |
417 /* fprintf(stderr, "big_values too large!\n"); */ | |
418 /* gr_info->big_values = 288; */ | |
419 return 0; | |
420 } | |
421 gr_info->pow2gain = | |
422 gainpow2 + 256 - mpg123_getbits_fast(8) + powdiff; | |
423 if (ms_stereo) | |
424 gr_info->pow2gain += 2; | |
425 gr_info->scalefac_compress = mpg123_getbits(tab[4]); | |
426 | |
427 if (mpg123_get1bit()) { /* window switch flag */ | |
428 int i; | |
429 | |
430 gr_info->block_type = mpg123_getbits_fast(2); | |
431 gr_info->mixed_block_flag = mpg123_get1bit(); | |
432 gr_info->table_select[0] = mpg123_getbits_fast(5); | |
433 gr_info->table_select[1] = mpg123_getbits_fast(5); | |
434 /* | |
435 * table_select[2] not needed, because | |
436 * there is no region2, but to satisfy | |
437 * some verifications tools we set it | |
438 * either. | |
439 */ | |
440 gr_info->table_select[2] = 0; | |
441 for (i = 0; i < 3; i++) | |
442 gr_info->full_gain[i] = | |
443 gr_info->pow2gain + (mpg123_getbits_fast(3) << 3); | |
444 | |
445 if (gr_info->block_type == 0) { | |
446 /* fprintf(stderr, "Blocktype == 0 and window-switching == 1 not allowed.\n"); */ | |
447 /* exit(1); */ | |
448 return 0; | |
449 } | |
450 | |
451 /* region_count/start parameters are implicit in this case. */ | |
452 if (!lsf || gr_info->block_type == 2) | |
453 gr_info->region1start = 36 >> 1; | |
454 else { | |
455 /* check this again for 2.5 and sfreq=8 */ | |
456 if (sfreq == 8) | |
457 gr_info->region1start = 108 >> 1; | |
458 else | |
459 gr_info->region1start = 54 >> 1; | |
460 } | |
461 gr_info->region2start = 576 >> 1; | |
462 } | |
463 else { | |
464 int i, r0c, r1c; | |
465 | |
466 for (i = 0; i < 3; i++) | |
467 gr_info->table_select[i] = mpg123_getbits_fast(5); | |
468 r0c = mpg123_getbits_fast(4); | |
469 r1c = mpg123_getbits_fast(3); | |
470 gr_info->region1start = bandInfo[sfreq].longIdx[r0c + 1] >> 1; | |
471 if (r0c + r1c + 2 > 22) | |
472 gr_info->region2start = 576 >> 1; | |
473 else | |
474 gr_info->region2start = | |
475 bandInfo[sfreq].longIdx[r0c + 1 + r1c + 1] >> 1; | |
476 gr_info->block_type = 0; | |
477 gr_info->mixed_block_flag = 0; | |
478 } | |
479 if (!lsf) | |
480 gr_info->preflag = mpg123_get1bit(); | |
481 gr_info->scalefac_scale = mpg123_get1bit(); | |
482 gr_info->count1table_select = mpg123_get1bit(); | |
483 } | |
484 } | |
485 return 1; | |
486 } | |
487 | |
488 | |
489 /* | |
490 * read scalefactors | |
491 */ | |
492 static int | |
493 III_get_scale_factors_1(int *scf, struct gr_info_s *gr_info) | |
494 { | |
495 static const unsigned char slen[2][16] = { | |
496 {0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4}, | |
497 {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3} | |
498 }; | |
499 int numbits; | |
500 int num0 = slen[0][gr_info->scalefac_compress]; | |
501 int num1 = slen[1][gr_info->scalefac_compress]; | |
502 | |
503 if (gr_info->block_type == 2) { | |
504 int i = 18; | |
505 | |
506 numbits = (num0 + num1) * 18; | |
507 | |
508 if (gr_info->mixed_block_flag) { | |
509 for (i = 8; i; i--) | |
510 *scf++ = mpg123_getbits_fast(num0); | |
511 i = 9; | |
512 numbits -= num0; /* num0 * 17 + num1 * 18 */ | |
513 } | |
514 | |
515 for (; i; i--) | |
516 *scf++ = mpg123_getbits_fast(num0); | |
517 for (i = 18; i; i--) | |
518 *scf++ = mpg123_getbits_fast(num1); | |
519 *scf++ = 0; | |
520 *scf++ = 0; | |
521 *scf++ = 0; /* short[13][0..2] = 0 */ | |
522 } | |
523 else { | |
524 int i; | |
525 int scfsi = gr_info->scfsi; | |
526 | |
527 if (scfsi < 0) { /* scfsi < 0 => granule == 0 */ | |
528 for (i = 11; i; i--) | |
529 *scf++ = mpg123_getbits_fast(num0); | |
530 for (i = 10; i; i--) | |
531 *scf++ = mpg123_getbits_fast(num1); | |
532 numbits = (num0 + num1) * 10 + num0; | |
533 *scf++ = 0; | |
534 } | |
535 else { | |
536 numbits = 0; | |
537 if (!(scfsi & 0x8)) { | |
538 for (i = 0; i < 6; i++) | |
539 *scf++ = mpg123_getbits_fast(num0); | |
540 numbits += num0 * 6; | |
541 } | |
542 else { | |
543 scf += 6; | |
544 } | |
545 | |
546 if (!(scfsi & 0x4)) { | |
547 for (i = 0; i < 5; i++) | |
548 *scf++ = mpg123_getbits_fast(num0); | |
549 numbits += num0 * 5; | |
550 } | |
551 else { | |
552 scf += 5; | |
553 } | |
554 | |
555 if (!(scfsi & 0x2)) { | |
556 for (i = 0; i < 5; i++) | |
557 *scf++ = mpg123_getbits_fast(num1); | |
558 numbits += num1 * 5; | |
559 } | |
560 else { | |
561 scf += 5; | |
562 } | |
563 | |
564 if (!(scfsi & 0x1)) { | |
565 for (i = 0; i < 5; i++) | |
566 *scf++ = mpg123_getbits_fast(num1); | |
567 numbits += num1 * 5; | |
568 } | |
569 else { | |
570 scf += 5; | |
571 } | |
572 *scf++ = 0; /* no l[21] in original sources */ | |
573 } | |
574 } | |
575 return numbits; | |
576 } | |
577 | |
578 static int | |
579 III_get_scale_factors_2(int *scf, struct gr_info_s *gr_info, int i_stereo) | |
580 { | |
581 unsigned char *pnt; | |
582 int i, j, n = 0, numbits = 0; | |
583 unsigned int slen; | |
584 | |
585 static unsigned char stab[3][6][4] = { | |
586 {{6, 5, 5, 5}, {6, 5, 7, 3}, {11, 10, 0, 0}, | |
587 {7, 7, 7, 0}, {6, 6, 6, 3}, {8, 8, 5, 0}}, | |
588 {{9, 9, 9, 9}, {9, 9, 12, 6}, {18, 18, 0, 0}, | |
589 {12, 12, 12, 0}, {12, 9, 9, 6}, {15, 12, 9, 0}}, | |
590 {{6, 9, 9, 9}, {6, 9, 12, 6}, {15, 18, 0, 0}, | |
591 {6, 15, 12, 0}, {6, 12, 9, 6}, {6, 18, 9, 0}} | |
592 }; | |
593 | |
594 if (i_stereo) /* i_stereo AND second channel -> mpg123_do_layer3() checks this */ | |
595 slen = i_slen2[gr_info->scalefac_compress >> 1]; | |
596 else | |
597 slen = n_slen2[gr_info->scalefac_compress]; | |
598 | |
599 gr_info->preflag = (slen >> 15) & 0x1; | |
600 | |
601 n = 0; | |
602 if (gr_info->block_type == 2) { | |
603 n++; | |
604 if (gr_info->mixed_block_flag) | |
605 n++; | |
606 } | |
607 | |
608 pnt = stab[n][(slen >> 12) & 0x7]; | |
609 | |
610 for (i = 0; i < 4; i++) { | |
611 int num = slen & 0x7; | |
612 | |
613 slen >>= 3; | |
614 if (num) { | |
615 for (j = 0; j < (int) (pnt[i]); j++) | |
616 *scf++ = mpg123_getbits_fast(num); | |
617 numbits += pnt[i] * num; | |
618 } | |
619 else { | |
620 for (j = 0; j < (int) (pnt[i]); j++) | |
621 *scf++ = 0; | |
622 } | |
623 } | |
624 | |
625 n = (n << 1) + 1; | |
626 for (i = 0; i < n; i++) | |
627 *scf++ = 0; | |
628 | |
629 return numbits; | |
630 } | |
631 | |
632 static int pretab1[22] = | |
633 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 }; | |
634 static int pretab2[22] = | |
635 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; | |
636 | |
637 /* | |
638 * Dequantize samples (includes huffman decoding) | |
639 */ | |
640 /* 24 is enough because tab13 has max. a 19 bit huffvector */ | |
641 #define BITSHIFT ((sizeof (long) - 1) * 8) | |
642 | |
643 #define REFRESH_MASK() \ | |
644 while(num < BITSHIFT) { \ | |
645 mask |= ((unsigned long)mpg123_getbyte()) << (BITSHIFT - num); \ | |
646 num += 8; \ | |
647 part2remain -= 8; \ | |
648 } | |
649 | |
650 static int | |
651 III_dequantize_sample(real xr[SBLIMIT][SSLIMIT], int *scf, | |
652 struct gr_info_s *gr_info, int sfreq, int part2bits) | |
653 { | |
654 int shift = 1 + gr_info->scalefac_scale; | |
655 real *xrpnt = (real *) xr; | |
656 int l[3], l3; | |
657 int part2remain = gr_info->part2_3_length - part2bits; | |
658 int *me; | |
659 | |
660 int num = mpg123_getbitoffset(); | |
661 long mask; | |
662 /* we must split this, because for num==0 the shift is undefined if you do it in one step */ | |
663 mask = ((unsigned long) mpg123_getbits(num)) << BITSHIFT; | |
664 mask <<= 8 - num; | |
665 part2remain -= num; | |
666 | |
667 { | |
668 int bv = gr_info->big_values; | |
669 int region1 = gr_info->region1start; | |
670 int region2 = gr_info->region2start; | |
671 | |
672 l3 = ((576 >> 1) - bv) >> 1; | |
673 /* | |
674 * we may lose the 'odd' bit here !! | |
675 * check this later again | |
676 */ | |
677 if (bv <= region1) { | |
678 l[0] = bv; | |
679 l[1] = 0; | |
680 l[2] = 0; | |
681 } | |
682 else { | |
683 l[0] = region1; | |
684 if (bv <= region2) { | |
685 l[1] = bv - l[0]; | |
686 l[2] = 0; | |
687 } | |
688 else { | |
689 l[1] = region2 - l[0]; | |
690 l[2] = bv - region2; | |
691 } | |
692 } | |
693 } | |
694 | |
695 if (gr_info->block_type == 2) { | |
696 /* | |
697 * decoding with short or mixed mode BandIndex table | |
698 */ | |
699 int i, max[4]; | |
700 int step = 0, lwin = 3, cb = 0; | |
701 register real v = 0.0; | |
702 register int *m, mc; | |
703 | |
704 if (gr_info->mixed_block_flag) { | |
705 max[3] = -1; | |
706 max[0] = max[1] = max[2] = 2; | |
707 m = map[sfreq][0]; | |
708 me = mapend[sfreq][0]; | |
709 } | |
710 else { | |
711 max[0] = max[1] = max[2] = max[3] = -1; | |
712 /* max[3] not really needed in this case */ | |
713 m = map[sfreq][1]; | |
714 me = mapend[sfreq][1]; | |
715 } | |
716 | |
717 mc = 0; | |
718 for (i = 0; i < 2; i++) { | |
719 int lp = l[i]; | |
720 struct newhuff *h = ht + gr_info->table_select[i]; | |
721 | |
722 for (; lp; lp--, mc--) { | |
723 register int x, y; | |
724 if ((!mc)) { | |
725 mc = *m++; | |
726 xrpnt = ((real *) xr) + (*m++); | |
727 lwin = *m++; | |
728 cb = *m++; | |
729 if (lwin == 3) { | |
730 v = gr_info->pow2gain[(*scf++) << shift]; | |
731 step = 1; | |
732 } | |
733 else { | |
734 v = gr_info->full_gain[lwin][(*scf++) << shift]; | |
735 step = 3; | |
736 } | |
737 } | |
738 { | |
739 register short *val = h->table; | |
740 | |
741 REFRESH_MASK(); | |
742 while ((y = *val++) < 0) { | |
743 if (mask < 0) | |
744 val -= y; | |
745 num--; | |
746 mask <<= 1; | |
747 } | |
748 x = y >> 4; | |
749 y &= 0xf; | |
750 } | |
751 if (x == 15 && h->linbits) { | |
752 max[lwin] = cb; | |
753 REFRESH_MASK(); | |
754 x += ((unsigned long) mask) >> (BITSHIFT + 8 - | |
755 h->linbits); | |
756 num -= h->linbits + 1; | |
757 mask <<= h->linbits; | |
758 if (mask < 0) | |
759 *xrpnt = -ispow[x] * v; | |
760 else | |
761 *xrpnt = ispow[x] * v; | |
762 mask <<= 1; | |
763 } | |
764 else if (x) { | |
765 max[lwin] = cb; | |
766 if (mask < 0) | |
767 *xrpnt = -ispow[x] * v; | |
768 else | |
769 *xrpnt = ispow[x] * v; | |
770 num--; | |
771 mask <<= 1; | |
772 } | |
773 else | |
774 *xrpnt = 0.0; | |
775 xrpnt += step; | |
776 if (y == 15 && h->linbits) { | |
777 max[lwin] = cb; | |
778 REFRESH_MASK(); | |
779 y += ((unsigned long) mask) >> (BITSHIFT + 8 - | |
780 h->linbits); | |
781 num -= h->linbits + 1; | |
782 mask <<= h->linbits; | |
783 if (mask < 0) | |
784 *xrpnt = -ispow[y] * v; | |
785 else | |
786 *xrpnt = ispow[y] * v; | |
787 mask <<= 1; | |
788 } | |
789 else if (y) { | |
790 max[lwin] = cb; | |
791 if (mask < 0) | |
792 *xrpnt = -ispow[y] * v; | |
793 else | |
794 *xrpnt = ispow[y] * v; | |
795 num--; | |
796 mask <<= 1; | |
797 } | |
798 else | |
799 *xrpnt = 0.0; | |
800 xrpnt += step; | |
801 } | |
802 } | |
803 | |
804 for (; l3 && (part2remain + num > 0); l3--) { | |
805 struct newhuff *h = htc + gr_info->count1table_select; | |
806 register short *val = h->table, a; | |
807 | |
808 REFRESH_MASK(); | |
809 while ((a = *val++) < 0) { | |
810 if (mask < 0) | |
811 val -= a; | |
812 num--; | |
813 mask <<= 1; | |
814 } | |
815 if (part2remain + num <= 0) { | |
816 num -= part2remain + num; | |
817 break; | |
818 } | |
819 | |
820 for (i = 0; i < 4; i++) { | |
821 if (!(i & 1)) { | |
822 if (!mc) { | |
823 mc = *m++; | |
824 xrpnt = ((real *) xr) + (*m++); | |
825 lwin = *m++; | |
826 cb = *m++; | |
827 if (lwin == 3) { | |
828 v = gr_info->pow2gain[(*scf++) << shift]; | |
829 step = 1; | |
830 } | |
831 else { | |
832 v = gr_info->full_gain[lwin][(*scf++) << shift]; | |
833 step = 3; | |
834 } | |
835 } | |
836 mc--; | |
837 } | |
838 if ((a & (0x8 >> i))) { | |
839 max[lwin] = cb; | |
840 if (part2remain + num <= 0) { | |
841 break; | |
842 } | |
843 if (mask < 0) | |
844 *xrpnt = -v; | |
845 else | |
846 *xrpnt = v; | |
847 num--; | |
848 mask <<= 1; | |
849 } | |
850 else | |
851 *xrpnt = 0.0; | |
852 xrpnt += step; | |
853 } | |
854 } | |
855 | |
856 if (lwin < 3) { /* short band? */ | |
857 while (1) { | |
858 /* HACK Prevent overflowing the xr buffer */ | |
859 if (mc * 6 > &xr[SBLIMIT][SSLIMIT] - xrpnt) | |
860 return 1; | |
861 | |
862 for (; mc > 0; mc--) { | |
863 *xrpnt = 0.0; | |
864 xrpnt += 3; /* short band -> step=3 */ | |
865 *xrpnt = 0.0; | |
866 xrpnt += 3; | |
867 } | |
868 if (m >= me) | |
869 break; | |
870 mc = *m++; | |
871 xrpnt = ((real *) xr) + *m++; | |
872 if (*m++ == 0) | |
873 break; /* optimize: field will be set to zero at the end of the function */ | |
874 m++; /* cb */ | |
875 } | |
876 } | |
877 | |
878 gr_info->maxband[0] = max[0] + 1; | |
879 gr_info->maxband[1] = max[1] + 1; | |
880 gr_info->maxband[2] = max[2] + 1; | |
881 gr_info->maxbandl = max[3] + 1; | |
882 | |
883 { | |
884 int rmax = max[0] > max[1] ? max[0] : max[1]; | |
885 | |
886 rmax = (rmax > max[2] ? rmax : max[2]) + 1; | |
887 gr_info->maxb = | |
888 rmax ? shortLimit[sfreq][rmax] : longLimit[sfreq][max[3] + 1]; | |
889 } | |
890 | |
891 } | |
892 else { | |
893 /* | |
894 * decoding with 'long' BandIndex table (block_type != 2) | |
895 */ | |
896 int *pretab = gr_info->preflag ? pretab1 : pretab2; | |
897 int i, max = -1; | |
898 int cb = 0; | |
899 int *m = map[sfreq][2]; | |
900 register real v = 0.0; | |
901 int mc = 0; | |
902 | |
903 /* | |
904 * long hash table values | |
905 */ | |
906 for (i = 0; i < 3; i++) { | |
907 int lp = l[i]; | |
908 struct newhuff *h = ht + gr_info->table_select[i]; | |
909 | |
910 for (; lp; lp--, mc--) { | |
911 int x, y; | |
912 | |
913 if (!mc) { | |
914 mc = *m++; | |
915 cb = *m++; | |
916 /* if (cb == 21) */ | |
917 /* v = 0.0; */ | |
918 /* else */ | |
919 v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift]; | |
920 | |
921 } | |
922 { | |
923 register short *val = h->table; | |
924 REFRESH_MASK(); | |
925 while ((y = *val++) < 0) { | |
926 if (mask < 0) | |
927 val -= y; | |
928 num--; | |
929 mask <<= 1; | |
930 } | |
931 x = y >> 4; | |
932 y &= 0xf; | |
933 } | |
934 | |
935 if (x == 15 && h->linbits) { | |
936 max = cb; | |
937 REFRESH_MASK(); | |
938 x += ((unsigned long) mask) >> (BITSHIFT + 8 - | |
939 h->linbits); | |
940 num -= h->linbits + 1; | |
941 mask <<= h->linbits; | |
942 if (mask < 0) | |
943 *xrpnt++ = -ispow[x] * v; | |
944 else | |
945 *xrpnt++ = ispow[x] * v; | |
946 mask <<= 1; | |
947 } | |
948 else if (x) { | |
949 max = cb; | |
950 if (mask < 0) | |
951 *xrpnt++ = -ispow[x] * v; | |
952 else | |
953 *xrpnt++ = ispow[x] * v; | |
954 num--; | |
955 mask <<= 1; | |
956 } | |
957 else | |
958 *xrpnt++ = 0.0; | |
959 | |
960 if (y == 15 && h->linbits) { | |
961 max = cb; | |
962 REFRESH_MASK(); | |
963 y += ((unsigned long) mask) >> (BITSHIFT + 8 - | |
964 h->linbits); | |
965 num -= h->linbits + 1; | |
966 mask <<= h->linbits; | |
967 if (mask < 0) | |
968 *xrpnt++ = -ispow[y] * v; | |
969 else | |
970 *xrpnt++ = ispow[y] * v; | |
971 mask <<= 1; | |
972 } | |
973 else if (y) { | |
974 max = cb; | |
975 if (mask < 0) | |
976 *xrpnt++ = -ispow[y] * v; | |
977 else | |
978 *xrpnt++ = ispow[y] * v; | |
979 num--; | |
980 mask <<= 1; | |
981 } | |
982 else | |
983 *xrpnt++ = 0.0; | |
984 } | |
985 } | |
986 | |
987 /* | |
988 * short (count1table) values | |
989 */ | |
990 for (; l3 && (part2remain + num > 0); l3--) { | |
991 struct newhuff *h = htc + gr_info->count1table_select; | |
992 register short *val = h->table, a; | |
993 | |
994 REFRESH_MASK(); | |
995 while ((a = *val++) < 0) { | |
996 if (mask < 0) | |
997 val -= a; | |
998 num--; | |
999 mask <<= 1; | |
1000 } | |
1001 if (part2remain + num <= 0) { | |
1002 num -= part2remain + num; | |
1003 break; | |
1004 } | |
1005 | |
1006 for (i = 0; i < 4; i++) { | |
1007 if (!(i & 1)) { | |
1008 if (!mc) { | |
1009 mc = *m++; | |
1010 cb = *m++; | |
1011 /* if (cb == 21) */ | |
1012 /* v = 0.0; */ | |
1013 /* else */ | |
1014 v = gr_info-> | |
1015 pow2gain[((*scf++) + (*pretab++)) << shift]; | |
1016 } | |
1017 mc--; | |
1018 } | |
1019 if ((a & (0x8 >> i))) { | |
1020 max = cb; | |
1021 if (part2remain + num <= 0) { | |
1022 break; | |
1023 } | |
1024 if (mask < 0) | |
1025 *xrpnt++ = -v; | |
1026 else | |
1027 *xrpnt++ = v; | |
1028 num--; | |
1029 mask <<= 1; | |
1030 } | |
1031 else | |
1032 *xrpnt++ = 0.0; | |
1033 } | |
1034 } | |
1035 | |
1036 gr_info->maxbandl = max + 1; | |
1037 gr_info->maxb = longLimit[sfreq][gr_info->maxbandl]; | |
1038 } | |
1039 | |
1040 part2remain += num; | |
1041 mpg123_backbits(num); | |
1042 num = 0; | |
1043 | |
1044 while (xrpnt < &xr[SBLIMIT][0]) | |
1045 *xrpnt++ = 0.0; | |
1046 | |
1047 while (part2remain > 16) { | |
1048 mpg123_getbits(16); /* Dismiss stuffing Bits */ | |
1049 part2remain -= 16; | |
1050 } | |
1051 if (part2remain > 0) | |
1052 mpg123_getbits(part2remain); | |
1053 else if (part2remain < 0) { | |
1054 /* fprintf(stderr, "mpg123: Can't rewind stream by %d bits!\n", */ | |
1055 /* -part2remain); */ | |
1056 return 1; /* -> error */ | |
1057 } | |
1058 return 0; | |
1059 } | |
1060 | |
1061 /* | |
1062 * III_stereo: calculate real channel values for Joint-I-Stereo-mode | |
1063 */ | |
1064 static void | |
1065 III_i_stereo(real xr_buf[2][SBLIMIT][SSLIMIT], int *scalefac, | |
1066 struct gr_info_s *gr_info, int sfreq, int ms_stereo, int lsf) | |
1067 { | |
1068 real(*xr)[SBLIMIT * SSLIMIT] = (real(*)[SBLIMIT * SSLIMIT]) xr_buf; | |
1069 struct bandInfoStruct *bi = &bandInfo[sfreq]; | |
1070 | |
1071 const real *tab1, *tab2; | |
1072 | |
1073 #if 1 | |
1074 int tab; | |
1075 static const real *tabs[3][2][2] = { | |
1076 {{tan1_1, tan2_1}, {tan1_2, tan2_2}}, | |
1077 {{pow1_1[0], pow2_1[0]}, {pow1_2[0], pow2_2[0]}}, | |
1078 {{pow1_1[1], pow2_1[1]}, {pow1_2[1], pow2_2[1]}} | |
1079 }; | |
1080 | |
1081 tab = lsf + (gr_info->scalefac_compress & lsf); | |
1082 tab1 = tabs[tab][ms_stereo][0]; | |
1083 tab2 = tabs[tab][ms_stereo][1]; | |
1084 #else | |
1085 if (lsf) { | |
1086 int p = gr_info->scalefac_compress & 0x1; | |
1087 | |
1088 if (ms_stereo) { | |
1089 tab1 = pow1_2[p]; | |
1090 tab2 = pow2_2[p]; | |
1091 } | |
1092 else { | |
1093 tab1 = pow1_1[p]; | |
1094 tab2 = pow2_1[p]; | |
1095 } | |
1096 } | |
1097 else { | |
1098 if (ms_stereo) { | |
1099 tab1 = tan1_2; | |
1100 tab2 = tan2_2; | |
1101 } | |
1102 else { | |
1103 tab1 = tan1_1; | |
1104 tab2 = tan2_1; | |
1105 } | |
1106 } | |
1107 #endif | |
1108 | |
1109 if (gr_info->block_type == 2) { | |
1110 int lwin, do_l = 0; | |
1111 | |
1112 if (gr_info->mixed_block_flag) | |
1113 do_l = 1; | |
1114 | |
1115 for (lwin = 0; lwin < 3; lwin++) { /* process each window */ | |
1116 /* get first band with zero values */ | |
1117 int is_p, sb, idx, sfb = gr_info->maxband[lwin]; /* sfb is minimal 3 for mixed mode */ | |
1118 | |
1119 if (sfb > 3) | |
1120 do_l = 0; | |
1121 | |
1122 for (; sfb < 12; sfb++) { | |
1123 is_p = scalefac[sfb * 3 + lwin - gr_info->mixed_block_flag]; /* scale: 0-15 */ | |
1124 if (is_p != 7) { | |
1125 real t1, t2; | |
1126 | |
1127 sb = bi->shortDiff[sfb]; | |
1128 idx = bi->shortIdx[sfb] + lwin; | |
1129 t1 = tab1[is_p]; | |
1130 t2 = tab2[is_p]; | |
1131 for (; sb > 0; sb--, idx += 3) { | |
1132 real v = xr[0][idx]; | |
1133 | |
1134 xr[0][idx] = v * t1; | |
1135 xr[1][idx] = v * t2; | |
1136 } | |
1137 } | |
1138 } | |
1139 | |
1140 #if 1 | |
1141 /* in the original: copy 10 to 11 , here: copy 11 to 12 | |
1142 maybe still wrong??? (copy 12 to 13?) */ | |
1143 is_p = scalefac[11 * 3 + lwin - gr_info->mixed_block_flag]; /* scale: 0-15 */ | |
1144 sb = bi->shortDiff[12]; | |
1145 idx = bi->shortIdx[12] + lwin; | |
1146 #else | |
1147 is_p = scalefac[10 * 3 + lwin - gr_info->mixed_block_flag]; /* scale: 0-15 */ | |
1148 sb = bi->shortDiff[11]; | |
1149 idx = bi->shortIdx[11] + lwin; | |
1150 #endif | |
1151 if (is_p != 7) { | |
1152 real t1, t2; | |
1153 t1 = tab1[is_p]; | |
1154 t2 = tab2[is_p]; | |
1155 for (; sb > 0; sb--, idx += 3) { | |
1156 real v = xr[0][idx]; | |
1157 xr[0][idx] = v * t1; | |
1158 xr[1][idx] = v * t2; | |
1159 } | |
1160 } | |
1161 } /* end for(lwin; .. ; . ) */ | |
1162 | |
1163 /* also check l-part, if ALL bands in the three windows are 'empty' | |
1164 * and mode = mixed_mode | |
1165 */ | |
1166 if (do_l) { | |
1167 int sfb = gr_info->maxbandl; | |
1168 int idx = bi->longIdx[sfb]; | |
1169 | |
1170 for (; sfb < 8; sfb++) { | |
1171 int sb = bi->longDiff[sfb]; | |
1172 int is_p = scalefac[sfb]; /* scale: 0-15 */ | |
1173 | |
1174 if (is_p != 7) { | |
1175 real t1, t2; | |
1176 | |
1177 t1 = tab1[is_p]; | |
1178 t2 = tab2[is_p]; | |
1179 for (; sb > 0; sb--, idx++) { | |
1180 real v = xr[0][idx]; | |
1181 | |
1182 xr[0][idx] = v * t1; | |
1183 xr[1][idx] = v * t2; | |
1184 } | |
1185 } | |
1186 else | |
1187 idx += sb; | |
1188 } | |
1189 } | |
1190 } | |
1191 else { /* ((gr_info->block_type != 2)) */ | |
1192 int sfb = gr_info->maxbandl; | |
1193 int is_p, idx = bi->longIdx[sfb]; | |
1194 | |
1195 /* hmm ... maybe the maxbandl stuff for i-stereo is buggy? */ | |
1196 if (sfb <= 21) { | |
1197 for (; sfb < 21; sfb++) { | |
1198 int sb = bi->longDiff[sfb]; | |
1199 | |
1200 is_p = scalefac[sfb]; /* scale: 0-15 */ | |
1201 if (is_p != 7) { | |
1202 real t1, t2; | |
1203 t1 = tab1[is_p]; | |
1204 t2 = tab2[is_p]; | |
1205 for (; sb > 0; sb--, idx++) { | |
1206 real v = xr[0][idx]; | |
1207 xr[0][idx] = v * t1; | |
1208 xr[1][idx] = v * t2; | |
1209 } | |
1210 } | |
1211 else | |
1212 idx += sb; | |
1213 } | |
1214 | |
1215 is_p = scalefac[20]; | |
1216 if (is_p != 7) { /* copy l-band 20 to l-band 21 */ | |
1217 int sb; | |
1218 real t1 = tab1[is_p], t2 = tab2[is_p]; | |
1219 | |
1220 for (sb = bi->longDiff[21]; sb > 0; sb--, idx++) { | |
1221 real v = xr[0][idx]; | |
1222 | |
1223 xr[0][idx] = v * t1; | |
1224 xr[1][idx] = v * t2; | |
1225 } | |
1226 } | |
1227 } | |
1228 } /* ... */ | |
1229 } | |
1230 | |
1231 static void | |
1232 III_antialias(real xr[SBLIMIT][SSLIMIT], struct gr_info_s *gr_info) | |
1233 { | |
1234 int sblim; | |
1235 | |
1236 if (gr_info->block_type == 2) { | |
1237 if (!gr_info->mixed_block_flag) | |
1238 return; | |
1239 sblim = 1; | |
1240 } | |
1241 else { | |
1242 sblim = gr_info->maxb - 1; | |
1243 } | |
1244 | |
1245 /* 31 alias-reduction operations between each pair of sub-bands */ | |
1246 /* with 8 butterflies between each pair */ | |
1247 | |
1248 { | |
1249 int sb; | |
1250 real *xr1 = (real *) xr[1]; | |
1251 | |
1252 if (sblim < 1 || sblim > SBLIMIT) | |
1253 return; | |
1254 | |
1255 for (sb = sblim; sb; sb--, xr1 += 10) { | |
1256 int ss; | |
1257 real *cs = aa_cs, *ca = aa_ca; | |
1258 real *xr2 = xr1; | |
1259 | |
1260 for (ss = 7; ss >= 0; ss--) { /* upper and lower butterfly inputs */ | |
1261 register real bu = *--xr2, bd = *xr1; | |
1262 | |
1263 *xr2 = (bu * (*cs)) - (bd * (*ca)); | |
1264 *xr1++ = (bd * (*cs++)) + (bu * (*ca++)); | |
1265 } | |
1266 } | |
1267 } | |
1268 } | |
1269 | |
1270 /* | |
1271 This is an optimized DCT from Jeff Tsay's maplay 1.2+ package. | |
1272 Saved one multiplication by doing the 'twiddle factor' stuff | |
1273 together with the window mul. (MH) | |
1274 | |
1275 This uses Byeong Gi Lee's Fast Cosine Transform algorithm, but the | |
1276 9 point IDCT needs to be reduced further. Unfortunately, I don't | |
1277 know how to do that, because 9 is not an even number. - Jeff. | |
1278 | |
1279 **************************************************************** | |
1280 | |
1281 9 Point Inverse Discrete Cosine Transform | |
1282 | |
1283 This piece of code is Copyright 1997 Mikko Tommila and is freely usable | |
1284 by anybody. The algorithm itself is of course in the public domain. | |
1285 | |
1286 Again derived heuristically from the 9-point WFTA. | |
1287 | |
1288 The algorithm is optimized (?) for speed, not for small rounding errors or | |
1289 good readability. | |
1290 | |
1291 36 additions, 11 multiplications | |
1292 | |
1293 Again this is very likely sub-optimal. | |
1294 | |
1295 The code is optimized to use a minimum number of temporary variables, | |
1296 so it should compile quite well even on 8-register Intel x86 processors. | |
1297 This makes the code quite obfuscated and very difficult to understand. | |
1298 | |
1299 References: | |
1300 [1] S. Winograd: "On Computing the Discrete Fourier Transform", | |
1301 Mathematics of Computation, Volume 32, Number 141, January 1978, | |
1302 Pages 175-199 | |
1303 */ | |
1304 | |
1305 /*------------------------------------------------------------------*/ | |
1306 /* */ | |
1307 /* Function: Calculation of the inverse MDCT */ | |
1308 /* */ | |
1309 /*------------------------------------------------------------------*/ | |
1310 | |
1311 #define MACRO(v) \ | |
1312 do { \ | |
1313 real tmpval; \ | |
1314 \ | |
1315 tmpval = tmp[(v)] + tmp[17-(v)]; \ | |
1316 out2[9+(v)] = tmpval * w[27+(v)]; \ | |
1317 out2[8-(v)] = tmpval * w[26-(v)]; \ | |
1318 tmpval = tmp[(v)] - tmp[17-(v)]; \ | |
1319 ts[SBLIMIT*(8-(v))] = out1[8-(v)] + tmpval * w[8-(v)]; \ | |
1320 ts[SBLIMIT*(9+(v))] = out1[9+(v)] + tmpval * w[9+(v)]; \ | |
1321 } while (0) | |
1322 | |
1323 #ifndef USE_SIMD | |
1324 static | |
1325 #endif | |
1326 void | |
1327 mpg123_dct36(real * inbuf, real * o1, real * o2, real * wintab, real * tsbuf) | |
1328 { | |
1329 real tmp[18]; | |
1330 register real *in = inbuf; | |
1331 | |
1332 in[17] += in[16]; | |
1333 in[16] += in[15]; | |
1334 in[15] += in[14]; | |
1335 in[14] += in[13]; | |
1336 in[13] += in[12]; | |
1337 in[12] += in[11]; | |
1338 in[11] += in[10]; | |
1339 in[10] += in[9]; | |
1340 in[9] += in[8]; | |
1341 in[8] += in[7]; | |
1342 in[7] += in[6]; | |
1343 in[6] += in[5]; | |
1344 in[5] += in[4]; | |
1345 in[4] += in[3]; | |
1346 in[3] += in[2]; | |
1347 in[2] += in[1]; | |
1348 in[1] += in[0]; | |
1349 | |
1350 in[17] += in[15]; | |
1351 in[15] += in[13]; | |
1352 in[13] += in[11]; | |
1353 in[11] += in[9]; | |
1354 in[9] += in[7]; | |
1355 in[7] += in[5]; | |
1356 in[5] += in[3]; | |
1357 in[3] += in[1]; | |
1358 | |
1359 | |
1360 { | |
1361 real t3; | |
1362 { | |
1363 real t0, t1, t2; | |
1364 | |
1365 t0 = COS6_2 * (in[8] + in[16] - in[4]); | |
1366 t1 = COS6_2 * in[12]; | |
1367 | |
1368 t3 = in[0]; | |
1369 t2 = t3 - t1 - t1; | |
1370 tmp[1] = tmp[7] = t2 - t0; | |
1371 tmp[4] = t2 + t0 + t0; | |
1372 t3 += t1; | |
1373 | |
1374 t2 = COS6_1 * (in[10] + in[14] - in[2]); | |
1375 tmp[1] -= t2; | |
1376 tmp[7] += t2; | |
1377 } | |
1378 { | |
1379 real t0, t1, t2; | |
1380 | |
1381 t0 = cos9[0] * (in[4] + in[8]); | |
1382 t1 = cos9[1] * (in[8] - in[16]); | |
1383 t2 = cos9[2] * (in[4] + in[16]); | |
1384 | |
1385 tmp[2] = tmp[6] = t3 - t0 - t2; | |
1386 tmp[0] = tmp[8] = t3 + t0 + t1; | |
1387 tmp[3] = tmp[5] = t3 - t1 + t2; | |
1388 } | |
1389 } | |
1390 { | |
1391 real t1, t2, t3; | |
1392 | |
1393 t1 = cos18[0] * (in[2] + in[10]); | |
1394 t2 = cos18[1] * (in[10] - in[14]); | |
1395 t3 = COS6_1 * in[6]; | |
1396 | |
1397 { | |
1398 real t0 = t1 + t2 + t3; | |
1399 tmp[0] += t0; | |
1400 tmp[8] -= t0; | |
1401 } | |
1402 | |
1403 t2 -= t3; | |
1404 t1 -= t3; | |
1405 | |
1406 t3 = cos18[2] * (in[2] + in[14]); | |
1407 | |
1408 t1 += t3; | |
1409 tmp[3] += t1; | |
1410 tmp[5] -= t1; | |
1411 | |
1412 t2 -= t3; | |
1413 tmp[2] += t2; | |
1414 tmp[6] -= t2; | |
1415 } | |
1416 | |
1417 { | |
1418 real t0, t1, t2, t3, t4, t5, t6, t7; | |
1419 | |
1420 t1 = COS6_2 * in[13]; | |
1421 t2 = COS6_2 * (in[9] + in[17] - in[5]); | |
1422 | |
1423 t3 = in[1] + t1; | |
1424 t4 = in[1] - t1 - t1; | |
1425 t5 = t4 - t2; | |
1426 | |
1427 t0 = cos9[0] * (in[5] + in[9]); | |
1428 t1 = cos9[1] * (in[9] - in[17]); | |
1429 | |
1430 tmp[13] = (t4 + t2 + t2) * tfcos36[17 - 13]; | |
1431 t2 = cos9[2] * (in[5] + in[17]); | |
1432 | |
1433 t6 = t3 - t0 - t2; | |
1434 t0 += t3 + t1; | |
1435 t3 += t2 - t1; | |
1436 | |
1437 t2 = cos18[0] * (in[3] + in[11]); | |
1438 t4 = cos18[1] * (in[11] - in[15]); | |
1439 t7 = COS6_1 * in[7]; | |
1440 | |
1441 t1 = t2 + t4 + t7; | |
1442 tmp[17] = (t0 + t1) * tfcos36[17 - 17]; | |
1443 tmp[9] = (t0 - t1) * tfcos36[17 - 9]; | |
1444 t1 = cos18[2] * (in[3] + in[15]); | |
1445 t2 += t1 - t7; | |
1446 | |
1447 tmp[14] = (t3 + t2) * tfcos36[17 - 14]; | |
1448 t0 = COS6_1 * (in[11] + in[15] - in[3]); | |
1449 tmp[12] = (t3 - t2) * tfcos36[17 - 12]; | |
1450 | |
1451 t4 -= t1 + t7; | |
1452 | |
1453 tmp[16] = (t5 - t0) * tfcos36[17 - 16]; | |
1454 tmp[10] = (t5 + t0) * tfcos36[17 - 10]; | |
1455 tmp[15] = (t6 + t4) * tfcos36[17 - 15]; | |
1456 tmp[11] = (t6 - t4) * tfcos36[17 - 11]; | |
1457 } | |
1458 | |
1459 { | |
1460 register real *out2 = o2; | |
1461 register real *w = wintab; | |
1462 register real *out1 = o1; | |
1463 register real *ts = tsbuf; | |
1464 | |
1465 MACRO(0); | |
1466 MACRO(1); | |
1467 MACRO(2); | |
1468 MACRO(3); | |
1469 MACRO(4); | |
1470 MACRO(5); | |
1471 MACRO(6); | |
1472 MACRO(7); | |
1473 MACRO(8); | |
1474 } | |
1475 } | |
1476 | |
1477 /* | |
1478 * new DCT12 | |
1479 */ | |
1480 static void | |
1481 dct12(real * in, real * rawout1, real * rawout2, | |
1482 register real * wi, register real * ts) | |
1483 { | |
1484 | |
1485 #define DCT12_PART1() \ | |
1486 do { \ | |
1487 in5 = in[5*3]; \ | |
1488 in5 += (in4 = in[4*3]); \ | |
1489 in4 += (in3 = in[3*3]); \ | |
1490 in3 += (in2 = in[2*3]); \ | |
1491 in2 += (in1 = in[1*3]); \ | |
1492 in1 += (in0 = in[0*3]); \ | |
1493 \ | |
1494 in5 += in3; in3 += in1; \ | |
1495 \ | |
1496 in2 *= COS6_1; \ | |
1497 in3 *= COS6_1; \ | |
1498 } while (0) | |
1499 | |
1500 #define DCT12_PART2() \ | |
1501 do { \ | |
1502 in0 += in4 * COS6_2; \ | |
1503 \ | |
1504 in4 = in0 + in2; \ | |
1505 in0 -= in2; \ | |
1506 \ | |
1507 in1 += in5 * COS6_2; \ | |
1508 \ | |
1509 in5 = (in1 + in3) * tfcos12[0]; \ | |
1510 in1 = (in1 - in3) * tfcos12[2]; \ | |
1511 \ | |
1512 in3 = in4 + in5; \ | |
1513 in4 -= in5; \ | |
1514 \ | |
1515 in2 = in0 + in1; \ | |
1516 in0 -= in1; \ | |
1517 } while (0) | |
1518 | |
1519 | |
1520 { | |
1521 real in0, in1, in2, in3, in4, in5; | |
1522 register real *out1 = rawout1; | |
1523 | |
1524 ts[SBLIMIT * 0] = out1[0]; | |
1525 ts[SBLIMIT * 1] = out1[1]; | |
1526 ts[SBLIMIT * 2] = out1[2]; | |
1527 ts[SBLIMIT * 3] = out1[3]; | |
1528 ts[SBLIMIT * 4] = out1[4]; | |
1529 ts[SBLIMIT * 5] = out1[5]; | |
1530 | |
1531 DCT12_PART1(); | |
1532 | |
1533 { | |
1534 real tmp0, tmp1 = (in0 - in4); | |
1535 | |
1536 { | |
1537 real tmp2 = (in1 - in5) * tfcos12[1]; | |
1538 | |
1539 tmp0 = tmp1 + tmp2; | |
1540 tmp1 -= tmp2; | |
1541 } | |
1542 ts[(17 - 1) * SBLIMIT] = out1[17 - 1] + tmp0 * wi[11 - 1]; | |
1543 ts[(12 + 1) * SBLIMIT] = out1[12 + 1] + tmp0 * wi[6 + 1]; | |
1544 ts[(6 + 1) * SBLIMIT] = out1[6 + 1] + tmp1 * wi[1]; | |
1545 ts[(11 - 1) * SBLIMIT] = out1[11 - 1] + tmp1 * wi[5 - 1]; | |
1546 } | |
1547 | |
1548 DCT12_PART2(); | |
1549 | |
1550 ts[(17 - 0) * SBLIMIT] = out1[17 - 0] + in2 * wi[11 - 0]; | |
1551 ts[(12 + 0) * SBLIMIT] = out1[12 + 0] + in2 * wi[6 + 0]; | |
1552 ts[(12 + 2) * SBLIMIT] = out1[12 + 2] + in3 * wi[6 + 2]; | |
1553 ts[(17 - 2) * SBLIMIT] = out1[17 - 2] + in3 * wi[11 - 2]; | |
1554 | |
1555 ts[(6 + 0) * SBLIMIT] = out1[6 + 0] + in0 * wi[0]; | |
1556 ts[(11 - 0) * SBLIMIT] = out1[11 - 0] + in0 * wi[5 - 0]; | |
1557 ts[(6 + 2) * SBLIMIT] = out1[6 + 2] + in4 * wi[2]; | |
1558 ts[(11 - 2) * SBLIMIT] = out1[11 - 2] + in4 * wi[5 - 2]; | |
1559 } | |
1560 | |
1561 in++; | |
1562 | |
1563 { | |
1564 real in0, in1, in2, in3, in4, in5; | |
1565 register real *out2 = rawout2; | |
1566 | |
1567 DCT12_PART1(); | |
1568 | |
1569 { | |
1570 real tmp0, tmp1 = (in0 - in4); | |
1571 | |
1572 { | |
1573 real tmp2 = (in1 - in5) * tfcos12[1]; | |
1574 | |
1575 tmp0 = tmp1 + tmp2; | |
1576 tmp1 -= tmp2; | |
1577 } | |
1578 out2[5 - 1] = tmp0 * wi[11 - 1]; | |
1579 out2[0 + 1] = tmp0 * wi[6 + 1]; | |
1580 ts[(12 + 1) * SBLIMIT] += tmp1 * wi[1]; | |
1581 ts[(17 - 1) * SBLIMIT] += tmp1 * wi[5 - 1]; | |
1582 } | |
1583 | |
1584 DCT12_PART2(); | |
1585 | |
1586 out2[5 - 0] = in2 * wi[11 - 0]; | |
1587 out2[0 + 0] = in2 * wi[6 + 0]; | |
1588 out2[0 + 2] = in3 * wi[6 + 2]; | |
1589 out2[5 - 2] = in3 * wi[11 - 2]; | |
1590 | |
1591 ts[(12 + 0) * SBLIMIT] += in0 * wi[0]; | |
1592 ts[(17 - 0) * SBLIMIT] += in0 * wi[5 - 0]; | |
1593 ts[(12 + 2) * SBLIMIT] += in4 * wi[2]; | |
1594 ts[(17 - 2) * SBLIMIT] += in4 * wi[5 - 2]; | |
1595 } | |
1596 | |
1597 in++; | |
1598 | |
1599 { | |
1600 real in0, in1, in2, in3, in4, in5; | |
1601 register real *out2 = rawout2; | |
1602 | |
1603 out2[12] = out2[13] = out2[14] = out2[15] = out2[16] = out2[17] = 0.0; | |
1604 | |
1605 DCT12_PART1(); | |
1606 | |
1607 { | |
1608 real tmp0, tmp1 = (in0 - in4); | |
1609 | |
1610 { | |
1611 real tmp2 = (in1 - in5) * tfcos12[1]; | |
1612 | |
1613 tmp0 = tmp1 + tmp2; | |
1614 tmp1 -= tmp2; | |
1615 } | |
1616 out2[11 - 1] = tmp0 * wi[11 - 1]; | |
1617 out2[6 + 1] = tmp0 * wi[6 + 1]; | |
1618 out2[0 + 1] += tmp1 * wi[1]; | |
1619 out2[5 - 1] += tmp1 * wi[5 - 1]; | |
1620 } | |
1621 | |
1622 DCT12_PART2(); | |
1623 | |
1624 out2[11 - 0] = in2 * wi[11 - 0]; | |
1625 out2[6 + 0] = in2 * wi[6 + 0]; | |
1626 out2[6 + 2] = in3 * wi[6 + 2]; | |
1627 out2[11 - 2] = in3 * wi[11 - 2]; | |
1628 | |
1629 out2[0 + 0] += in0 * wi[0]; | |
1630 out2[5 - 0] += in0 * wi[5 - 0]; | |
1631 out2[0 + 2] += in4 * wi[2]; | |
1632 out2[5 - 2] += in4 * wi[5 - 2]; | |
1633 } | |
1634 } | |
1635 | |
1636 /* | |
1637 * III_hybrid | |
1638 */ | |
1639 static void | |
1640 III_hybrid(real fsIn[SBLIMIT][SSLIMIT], | |
1641 real tsOut[SSLIMIT][SBLIMIT], int ch, | |
1642 struct gr_info_s *gr_info, struct frame *fr) | |
1643 { | |
1644 static real block[2][2][SBLIMIT * SSLIMIT] = { {{0,}} }; | |
1645 static int blc[2] = { 0, 0 }; | |
1646 | |
1647 real *tspnt = (real *) tsOut; | |
1648 real *rawout1, *rawout2; | |
1649 int bt, sb = 0; | |
1650 | |
1651 { | |
1652 int b = blc[ch]; | |
1653 rawout1 = block[b][ch]; | |
1654 b = -b + 1; | |
1655 rawout2 = block[b][ch]; | |
1656 blc[ch] = b; | |
1657 } | |
1658 | |
1659 if (gr_info->mixed_block_flag) { | |
1660 sb = 2; | |
1661 DCT36(fsIn[0], rawout1, rawout2, win[0], tspnt); | |
1662 DCT36(fsIn[1], rawout1 + 18, rawout2 + 18, win1[0], tspnt + 1); | |
1663 rawout1 += 36; | |
1664 rawout2 += 36; | |
1665 tspnt += 2; | |
1666 } | |
1667 | |
1668 bt = gr_info->block_type; | |
1669 if (bt == 2) { | |
1670 for (; sb < gr_info->maxb; | |
1671 sb += 2, tspnt += 2, rawout1 += 36, rawout2 += 36) { | |
1672 dct12(fsIn[sb], rawout1, rawout2, win[2], tspnt); | |
1673 dct12(fsIn[sb + 1], rawout1 + 18, rawout2 + 18, win1[2], | |
1674 tspnt + 1); | |
1675 } | |
1676 } | |
1677 else { | |
1678 for (; sb < gr_info->maxb; | |
1679 sb += 2, tspnt += 2, rawout1 += 36, rawout2 += 36) { | |
1680 DCT36(fsIn[sb], rawout1, rawout2, win[bt], tspnt); | |
1681 DCT36(fsIn[sb + 1], rawout1 + 18, rawout2 + 18, win1[bt], | |
1682 tspnt + 1); | |
1683 } | |
1684 } | |
1685 | |
1686 for (; sb < SBLIMIT; sb++, tspnt++) { | |
1687 int i; | |
1688 for (i = 0; i < SSLIMIT; i++) { | |
1689 tspnt[i * SBLIMIT] = *rawout1++; | |
1690 *rawout2++ = 0.0; | |
1691 } | |
1692 } | |
1693 } | |
1694 | |
1695 /* | |
1696 * main layer3 handler | |
1697 */ | |
1698 int | |
1699 mpg123_do_layer3(struct frame *fr) | |
1700 { | |
1701 int gr, ch, ss; | |
1702 int scalefacs[2][39]; /* max 39 for short[13][3] mode, mixed: 38, long: 22 */ | |
1703 struct III_sideinfo sideinfo; | |
1704 int stereo = fr->stereo; | |
1705 int single = fr->single; | |
1706 int ms_stereo, i_stereo; | |
1707 int sfreq = fr->sampling_frequency; | |
1708 int stereo1, granules; | |
1709 | |
1710 if (stereo == 1) { /* stream is mono */ | |
1711 stereo1 = 1; | |
1712 single = 0; | |
1713 } | |
1714 else if (single >= 0) /* stream is stereo, but force to mono */ | |
1715 stereo1 = 1; | |
1716 else | |
1717 stereo1 = 2; | |
1718 | |
1719 if (fr->mode == MPG_MD_JOINT_STEREO) { | |
1720 ms_stereo = (fr->mode_ext & 0x2) >> 1; | |
1721 i_stereo = fr->mode_ext & 0x1; | |
1722 } | |
1723 else | |
1724 ms_stereo = i_stereo = 0; | |
1725 | |
1726 granules = fr->lsf ? 1 : 2; | |
1727 if (!III_get_side_info | |
1728 (&sideinfo, stereo, ms_stereo, sfreq, single, fr->lsf)) | |
1729 return 0; | |
1730 | |
1731 mpg123_set_pointer(sideinfo.main_data_begin); | |
1732 | |
1733 for (gr = 0; gr < granules; gr++) { | |
1734 real hybridIn[2][SBLIMIT][SSLIMIT]; | |
1735 real hybridOut[2][SSLIMIT][SBLIMIT]; | |
1736 | |
1737 { | |
1738 struct gr_info_s *gr_info = &(sideinfo.ch[0].gr[gr]); | |
1739 long part2bits; | |
1740 | |
1741 if (fr->lsf) | |
1742 part2bits = III_get_scale_factors_2(scalefacs[0], gr_info, 0); | |
1743 else | |
1744 part2bits = III_get_scale_factors_1(scalefacs[0], gr_info); | |
1745 | |
1746 if (III_dequantize_sample | |
1747 (hybridIn[0], scalefacs[0], gr_info, sfreq, part2bits)) | |
1748 return 0; | |
1749 } | |
1750 | |
1751 if (stereo == 2) { | |
1752 struct gr_info_s *gr_info = &(sideinfo.ch[1].gr[gr]); | |
1753 long part2bits; | |
1754 | |
1755 if (fr->lsf) | |
1756 part2bits = | |
1757 III_get_scale_factors_2(scalefacs[1], gr_info, i_stereo); | |
1758 else | |
1759 part2bits = III_get_scale_factors_1(scalefacs[1], gr_info); | |
1760 | |
1761 if (III_dequantize_sample | |
1762 (hybridIn[1], scalefacs[1], gr_info, sfreq, part2bits)) | |
1763 return 0; | |
1764 | |
1765 if (ms_stereo) { | |
1766 int i; | |
1767 int maxb = sideinfo.ch[0].gr[gr].maxb; | |
1768 | |
1769 if (sideinfo.ch[1].gr[gr].maxb > maxb) | |
1770 maxb = sideinfo.ch[1].gr[gr].maxb; | |
1771 for (i = 0; i < SSLIMIT * maxb; i++) { | |
1772 real tmp0 = ((real *) hybridIn[0])[i]; | |
1773 real tmp1 = ((real *) hybridIn[1])[i]; | |
1774 ((real *) hybridIn[0])[i] = tmp0 + tmp1; | |
1775 ((real *) hybridIn[1])[i] = tmp0 - tmp1; | |
1776 } | |
1777 } | |
1778 | |
1779 if (i_stereo) | |
1780 III_i_stereo(hybridIn, scalefacs[1], gr_info, sfreq, | |
1781 ms_stereo, fr->lsf); | |
1782 | |
1783 if (ms_stereo || i_stereo || (single == 3)) { | |
1784 if (gr_info->maxb > sideinfo.ch[0].gr[gr].maxb) | |
1785 sideinfo.ch[0].gr[gr].maxb = gr_info->maxb; | |
1786 else | |
1787 gr_info->maxb = sideinfo.ch[0].gr[gr].maxb; | |
1788 } | |
1789 | |
1790 switch (single) { | |
1791 case 3: | |
1792 { | |
1793 register int i; | |
1794 register real *in0 = (real *) hybridIn[0], | |
1795 *in1 = (real *) hybridIn[1]; | |
1796 for (i = 0; i < SSLIMIT * gr_info->maxb; i++, in0++) | |
1797 *in0 = (*in0 + *in1++); /* *0.5 done by pow-scale */ | |
1798 } | |
1799 break; | |
1800 case 1: | |
1801 { | |
1802 register int i; | |
1803 register real *in0 = (real *) hybridIn[0], | |
1804 *in1 = (real *) hybridIn[1]; | |
1805 for (i = 0; i < SSLIMIT * gr_info->maxb; i++) | |
1806 *in0++ = *in1++; | |
1807 } | |
1808 break; | |
1809 } | |
1810 } | |
1811 | |
1812 #ifdef XMMS_EQ | |
1813 if (mpg123_info->eq_active) { | |
1814 int i, sb; | |
1815 | |
1816 if (single < 0) { | |
1817 for (sb = 0, i = 0; sb < SBLIMIT; sb++) { | |
1818 for (ss = 0; ss < SSLIMIT; ss++) { | |
1819 hybridIn[0][sb][ss] *= mpg123_info->eq_mul[i]; | |
1820 hybridIn[1][sb][ss] *= mpg123_info->eq_mul[i++]; | |
1821 } | |
1822 } | |
1823 } | |
1824 else { | |
1825 for (sb = 0, i = 0; sb < SBLIMIT; sb++) { | |
1826 for (ss = 0; ss < SSLIMIT; ss++) | |
1827 hybridIn[0][sb][ss] *= mpg123_info->eq_mul[i++]; | |
1828 } | |
1829 } | |
1830 } | |
1831 #endif | |
1832 | |
1833 #ifdef USE_SIMD | |
1834 if (fr->synth_type == SYNTH_MMX && single < 0) { | |
1835 int i, sb; | |
1836 | |
1837 for (sb = 0, i = 0; sb < SBLIMIT; sb++) { | |
1838 for (ss = 0; ss < SSLIMIT; ss++) { | |
1839 hybridIn[0][sb][ss] *= 16384.0; | |
1840 hybridIn[1][sb][ss] *= 16384.0; | |
1841 } | |
1842 } | |
1843 } | |
1844 #endif | |
1845 for (ch = 0; ch < stereo1; ch++) { | |
1846 struct gr_info_s *gr_info = &(sideinfo.ch[ch].gr[gr]); | |
1847 | |
1848 III_antialias(hybridIn[ch], gr_info); | |
1849 if (gr_info->maxb < 1 || gr_info->maxb > SBLIMIT) | |
1850 return 0; | |
1851 III_hybrid(hybridIn[ch], hybridOut[ch], ch, gr_info, fr); | |
1852 } | |
1853 | |
1854 for (ss = 0; ss < SSLIMIT; ss++) { | |
1855 if (single >= 0) { | |
1856 (fr->synth_mono) (hybridOut[0][ss], mpg123_pcm_sample, | |
1857 &mpg123_pcm_point); | |
1858 } | |
1859 else { | |
1860 int p1 = mpg123_pcm_point; | |
1861 | |
1862 (fr->synth) (hybridOut[0][ss], 0, mpg123_pcm_sample, &p1); | |
1863 (fr->synth) (hybridOut[1][ss], 1, mpg123_pcm_sample, | |
1864 &mpg123_pcm_point); | |
1865 } | |
1866 } | |
1867 | |
1868 if (mpg123_info->output_audio && mpg123_info->jump_to_time == -1) { | |
1869 produce_audio(mpg123_ip.output->written_time(), | |
1870 mpg123_cfg.resolution == | |
1871 16 ? FMT_S16_NE : FMT_U8, | |
1872 mpg123_cfg.channels == | |
1873 2 ? fr->stereo : 1, mpg123_pcm_point, | |
1874 mpg123_pcm_sample, &mpg123_info->going); | |
1875 } | |
1876 | |
1877 mpg123_pcm_point = 0; | |
1878 } | |
1879 return 1; | |
1880 } |