0
|
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 }
|