1 /*
2 * libmad - MPEG audio decoder library
3 * Copyright (C) 2000-2004 Underbit Technologies, Inc.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 *
19 * $Id: layer3.c,v 1.43 2004/01/23 09:41:32 rob Exp $
20 */
21
22 # include "global.h"
23
24 # include <stdlib.h>
25 # include <string.h>
26
27 #ifndef CHAR_BIT
28 #define CHAR_BIT 8
29 #endif
30
31 # include "fixed.h"
32 # include "bit.h"
33 # include "stream.h"
34 # include "frame.h"
35 # include "huffman.h"
36 # include "layer3.h"
37
38 /* --- Layer III ----------------------------------------------------------- */
39
40 enum {
41 count1table_select = 0x01,
42 scalefac_scale = 0x02,
43 preflag = 0x04,
44 mixed_block_flag = 0x08
45 };
46
47 enum {
48 I_STEREO = 0x1,
49 MS_STEREO = 0x2
50 };
51
52 struct sideinfo {
53 unsigned int main_data_begin;
54 unsigned int private_bits;
55
56 unsigned char scfsi[2];
57
58 struct granule {
59 struct channel {
60 /* from side info */
61 unsigned short part2_3_length;
62 unsigned short big_values;
63 unsigned short global_gain;
64 unsigned short scalefac_compress;
65
66 unsigned char flags;
67 unsigned char block_type;
68 unsigned char table_select[3];
69 unsigned char subblock_gain[3];
70 unsigned char region0_count;
71 unsigned char region1_count;
72
73 /* from main_data */
74 unsigned char scalefac[39]; /* scalefac_l and/or scalefac_s */
75 } ch[2];
76 } gr[2];
77 };
78
79 /*
80 * scalefactor bit lengths
81 * derived from section 2.4.2.7 of ISO/IEC 11172-3
82 */
83 static
84 struct {
85 unsigned char slen1;
86 unsigned char slen2;
87 } const sflen_table[16] = {
88 { 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 },
89 { 3, 0 }, { 1, 1 }, { 1, 2 }, { 1, 3 },
90 { 2, 1 }, { 2, 2 }, { 2, 3 }, { 3, 1 },
91 { 3, 2 }, { 3, 3 }, { 4, 2 }, { 4, 3 }
92 };
93
94 /*
95 * number of LSF scalefactor band values
96 * derived from section 2.4.3.2 of ISO/IEC 13818-3
97 */
98 static
99 unsigned char const nsfb_table[6][3][4] = {
100 { { 6, 5, 5, 5 },
101 { 9, 9, 9, 9 },
102 { 6, 9, 9, 9 } },
103
104 { { 6, 5, 7, 3 },
105 { 9, 9, 12, 6 },
106 { 6, 9, 12, 6 } },
107
108 { { 11, 10, 0, 0 },
109 { 18, 18, 0, 0 },
110 { 15, 18, 0, 0 } },
111
112 { { 7, 7, 7, 0 },
113 { 12, 12, 12, 0 },
114 { 6, 15, 12, 0 } },
115
116 { { 6, 6, 6, 3 },
117 { 12, 9, 9, 6 },
118 { 6, 12, 9, 6 } },
119
120 { { 8, 8, 5, 0 },
121 { 15, 12, 9, 0 },
122 { 6, 18, 9, 0 } }
123 };
124
125 /*
126 * MPEG-1 scalefactor band widths
127 * derived from Table B.8 of ISO/IEC 11172-3
128 */
129 static
130 unsigned char const sfb_48000_long[] = {
131 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10,
132 12, 16, 18, 22, 28, 34, 40, 46, 54, 54, 192
133 };
134
135 static
136 unsigned char const sfb_44100_long[] = {
137 4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10,
138 12, 16, 20, 24, 28, 34, 42, 50, 54, 76, 158
139 };
140
141 static
142 unsigned char const sfb_32000_long[] = {
143 4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12,
144 16, 20, 24, 30, 38, 46, 56, 68, 84, 102, 26
145 };
146
147 static
148 unsigned char const sfb_48000_short[] = {
149 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6,
150 6, 6, 6, 6, 6, 10, 10, 10, 12, 12, 12, 14, 14,
151 14, 16, 16, 16, 20, 20, 20, 26, 26, 26, 66, 66, 66
152 };
153
154 static
155 unsigned char const sfb_44100_short[] = {
156 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6,
157 6, 6, 8, 8, 8, 10, 10, 10, 12, 12, 12, 14, 14,
158 14, 18, 18, 18, 22, 22, 22, 30, 30, 30, 56, 56, 56
159 };
160
161 static
162 unsigned char const sfb_32000_short[] = {
163 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6,
164 6, 6, 8, 8, 8, 12, 12, 12, 16, 16, 16, 20, 20,
165 20, 26, 26, 26, 34, 34, 34, 42, 42, 42, 12, 12, 12
166 };
167
168 static
169 unsigned char const sfb_48000_mixed[] = {
170 /* long */ 4, 4, 4, 4, 4, 4, 6, 6,
171 /* short */ 4, 4, 4, 6, 6, 6, 6, 6, 6, 10,
172 10, 10, 12, 12, 12, 14, 14, 14, 16, 16,
173 16, 20, 20, 20, 26, 26, 26, 66, 66, 66
174 };
175
176 static
177 unsigned char const sfb_44100_mixed[] = {
178 /* long */ 4, 4, 4, 4, 4, 4, 6, 6,
179 /* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 10,
180 10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
181 18, 22, 22, 22, 30, 30, 30, 56, 56, 56
182 };
183
184 static
185 unsigned char const sfb_32000_mixed[] = {
186 /* long */ 4, 4, 4, 4, 4, 4, 6, 6,
187 /* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 12,
188 12, 12, 16, 16, 16, 20, 20, 20, 26, 26,
189 26, 34, 34, 34, 42, 42, 42, 12, 12, 12
190 };
191
192 /*
193 * MPEG-2 scalefactor band widths
194 * derived from Table B.2 of ISO/IEC 13818-3
195 */
196 static
197 unsigned char const sfb_24000_long[] = {
198 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
199 18, 22, 26, 32, 38, 46, 54, 62, 70, 76, 36
200 };
201
202 static
203 unsigned char const sfb_22050_long[] = {
204 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
205 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54
206 };
207
208 # define sfb_16000_long sfb_22050_long
209
210 static
211 unsigned char const sfb_24000_short[] = {
212 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8,
213 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
214 18, 24, 24, 24, 32, 32, 32, 44, 44, 44, 12, 12, 12
215 };
216
217 static
218 unsigned char const sfb_22050_short[] = {
219 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6,
220 6, 6, 8, 8, 8, 10, 10, 10, 14, 14, 14, 18, 18,
221 18, 26, 26, 26, 32, 32, 32, 42, 42, 42, 18, 18, 18
222 };
223
224 static
225 unsigned char const sfb_16000_short[] = {
226 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8,
227 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
228 18, 24, 24, 24, 30, 30, 30, 40, 40, 40, 18, 18, 18
229 };
230
231 static
232 unsigned char const sfb_24000_mixed[] = {
233 /* long */ 6, 6, 6, 6, 6, 6,
234 /* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12,
235 12, 12, 14, 14, 14, 18, 18, 18, 24, 24,
236 24, 32, 32, 32, 44, 44, 44, 12, 12, 12
237 };
238
239 static
240 unsigned char const sfb_22050_mixed[] = {
241 /* long */ 6, 6, 6, 6, 6, 6,
242 /* short */ 6, 6, 6, 6, 6, 6, 8, 8, 8, 10,
243 10, 10, 14, 14, 14, 18, 18, 18, 26, 26,
244 26, 32, 32, 32, 42, 42, 42, 18, 18, 18
245 };
246
247 static
248 unsigned char const sfb_16000_mixed[] = {
249 /* long */ 6, 6, 6, 6, 6, 6,
250 /* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12,
251 12, 12, 14, 14, 14, 18, 18, 18, 24, 24,
252 24, 30, 30, 30, 40, 40, 40, 18, 18, 18
253 };
254
255 /*
256 * MPEG 2.5 scalefactor band widths
257 * derived from public sources
258 */
259 # define sfb_12000_long sfb_16000_long
260 # define sfb_11025_long sfb_12000_long
261
262 static
263 unsigned char const sfb_8000_long[] = {
264 12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32,
265 40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2
266 };
267
268 # define sfb_12000_short sfb_16000_short
269 # define sfb_11025_short sfb_12000_short
270
271 static
272 unsigned char const sfb_8000_short[] = {
273 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 16,
274 16, 16, 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36,
275 36, 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26
276 };
277
278 # define sfb_12000_mixed sfb_16000_mixed
279 # define sfb_11025_mixed sfb_12000_mixed
280
281 /* the 8000 Hz short block scalefactor bands do not break after
282 the first 36 frequency lines, so this is probably wrong */
283 static
284 unsigned char const sfb_8000_mixed[] = {
285 /* long */ 12, 12, 12,
286 /* short */ 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16,
287 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, 36,
288 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26
289 };
290
291 static
292 struct {
293 unsigned char const *l;
294 unsigned char const *s;
295 unsigned char const *m;
296 } const sfbwidth_table[9] = {
297 { sfb_48000_long, sfb_48000_short, sfb_48000_mixed },
298 { sfb_44100_long, sfb_44100_short, sfb_44100_mixed },
299 { sfb_32000_long, sfb_32000_short, sfb_32000_mixed },
300 { sfb_24000_long, sfb_24000_short, sfb_24000_mixed },
301 { sfb_22050_long, sfb_22050_short, sfb_22050_mixed },
302 { sfb_16000_long, sfb_16000_short, sfb_16000_mixed },
303 { sfb_12000_long, sfb_12000_short, sfb_12000_mixed },
304 { sfb_11025_long, sfb_11025_short, sfb_11025_mixed },
305 { sfb_8000_long, sfb_8000_short, sfb_8000_mixed }
306 };
307
308 /*
309 * scalefactor band preemphasis (used only when preflag is set)
310 * derived from Table B.6 of ISO/IEC 11172-3
311 */
312 static
313 unsigned char const pretab[22] = {
314 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0
315 };
316
317 /*
318 * table for requantization
319 *
320 * rq_table[x].mantissa * 2^(rq_table[x].exponent) = x^(4/3)
321 */
322 static
323 struct fixedfloat {
324 unsigned long mantissa : 27;
325 unsigned short exponent : 5;
326 } const rq_table[8207] = {
327 # include "rq_table.dat"
328 };
329
330 /*
331 * fractional powers of two
332 * used for requantization and joint stereo decoding
333 *
334 * root_table[3 + x] = 2^(x/4)
335 */
336 static
337 mad_fixed_t const root_table[7] = {
338 MAD_F(0x09837f05) /* 2^(-3/4) == 0.59460355750136 */,
339 MAD_F(0x0b504f33) /* 2^(-2/4) == 0.70710678118655 */,
340 MAD_F(0x0d744fcd) /* 2^(-1/4) == 0.84089641525371 */,
341 MAD_F(0x10000000) /* 2^( 0/4) == 1.00000000000000 */,
342 MAD_F(0x1306fe0a) /* 2^(+1/4) == 1.18920711500272 */,
343 MAD_F(0x16a09e66) /* 2^(+2/4) == 1.41421356237310 */,
344 MAD_F(0x1ae89f99) /* 2^(+3/4) == 1.68179283050743 */
345 };
346
347 /*
348 * coefficients for aliasing reduction
349 * derived from Table B.9 of ISO/IEC 11172-3
350 *
351 * c[] = { -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037 }
352 * cs[i] = 1 / sqrt(1 + c[i]^2)
353 * ca[i] = c[i] / sqrt(1 + c[i]^2)
354 */
355 static
356 mad_fixed_t const cs[8] = {
357 +MAD_F(0x0db84a81) /* +0.857492926 */, +MAD_F(0x0e1b9d7f) /* +0.881741997 */,
358 +MAD_F(0x0f31adcf) /* +0.949628649 */, +MAD_F(0x0fbba815) /* +0.983314592 */,
359 +MAD_F(0x0feda417) /* +0.995517816 */, +MAD_F(0x0ffc8fc8) /* +0.999160558 */,
360 +MAD_F(0x0fff964c) /* +0.999899195 */, +MAD_F(0x0ffff8d3) /* +0.999993155 */
361 };
362
363 static
364 mad_fixed_t const ca[8] = {
365 -MAD_F(0x083b5fe7) /* -0.514495755 */, -MAD_F(0x078c36d2) /* -0.471731969 */,
366 -MAD_F(0x05039814) /* -0.313377454 */, -MAD_F(0x02e91dd1) /* -0.181913200 */,
367 -MAD_F(0x0183603a) /* -0.094574193 */, -MAD_F(0x00a7cb87) /* -0.040965583 */,
368 -MAD_F(0x003a2847) /* -0.014198569 */, -MAD_F(0x000f27b4) /* -0.003699975 */
369 };
370
371 /*
372 * IMDCT coefficients for short blocks
373 * derived from section 2.4.3.4.10.2 of ISO/IEC 11172-3
374 *
375 * imdct_s[i/even][k] = cos((PI / 24) * (2 * (i / 2) + 7) * (2 * k + 1))
376 * imdct_s[i /odd][k] = cos((PI / 24) * (2 * (6 + (i-1)/2) + 7) * (2 * k + 1))
377 */
378 static
379 mad_fixed_t const imdct_s[6][6] = {
380 # include "imdct_s.dat"
381 };
382
383 # if !defined(ASO_IMDCT)
384 /*
385 * windowing coefficients for long blocks
386 * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3
387 *
388 * window_l[i] = sin((PI / 36) * (i + 1/2))
389 */
390 static
391 mad_fixed_t const window_l[36] = {
392 MAD_F(0x00b2aa3e) /* 0.043619387 */, MAD_F(0x0216a2a2) /* 0.130526192 */,
393 MAD_F(0x03768962) /* 0.216439614 */, MAD_F(0x04cfb0e2) /* 0.300705800 */,
394 MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x07635284) /* 0.461748613 */,
395 MAD_F(0x0898c779) /* 0.537299608 */, MAD_F(0x09bd7ca0) /* 0.608761429 */,
396 MAD_F(0x0acf37ad) /* 0.675590208 */, MAD_F(0x0bcbe352) /* 0.737277337 */,
397 MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x0d7e8807) /* 0.843391446 */,
398
399 MAD_F(0x0e313245) /* 0.887010833 */, MAD_F(0x0ec835e8) /* 0.923879533 */,
400 MAD_F(0x0f426cb5) /* 0.953716951 */, MAD_F(0x0f9ee890) /* 0.976296007 */,
401 MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ffc19fd) /* 0.999048222 */,
402 MAD_F(0x0ffc19fd) /* 0.999048222 */, MAD_F(0x0fdcf549) /* 0.991444861 */,
403 MAD_F(0x0f9ee890) /* 0.976296007 */, MAD_F(0x0f426cb5) /* 0.953716951 */,
404 MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0e313245) /* 0.887010833 */,
405
406 MAD_F(0x0d7e8807) /* 0.843391446 */, MAD_F(0x0cb19346) /* 0.793353340 */,
407 MAD_F(0x0bcbe352) /* 0.737277337 */, MAD_F(0x0acf37ad) /* 0.675590208 */,
408 MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0898c779) /* 0.537299608 */,
409 MAD_F(0x07635284) /* 0.461748613 */, MAD_F(0x061f78aa) /* 0.382683432 */,
410 MAD_F(0x04cfb0e2) /* 0.300705800 */, MAD_F(0x03768962) /* 0.216439614 */,
411 MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x00b2aa3e) /* 0.043619387 */,
412 };
413 # endif /* ASO_IMDCT */
414
415 /*
416 * windowing coefficients for short blocks
417 * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3
418 *
419 * window_s[i] = sin((PI / 12) * (i + 1/2))
420 */
421 static
422 mad_fixed_t const window_s[12] = {
423 MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x061f78aa) /* 0.382683432 */,
424 MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0cb19346) /* 0.793353340 */,
425 MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0fdcf549) /* 0.991444861 */,
426 MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ec835e8) /* 0.923879533 */,
427 MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x09bd7ca0) /* 0.608761429 */,
428 MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x0216a2a2) /* 0.130526192 */,
429 };
430
431 /*
432 * coefficients for intensity stereo processing
433 * derived from section 2.4.3.4.9.3 of ISO/IEC 11172-3
434 *
435 * is_ratio[i] = tan(i * (PI / 12))
436 * is_table[i] = is_ratio[i] / (1 + is_ratio[i])
437 */
438 static
439 mad_fixed_t const is_table[7] = {
440 MAD_F(0x00000000) /* 0.000000000 */,
441 MAD_F(0x0361962f) /* 0.211324865 */,
442 MAD_F(0x05db3d74) /* 0.366025404 */,
443 MAD_F(0x08000000) /* 0.500000000 */,
444 MAD_F(0x0a24c28c) /* 0.633974596 */,
445 MAD_F(0x0c9e69d1) /* 0.788675135 */,
446 MAD_F(0x10000000) /* 1.000000000 */
447 };
448
449 /*
450 * coefficients for LSF intensity stereo processing
451 * derived from section 2.4.3.2 of ISO/IEC 13818-3
452 *
453 * is_lsf_table[0][i] = (1 / sqrt(sqrt(2)))^(i + 1)
454 * is_lsf_table[1][i] = (1 / sqrt(2)) ^(i + 1)
455 */
456 static
457 mad_fixed_t const is_lsf_table[2][15] = {
458 {
459 MAD_F(0x0d744fcd) /* 0.840896415 */,
460 MAD_F(0x0b504f33) /* 0.707106781 */,
461 MAD_F(0x09837f05) /* 0.594603558 */,
462 MAD_F(0x08000000) /* 0.500000000 */,
463 MAD_F(0x06ba27e6) /* 0.420448208 */,
464 MAD_F(0x05a8279a) /* 0.353553391 */,
465 MAD_F(0x04c1bf83) /* 0.297301779 */,
466 MAD_F(0x04000000) /* 0.250000000 */,
467 MAD_F(0x035d13f3) /* 0.210224104 */,
468 MAD_F(0x02d413cd) /* 0.176776695 */,
469 MAD_F(0x0260dfc1) /* 0.148650889 */,
470 MAD_F(0x02000000) /* 0.125000000 */,
471 MAD_F(0x01ae89fa) /* 0.105112052 */,
472 MAD_F(0x016a09e6) /* 0.088388348 */,
473 MAD_F(0x01306fe1) /* 0.074325445 */
474 }, {
475 MAD_F(0x0b504f33) /* 0.707106781 */,
476 MAD_F(0x08000000) /* 0.500000000 */,
477 MAD_F(0x05a8279a) /* 0.353553391 */,
478 MAD_F(0x04000000) /* 0.250000000 */,
479 MAD_F(0x02d413cd) /* 0.176776695 */,
480 MAD_F(0x02000000) /* 0.125000000 */,
481 MAD_F(0x016a09e6) /* 0.088388348 */,
482 MAD_F(0x01000000) /* 0.062500000 */,
483 MAD_F(0x00b504f3) /* 0.044194174 */,
484 MAD_F(0x00800000) /* 0.031250000 */,
485 MAD_F(0x005a827a) /* 0.022097087 */,
486 MAD_F(0x00400000) /* 0.015625000 */,
487 MAD_F(0x002d413d) /* 0.011048543 */,
488 MAD_F(0x00200000) /* 0.007812500 */,
489 MAD_F(0x0016a09e) /* 0.005524272 */
490 }
491 };
492
493 /*
494 * NAME: III_sideinfo()
495 * DESCRIPTION: decode frame side information from a bitstream
496 */
497 static
III_sideinfo(struct mad_bitptr * ptr,unsigned int nch,int lsf,struct sideinfo * si,unsigned int * data_bitlen,unsigned int * priv_bitlen)498 enum mad_error III_sideinfo(struct mad_bitptr *ptr, unsigned int nch,
499 int lsf, struct sideinfo *si,
500 unsigned int *data_bitlen,
501 unsigned int *priv_bitlen)
502 {
503 unsigned int ngr, gr, ch, i;
504 enum mad_error result = MAD_ERROR_NONE;
505
506 *data_bitlen = 0;
507 *priv_bitlen = lsf ? ((nch == 1) ? 1 : 2) : ((nch == 1) ? 5 : 3);
508
509 si->main_data_begin = mad_bit_read(ptr, lsf ? 8 : 9);
510 si->private_bits = mad_bit_read(ptr, *priv_bitlen);
511
512 ngr = 1;
513 if (!lsf) {
514 ngr = 2;
515
516 for (ch = 0; ch < nch; ++ch)
517 si->scfsi[ch] = mad_bit_read(ptr, 4);
518 }
519
520 for (gr = 0; gr < ngr; ++gr) {
521 struct granule *granule = &si->gr[gr];
522
523 for (ch = 0; ch < nch; ++ch) {
524 struct channel *channel = &granule->ch[ch];
525
526 channel->part2_3_length = mad_bit_read(ptr, 12);
527 channel->big_values = mad_bit_read(ptr, 9);
528 channel->global_gain = mad_bit_read(ptr, 8);
529 channel->scalefac_compress = mad_bit_read(ptr, lsf ? 9 : 4);
530
531 *data_bitlen += channel->part2_3_length;
532
533 if (channel->big_values > 288 && result == 0)
534 result = MAD_ERROR_BADBIGVALUES;
535
536 channel->flags = 0;
537
538 /* window_switching_flag */
539 if (mad_bit_read(ptr, 1)) {
540 channel->block_type = mad_bit_read(ptr, 2);
541
542 if (channel->block_type == 0 && result == 0)
543 result = MAD_ERROR_BADBLOCKTYPE;
544
545 if (!lsf && channel->block_type == 2 && si->scfsi[ch] && result == 0)
546 result = MAD_ERROR_BADSCFSI;
547
548 channel->region0_count = 7;
549 channel->region1_count = 36;
550
551 if (mad_bit_read(ptr, 1))
552 channel->flags |= mixed_block_flag;
553 else if (channel->block_type == 2)
554 channel->region0_count = 8;
555
556 for (i = 0; i < 2; ++i)
557 channel->table_select[i] = mad_bit_read(ptr, 5);
558
559 for (i = 0; i < 3; ++i)
560 channel->subblock_gain[i] = mad_bit_read(ptr, 3);
561 }
562 else {
563 channel->block_type = 0;
564
565 for (i = 0; i < 3; ++i)
566 channel->table_select[i] = mad_bit_read(ptr, 5);
567
568 channel->region0_count = mad_bit_read(ptr, 4);
569 channel->region1_count = mad_bit_read(ptr, 3);
570 }
571
572 /* [preflag,] scalefac_scale, count1table_select */
573 channel->flags |= mad_bit_read(ptr, lsf ? 2 : 3);
574 }
575 }
576
577 return result;
578 }
579
580 /*
581 * NAME: III_scalefactors_lsf()
582 * DESCRIPTION: decode channel scalefactors for LSF from a bitstream
583 */
584 static
III_scalefactors_lsf(struct mad_bitptr * ptr,struct channel * channel,struct channel * gr1ch,int mode_extension)585 unsigned int III_scalefactors_lsf(struct mad_bitptr *ptr,
586 struct channel *channel,
587 struct channel *gr1ch, int mode_extension)
588 {
589 struct mad_bitptr start;
590 unsigned int scalefac_compress, index, slen[4], part, n, i;
591 unsigned char const *nsfb;
592
593 start = *ptr;
594
595 scalefac_compress = channel->scalefac_compress;
596 index = (channel->block_type == 2) ?
597 ((channel->flags & mixed_block_flag) ? 2 : 1) : 0;
598
599 if (!((mode_extension & I_STEREO) && gr1ch)) {
600 if (scalefac_compress < 400) {
601 slen[0] = (scalefac_compress >> 4) / 5;
602 slen[1] = (scalefac_compress >> 4) % 5;
603 slen[2] = (scalefac_compress % 16) >> 2;
604 slen[3] = scalefac_compress % 4;
605
606 nsfb = nsfb_table[0][index];
607 }
608 else if (scalefac_compress < 500) {
609 scalefac_compress -= 400;
610
611 slen[0] = (scalefac_compress >> 2) / 5;
612 slen[1] = (scalefac_compress >> 2) % 5;
613 slen[2] = scalefac_compress % 4;
614 slen[3] = 0;
615
616 nsfb = nsfb_table[1][index];
617 }
618 else {
619 scalefac_compress -= 500;
620
621 slen[0] = scalefac_compress / 3;
622 slen[1] = scalefac_compress % 3;
623 slen[2] = 0;
624 slen[3] = 0;
625
626 channel->flags |= preflag;
627
628 nsfb = nsfb_table[2][index];
629 }
630
631 n = 0;
632 for (part = 0; part < 4; ++part) {
633 for (i = 0; i < nsfb[part]; ++i)
634 channel->scalefac[n++] = mad_bit_read(ptr, slen[part]);
635 }
636
637 while (n < 39)
638 channel->scalefac[n++] = 0;
639 }
640 else { /* (mode_extension & I_STEREO) && gr1ch (i.e. ch == 1) */
641 scalefac_compress >>= 1;
642
643 if (scalefac_compress < 180) {
644 slen[0] = scalefac_compress / 36;
645 slen[1] = (scalefac_compress % 36) / 6;
646 slen[2] = (scalefac_compress % 36) % 6;
647 slen[3] = 0;
648
649 nsfb = nsfb_table[3][index];
650 }
651 else if (scalefac_compress < 244) {
652 scalefac_compress -= 180;
653
654 slen[0] = (scalefac_compress % 64) >> 4;
655 slen[1] = (scalefac_compress % 16) >> 2;
656 slen[2] = scalefac_compress % 4;
657 slen[3] = 0;
658
659 nsfb = nsfb_table[4][index];
660 }
661 else {
662 scalefac_compress -= 244;
663
664 slen[0] = scalefac_compress / 3;
665 slen[1] = scalefac_compress % 3;
666 slen[2] = 0;
667 slen[3] = 0;
668
669 nsfb = nsfb_table[5][index];
670 }
671
672 n = 0;
673 for (part = 0; part < 4; ++part) {
674 unsigned int max, is_pos;
675
676 max = (1 << slen[part]) - 1;
677
678 for (i = 0; i < nsfb[part]; ++i) {
679 is_pos = mad_bit_read(ptr, slen[part]);
680
681 channel->scalefac[n] = is_pos;
682 gr1ch->scalefac[n++] = (is_pos == max);
683 }
684 }
685
686 while (n < 39) {
687 channel->scalefac[n] = 0;
688 gr1ch->scalefac[n++] = 0; /* apparently not illegal */
689 }
690 }
691
692 return mad_bit_length(&start, ptr);
693 }
694
695 /*
696 * NAME: III_scalefactors()
697 * DESCRIPTION: decode channel scalefactors of one granule from a bitstream
698 */
699 static
III_scalefactors(struct mad_bitptr * ptr,struct channel * channel,struct channel const * gr0ch,unsigned int scfsi)700 unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel,
701 struct channel const *gr0ch, unsigned int scfsi)
702 {
703 struct mad_bitptr start;
704 unsigned int slen1, slen2, sfbi;
705
706 start = *ptr;
707
708 slen1 = sflen_table[channel->scalefac_compress].slen1;
709 slen2 = sflen_table[channel->scalefac_compress].slen2;
710
711 if (channel->block_type == 2) {
712 unsigned int nsfb;
713
714 sfbi = 0;
715
716 nsfb = (channel->flags & mixed_block_flag) ? 8 + 3 * 3 : 6 * 3;
717 while (nsfb--)
718 channel->scalefac[sfbi++] = mad_bit_read(ptr, slen1);
719
720 nsfb = 6 * 3;
721 while (nsfb--)
722 channel->scalefac[sfbi++] = mad_bit_read(ptr, slen2);
723
724 nsfb = 1 * 3;
725 while (nsfb--)
726 channel->scalefac[sfbi++] = 0;
727 }
728 else { /* channel->block_type != 2 */
729 if (scfsi & 0x8) {
730 for (sfbi = 0; sfbi < 6; ++sfbi)
731 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
732 }
733 else {
734 for (sfbi = 0; sfbi < 6; ++sfbi)
735 channel->scalefac[sfbi] = mad_bit_read(ptr, slen1);
736 }
737
738 if (scfsi & 0x4) {
739 for (sfbi = 6; sfbi < 11; ++sfbi)
740 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
741 }
742 else {
743 for (sfbi = 6; sfbi < 11; ++sfbi)
744 channel->scalefac[sfbi] = mad_bit_read(ptr, slen1);
745 }
746
747 if (scfsi & 0x2) {
748 for (sfbi = 11; sfbi < 16; ++sfbi)
749 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
750 }
751 else {
752 for (sfbi = 11; sfbi < 16; ++sfbi)
753 channel->scalefac[sfbi] = mad_bit_read(ptr, slen2);
754 }
755
756 if (scfsi & 0x1) {
757 for (sfbi = 16; sfbi < 21; ++sfbi)
758 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
759 }
760 else {
761 for (sfbi = 16; sfbi < 21; ++sfbi)
762 channel->scalefac[sfbi] = mad_bit_read(ptr, slen2);
763 }
764
765 channel->scalefac[21] = 0;
766 }
767
768 return mad_bit_length(&start, ptr);
769 }
770
771 /*
772 * The Layer III formula for requantization and scaling is defined by
773 * section 2.4.3.4.7.1 of ISO/IEC 11172-3, as follows:
774 *
775 * long blocks:
776 * xr[i] = sign(is[i]) * abs(is[i])^(4/3) *
777 * 2^((1/4) * (global_gain - 210)) *
778 * 2^-(scalefac_multiplier *
779 * (scalefac_l[sfb] + preflag * pretab[sfb]))
780 *
781 * short blocks:
782 * xr[i] = sign(is[i]) * abs(is[i])^(4/3) *
783 * 2^((1/4) * (global_gain - 210 - 8 * subblock_gain[w])) *
784 * 2^-(scalefac_multiplier * scalefac_s[sfb][w])
785 *
786 * where:
787 * scalefac_multiplier = (scalefac_scale + 1) / 2
788 *
789 * The routines III_exponents() and III_requantize() facilitate this
790 * calculation.
791 */
792
793 /*
794 * NAME: III_exponents()
795 * DESCRIPTION: calculate scalefactor exponents
796 */
797 static
III_exponents(struct channel const * channel,unsigned char const * sfbwidth,signed int exponents[39])798 void III_exponents(struct channel const *channel,
799 unsigned char const *sfbwidth, signed int exponents[39])
800 {
801 signed int gain;
802 unsigned int scalefac_multiplier, sfbi;
803
804 gain = (signed int) channel->global_gain - 210;
805 scalefac_multiplier = (channel->flags & scalefac_scale) ? 2 : 1;
806
807 if (channel->block_type == 2) {
808 unsigned int l;
809 signed int gain0, gain1, gain2;
810
811 sfbi = l = 0;
812
813 if (channel->flags & mixed_block_flag) {
814 unsigned int premask;
815
816 premask = (channel->flags & preflag) ? ~0 : 0;
817
818 /* long block subbands 0-1 */
819
820 while (l < 36) {
821 exponents[sfbi] = gain -
822 (signed int) ((channel->scalefac[sfbi] + (pretab[sfbi] & premask)) <<
823 scalefac_multiplier);
824
825 l += sfbwidth[sfbi++];
826 }
827 }
828
829 /* this is probably wrong for 8000 Hz short/mixed blocks */
830
831 gain0 = gain - 8 * (signed int) channel->subblock_gain[0];
832 gain1 = gain - 8 * (signed int) channel->subblock_gain[1];
833 gain2 = gain - 8 * (signed int) channel->subblock_gain[2];
834
835 while (l < 576) {
836 exponents[sfbi + 0] = gain0 -
837 (signed int) (channel->scalefac[sfbi + 0] << scalefac_multiplier);
838 exponents[sfbi + 1] = gain1 -
839 (signed int) (channel->scalefac[sfbi + 1] << scalefac_multiplier);
840 exponents[sfbi + 2] = gain2 -
841 (signed int) (channel->scalefac[sfbi + 2] << scalefac_multiplier);
842
843 l += 3 * sfbwidth[sfbi];
844 sfbi += 3;
845 }
846 }
847 else { /* channel->block_type != 2 */
848 if (channel->flags & preflag) {
849 for (sfbi = 0; sfbi < 22; ++sfbi) {
850 exponents[sfbi] = gain -
851 (signed int) ((channel->scalefac[sfbi] + pretab[sfbi]) <<
852 scalefac_multiplier);
853 }
854 }
855 else {
856 for (sfbi = 0; sfbi < 22; ++sfbi) {
857 exponents[sfbi] = gain -
858 (signed int) (channel->scalefac[sfbi] << scalefac_multiplier);
859 }
860 }
861 }
862 }
863
864 /*
865 * NAME: III_requantize()
866 * DESCRIPTION: requantize one (positive) value
867 */
868 static
III_requantize(unsigned int value,signed int exp)869 mad_fixed_t III_requantize(unsigned int value, signed int exp)
870 {
871 mad_fixed_t requantized;
872 signed int frac;
873 struct fixedfloat const *power;
874
875 frac = exp % 4; /* assumes sign(frac) == sign(exp) */
876 exp /= 4;
877
878 power = &rq_table[value];
879 requantized = power->mantissa;
880 exp += power->exponent;
881
882 if (exp < 0) {
883 if (-exp >= (int)sizeof(mad_fixed_t) * CHAR_BIT) {
884 /* underflow */
885 requantized = 0;
886 }
887 else {
888 requantized += 1L << (-exp - 1);
889 requantized >>= -exp;
890 }
891 }
892 else {
893 if (exp >= 5) {
894 /* overflow */
895 requantized = MAD_F_MAX;
896 }
897 else
898 requantized <<= exp;
899 }
900
901 return frac ? mad_f_mul(requantized, root_table[3 + frac]) : requantized;
902 }
903
904 /* we must take care that sz >= bits and sz < sizeof(long) lest bits == 0 */
905 # define MASK(cache, sz, bits) \
906 (((cache) >> ((sz) - (bits))) & ((1 << (bits)) - 1))
907 # define MASK1BIT(cache, sz) \
908 ((cache) & (1 << ((sz) - 1)))
909
910 /*
911 * NAME: III_huffdecode()
912 * DESCRIPTION: decode Huffman code words of one channel of one granule
913 */
914 static
III_huffdecode(struct mad_bitptr * ptr,mad_fixed_t xr[576],struct channel * channel,unsigned char const * sfbwidth,unsigned int part2_length)915 enum mad_error III_huffdecode(struct mad_bitptr *ptr, mad_fixed_t xr[576],
916 struct channel *channel,
917 unsigned char const *sfbwidth,
918 unsigned int part2_length)
919 {
920 signed int exponents[39], exp;
921 signed int const *expptr;
922 struct mad_bitptr peek;
923 signed int bits_left, cachesz;
924 register mad_fixed_t *xrptr;
925 mad_fixed_t const *sfbound;
926 register unsigned long bitcache;
927
928 bits_left = (signed) channel->part2_3_length - (signed) part2_length;
929 if (bits_left < 0)
930 return MAD_ERROR_BADPART3LEN;
931
932 III_exponents(channel, sfbwidth, exponents);
933
934 peek = *ptr;
935 mad_bit_skip(ptr, bits_left);
936
937 /* align bit reads to byte boundaries */
938 cachesz = mad_bit_bitsleft(&peek);
939 cachesz += ((32 - 1 - 24) + (24 - cachesz)) & ~7;
940
941 bitcache = mad_bit_read(&peek, cachesz);
942 bits_left -= cachesz;
943
944 xrptr = &xr[0];
945
946 /* big_values */
947 {
948 unsigned int region, rcount;
949 struct hufftable const *entry;
950 union huffpair const *table;
951 unsigned int linbits, startbits, big_values, reqhits;
952 mad_fixed_t reqcache[16];
953
954 sfbound = xrptr + *sfbwidth++;
955 rcount = channel->region0_count + 1;
956
957 entry = &mad_huff_pair_table[channel->table_select[region = 0]];
958 table = entry->table;
959 linbits = entry->linbits;
960 startbits = entry->startbits;
961
962 if (table == 0)
963 return MAD_ERROR_BADHUFFTABLE;
964
965 expptr = &exponents[0];
966 exp = *expptr++;
967 reqhits = 0;
968
969 big_values = channel->big_values;
970
971 while (big_values-- && cachesz + bits_left > 0) {
972 union huffpair const *pair;
973 unsigned int clumpsz, value;
974 register mad_fixed_t requantized;
975
976 if (xrptr == sfbound) {
977 sfbound += *sfbwidth++;
978
979 /* change table if region boundary */
980
981 if (--rcount == 0) {
982 if (region == 0)
983 rcount = channel->region1_count + 1;
984 else
985 rcount = 0; /* all remaining */
986
987 entry = &mad_huff_pair_table[channel->table_select[++region]];
988 table = entry->table;
989 linbits = entry->linbits;
990 startbits = entry->startbits;
991
992 if (table == 0)
993 return MAD_ERROR_BADHUFFTABLE;
994 }
995
996 if (exp != *expptr) {
997 exp = *expptr;
998 reqhits = 0;
999 }
1000
1001 ++expptr;
1002 }
1003
1004 if (cachesz < 21) {
1005 unsigned int bits;
1006
1007 bits = ((32 - 1 - 21) + (21 - cachesz)) & ~7;
1008 bitcache = (bitcache << bits) | mad_bit_read(&peek, bits);
1009 cachesz += bits;
1010 bits_left -= bits;
1011 }
1012
1013 /* hcod (0..19) */
1014
1015 clumpsz = startbits;
1016 pair = &table[MASK(bitcache, cachesz, clumpsz)];
1017
1018 while (!pair->final) {
1019 cachesz -= clumpsz;
1020
1021 clumpsz = pair->ptr.bits;
1022 pair = &table[pair->ptr.offset + MASK(bitcache, cachesz, clumpsz)];
1023 }
1024
1025 cachesz -= pair->value.hlen;
1026
1027 if (linbits) {
1028 /* x (0..14) */
1029
1030 value = pair->value.x;
1031
1032 switch (value) {
1033 case 0:
1034 xrptr[0] = 0;
1035 break;
1036
1037 case 15:
1038 if (cachesz < (int)linbits + 2) {
1039 bitcache = (bitcache << 16) | mad_bit_read(&peek, 16);
1040 cachesz += 16;
1041 bits_left -= 16;
1042 }
1043
1044 value += MASK(bitcache, cachesz, linbits);
1045 cachesz -= linbits;
1046
1047 requantized = III_requantize(value, exp);
1048 goto x_final;
1049
1050 default:
1051 if (reqhits & (1 << value))
1052 requantized = reqcache[value];
1053 else {
1054 reqhits |= (1 << value);
1055 requantized = reqcache[value] = III_requantize(value, exp);
1056 }
1057
1058 x_final:
1059 xrptr[0] = MASK1BIT(bitcache, cachesz--) ?
1060 -requantized : requantized;
1061 }
1062
1063 /* y (0..14) */
1064
1065 value = pair->value.y;
1066
1067 switch (value) {
1068 case 0:
1069 xrptr[1] = 0;
1070 break;
1071
1072 case 15:
1073 if (cachesz < (int)linbits + 1) {
1074 bitcache = (bitcache << 16) | mad_bit_read(&peek, 16);
1075 cachesz += 16;
1076 bits_left -= 16;
1077 }
1078
1079 value += MASK(bitcache, cachesz, linbits);
1080 cachesz -= linbits;
1081
1082 requantized = III_requantize(value, exp);
1083 goto y_final;
1084
1085 default:
1086 if (reqhits & (1 << value))
1087 requantized = reqcache[value];
1088 else {
1089 reqhits |= (1 << value);
1090 requantized = reqcache[value] = III_requantize(value, exp);
1091 }
1092
1093 y_final:
1094 xrptr[1] = MASK1BIT(bitcache, cachesz--) ?
1095 -requantized : requantized;
1096 }
1097 }
1098 else {
1099 /* x (0..1) */
1100
1101 value = pair->value.x;
1102
1103 if (value == 0)
1104 xrptr[0] = 0;
1105 else {
1106 if (reqhits & (1 << value))
1107 requantized = reqcache[value];
1108 else {
1109 reqhits |= (1 << value);
1110 requantized = reqcache[value] = III_requantize(value, exp);
1111 }
1112
1113 xrptr[0] = MASK1BIT(bitcache, cachesz--) ?
1114 -requantized : requantized;
1115 }
1116
1117 /* y (0..1) */
1118
1119 value = pair->value.y;
1120
1121 if (value == 0)
1122 xrptr[1] = 0;
1123 else {
1124 if (reqhits & (1 << value))
1125 requantized = reqcache[value];
1126 else {
1127 reqhits |= (1 << value);
1128 requantized = reqcache[value] = III_requantize(value, exp);
1129 }
1130
1131 xrptr[1] = MASK1BIT(bitcache, cachesz--) ?
1132 -requantized : requantized;
1133 }
1134 }
1135
1136 xrptr += 2;
1137 }
1138 }
1139
1140 if (cachesz + bits_left < 0)
1141 return MAD_ERROR_BADHUFFDATA; /* big_values overrun */
1142
1143 /* count1 */
1144 {
1145 union huffquad const *table;
1146 register mad_fixed_t requantized;
1147
1148 table = mad_huff_quad_table[channel->flags & count1table_select];
1149
1150 requantized = III_requantize(1, exp);
1151
1152 while (cachesz + bits_left > 0 && xrptr <= &xr[572]) {
1153 union huffquad const *quad;
1154
1155 /* hcod (1..6) */
1156
1157 if (cachesz < 10) {
1158 bitcache = (bitcache << 16) | mad_bit_read(&peek, 16);
1159 cachesz += 16;
1160 bits_left -= 16;
1161 }
1162
1163 quad = &table[MASK(bitcache, cachesz, 4)];
1164
1165 /* quad tables guaranteed to have at most one extra lookup */
1166 if (!quad->final) {
1167 cachesz -= 4;
1168
1169 quad = &table[quad->ptr.offset +
1170 MASK(bitcache, cachesz, quad->ptr.bits)];
1171 }
1172
1173 cachesz -= quad->value.hlen;
1174
1175 if (xrptr == sfbound) {
1176 sfbound += *sfbwidth++;
1177
1178 if (exp != *expptr) {
1179 exp = *expptr;
1180 requantized = III_requantize(1, exp);
1181 }
1182
1183 ++expptr;
1184 }
1185
1186 /* v (0..1) */
1187
1188 xrptr[0] = quad->value.v ?
1189 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
1190
1191 /* w (0..1) */
1192
1193 xrptr[1] = quad->value.w ?
1194 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
1195
1196 xrptr += 2;
1197
1198 if (xrptr == sfbound) {
1199 sfbound += *sfbwidth++;
1200
1201 if (exp != *expptr) {
1202 exp = *expptr;
1203 requantized = III_requantize(1, exp);
1204 }
1205
1206 ++expptr;
1207 }
1208
1209 /* x (0..1) */
1210
1211 xrptr[0] = quad->value.x ?
1212 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
1213
1214 /* y (0..1) */
1215
1216 xrptr[1] = quad->value.y ?
1217 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
1218
1219 xrptr += 2;
1220 }
1221
1222 if (cachesz + bits_left < 0) {
1223
1224 /* technically the bitstream is misformatted, but apparently
1225 some encoders are just a bit sloppy with stuffing bits */
1226
1227 xrptr -= 4;
1228 }
1229 }
1230
1231 /* rzero */
1232 while (xrptr < &xr[576]) {
1233 xrptr[0] = 0;
1234 xrptr[1] = 0;
1235
1236 xrptr += 2;
1237 }
1238
1239 return MAD_ERROR_NONE;
1240 }
1241
1242 # undef MASK
1243 # undef MASK1BIT
1244
1245 /*
1246 * NAME: III_reorder()
1247 * DESCRIPTION: reorder frequency lines of a short block into subband order
1248 */
1249 static
III_reorder(mad_fixed_t xr[576],struct channel const * channel,unsigned char const sfbwidth[39])1250 void III_reorder(mad_fixed_t xr[576], struct channel const *channel,
1251 unsigned char const sfbwidth[39])
1252 {
1253 mad_fixed_t tmp[32][3][6];
1254 unsigned int sb, l, f, w, sbw[3], sw[3];
1255
1256 /* this is probably wrong for 8000 Hz mixed blocks */
1257
1258 sb = 0;
1259 if (channel->flags & mixed_block_flag) {
1260 sb = 2;
1261
1262 l = 0;
1263 while (l < 36)
1264 l += *sfbwidth++;
1265 }
1266
1267 for (w = 0; w < 3; ++w) {
1268 sbw[w] = sb;
1269 sw[w] = 0;
1270 }
1271
1272 f = *sfbwidth++;
1273 w = 0;
1274
1275 for (l = 18 * sb; l < 576; ++l) {
1276 if (f-- == 0) {
1277 f = *sfbwidth++ - 1;
1278 w = (w + 1) % 3;
1279 }
1280
1281 tmp[sbw[w]][w][sw[w]++] = xr[l];
1282
1283 if (sw[w] == 6) {
1284 sw[w] = 0;
1285 ++sbw[w];
1286 }
1287 }
1288
1289 memcpy(&xr[18 * sb], &tmp[sb], (576 - 18 * sb) * sizeof(mad_fixed_t));
1290 }
1291
1292 /*
1293 * NAME: III_stereo()
1294 * DESCRIPTION: perform joint stereo processing on a granule
1295 */
1296 static
III_stereo(mad_fixed_t xr[2][576],struct granule const * granule,struct mad_header * header,unsigned char const * sfbwidth)1297 enum mad_error III_stereo(mad_fixed_t xr[2][576],
1298 struct granule const *granule,
1299 struct mad_header *header,
1300 unsigned char const *sfbwidth)
1301 {
1302 short modes[39];
1303 unsigned int sfbi, l, n, i;
1304
1305 if (granule->ch[0].block_type !=
1306 granule->ch[1].block_type ||
1307 (granule->ch[0].flags & mixed_block_flag) !=
1308 (granule->ch[1].flags & mixed_block_flag))
1309 return MAD_ERROR_BADSTEREO;
1310
1311 for (i = 0; i < 39; ++i)
1312 modes[i] = header->mode_extension;
1313
1314 /* intensity stereo */
1315
1316 if (header->mode_extension & I_STEREO) {
1317 struct channel const *right_ch = &granule->ch[1];
1318 mad_fixed_t const *right_xr = xr[1];
1319 unsigned int is_pos;
1320
1321 header->flags |= MAD_FLAG_I_STEREO;
1322
1323 /* first determine which scalefactor bands are to be processed */
1324
1325 if (right_ch->block_type == 2) {
1326 unsigned int lower, start, max, bound[3], w;
1327
1328 lower = start = max = bound[0] = bound[1] = bound[2] = 0;
1329
1330 sfbi = l = 0;
1331
1332 if (right_ch->flags & mixed_block_flag) {
1333 while (l < 36) {
1334 n = sfbwidth[sfbi++];
1335
1336 for (i = 0; i < n; ++i) {
1337 if (right_xr[i]) {
1338 lower = sfbi;
1339 break;
1340 }
1341 }
1342
1343 right_xr += n;
1344 l += n;
1345 }
1346
1347 start = sfbi;
1348 }
1349
1350 w = 0;
1351 while (l < 576) {
1352 n = sfbwidth[sfbi++];
1353
1354 for (i = 0; i < n; ++i) {
1355 if (right_xr[i]) {
1356 max = bound[w] = sfbi;
1357 break;
1358 }
1359 }
1360
1361 right_xr += n;
1362 l += n;
1363 w = (w + 1) % 3;
1364 }
1365
1366 if (max)
1367 lower = start;
1368
1369 /* long blocks */
1370
1371 for (i = 0; i < lower; ++i)
1372 modes[i] = header->mode_extension & ~I_STEREO;
1373
1374 /* short blocks */
1375
1376 w = 0;
1377 for (i = start; i < max; ++i) {
1378 if (i < bound[w])
1379 modes[i] = header->mode_extension & ~I_STEREO;
1380
1381 w = (w + 1) % 3;
1382 }
1383 }
1384 else { /* right_ch->block_type != 2 */
1385 unsigned int bound;
1386
1387 bound = 0;
1388 for (sfbi = l = 0; l < 576; l += n) {
1389 n = sfbwidth[sfbi++];
1390
1391 for (i = 0; i < n; ++i) {
1392 if (right_xr[i]) {
1393 bound = sfbi;
1394 break;
1395 }
1396 }
1397
1398 right_xr += n;
1399 }
1400
1401 for (i = 0; i < bound; ++i)
1402 modes[i] = header->mode_extension & ~I_STEREO;
1403 }
1404
1405 /* now do the actual processing */
1406
1407 if (header->flags & MAD_FLAG_LSF_EXT) {
1408 unsigned char const *illegal_pos = granule[1].ch[1].scalefac;
1409 mad_fixed_t const *lsf_scale;
1410
1411 /* intensity_scale */
1412 lsf_scale = is_lsf_table[right_ch->scalefac_compress & 0x1];
1413
1414 for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
1415 n = sfbwidth[sfbi];
1416
1417 if (!(modes[sfbi] & I_STEREO))
1418 continue;
1419
1420 if (illegal_pos[sfbi]) {
1421 modes[sfbi] &= ~I_STEREO;
1422 continue;
1423 }
1424
1425 is_pos = right_ch->scalefac[sfbi];
1426
1427 for (i = 0; i < n; ++i) {
1428 register mad_fixed_t left;
1429
1430 left = xr[0][l + i];
1431
1432 if (is_pos == 0)
1433 xr[1][l + i] = left;
1434 else {
1435 register mad_fixed_t opposite;
1436
1437 opposite = mad_f_mul(left, lsf_scale[(is_pos - 1) / 2]);
1438
1439 if (is_pos & 1) {
1440 xr[0][l + i] = opposite;
1441 xr[1][l + i] = left;
1442 }
1443 else
1444 xr[1][l + i] = opposite;
1445 }
1446 }
1447 }
1448 }
1449 else { /* !(header->flags & MAD_FLAG_LSF_EXT) */
1450 for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
1451 n = sfbwidth[sfbi];
1452
1453 if (!(modes[sfbi] & I_STEREO))
1454 continue;
1455
1456 is_pos = right_ch->scalefac[sfbi];
1457
1458 if (is_pos >= 7) { /* illegal intensity position */
1459 modes[sfbi] &= ~I_STEREO;
1460 continue;
1461 }
1462
1463 for (i = 0; i < n; ++i) {
1464 register mad_fixed_t left;
1465
1466 left = xr[0][l + i];
1467
1468 xr[0][l + i] = mad_f_mul(left, is_table[ is_pos]);
1469 xr[1][l + i] = mad_f_mul(left, is_table[6 - is_pos]);
1470 }
1471 }
1472 }
1473 }
1474
1475 /* middle/side stereo */
1476
1477 if (header->mode_extension & MS_STEREO) {
1478 register mad_fixed_t invsqrt2;
1479
1480 header->flags |= MAD_FLAG_MS_STEREO;
1481
1482 invsqrt2 = root_table[3 + -2];
1483
1484 for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
1485 n = sfbwidth[sfbi];
1486
1487 if (modes[sfbi] != MS_STEREO)
1488 continue;
1489
1490 for (i = 0; i < n; ++i) {
1491 register mad_fixed_t m, s;
1492
1493 m = xr[0][l + i];
1494 s = xr[1][l + i];
1495
1496 xr[0][l + i] = mad_f_mul(m + s, invsqrt2); /* l = (m + s) / sqrt(2) */
1497 xr[1][l + i] = mad_f_mul(m - s, invsqrt2); /* r = (m - s) / sqrt(2) */
1498 }
1499 }
1500 }
1501
1502 return MAD_ERROR_NONE;
1503 }
1504
1505 /*
1506 * NAME: III_aliasreduce()
1507 * DESCRIPTION: perform frequency line alias reduction
1508 */
III_aliasreduce(mad_fixed_t xr[576],int lines)1509 static void III_aliasreduce(mad_fixed_t xr[576], int lines)
1510 {
1511 mad_fixed_t const *bound;
1512 int i;
1513
1514 bound = &xr[lines];
1515 for (xr += 18; xr < bound; xr += 18) {
1516 for (i = 0; i < 8; ++i) {
1517 register mad_fixed_t a, b;
1518 register mad_fixed64hi_t hi;
1519 register mad_fixed64lo_t lo;
1520
1521 a = xr[-1 - i];
1522 b = xr[ i];
1523
1524 # if defined(ASO_ZEROCHECK)
1525 if (a | b) {
1526 # endif
1527 MAD_F_ML0(hi, lo, a, cs[i]);
1528 MAD_F_MLA(hi, lo, -b, ca[i]);
1529
1530 xr[-1 - i] = MAD_F_MLZ(hi, lo);
1531
1532 MAD_F_ML0(hi, lo, b, cs[i]);
1533 MAD_F_MLA(hi, lo, a, ca[i]);
1534
1535 xr[ i] = MAD_F_MLZ(hi, lo);
1536 # if defined(ASO_ZEROCHECK)
1537 }
1538 # endif
1539 }
1540 }
1541 }
1542
1543 # if defined(ASO_IMDCT)
1544 void III_imdct_l(mad_fixed_t const [18], mad_fixed_t [36], unsigned int);
1545 # else
1546 # if 1
fastsdct(mad_fixed_t const x[9],mad_fixed_t y[18])1547 static void fastsdct(mad_fixed_t const x[9], mad_fixed_t y[18])
1548 {
1549 mad_fixed_t a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12;
1550 mad_fixed_t a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25;
1551 mad_fixed_t m0, m1, m2, m3, m4, m5, m6, m7;
1552
1553 enum {
1554 c0 = MAD_F(0x1f838b8d), /* 2 * cos( 1 * PI / 18) */
1555 c1 = MAD_F(0x1bb67ae8), /* 2 * cos( 3 * PI / 18) */
1556 c2 = MAD_F(0x18836fa3), /* 2 * cos( 4 * PI / 18) */
1557 c3 = MAD_F(0x1491b752), /* 2 * cos( 5 * PI / 18) */
1558 c4 = MAD_F(0x0af1d43a), /* 2 * cos( 7 * PI / 18) */
1559 c5 = MAD_F(0x058e86a0), /* 2 * cos( 8 * PI / 18) */
1560 c6 = -MAD_F(0x1e11f642) /* 2 * cos(16 * PI / 18) */
1561 };
1562
1563 a0 = x[3] + x[5];
1564 a1 = x[3] - x[5];
1565 a2 = x[6] + x[2];
1566 a3 = x[6] - x[2];
1567 a4 = x[1] + x[7];
1568 a5 = x[1] - x[7];
1569 a6 = x[8] + x[0];
1570 a7 = x[8] - x[0];
1571
1572 a8 = a0 + a2;
1573 a9 = a0 - a2;
1574 a10 = a0 - a6;
1575 a11 = a2 - a6;
1576 a12 = a8 + a6;
1577 a13 = a1 - a3;
1578 a14 = a13 + a7;
1579 a15 = a3 + a7;
1580 a16 = a1 - a7;
1581 a17 = a1 + a3;
1582
1583 m0 = mad_f_mul(a17, -c3);
1584 m1 = mad_f_mul(a16, -c0);
1585 m2 = mad_f_mul(a15, -c4);
1586 m3 = mad_f_mul(a14, -c1);
1587 m4 = mad_f_mul(a5, -c1);
1588 m5 = mad_f_mul(a11, -c6);
1589 m6 = mad_f_mul(a10, -c5);
1590 m7 = mad_f_mul(a9, -c2);
1591
1592 a18 = x[4] + a4;
1593 a19 = 2 * x[4] - a4;
1594 a20 = a19 + m5;
1595 a21 = a19 - m5;
1596 a22 = a19 + m6;
1597 a23 = m4 + m2;
1598 a24 = m4 - m2;
1599 a25 = m4 + m1;
1600
1601 /* output to every other slot for convenience */
1602
1603 y[ 0] = a18 + a12;
1604 y[ 2] = m0 - a25;
1605 y[ 4] = m7 - a20;
1606 y[ 6] = m3;
1607 y[ 8] = a21 - m6;
1608 y[10] = a24 - m1;
1609 y[12] = a12 - 2 * a18;
1610 y[14] = a23 + m0;
1611 y[16] = a22 + m7;
1612 }
1613
sdctII(mad_fixed_t const x[18],mad_fixed_t X[18])1614 static INLINE void sdctII(mad_fixed_t const x[18], mad_fixed_t X[18])
1615 {
1616 mad_fixed_t tmp[9];
1617 int i;
1618
1619 /* scale[i] = 2 * cos(PI * (2 * i + 1) / (2 * 18)) */
1620 static mad_fixed_t const scale[9] = {
1621 MAD_F(0x1fe0d3b4), MAD_F(0x1ee8dd47), MAD_F(0x1d007930),
1622 MAD_F(0x1a367e59), MAD_F(0x16a09e66), MAD_F(0x125abcf8),
1623 MAD_F(0x0d8616bc), MAD_F(0x08483ee1), MAD_F(0x02c9fad7)
1624 };
1625
1626 /* divide the 18-point SDCT-II into two 9-point SDCT-IIs */
1627
1628 /* even input butterfly */
1629
1630 for (i = 0; i < 9; i += 3) {
1631 tmp[i + 0] = x[i + 0] + x[18 - (i + 0) - 1];
1632 tmp[i + 1] = x[i + 1] + x[18 - (i + 1) - 1];
1633 tmp[i + 2] = x[i + 2] + x[18 - (i + 2) - 1];
1634 }
1635
1636 fastsdct(tmp, &X[0]);
1637
1638 /* odd input butterfly and scaling */
1639
1640 for (i = 0; i < 9; i += 3) {
1641 tmp[i + 0] = mad_f_mul(x[i + 0] - x[18 - (i + 0) - 1], scale[i + 0]);
1642 tmp[i + 1] = mad_f_mul(x[i + 1] - x[18 - (i + 1) - 1], scale[i + 1]);
1643 tmp[i + 2] = mad_f_mul(x[i + 2] - x[18 - (i + 2) - 1], scale[i + 2]);
1644 }
1645
1646 fastsdct(tmp, &X[1]);
1647
1648 /* output accumulation */
1649
1650 for (i = 3; i < 18; i += 8) {
1651 X[i + 0] -= X[(i + 0) - 2];
1652 X[i + 2] -= X[(i + 2) - 2];
1653 X[i + 4] -= X[(i + 4) - 2];
1654 X[i + 6] -= X[(i + 6) - 2];
1655 }
1656 }
1657
dctIV(mad_fixed_t const y[18],mad_fixed_t X[18])1658 static INLINE void dctIV(mad_fixed_t const y[18], mad_fixed_t X[18])
1659 {
1660 mad_fixed_t tmp[18];
1661 int i;
1662
1663 /* scale[i] = 2 * cos(PI * (2 * i + 1) / (4 * 18)) */
1664 static mad_fixed_t const scale[18] = {
1665 MAD_F(0x1ff833fa), MAD_F(0x1fb9ea93), MAD_F(0x1f3dd120),
1666 MAD_F(0x1e84d969), MAD_F(0x1d906bcf), MAD_F(0x1c62648b),
1667 MAD_F(0x1afd100f), MAD_F(0x1963268b), MAD_F(0x1797c6a4),
1668 MAD_F(0x159e6f5b), MAD_F(0x137af940), MAD_F(0x11318ef3),
1669 MAD_F(0x0ec6a507), MAD_F(0x0c3ef153), MAD_F(0x099f61c5),
1670 MAD_F(0x06ed12c5), MAD_F(0x042d4544), MAD_F(0x0165547c)
1671 };
1672
1673 /* scaling */
1674
1675 for (i = 0; i < 18; i += 3) {
1676 tmp[i + 0] = mad_f_mul(y[i + 0], scale[i + 0]);
1677 tmp[i + 1] = mad_f_mul(y[i + 1], scale[i + 1]);
1678 tmp[i + 2] = mad_f_mul(y[i + 2], scale[i + 2]);
1679 }
1680
1681 /* SDCT-II */
1682
1683 sdctII(tmp, X);
1684
1685 /* scale reduction and output accumulation */
1686
1687 X[0] /= 2;
1688 for (i = 1; i < 17; i += 4) {
1689 X[i + 0] = X[i + 0] / 2 - X[(i + 0) - 1];
1690 X[i + 1] = X[i + 1] / 2 - X[(i + 1) - 1];
1691 X[i + 2] = X[i + 2] / 2 - X[(i + 2) - 1];
1692 X[i + 3] = X[i + 3] / 2 - X[(i + 3) - 1];
1693 }
1694 X[17] = X[17] / 2 - X[16];
1695 }
1696
1697 /*
1698 * NAME: imdct36
1699 * DESCRIPTION: perform X[18]->x[36] IMDCT using Szu-Wei Lee's fast algorithm
1700 */
imdct36(mad_fixed_t const x[18],mad_fixed_t y[36])1701 static INLINE void imdct36(mad_fixed_t const x[18], mad_fixed_t y[36])
1702 {
1703 mad_fixed_t tmp[18];
1704 int i;
1705
1706 /* DCT-IV */
1707
1708 dctIV(x, tmp);
1709
1710 /* convert 18-point DCT-IV to 36-point IMDCT */
1711
1712 for (i = 0; i < 9; i += 3) {
1713 y[i + 0] = tmp[9 + (i + 0)];
1714 y[i + 1] = tmp[9 + (i + 1)];
1715 y[i + 2] = tmp[9 + (i + 2)];
1716 }
1717 for (i = 9; i < 27; i += 3) {
1718 y[i + 0] = -tmp[36 - (9 + (i + 0)) - 1];
1719 y[i + 1] = -tmp[36 - (9 + (i + 1)) - 1];
1720 y[i + 2] = -tmp[36 - (9 + (i + 2)) - 1];
1721 }
1722 for (i = 27; i < 36; i += 3) {
1723 y[i + 0] = -tmp[(i + 0) - 27];
1724 y[i + 1] = -tmp[(i + 1) - 27];
1725 y[i + 2] = -tmp[(i + 2) - 27];
1726 }
1727 }
1728 # else
1729 /*
1730 * NAME: imdct36
1731 * DESCRIPTION: perform X[18]->x[36] IMDCT
1732 */
1733 static inline
imdct36(mad_fixed_t const X[18],mad_fixed_t x[36])1734 void imdct36(mad_fixed_t const X[18], mad_fixed_t x[36])
1735 {
1736 mad_fixed_t t0, t1, t2, t3, t4, t5, t6, t7;
1737 mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15;
1738 register mad_fixed64hi_t hi;
1739 register mad_fixed64lo_t lo;
1740
1741 MAD_F_ML0(hi, lo, X[4], MAD_F(0x0ec835e8));
1742 MAD_F_MLA(hi, lo, X[13], MAD_F(0x061f78aa));
1743
1744 t6 = MAD_F_MLZ(hi, lo);
1745
1746 MAD_F_MLA(hi, lo, (t14 = X[1] - X[10]), -MAD_F(0x061f78aa));
1747 MAD_F_MLA(hi, lo, (t15 = X[7] + X[16]), -MAD_F(0x0ec835e8));
1748
1749 t0 = MAD_F_MLZ(hi, lo);
1750
1751 MAD_F_MLA(hi, lo, (t8 = X[0] - X[11] - X[12]), MAD_F(0x0216a2a2));
1752 MAD_F_MLA(hi, lo, (t9 = X[2] - X[9] - X[14]), MAD_F(0x09bd7ca0));
1753 MAD_F_MLA(hi, lo, (t10 = X[3] - X[8] - X[15]), -MAD_F(0x0cb19346));
1754 MAD_F_MLA(hi, lo, (t11 = X[5] - X[6] - X[17]), -MAD_F(0x0fdcf549));
1755
1756 x[7] = MAD_F_MLZ(hi, lo);
1757 x[10] = -x[7];
1758
1759 MAD_F_ML0(hi, lo, t8, -MAD_F(0x0cb19346));
1760 MAD_F_MLA(hi, lo, t9, MAD_F(0x0fdcf549));
1761 MAD_F_MLA(hi, lo, t10, MAD_F(0x0216a2a2));
1762 MAD_F_MLA(hi, lo, t11, -MAD_F(0x09bd7ca0));
1763
1764 x[19] = x[34] = MAD_F_MLZ(hi, lo) - t0;
1765
1766 t12 = X[0] - X[3] + X[8] - X[11] - X[12] + X[15];
1767 t13 = X[2] + X[5] - X[6] - X[9] - X[14] - X[17];
1768
1769 MAD_F_ML0(hi, lo, t12, -MAD_F(0x0ec835e8));
1770 MAD_F_MLA(hi, lo, t13, MAD_F(0x061f78aa));
1771
1772 x[22] = x[31] = MAD_F_MLZ(hi, lo) + t0;
1773
1774 MAD_F_ML0(hi, lo, X[1], -MAD_F(0x09bd7ca0));
1775 MAD_F_MLA(hi, lo, X[7], MAD_F(0x0216a2a2));
1776 MAD_F_MLA(hi, lo, X[10], -MAD_F(0x0fdcf549));
1777 MAD_F_MLA(hi, lo, X[16], MAD_F(0x0cb19346));
1778
1779 t1 = MAD_F_MLZ(hi, lo) + t6;
1780
1781 MAD_F_ML0(hi, lo, X[0], MAD_F(0x03768962));
1782 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0e313245));
1783 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0ffc19fd));
1784 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0acf37ad));
1785 MAD_F_MLA(hi, lo, X[6], MAD_F(0x04cfb0e2));
1786 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0898c779));
1787 MAD_F_MLA(hi, lo, X[9], MAD_F(0x0d7e8807));
1788 MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f426cb5));
1789 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0bcbe352));
1790 MAD_F_MLA(hi, lo, X[14], MAD_F(0x00b2aa3e));
1791 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x07635284));
1792 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0f9ee890));
1793
1794 x[6] = MAD_F_MLZ(hi, lo) + t1;
1795 x[11] = -x[6];
1796
1797 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f426cb5));
1798 MAD_F_MLA(hi, lo, X[2], -MAD_F(0x00b2aa3e));
1799 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0898c779));
1800 MAD_F_MLA(hi, lo, X[5], MAD_F(0x0f9ee890));
1801 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0acf37ad));
1802 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x07635284));
1803 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0e313245));
1804 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0bcbe352));
1805 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x03768962));
1806 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0d7e8807));
1807 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0ffc19fd));
1808 MAD_F_MLA(hi, lo, X[17], MAD_F(0x04cfb0e2));
1809
1810 x[23] = x[30] = MAD_F_MLZ(hi, lo) + t1;
1811
1812 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0bcbe352));
1813 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0d7e8807));
1814 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x07635284));
1815 MAD_F_MLA(hi, lo, X[5], MAD_F(0x04cfb0e2));
1816 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f9ee890));
1817 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0ffc19fd));
1818 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x00b2aa3e));
1819 MAD_F_MLA(hi, lo, X[11], MAD_F(0x03768962));
1820 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0f426cb5));
1821 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0e313245));
1822 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0898c779));
1823 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0acf37ad));
1824
1825 x[18] = x[35] = MAD_F_MLZ(hi, lo) - t1;
1826
1827 MAD_F_ML0(hi, lo, X[4], MAD_F(0x061f78aa));
1828 MAD_F_MLA(hi, lo, X[13], -MAD_F(0x0ec835e8));
1829
1830 t7 = MAD_F_MLZ(hi, lo);
1831
1832 MAD_F_MLA(hi, lo, X[1], -MAD_F(0x0cb19346));
1833 MAD_F_MLA(hi, lo, X[7], MAD_F(0x0fdcf549));
1834 MAD_F_MLA(hi, lo, X[10], MAD_F(0x0216a2a2));
1835 MAD_F_MLA(hi, lo, X[16], -MAD_F(0x09bd7ca0));
1836
1837 t2 = MAD_F_MLZ(hi, lo);
1838
1839 MAD_F_MLA(hi, lo, X[0], MAD_F(0x04cfb0e2));
1840 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0ffc19fd));
1841 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0d7e8807));
1842 MAD_F_MLA(hi, lo, X[5], MAD_F(0x03768962));
1843 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0bcbe352));
1844 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0e313245));
1845 MAD_F_MLA(hi, lo, X[9], MAD_F(0x07635284));
1846 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0acf37ad));
1847 MAD_F_MLA(hi, lo, X[12], MAD_F(0x0f9ee890));
1848 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0898c779));
1849 MAD_F_MLA(hi, lo, X[15], MAD_F(0x00b2aa3e));
1850 MAD_F_MLA(hi, lo, X[17], MAD_F(0x0f426cb5));
1851
1852 x[5] = MAD_F_MLZ(hi, lo);
1853 x[12] = -x[5];
1854
1855 MAD_F_ML0(hi, lo, X[0], MAD_F(0x0acf37ad));
1856 MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0898c779));
1857 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0e313245));
1858 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0f426cb5));
1859 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x03768962));
1860 MAD_F_MLA(hi, lo, X[8], MAD_F(0x00b2aa3e));
1861 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0ffc19fd));
1862 MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f9ee890));
1863 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x04cfb0e2));
1864 MAD_F_MLA(hi, lo, X[14], MAD_F(0x07635284));
1865 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0d7e8807));
1866 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0bcbe352));
1867
1868 x[0] = MAD_F_MLZ(hi, lo) + t2;
1869 x[17] = -x[0];
1870
1871 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f9ee890));
1872 MAD_F_MLA(hi, lo, X[2], -MAD_F(0x07635284));
1873 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x00b2aa3e));
1874 MAD_F_MLA(hi, lo, X[5], MAD_F(0x0bcbe352));
1875 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f426cb5));
1876 MAD_F_MLA(hi, lo, X[8], MAD_F(0x0d7e8807));
1877 MAD_F_MLA(hi, lo, X[9], MAD_F(0x0898c779));
1878 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x04cfb0e2));
1879 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0acf37ad));
1880 MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0ffc19fd));
1881 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0e313245));
1882 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x03768962));
1883
1884 x[24] = x[29] = MAD_F_MLZ(hi, lo) + t2;
1885
1886 MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0216a2a2));
1887 MAD_F_MLA(hi, lo, X[7], -MAD_F(0x09bd7ca0));
1888 MAD_F_MLA(hi, lo, X[10], MAD_F(0x0cb19346));
1889 MAD_F_MLA(hi, lo, X[16], MAD_F(0x0fdcf549));
1890
1891 t3 = MAD_F_MLZ(hi, lo) + t7;
1892
1893 MAD_F_ML0(hi, lo, X[0], MAD_F(0x00b2aa3e));
1894 MAD_F_MLA(hi, lo, X[2], MAD_F(0x03768962));
1895 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x04cfb0e2));
1896 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x07635284));
1897 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0898c779));
1898 MAD_F_MLA(hi, lo, X[8], MAD_F(0x0acf37ad));
1899 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0bcbe352));
1900 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0d7e8807));
1901 MAD_F_MLA(hi, lo, X[12], MAD_F(0x0e313245));
1902 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f426cb5));
1903 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0f9ee890));
1904 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0ffc19fd));
1905
1906 x[8] = MAD_F_MLZ(hi, lo) + t3;
1907 x[9] = -x[8];
1908
1909 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0e313245));
1910 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0bcbe352));
1911 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0f9ee890));
1912 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0898c779));
1913 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0ffc19fd));
1914 MAD_F_MLA(hi, lo, X[8], MAD_F(0x04cfb0e2));
1915 MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f426cb5));
1916 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x00b2aa3e));
1917 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0d7e8807));
1918 MAD_F_MLA(hi, lo, X[14], -MAD_F(0x03768962));
1919 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0acf37ad));
1920 MAD_F_MLA(hi, lo, X[17], MAD_F(0x07635284));
1921
1922 x[21] = x[32] = MAD_F_MLZ(hi, lo) + t3;
1923
1924 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0d7e8807));
1925 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0f426cb5));
1926 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0acf37ad));
1927 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0ffc19fd));
1928 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x07635284));
1929 MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f9ee890));
1930 MAD_F_MLA(hi, lo, X[9], MAD_F(0x03768962));
1931 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0e313245));
1932 MAD_F_MLA(hi, lo, X[12], MAD_F(0x00b2aa3e));
1933 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0bcbe352));
1934 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x04cfb0e2));
1935 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0898c779));
1936
1937 x[20] = x[33] = MAD_F_MLZ(hi, lo) - t3;
1938
1939 MAD_F_ML0(hi, lo, t14, -MAD_F(0x0ec835e8));
1940 MAD_F_MLA(hi, lo, t15, MAD_F(0x061f78aa));
1941
1942 t4 = MAD_F_MLZ(hi, lo) - t7;
1943
1944 MAD_F_ML0(hi, lo, t12, MAD_F(0x061f78aa));
1945 MAD_F_MLA(hi, lo, t13, MAD_F(0x0ec835e8));
1946
1947 x[4] = MAD_F_MLZ(hi, lo) + t4;
1948 x[13] = -x[4];
1949
1950 MAD_F_ML0(hi, lo, t8, MAD_F(0x09bd7ca0));
1951 MAD_F_MLA(hi, lo, t9, -MAD_F(0x0216a2a2));
1952 MAD_F_MLA(hi, lo, t10, MAD_F(0x0fdcf549));
1953 MAD_F_MLA(hi, lo, t11, -MAD_F(0x0cb19346));
1954
1955 x[1] = MAD_F_MLZ(hi, lo) + t4;
1956 x[16] = -x[1];
1957
1958 MAD_F_ML0(hi, lo, t8, -MAD_F(0x0fdcf549));
1959 MAD_F_MLA(hi, lo, t9, -MAD_F(0x0cb19346));
1960 MAD_F_MLA(hi, lo, t10, -MAD_F(0x09bd7ca0));
1961 MAD_F_MLA(hi, lo, t11, -MAD_F(0x0216a2a2));
1962
1963 x[25] = x[28] = MAD_F_MLZ(hi, lo) + t4;
1964
1965 MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0fdcf549));
1966 MAD_F_MLA(hi, lo, X[7], -MAD_F(0x0cb19346));
1967 MAD_F_MLA(hi, lo, X[10], -MAD_F(0x09bd7ca0));
1968 MAD_F_MLA(hi, lo, X[16], -MAD_F(0x0216a2a2));
1969
1970 t5 = MAD_F_MLZ(hi, lo) - t6;
1971
1972 MAD_F_ML0(hi, lo, X[0], MAD_F(0x0898c779));
1973 MAD_F_MLA(hi, lo, X[2], MAD_F(0x04cfb0e2));
1974 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0bcbe352));
1975 MAD_F_MLA(hi, lo, X[5], MAD_F(0x00b2aa3e));
1976 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0e313245));
1977 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x03768962));
1978 MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f9ee890));
1979 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x07635284));
1980 MAD_F_MLA(hi, lo, X[12], MAD_F(0x0ffc19fd));
1981 MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0acf37ad));
1982 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0f426cb5));
1983 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0d7e8807));
1984
1985 x[2] = MAD_F_MLZ(hi, lo) + t5;
1986 x[15] = -x[2];
1987
1988 MAD_F_ML0(hi, lo, X[0], MAD_F(0x07635284));
1989 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0acf37ad));
1990 MAD_F_MLA(hi, lo, X[3], MAD_F(0x03768962));
1991 MAD_F_MLA(hi, lo, X[5], MAD_F(0x0d7e8807));
1992 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x00b2aa3e));
1993 MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f426cb5));
1994 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x04cfb0e2));
1995 MAD_F_MLA(hi, lo, X[11], MAD_F(0x0ffc19fd));
1996 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0898c779));
1997 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f9ee890));
1998 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0bcbe352));
1999 MAD_F_MLA(hi, lo, X[17], MAD_F(0x0e313245));
2000
2001 x[3] = MAD_F_MLZ(hi, lo) + t5;
2002 x[14] = -x[3];
2003
2004 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0ffc19fd));
2005 MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0f9ee890));
2006 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0f426cb5));
2007 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0e313245));
2008 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0d7e8807));
2009 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0bcbe352));
2010 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0acf37ad));
2011 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0898c779));
2012 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x07635284));
2013 MAD_F_MLA(hi, lo, X[14], -MAD_F(0x04cfb0e2));
2014 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x03768962));
2015 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x00b2aa3e));
2016
2017 x[26] = x[27] = MAD_F_MLZ(hi, lo) + t5;
2018 }
2019 # endif
2020
2021 /*
2022 * NAME: III_imdct_l()
2023 * DESCRIPTION: perform IMDCT and windowing for long blocks
2024 */
2025 static
III_imdct_l(mad_fixed_t const X[18],mad_fixed_t z[36],unsigned int block_type)2026 void III_imdct_l(mad_fixed_t const X[18], mad_fixed_t z[36],
2027 unsigned int block_type)
2028 {
2029 unsigned int i;
2030
2031 /* IMDCT */
2032
2033 imdct36(X, z);
2034
2035 /* windowing */
2036
2037 switch (block_type) {
2038 case 0: /* normal window */
2039 # if defined(ASO_INTERLEAVE1)
2040 {
2041 register mad_fixed_t tmp1, tmp2;
2042
2043 tmp1 = window_l[0];
2044 tmp2 = window_l[1];
2045
2046 for (i = 0; i < 34; i += 2) {
2047 z[i + 0] = mad_f_mul(z[i + 0], tmp1);
2048 tmp1 = window_l[i + 2];
2049 z[i + 1] = mad_f_mul(z[i + 1], tmp2);
2050 tmp2 = window_l[i + 3];
2051 }
2052
2053 z[34] = mad_f_mul(z[34], tmp1);
2054 z[35] = mad_f_mul(z[35], tmp2);
2055 }
2056 # elif defined(ASO_INTERLEAVE2)
2057 {
2058 register mad_fixed_t tmp1, tmp2;
2059
2060 tmp1 = z[0];
2061 tmp2 = window_l[0];
2062
2063 for (i = 0; i < 35; ++i) {
2064 z[i] = mad_f_mul(tmp1, tmp2);
2065 tmp1 = z[i + 1];
2066 tmp2 = window_l[i + 1];
2067 }
2068
2069 z[35] = mad_f_mul(tmp1, tmp2);
2070 }
2071 # elif 1
2072 for (i = 0; i < 36; i += 4) {
2073 z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]);
2074 z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]);
2075 z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]);
2076 z[i + 3] = mad_f_mul(z[i + 3], window_l[i + 3]);
2077 }
2078 # else
2079 for (i = 0; i < 36; ++i) z[i] = mad_f_mul(z[i], window_l[i]);
2080 # endif
2081 break;
2082
2083 case 1: /* start block */
2084 for (i = 0; i < 18; i += 3) {
2085 z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]);
2086 z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]);
2087 z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]);
2088 }
2089 /* (i = 18; i < 24; ++i) z[i] unchanged */
2090 for (i = 24; i < 30; ++i) z[i] = mad_f_mul(z[i], window_s[i - 18]);
2091 for (i = 30; i < 36; ++i) z[i] = 0;
2092 break;
2093
2094 case 3: /* stop block */
2095 for (i = 0; i < 6; ++i) z[i] = 0;
2096 for (i = 6; i < 12; ++i) z[i] = mad_f_mul(z[i], window_s[i - 6]);
2097 /* (i = 12; i < 18; ++i) z[i] unchanged */
2098 for (i = 18; i < 36; i += 3) {
2099 z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]);
2100 z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]);
2101 z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]);
2102 }
2103 break;
2104 }
2105 }
2106 # endif /* ASO_IMDCT */
2107
2108 /*
2109 * NAME: III_imdct_s()
2110 * DESCRIPTION: perform IMDCT and windowing for short blocks
2111 */
2112 static
III_imdct_s(mad_fixed_t const X[18],mad_fixed_t z[36])2113 void III_imdct_s(mad_fixed_t const X[18], mad_fixed_t z[36])
2114 {
2115 mad_fixed_t y[36], *yptr;
2116 mad_fixed_t const *wptr;
2117 int w, i;
2118 register mad_fixed64hi_t hi;
2119 register mad_fixed64lo_t lo;
2120
2121 /* IMDCT */
2122
2123 yptr = &y[0];
2124
2125 for (w = 0; w < 3; ++w) {
2126 register mad_fixed_t const (*s)[6];
2127
2128 s = imdct_s;
2129
2130 for (i = 0; i < 3; ++i) {
2131 MAD_F_ML0(hi, lo, X[0], (*s)[0]);
2132 MAD_F_MLA(hi, lo, X[1], (*s)[1]);
2133 MAD_F_MLA(hi, lo, X[2], (*s)[2]);
2134 MAD_F_MLA(hi, lo, X[3], (*s)[3]);
2135 MAD_F_MLA(hi, lo, X[4], (*s)[4]);
2136 MAD_F_MLA(hi, lo, X[5], (*s)[5]);
2137
2138 yptr[i + 0] = MAD_F_MLZ(hi, lo);
2139 yptr[5 - i] = -yptr[i + 0];
2140
2141 ++s;
2142
2143 MAD_F_ML0(hi, lo, X[0], (*s)[0]);
2144 MAD_F_MLA(hi, lo, X[1], (*s)[1]);
2145 MAD_F_MLA(hi, lo, X[2], (*s)[2]);
2146 MAD_F_MLA(hi, lo, X[3], (*s)[3]);
2147 MAD_F_MLA(hi, lo, X[4], (*s)[4]);
2148 MAD_F_MLA(hi, lo, X[5], (*s)[5]);
2149
2150 yptr[ i + 6] = MAD_F_MLZ(hi, lo);
2151 yptr[11 - i] = yptr[i + 6];
2152
2153 ++s;
2154 }
2155
2156 yptr += 12;
2157 X += 6;
2158 }
2159
2160 /* windowing, overlapping and concatenation */
2161
2162 yptr = &y[0];
2163 wptr = &window_s[0];
2164
2165 for (i = 0; i < 6; ++i) {
2166 z[i + 0] = 0;
2167 z[i + 6] = mad_f_mul(yptr[ 0 + 0], wptr[0]);
2168
2169 MAD_F_ML0(hi, lo, yptr[ 0 + 6], wptr[6]);
2170 MAD_F_MLA(hi, lo, yptr[12 + 0], wptr[0]);
2171
2172 z[i + 12] = MAD_F_MLZ(hi, lo);
2173
2174 MAD_F_ML0(hi, lo, yptr[12 + 6], wptr[6]);
2175 MAD_F_MLA(hi, lo, yptr[24 + 0], wptr[0]);
2176
2177 z[i + 18] = MAD_F_MLZ(hi, lo);
2178
2179 z[i + 24] = mad_f_mul(yptr[24 + 6], wptr[6]);
2180 z[i + 30] = 0;
2181
2182 ++yptr;
2183 ++wptr;
2184 }
2185 }
2186
2187 /*
2188 * NAME: III_overlap()
2189 * DESCRIPTION: perform overlap-add of windowed IMDCT outputs
2190 */
2191 static
III_overlap(mad_fixed_t const output[36],mad_fixed_t overlap[18],mad_fixed_t sample[18][32],unsigned int sb)2192 void III_overlap(mad_fixed_t const output[36], mad_fixed_t overlap[18],
2193 mad_fixed_t sample[18][32], unsigned int sb)
2194 {
2195 unsigned int i;
2196
2197 # if defined(ASO_INTERLEAVE2)
2198 {
2199 register mad_fixed_t tmp1, tmp2;
2200
2201 tmp1 = overlap[0];
2202 tmp2 = overlap[1];
2203
2204 for (i = 0; i < 16; i += 2) {
2205 sample[i + 0][sb] = output[i + 0 + 0] + tmp1;
2206 overlap[i + 0] = output[i + 0 + 18];
2207 tmp1 = overlap[i + 2];
2208
2209 sample[i + 1][sb] = output[i + 1 + 0] + tmp2;
2210 overlap[i + 1] = output[i + 1 + 18];
2211 tmp2 = overlap[i + 3];
2212 }
2213
2214 sample[16][sb] = output[16 + 0] + tmp1;
2215 overlap[16] = output[16 + 18];
2216 sample[17][sb] = output[17 + 0] + tmp2;
2217 overlap[17] = output[17 + 18];
2218 }
2219 # elif 0
2220 for (i = 0; i < 18; i += 2) {
2221 sample[i + 0][sb] = output[i + 0 + 0] + overlap[i + 0];
2222 overlap[i + 0] = output[i + 0 + 18];
2223
2224 sample[i + 1][sb] = output[i + 1 + 0] + overlap[i + 1];
2225 overlap[i + 1] = output[i + 1 + 18];
2226 }
2227 # else
2228 for (i = 0; i < 18; ++i) {
2229 sample[i][sb] = output[i + 0] + overlap[i];
2230 overlap[i] = output[i + 18];
2231 }
2232 # endif
2233 }
2234
2235 /*
2236 * NAME: III_overlap_z()
2237 * DESCRIPTION: perform "overlap-add" of zero IMDCT outputs
2238 */
III_overlap_z(mad_fixed_t overlap[18],mad_fixed_t sample[18][32],unsigned int sb)2239 static INLINE void III_overlap_z(mad_fixed_t overlap[18],
2240 mad_fixed_t sample[18][32], unsigned int sb)
2241 {
2242 unsigned int i;
2243
2244 # if defined(ASO_INTERLEAVE2)
2245 {
2246 register mad_fixed_t tmp1, tmp2;
2247
2248 tmp1 = overlap[0];
2249 tmp2 = overlap[1];
2250
2251 for (i = 0; i < 16; i += 2) {
2252 sample[i + 0][sb] = tmp1;
2253 overlap[i + 0] = 0;
2254 tmp1 = overlap[i + 2];
2255
2256 sample[i + 1][sb] = tmp2;
2257 overlap[i + 1] = 0;
2258 tmp2 = overlap[i + 3];
2259 }
2260
2261 sample[16][sb] = tmp1;
2262 overlap[16] = 0;
2263 sample[17][sb] = tmp2;
2264 overlap[17] = 0;
2265 }
2266 # else
2267 for (i = 0; i < 18; ++i) {
2268 sample[i][sb] = overlap[i];
2269 overlap[i] = 0;
2270 }
2271 # endif
2272 }
2273
2274 /*
2275 * NAME: III_freqinver()
2276 * DESCRIPTION: perform subband frequency inversion for odd sample lines
2277 */
2278 static
III_freqinver(mad_fixed_t sample[18][32],unsigned int sb)2279 void III_freqinver(mad_fixed_t sample[18][32], unsigned int sb)
2280 {
2281 unsigned int i;
2282
2283 # if 1 || defined(ASO_INTERLEAVE1) || defined(ASO_INTERLEAVE2)
2284 {
2285 register mad_fixed_t tmp1, tmp2;
2286
2287 tmp1 = sample[1][sb];
2288 tmp2 = sample[3][sb];
2289
2290 for (i = 1; i < 13; i += 4) {
2291 sample[i + 0][sb] = -tmp1;
2292 tmp1 = sample[i + 4][sb];
2293 sample[i + 2][sb] = -tmp2;
2294 tmp2 = sample[i + 6][sb];
2295 }
2296
2297 sample[13][sb] = -tmp1;
2298 tmp1 = sample[17][sb];
2299 sample[15][sb] = -tmp2;
2300 sample[17][sb] = -tmp1;
2301 }
2302 # else
2303 for (i = 1; i < 18; i += 2)
2304 sample[i][sb] = -sample[i][sb];
2305 # endif
2306 }
2307
2308 /*
2309 * NAME: III_decode()
2310 * DESCRIPTION: decode frame main_data
2311 */
2312 static
III_decode(struct mad_bitptr * ptr,struct mad_frame * frame,struct sideinfo * si,unsigned int nch)2313 enum mad_error III_decode(struct mad_bitptr *ptr, struct mad_frame *frame,
2314 struct sideinfo *si, unsigned int nch)
2315 {
2316 struct mad_header *header = &frame->header;
2317 unsigned int sfreqi, ngr, gr;
2318
2319 {
2320 unsigned int sfreq;
2321
2322 sfreq = header->samplerate;
2323 if (header->flags & MAD_FLAG_MPEG_2_5_EXT)
2324 sfreq *= 2;
2325
2326 /* 48000 => 0, 44100 => 1, 32000 => 2,
2327 24000 => 3, 22050 => 4, 16000 => 5 */
2328 sfreqi = ((sfreq >> 7) & 0x000f) +
2329 ((sfreq >> 15) & 0x0001) - 8;
2330
2331 if (header->flags & MAD_FLAG_MPEG_2_5_EXT)
2332 sfreqi += 3;
2333 }
2334
2335 /* scalefactors, Huffman decoding, requantization */
2336
2337 ngr = (header->flags & MAD_FLAG_LSF_EXT) ? 1 : 2;
2338
2339 for (gr = 0; gr < ngr; ++gr) {
2340 struct granule *granule = &si->gr[gr];
2341 unsigned char const *sfbwidth[2];
2342 mad_fixed_t xr[2][576];
2343 unsigned int ch;
2344 enum mad_error error;
2345
2346 for (ch = 0; ch < nch; ++ch) {
2347 struct channel *channel = &granule->ch[ch];
2348 unsigned int part2_length;
2349
2350 sfbwidth[ch] = sfbwidth_table[sfreqi].l;
2351 if (channel->block_type == 2) {
2352 sfbwidth[ch] = (channel->flags & mixed_block_flag) ?
2353 sfbwidth_table[sfreqi].m : sfbwidth_table[sfreqi].s;
2354 }
2355
2356 if (header->flags & MAD_FLAG_LSF_EXT) {
2357 part2_length = III_scalefactors_lsf(ptr, channel,
2358 ch == 0 ? 0 : &si->gr[1].ch[1],
2359 header->mode_extension);
2360 }
2361 else {
2362 part2_length = III_scalefactors(ptr, channel, &si->gr[0].ch[ch],
2363 gr == 0 ? 0 : si->scfsi[ch]);
2364 }
2365
2366 error = III_huffdecode(ptr, xr[ch], channel, sfbwidth[ch], part2_length);
2367 if (error)
2368 return error;
2369 }
2370
2371 /* joint stereo processing */
2372
2373 if (header->mode == MAD_MODE_JOINT_STEREO && header->mode_extension) {
2374 error = III_stereo(xr, granule, header, sfbwidth[0]);
2375 if (error)
2376 return error;
2377 }
2378
2379 /* reordering, alias reduction, IMDCT, overlap-add, frequency inversion */
2380
2381 for (ch = 0; ch < nch; ++ch) {
2382 struct channel const *channel = &granule->ch[ch];
2383 mad_fixed_t (*sample)[32] = &frame->sbsample[ch][18 * gr];
2384 unsigned int sb, l, i, sblimit;
2385 mad_fixed_t output[36];
2386
2387 if (channel->block_type == 2) {
2388 III_reorder(xr[ch], channel, sfbwidth[ch]);
2389
2390 /*
2391 * According to ISO/IEC 11172-3, "Alias reduction is not applied for
2392 * granules with block_type == 2 (short block)." However, other
2393 * sources suggest alias reduction should indeed be performed on the
2394 * lower two subbands of mixed blocks. Most other implementations do
2395 * this, so by default we will too.
2396 */
2397 if (channel->flags & mixed_block_flag)
2398 III_aliasreduce(xr[ch], 36);
2399 }
2400 else
2401 III_aliasreduce(xr[ch], 576);
2402
2403 l = 0;
2404
2405 /* subbands 0-1 */
2406
2407 if (channel->block_type != 2 || (channel->flags & mixed_block_flag)) {
2408 unsigned int block_type;
2409
2410 block_type = channel->block_type;
2411 if (channel->flags & mixed_block_flag)
2412 block_type = 0;
2413
2414 /* long blocks */
2415 for (sb = 0; sb < 2; ++sb, l += 18) {
2416 III_imdct_l(&xr[ch][l], output, block_type);
2417 III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
2418 }
2419 }
2420 else {
2421 /* short blocks */
2422 for (sb = 0; sb < 2; ++sb, l += 18) {
2423 III_imdct_s(&xr[ch][l], output);
2424 III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
2425 }
2426 }
2427
2428 III_freqinver(sample, 1);
2429
2430 /* (nonzero) subbands 2-31 */
2431
2432 i = 576;
2433 while (i > 36 && xr[ch][i - 1] == 0)
2434 --i;
2435
2436 sblimit = 32 - (576 - i) / 18;
2437
2438 if (channel->block_type != 2) {
2439 /* long blocks */
2440 for (sb = 2; sb < sblimit; ++sb, l += 18) {
2441 III_imdct_l(&xr[ch][l], output, channel->block_type);
2442 III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
2443
2444 if (sb & 1)
2445 III_freqinver(sample, sb);
2446 }
2447 }
2448 else {
2449 /* short blocks */
2450 for (sb = 2; sb < sblimit; ++sb, l += 18) {
2451 III_imdct_s(&xr[ch][l], output);
2452 III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
2453
2454 if (sb & 1)
2455 III_freqinver(sample, sb);
2456 }
2457 }
2458
2459 /* remaining (zero) subbands */
2460
2461 for (sb = sblimit; sb < 32; ++sb) {
2462 III_overlap_z((*frame->overlap)[ch][sb], sample, sb);
2463
2464 if (sb & 1)
2465 III_freqinver(sample, sb);
2466 }
2467 }
2468 }
2469
2470 return MAD_ERROR_NONE;
2471 }
2472
2473 /*
2474 * NAME: layer->III()
2475 * DESCRIPTION: decode a single Layer III frame
2476 */
mad_layer_III(struct mad_stream * stream,struct mad_frame * frame)2477 int mad_layer_III(struct mad_stream *stream, struct mad_frame *frame)
2478 {
2479 struct mad_header *header = &frame->header;
2480 unsigned int nch, priv_bitlen, next_md_begin = 0;
2481 unsigned int si_len, data_bitlen, md_len;
2482 unsigned int frame_space, frame_used, frame_free;
2483 struct mad_bitptr ptr;
2484 struct sideinfo si;
2485 enum mad_error error;
2486 int result = 0;
2487
2488 /* allocate Layer III dynamic structures */
2489
2490 if (stream->main_data == 0) {
2491 stream->main_data = malloc(MAD_BUFFER_MDLEN);
2492 if (stream->main_data == 0) {
2493 stream->error = MAD_ERROR_NOMEM;
2494 return -1;
2495 }
2496 }
2497
2498 if (frame->overlap == 0) {
2499 frame->overlap = calloc(2 * 32 * 18, sizeof(mad_fixed_t));
2500 if (frame->overlap == 0) {
2501 stream->error = MAD_ERROR_NOMEM;
2502 return -1;
2503 }
2504 }
2505
2506 nch = MAD_NCHANNELS(header);
2507 si_len = (header->flags & MAD_FLAG_LSF_EXT) ?
2508 (nch == 1 ? 9 : 17) : (nch == 1 ? 17 : 32);
2509
2510 /* check frame sanity */
2511
2512 if (stream->next_frame - mad_bit_nextbyte(&stream->ptr) <
2513 (signed int) si_len) {
2514 stream->error = MAD_ERROR_BADFRAMELEN;
2515 stream->md_len = 0;
2516 return -1;
2517 }
2518
2519 /* check CRC word */
2520
2521 if (header->flags & MAD_FLAG_PROTECTION) {
2522 header->crc_check =
2523 mad_bit_crc(stream->ptr, si_len * CHAR_BIT, header->crc_check);
2524
2525 if (header->crc_check != header->crc_target &&
2526 !(frame->options & MAD_OPTION_IGNORECRC)) {
2527 stream->error = MAD_ERROR_BADCRC;
2528 result = -1;
2529 }
2530 }
2531
2532 /* decode frame side information */
2533
2534 error = III_sideinfo(&stream->ptr, nch, header->flags & MAD_FLAG_LSF_EXT,
2535 &si, &data_bitlen, &priv_bitlen);
2536 if (error && result == 0) {
2537 stream->error = error;
2538 result = -1;
2539 }
2540
2541 header->flags |= priv_bitlen;
2542 header->private_bits |= si.private_bits;
2543
2544 /* find main_data of next frame */
2545
2546 {
2547 struct mad_bitptr peek;
2548 unsigned long header;
2549
2550 mad_bit_init(&peek, stream->next_frame);
2551
2552 header = mad_bit_read(&peek, 32);
2553 if ((header & 0xffe60000L) /* syncword | layer */ == 0xffe20000L) {
2554 if (!(header & 0x00010000L)) /* protection_bit */
2555 mad_bit_skip(&peek, 16); /* crc_check */
2556
2557 next_md_begin =
2558 mad_bit_read(&peek, (header & 0x00080000L) /* ID */ ? 9 : 8);
2559 }
2560
2561 mad_bit_finish(&peek);
2562 }
2563
2564 /* find main_data of this frame */
2565
2566 frame_space = stream->next_frame - mad_bit_nextbyte(&stream->ptr);
2567
2568 if (next_md_begin > si.main_data_begin + frame_space)
2569 next_md_begin = 0;
2570
2571 md_len = si.main_data_begin + frame_space - next_md_begin;
2572
2573 frame_used = 0;
2574
2575 if (si.main_data_begin == 0) {
2576 ptr = stream->ptr;
2577 stream->md_len = 0;
2578
2579 frame_used = md_len;
2580 }
2581 else {
2582 if (si.main_data_begin > stream->md_len) {
2583 if (result == 0) {
2584 stream->error = MAD_ERROR_BADDATAPTR;
2585 result = -1;
2586 }
2587 }
2588 else {
2589 mad_bit_init(&ptr,
2590 *stream->main_data + stream->md_len - si.main_data_begin);
2591
2592 if (md_len > si.main_data_begin) {
2593
2594 memcpy(*stream->main_data + stream->md_len,
2595 mad_bit_nextbyte(&stream->ptr),
2596 frame_used = md_len - si.main_data_begin);
2597 stream->md_len += frame_used;
2598 }
2599 }
2600 }
2601
2602 frame_free = frame_space - frame_used;
2603
2604 /* decode main_data */
2605
2606 if (result == 0) {
2607 error = III_decode(&ptr, frame, &si, nch);
2608 if (error) {
2609 stream->error = error;
2610 result = -1;
2611 }
2612
2613 /* designate ancillary bits */
2614
2615 stream->anc_ptr = ptr;
2616 stream->anc_bitlen = md_len * CHAR_BIT - data_bitlen;
2617 }
2618
2619 /* preload main_data buffer with up to 511 bytes for next frame(s) */
2620
2621 if (frame_free >= next_md_begin) {
2622 memcpy(*stream->main_data,
2623 stream->next_frame - next_md_begin, next_md_begin);
2624 stream->md_len = next_md_begin;
2625 }
2626 else {
2627 if (md_len < si.main_data_begin) {
2628 unsigned int extra;
2629
2630 extra = si.main_data_begin - md_len;
2631 if (extra + frame_free > next_md_begin)
2632 extra = next_md_begin - frame_free;
2633
2634 if (extra < stream->md_len) {
2635 memmove(*stream->main_data,
2636 *stream->main_data + stream->md_len - extra, extra);
2637 stream->md_len = extra;
2638 }
2639 }
2640 else
2641 stream->md_len = 0;
2642
2643 memcpy(*stream->main_data + stream->md_len,
2644 stream->next_frame - frame_free, frame_free);
2645 stream->md_len += frame_free;
2646 }
2647
2648 return result;
2649 }
2650