2 * libmad - MPEG audio decoder library
3 * Copyright (C) 2000-2004 Underbit Technologies, Inc.
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.
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.
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
19 * $Id: layer3.c,v 1.43 2004/01/23 09:41:32 rob Exp $
35 #define CHAR_BIT 8 /* duh */
37 /* --- Layer III ----------------------------------------------------------- */
40 count1table_select = 0x01,
41 scalefac_scale = 0x02,
43 mixed_block_flag = 0x08
52 unsigned int main_data_begin;
53 unsigned int private_bits;
55 unsigned char scfsi[2];
60 unsigned short part2_3_length;
61 unsigned short big_values;
62 unsigned short global_gain;
63 unsigned short scalefac_compress;
66 unsigned char block_type;
67 unsigned char table_select[3];
68 unsigned char subblock_gain[3];
69 unsigned char region0_count;
70 unsigned char region1_count;
73 unsigned char scalefac[39]; /* scalefac_l and/or scalefac_s */
79 * scalefactor bit lengths
80 * derived from section 2.4.2.7 of ISO/IEC 11172-3
86 } const sflen_table[16] = {
87 { 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 },
88 { 3, 0 }, { 1, 1 }, { 1, 2 }, { 1, 3 },
89 { 2, 1 }, { 2, 2 }, { 2, 3 }, { 3, 1 },
90 { 3, 2 }, { 3, 3 }, { 4, 2 }, { 4, 3 }
94 * number of LSF scalefactor band values
95 * derived from section 2.4.3.2 of ISO/IEC 13818-3
98 unsigned char const nsfb_table[6][3][4] = {
125 * MPEG-1 scalefactor band widths
126 * derived from Table B.8 of ISO/IEC 11172-3
129 unsigned char const sfb_48000_long[] = {
130 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10,
131 12, 16, 18, 22, 28, 34, 40, 46, 54, 54, 192
135 unsigned char const sfb_44100_long[] = {
136 4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10,
137 12, 16, 20, 24, 28, 34, 42, 50, 54, 76, 158
141 unsigned char const sfb_32000_long[] = {
142 4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12,
143 16, 20, 24, 30, 38, 46, 56, 68, 84, 102, 26
147 unsigned char const sfb_48000_short[] = {
148 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6,
149 6, 6, 6, 6, 6, 10, 10, 10, 12, 12, 12, 14, 14,
150 14, 16, 16, 16, 20, 20, 20, 26, 26, 26, 66, 66, 66
154 unsigned char const sfb_44100_short[] = {
155 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6,
156 6, 6, 8, 8, 8, 10, 10, 10, 12, 12, 12, 14, 14,
157 14, 18, 18, 18, 22, 22, 22, 30, 30, 30, 56, 56, 56
161 unsigned char const sfb_32000_short[] = {
162 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6,
163 6, 6, 8, 8, 8, 12, 12, 12, 16, 16, 16, 20, 20,
164 20, 26, 26, 26, 34, 34, 34, 42, 42, 42, 12, 12, 12
168 unsigned char const sfb_48000_mixed[] = {
169 /* long */ 4, 4, 4, 4, 4, 4, 6, 6,
170 /* short */ 4, 4, 4, 6, 6, 6, 6, 6, 6, 10,
171 10, 10, 12, 12, 12, 14, 14, 14, 16, 16,
172 16, 20, 20, 20, 26, 26, 26, 66, 66, 66
176 unsigned char const sfb_44100_mixed[] = {
177 /* long */ 4, 4, 4, 4, 4, 4, 6, 6,
178 /* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 10,
179 10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
180 18, 22, 22, 22, 30, 30, 30, 56, 56, 56
184 unsigned char const sfb_32000_mixed[] = {
185 /* long */ 4, 4, 4, 4, 4, 4, 6, 6,
186 /* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 12,
187 12, 12, 16, 16, 16, 20, 20, 20, 26, 26,
188 26, 34, 34, 34, 42, 42, 42, 12, 12, 12
192 * MPEG-2 scalefactor band widths
193 * derived from Table B.2 of ISO/IEC 13818-3
196 unsigned char const sfb_24000_long[] = {
197 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
198 18, 22, 26, 32, 38, 46, 54, 62, 70, 76, 36
202 unsigned char const sfb_22050_long[] = {
203 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
204 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54
207 # define sfb_16000_long sfb_22050_long
210 unsigned char const sfb_24000_short[] = {
211 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8,
212 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
213 18, 24, 24, 24, 32, 32, 32, 44, 44, 44, 12, 12, 12
217 unsigned char const sfb_22050_short[] = {
218 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6,
219 6, 6, 8, 8, 8, 10, 10, 10, 14, 14, 14, 18, 18,
220 18, 26, 26, 26, 32, 32, 32, 42, 42, 42, 18, 18, 18
224 unsigned char const sfb_16000_short[] = {
225 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8,
226 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
227 18, 24, 24, 24, 30, 30, 30, 40, 40, 40, 18, 18, 18
231 unsigned char const sfb_24000_mixed[] = {
232 /* long */ 6, 6, 6, 6, 6, 6,
233 /* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12,
234 12, 12, 14, 14, 14, 18, 18, 18, 24, 24,
235 24, 32, 32, 32, 44, 44, 44, 12, 12, 12
239 unsigned char const sfb_22050_mixed[] = {
240 /* long */ 6, 6, 6, 6, 6, 6,
241 /* short */ 6, 6, 6, 6, 6, 6, 8, 8, 8, 10,
242 10, 10, 14, 14, 14, 18, 18, 18, 26, 26,
243 26, 32, 32, 32, 42, 42, 42, 18, 18, 18
247 unsigned char const sfb_16000_mixed[] = {
248 /* long */ 6, 6, 6, 6, 6, 6,
249 /* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12,
250 12, 12, 14, 14, 14, 18, 18, 18, 24, 24,
251 24, 30, 30, 30, 40, 40, 40, 18, 18, 18
255 * MPEG 2.5 scalefactor band widths
256 * derived from public sources
258 # define sfb_12000_long sfb_16000_long
259 # define sfb_11025_long sfb_12000_long
262 unsigned char const sfb_8000_long[] = {
263 12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32,
264 40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2
267 # define sfb_12000_short sfb_16000_short
268 # define sfb_11025_short sfb_12000_short
271 unsigned char const sfb_8000_short[] = {
272 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 16,
273 16, 16, 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36,
274 36, 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26
277 # define sfb_12000_mixed sfb_16000_mixed
278 # define sfb_11025_mixed sfb_12000_mixed
280 /* the 8000 Hz short block scalefactor bands do not break after
281 the first 36 frequency lines, so this is probably wrong */
283 unsigned char const sfb_8000_mixed[] = {
284 /* long */ 12, 12, 12,
285 /* short */ 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16,
286 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, 36,
287 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26
292 unsigned char const *l;
293 unsigned char const *s;
294 unsigned char const *m;
295 } const sfbwidth_table[9] = {
296 { sfb_48000_long, sfb_48000_short, sfb_48000_mixed },
297 { sfb_44100_long, sfb_44100_short, sfb_44100_mixed },
298 { sfb_32000_long, sfb_32000_short, sfb_32000_mixed },
299 { sfb_24000_long, sfb_24000_short, sfb_24000_mixed },
300 { sfb_22050_long, sfb_22050_short, sfb_22050_mixed },
301 { sfb_16000_long, sfb_16000_short, sfb_16000_mixed },
302 { sfb_12000_long, sfb_12000_short, sfb_12000_mixed },
303 { sfb_11025_long, sfb_11025_short, sfb_11025_mixed },
304 { sfb_8000_long, sfb_8000_short, sfb_8000_mixed }
308 * scalefactor band preemphasis (used only when preflag is set)
309 * derived from Table B.6 of ISO/IEC 11172-3
312 unsigned char const pretab[22] = {
313 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0
317 * table for requantization
319 * rq_table[x].mantissa * 2^(rq_table[x].exponent) = x^(4/3)
323 unsigned long mantissa; // : 27;
324 unsigned short exponent; // : 5;
325 } const rq_table[8207] = {
326 # include "rq_table.dat"
330 * fractional powers of two
331 * used for requantization and joint stereo decoding
333 * root_table[3 + x] = 2^(x/4)
336 mad_fixed_t const root_table[7] = {
337 MAD_F(0x09837f05) /* 2^(-3/4) == 0.59460355750136 */,
338 MAD_F(0x0b504f33) /* 2^(-2/4) == 0.70710678118655 */,
339 MAD_F(0x0d744fcd) /* 2^(-1/4) == 0.84089641525371 */,
340 MAD_F(0x10000000) /* 2^( 0/4) == 1.00000000000000 */,
341 MAD_F(0x1306fe0a) /* 2^(+1/4) == 1.18920711500272 */,
342 MAD_F(0x16a09e66) /* 2^(+2/4) == 1.41421356237310 */,
343 MAD_F(0x1ae89f99) /* 2^(+3/4) == 1.68179283050743 */
347 * coefficients for aliasing reduction
348 * derived from Table B.9 of ISO/IEC 11172-3
350 * c[] = { -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037 }
351 * cs[i] = 1 / sqrt(1 + c[i]^2)
352 * ca[i] = c[i] / sqrt(1 + c[i]^2)
355 mad_fixed_t const cs[8] = {
356 +MAD_F(0x0db84a81) /* +0.857492926 */, +MAD_F(0x0e1b9d7f) /* +0.881741997 */,
357 +MAD_F(0x0f31adcf) /* +0.949628649 */, +MAD_F(0x0fbba815) /* +0.983314592 */,
358 +MAD_F(0x0feda417) /* +0.995517816 */, +MAD_F(0x0ffc8fc8) /* +0.999160558 */,
359 +MAD_F(0x0fff964c) /* +0.999899195 */, +MAD_F(0x0ffff8d3) /* +0.999993155 */
363 mad_fixed_t const ca[8] = {
364 -MAD_F(0x083b5fe7) /* -0.514495755 */, -MAD_F(0x078c36d2) /* -0.471731969 */,
365 -MAD_F(0x05039814) /* -0.313377454 */, -MAD_F(0x02e91dd1) /* -0.181913200 */,
366 -MAD_F(0x0183603a) /* -0.094574193 */, -MAD_F(0x00a7cb87) /* -0.040965583 */,
367 -MAD_F(0x003a2847) /* -0.014198569 */, -MAD_F(0x000f27b4) /* -0.003699975 */
371 * IMDCT coefficients for short blocks
372 * derived from section 2.4.3.4.10.2 of ISO/IEC 11172-3
374 * imdct_s[i/even][k] = cos((PI / 24) * (2 * (i / 2) + 7) * (2 * k + 1))
375 * imdct_s[i /odd][k] = cos((PI / 24) * (2 * (6 + (i-1)/2) + 7) * (2 * k + 1))
378 mad_fixed_t const imdct_s[6][6] = {
379 # include "imdct_s.dat"
382 # if !defined(ASO_IMDCT)
384 * windowing coefficients for long blocks
385 * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3
387 * window_l[i] = sin((PI / 36) * (i + 1/2))
390 mad_fixed_t const window_l[36] = {
391 MAD_F(0x00b2aa3e) /* 0.043619387 */, MAD_F(0x0216a2a2) /* 0.130526192 */,
392 MAD_F(0x03768962) /* 0.216439614 */, MAD_F(0x04cfb0e2) /* 0.300705800 */,
393 MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x07635284) /* 0.461748613 */,
394 MAD_F(0x0898c779) /* 0.537299608 */, MAD_F(0x09bd7ca0) /* 0.608761429 */,
395 MAD_F(0x0acf37ad) /* 0.675590208 */, MAD_F(0x0bcbe352) /* 0.737277337 */,
396 MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x0d7e8807) /* 0.843391446 */,
398 MAD_F(0x0e313245) /* 0.887010833 */, MAD_F(0x0ec835e8) /* 0.923879533 */,
399 MAD_F(0x0f426cb5) /* 0.953716951 */, MAD_F(0x0f9ee890) /* 0.976296007 */,
400 MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ffc19fd) /* 0.999048222 */,
401 MAD_F(0x0ffc19fd) /* 0.999048222 */, MAD_F(0x0fdcf549) /* 0.991444861 */,
402 MAD_F(0x0f9ee890) /* 0.976296007 */, MAD_F(0x0f426cb5) /* 0.953716951 */,
403 MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0e313245) /* 0.887010833 */,
405 MAD_F(0x0d7e8807) /* 0.843391446 */, MAD_F(0x0cb19346) /* 0.793353340 */,
406 MAD_F(0x0bcbe352) /* 0.737277337 */, MAD_F(0x0acf37ad) /* 0.675590208 */,
407 MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0898c779) /* 0.537299608 */,
408 MAD_F(0x07635284) /* 0.461748613 */, MAD_F(0x061f78aa) /* 0.382683432 */,
409 MAD_F(0x04cfb0e2) /* 0.300705800 */, MAD_F(0x03768962) /* 0.216439614 */,
410 MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x00b2aa3e) /* 0.043619387 */,
412 # endif /* ASO_IMDCT */
415 * windowing coefficients for short blocks
416 * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3
418 * window_s[i] = sin((PI / 12) * (i + 1/2))
421 mad_fixed_t const window_s[12] = {
422 MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x061f78aa) /* 0.382683432 */,
423 MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0cb19346) /* 0.793353340 */,
424 MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0fdcf549) /* 0.991444861 */,
425 MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ec835e8) /* 0.923879533 */,
426 MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x09bd7ca0) /* 0.608761429 */,
427 MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x0216a2a2) /* 0.130526192 */,
431 * coefficients for intensity stereo processing
432 * derived from section 2.4.3.4.9.3 of ISO/IEC 11172-3
434 * is_ratio[i] = tan(i * (PI / 12))
435 * is_table[i] = is_ratio[i] / (1 + is_ratio[i])
438 mad_fixed_t const is_table[7] = {
439 MAD_F(0x00000000) /* 0.000000000 */,
440 MAD_F(0x0361962f) /* 0.211324865 */,
441 MAD_F(0x05db3d74) /* 0.366025404 */,
442 MAD_F(0x08000000) /* 0.500000000 */,
443 MAD_F(0x0a24c28c) /* 0.633974596 */,
444 MAD_F(0x0c9e69d1) /* 0.788675135 */,
445 MAD_F(0x10000000) /* 1.000000000 */
449 * coefficients for LSF intensity stereo processing
450 * derived from section 2.4.3.2 of ISO/IEC 13818-3
452 * is_lsf_table[0][i] = (1 / sqrt(sqrt(2)))^(i + 1)
453 * is_lsf_table[1][i] = (1 / sqrt(2)) ^(i + 1)
456 mad_fixed_t const is_lsf_table[2][15] = {
458 MAD_F(0x0d744fcd) /* 0.840896415 */,
459 MAD_F(0x0b504f33) /* 0.707106781 */,
460 MAD_F(0x09837f05) /* 0.594603558 */,
461 MAD_F(0x08000000) /* 0.500000000 */,
462 MAD_F(0x06ba27e6) /* 0.420448208 */,
463 MAD_F(0x05a8279a) /* 0.353553391 */,
464 MAD_F(0x04c1bf83) /* 0.297301779 */,
465 MAD_F(0x04000000) /* 0.250000000 */,
466 MAD_F(0x035d13f3) /* 0.210224104 */,
467 MAD_F(0x02d413cd) /* 0.176776695 */,
468 MAD_F(0x0260dfc1) /* 0.148650889 */,
469 MAD_F(0x02000000) /* 0.125000000 */,
470 MAD_F(0x01ae89fa) /* 0.105112052 */,
471 MAD_F(0x016a09e6) /* 0.088388348 */,
472 MAD_F(0x01306fe1) /* 0.074325445 */
474 MAD_F(0x0b504f33) /* 0.707106781 */,
475 MAD_F(0x08000000) /* 0.500000000 */,
476 MAD_F(0x05a8279a) /* 0.353553391 */,
477 MAD_F(0x04000000) /* 0.250000000 */,
478 MAD_F(0x02d413cd) /* 0.176776695 */,
479 MAD_F(0x02000000) /* 0.125000000 */,
480 MAD_F(0x016a09e6) /* 0.088388348 */,
481 MAD_F(0x01000000) /* 0.062500000 */,
482 MAD_F(0x00b504f3) /* 0.044194174 */,
483 MAD_F(0x00800000) /* 0.031250000 */,
484 MAD_F(0x005a827a) /* 0.022097087 */,
485 MAD_F(0x00400000) /* 0.015625000 */,
486 MAD_F(0x002d413d) /* 0.011048543 */,
487 MAD_F(0x00200000) /* 0.007812500 */,
488 MAD_F(0x0016a09e) /* 0.005524272 */
493 * NAME: III_sideinfo()
494 * DESCRIPTION: decode frame side information from a bitstream
497 enum mad_error III_sideinfo(struct mad_bitptr *ptr, unsigned int nch,
498 int lsf, struct sideinfo *si,
499 unsigned int *data_bitlen,
500 unsigned int *priv_bitlen)
502 unsigned int ngr, gr, ch, i;
503 enum mad_error result = MAD_ERROR_NONE;
506 *priv_bitlen = lsf ? ((nch == 1) ? 1 : 2) : ((nch == 1) ? 5 : 3);
508 si->main_data_begin = mad_bit_read(ptr, lsf ? 8 : 9);
509 si->private_bits = mad_bit_read(ptr, *priv_bitlen);
515 for (ch = 0; ch < nch; ++ch)
516 si->scfsi[ch] = mad_bit_read(ptr, 4);
519 for (gr = 0; gr < ngr; ++gr) {
520 struct granule *granule = &si->gr[gr];
522 for (ch = 0; ch < nch; ++ch) {
523 struct channel *channel = &granule->ch[ch];
525 channel->part2_3_length = mad_bit_read(ptr, 12);
526 channel->big_values = mad_bit_read(ptr, 9);
527 channel->global_gain = mad_bit_read(ptr, 8);
528 channel->scalefac_compress = mad_bit_read(ptr, lsf ? 9 : 4);
530 *data_bitlen += channel->part2_3_length;
532 if (channel->big_values > 288 && result == 0)
533 result = MAD_ERROR_BADBIGVALUES;
537 /* window_switching_flag */
538 if (mad_bit_read(ptr, 1)) {
539 channel->block_type = mad_bit_read(ptr, 2);
541 if (channel->block_type == 0 && result == 0)
542 result = MAD_ERROR_BADBLOCKTYPE;
544 if (!lsf && channel->block_type == 2 && si->scfsi[ch] && result == 0)
545 result = MAD_ERROR_BADSCFSI;
547 channel->region0_count = 7;
548 channel->region1_count = 36;
550 if (mad_bit_read(ptr, 1))
551 channel->flags |= mixed_block_flag;
552 else if (channel->block_type == 2)
553 channel->region0_count = 8;
555 for (i = 0; i < 2; ++i)
556 channel->table_select[i] = mad_bit_read(ptr, 5);
559 channel->table_select[2] = 4; /* not used */
562 for (i = 0; i < 3; ++i)
563 channel->subblock_gain[i] = mad_bit_read(ptr, 3);
566 channel->block_type = 0;
568 for (i = 0; i < 3; ++i)
569 channel->table_select[i] = mad_bit_read(ptr, 5);
571 channel->region0_count = mad_bit_read(ptr, 4);
572 channel->region1_count = mad_bit_read(ptr, 3);
575 /* [preflag,] scalefac_scale, count1table_select */
576 channel->flags |= mad_bit_read(ptr, lsf ? 2 : 3);
584 * NAME: III_scalefactors_lsf()
585 * DESCRIPTION: decode channel scalefactors for LSF from a bitstream
588 unsigned int III_scalefactors_lsf(struct mad_bitptr *ptr,
589 struct channel *channel,
590 struct channel *gr1ch, int mode_extension)
592 struct mad_bitptr start;
593 unsigned int scalefac_compress, index, slen[4], part, n, i;
594 unsigned char const *nsfb;
598 scalefac_compress = channel->scalefac_compress;
599 index = (channel->block_type == 2) ?
600 ((channel->flags & mixed_block_flag) ? 2 : 1) : 0;
602 if (!((mode_extension & I_STEREO) && gr1ch)) {
603 if (scalefac_compress < 400) {
604 slen[0] = (scalefac_compress >> 4) / 5;
605 slen[1] = (scalefac_compress >> 4) % 5;
606 slen[2] = (scalefac_compress % 16) >> 2;
607 slen[3] = scalefac_compress % 4;
609 nsfb = nsfb_table[0][index];
611 else if (scalefac_compress < 500) {
612 scalefac_compress -= 400;
614 slen[0] = (scalefac_compress >> 2) / 5;
615 slen[1] = (scalefac_compress >> 2) % 5;
616 slen[2] = scalefac_compress % 4;
619 nsfb = nsfb_table[1][index];
622 scalefac_compress -= 500;
624 slen[0] = scalefac_compress / 3;
625 slen[1] = scalefac_compress % 3;
629 channel->flags |= preflag;
631 nsfb = nsfb_table[2][index];
635 for (part = 0; part < 4; ++part) {
636 for (i = 0; i < nsfb[part]; ++i)
637 channel->scalefac[n++] = mad_bit_read(ptr, slen[part]);
641 channel->scalefac[n++] = 0;
643 else { /* (mode_extension & I_STEREO) && gr1ch (i.e. ch == 1) */
644 scalefac_compress >>= 1;
646 if (scalefac_compress < 180) {
647 slen[0] = scalefac_compress / 36;
648 slen[1] = (scalefac_compress % 36) / 6;
649 slen[2] = (scalefac_compress % 36) % 6;
652 nsfb = nsfb_table[3][index];
654 else if (scalefac_compress < 244) {
655 scalefac_compress -= 180;
657 slen[0] = (scalefac_compress % 64) >> 4;
658 slen[1] = (scalefac_compress % 16) >> 2;
659 slen[2] = scalefac_compress % 4;
662 nsfb = nsfb_table[4][index];
665 scalefac_compress -= 244;
667 slen[0] = scalefac_compress / 3;
668 slen[1] = scalefac_compress % 3;
672 nsfb = nsfb_table[5][index];
676 for (part = 0; part < 4; ++part) {
677 unsigned int max, is_pos;
679 max = (1 << slen[part]) - 1;
681 for (i = 0; i < nsfb[part]; ++i) {
682 is_pos = mad_bit_read(ptr, slen[part]);
684 channel->scalefac[n] = is_pos;
685 gr1ch->scalefac[n++] = (is_pos == max);
690 channel->scalefac[n] = 0;
691 gr1ch->scalefac[n++] = 0; /* apparently not illegal */
695 return mad_bit_length(&start, ptr);
699 * NAME: III_scalefactors()
700 * DESCRIPTION: decode channel scalefactors of one granule from a bitstream
703 unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel,
704 struct channel const *gr0ch, unsigned int scfsi)
706 struct mad_bitptr start;
707 unsigned int slen1, slen2, sfbi;
711 slen1 = sflen_table[channel->scalefac_compress].slen1;
712 slen2 = sflen_table[channel->scalefac_compress].slen2;
714 if (channel->block_type == 2) {
719 nsfb = (channel->flags & mixed_block_flag) ? 8 + 3 * 3 : 6 * 3;
721 channel->scalefac[sfbi++] = mad_bit_read(ptr, slen1);
725 channel->scalefac[sfbi++] = mad_bit_read(ptr, slen2);
729 channel->scalefac[sfbi++] = 0;
731 else { /* channel->block_type != 2 */
733 for (sfbi = 0; sfbi < 6; ++sfbi)
734 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
737 for (sfbi = 0; sfbi < 6; ++sfbi)
738 channel->scalefac[sfbi] = mad_bit_read(ptr, slen1);
742 for (sfbi = 6; sfbi < 11; ++sfbi)
743 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
746 for (sfbi = 6; sfbi < 11; ++sfbi)
747 channel->scalefac[sfbi] = mad_bit_read(ptr, slen1);
751 for (sfbi = 11; sfbi < 16; ++sfbi)
752 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
755 for (sfbi = 11; sfbi < 16; ++sfbi)
756 channel->scalefac[sfbi] = mad_bit_read(ptr, slen2);
760 for (sfbi = 16; sfbi < 21; ++sfbi)
761 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
764 for (sfbi = 16; sfbi < 21; ++sfbi)
765 channel->scalefac[sfbi] = mad_bit_read(ptr, slen2);
768 channel->scalefac[21] = 0;
771 return mad_bit_length(&start, ptr);
775 * The Layer III formula for requantization and scaling is defined by
776 * section 2.4.3.4.7.1 of ISO/IEC 11172-3, as follows:
779 * xr[i] = sign(is[i]) * abs(is[i])^(4/3) *
780 * 2^((1/4) * (global_gain - 210)) *
781 * 2^-(scalefac_multiplier *
782 * (scalefac_l[sfb] + preflag * pretab[sfb]))
785 * xr[i] = sign(is[i]) * abs(is[i])^(4/3) *
786 * 2^((1/4) * (global_gain - 210 - 8 * subblock_gain[w])) *
787 * 2^-(scalefac_multiplier * scalefac_s[sfb][w])
790 * scalefac_multiplier = (scalefac_scale + 1) / 2
792 * The routines III_exponents() and III_requantize() facilitate this
797 * NAME: III_exponents()
798 * DESCRIPTION: calculate scalefactor exponents
801 void III_exponents(struct channel const *channel,
802 unsigned char const *sfbwidth, signed int exponents[39])
805 unsigned int scalefac_multiplier, sfbi;
807 gain = (signed int) channel->global_gain - 210;
808 scalefac_multiplier = (channel->flags & scalefac_scale) ? 2 : 1;
810 if (channel->block_type == 2) {
812 signed int gain0, gain1, gain2;
816 if (channel->flags & mixed_block_flag) {
817 unsigned int premask;
819 premask = (channel->flags & preflag) ? ~0 : 0;
821 /* long block subbands 0-1 */
824 exponents[sfbi] = gain -
825 (signed int) ((channel->scalefac[sfbi] + (pretab[sfbi] & premask)) <<
826 scalefac_multiplier);
828 l += sfbwidth[sfbi++];
832 /* this is probably wrong for 8000 Hz short/mixed blocks */
834 gain0 = gain - 8 * (signed int) channel->subblock_gain[0];
835 gain1 = gain - 8 * (signed int) channel->subblock_gain[1];
836 gain2 = gain - 8 * (signed int) channel->subblock_gain[2];
839 exponents[sfbi + 0] = gain0 -
840 (signed int) (channel->scalefac[sfbi + 0] << scalefac_multiplier);
841 exponents[sfbi + 1] = gain1 -
842 (signed int) (channel->scalefac[sfbi + 1] << scalefac_multiplier);
843 exponents[sfbi + 2] = gain2 -
844 (signed int) (channel->scalefac[sfbi + 2] << scalefac_multiplier);
846 l += 3 * sfbwidth[sfbi];
850 else { /* channel->block_type != 2 */
851 if (channel->flags & preflag) {
852 for (sfbi = 0; sfbi < 22; ++sfbi) {
853 exponents[sfbi] = gain -
854 (signed int) ((channel->scalefac[sfbi] + pretab[sfbi]) <<
855 scalefac_multiplier);
859 for (sfbi = 0; sfbi < 22; ++sfbi) {
860 exponents[sfbi] = gain -
861 (signed int) (channel->scalefac[sfbi] << scalefac_multiplier);
868 * NAME: III_requantize()
869 * DESCRIPTION: requantize one (positive) value
872 mad_fixed_t III_requantize(unsigned int value, signed int exp)
874 mad_fixed_t requantized;
876 struct fixedfloat const *power;
878 frac = exp % 4; /* assumes sign(frac) == sign(exp) */
881 power = &rq_table[value];
882 requantized = power->mantissa;
883 exp += power->exponent;
886 if (-exp >= sizeof(mad_fixed_t) * CHAR_BIT) {
891 requantized += 1L << (-exp - 1);
892 requantized >>= -exp;
899 fprintf(stderr, "requantize overflow (%f * 2^%d)\n",
900 mad_f_todouble(requantized), exp);
902 requantized = MAD_F_MAX;
908 return frac ? mad_f_mul(requantized, root_table[3 + frac]) : requantized;
911 /* we must take care that sz >= bits and sz < sizeof(long) lest bits == 0 */
912 # define MASK(cache, sz, bits) \
913 (((cache) >> ((sz) - (bits))) & ((1 << (bits)) - 1))
914 # define MASK1BIT(cache, sz) \
915 ((cache) & (1 << ((sz) - 1)))
918 * NAME: III_huffdecode()
919 * DESCRIPTION: decode Huffman code words of one channel of one granule
922 enum mad_error III_huffdecode(struct mad_bitptr *ptr, mad_fixed_t xr[576],
923 struct channel *channel,
924 unsigned char const *sfbwidth,
925 unsigned int part2_length)
927 signed int exponents[39], exp;
928 signed int const *expptr;
929 struct mad_bitptr peek;
930 signed int bits_left, cachesz;
931 register mad_fixed_t *xrptr;
932 mad_fixed_t const *sfbound;
933 register unsigned long bitcache;
935 bits_left = (signed) channel->part2_3_length - (signed) part2_length;
937 return MAD_ERROR_BADPART3LEN;
939 III_exponents(channel, sfbwidth, exponents);
942 mad_bit_skip(ptr, bits_left);
944 /* align bit reads to byte boundaries */
945 cachesz = mad_bit_bitsleft(&peek);
946 cachesz += ((32 - 1 - 24) + (24 - cachesz)) & ~7;
948 bitcache = mad_bit_read(&peek, cachesz);
949 bits_left -= cachesz;
955 unsigned int region, rcount;
956 struct hufftable const *entry;
957 struct huffpair const *table;
958 unsigned int linbits, startbits, big_values, reqhits;
959 mad_fixed_t reqcache[16];
961 sfbound = xrptr + *sfbwidth++;
962 rcount = channel->region0_count + 1;
964 entry = &mad_huff_pair_table[channel->table_select[region = 0]];
965 table = entry->table;
966 linbits = entry->linbits;
967 startbits = entry->startbits;
970 return MAD_ERROR_BADHUFFTABLE;
972 expptr = &exponents[0];
976 big_values = channel->big_values;
978 while (big_values-- && cachesz + bits_left > 0) {
979 struct huffpair const *pair;
980 unsigned int clumpsz, value;
981 register mad_fixed_t requantized;
983 if (xrptr == sfbound) {
984 sfbound += *sfbwidth++;
986 /* change table if region boundary */
990 rcount = channel->region1_count + 1;
992 rcount = 0; /* all remaining */
994 entry = &mad_huff_pair_table[channel->table_select[++region]];
995 table = entry->table;
996 linbits = entry->linbits;
997 startbits = entry->startbits;
1000 return MAD_ERROR_BADHUFFTABLE;
1003 if (exp != *expptr) {
1014 bits = ((32 - 1 - 21) + (21 - cachesz)) & ~7;
1015 bitcache = (bitcache << bits) | mad_bit_read(&peek, bits);
1022 clumpsz = startbits;
1023 pair = &table[MASK(bitcache, cachesz, clumpsz)];
1025 while (!pair->final) {
1028 clumpsz = pair->ptr.bits;
1029 pair = &table[pair->ptr.offset + MASK(bitcache, cachesz, clumpsz)];
1032 cachesz -= pair->value.hlen;
1037 value = pair->value.x;
1045 if (cachesz < linbits + 2) {
1046 bitcache = (bitcache << 16) | mad_bit_read(&peek, 16);
1051 value += MASK(bitcache, cachesz, linbits);
1054 requantized = III_requantize(value, exp);
1058 if (reqhits & (1 << value))
1059 requantized = reqcache[value];
1061 reqhits |= (1 << value);
1062 requantized = reqcache[value] = III_requantize(value, exp);
1066 xrptr[0] = MASK1BIT(bitcache, cachesz--) ?
1067 -requantized : requantized;
1072 value = pair->value.y;
1080 if (cachesz < linbits + 1) {
1081 bitcache = (bitcache << 16) | mad_bit_read(&peek, 16);
1086 value += MASK(bitcache, cachesz, linbits);
1089 requantized = III_requantize(value, exp);
1093 if (reqhits & (1 << value))
1094 requantized = reqcache[value];
1096 reqhits |= (1 << value);
1097 requantized = reqcache[value] = III_requantize(value, exp);
1101 xrptr[1] = MASK1BIT(bitcache, cachesz--) ?
1102 -requantized : requantized;
1108 value = pair->value.x;
1113 if (reqhits & (1 << value))
1114 requantized = reqcache[value];
1116 reqhits |= (1 << value);
1117 requantized = reqcache[value] = III_requantize(value, exp);
1120 xrptr[0] = MASK1BIT(bitcache, cachesz--) ?
1121 -requantized : requantized;
1126 value = pair->value.y;
1131 if (reqhits & (1 << value))
1132 requantized = reqcache[value];
1134 reqhits |= (1 << value);
1135 requantized = reqcache[value] = III_requantize(value, exp);
1138 xrptr[1] = MASK1BIT(bitcache, cachesz--) ?
1139 -requantized : requantized;
1147 if (cachesz + bits_left < 0)
1148 return MAD_ERROR_BADHUFFDATA; /* big_values overrun */
1152 struct huffquad const *table;
1153 register mad_fixed_t requantized;
1155 table = mad_huff_quad_table[channel->flags & count1table_select];
1157 requantized = III_requantize(1, exp);
1159 while (cachesz + bits_left > 0 && xrptr <= &xr[572]) {
1160 struct huffquad const *quad;
1165 bitcache = (bitcache << 16) | mad_bit_read(&peek, 16);
1170 quad = &table[MASK(bitcache, cachesz, 4)];
1172 /* quad tables guaranteed to have at most one extra lookup */
1176 quad = &table[quad->ptr.offset +
1177 MASK(bitcache, cachesz, quad->ptr.bits)];
1180 cachesz -= quad->value.hlen;
1182 if (xrptr == sfbound) {
1183 sfbound += *sfbwidth++;
1185 if (exp != *expptr) {
1187 requantized = III_requantize(1, exp);
1195 xrptr[0] = quad->value.v ?
1196 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
1200 xrptr[1] = quad->value.w ?
1201 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
1205 if (xrptr == sfbound) {
1206 sfbound += *sfbwidth++;
1208 if (exp != *expptr) {
1210 requantized = III_requantize(1, exp);
1218 xrptr[0] = quad->value.x ?
1219 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
1223 xrptr[1] = quad->value.y ?
1224 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
1229 if (cachesz + bits_left < 0) {
1230 # if 0 && defined(DEBUG)
1231 fprintf(stderr, "huffman count1 overrun (%d bits)\n",
1232 -(cachesz + bits_left));
1235 /* technically the bitstream is misformatted, but apparently
1236 some encoders are just a bit sloppy with stuffing bits */
1242 assert(-bits_left <= MAD_BUFFER_GUARD * CHAR_BIT);
1244 # if 0 && defined(DEBUG)
1246 fprintf(stderr, "read %d bits too many\n", -bits_left);
1247 else if (cachesz + bits_left > 0)
1248 fprintf(stderr, "%d stuffing bits\n", cachesz + bits_left);
1252 while (xrptr < &xr[576]) {
1259 return MAD_ERROR_NONE;
1266 * NAME: III_reorder()
1267 * DESCRIPTION: reorder frequency lines of a short block into subband order
1270 void III_reorder(mad_fixed_t xr[576], struct channel const *channel,
1271 unsigned char const sfbwidth[39])
1273 mad_fixed_t tmp[32][3][6];
1274 unsigned int sb, l, f, w, sbw[3], sw[3];
1276 /* this is probably wrong for 8000 Hz mixed blocks */
1279 if (channel->flags & mixed_block_flag) {
1287 for (w = 0; w < 3; ++w) {
1295 for (l = 18 * sb; l < 576; ++l) {
1297 f = *sfbwidth++ - 1;
1301 tmp[sbw[w]][w][sw[w]++] = xr[l];
1309 memcpy(&xr[18 * sb], &tmp[sb], (576 - 18 * sb) * sizeof(mad_fixed_t));
1313 * NAME: III_stereo()
1314 * DESCRIPTION: perform joint stereo processing on a granule
1317 enum mad_error III_stereo(mad_fixed_t xr[2][576],
1318 struct granule const *granule,
1319 struct mad_header *header,
1320 unsigned char const *sfbwidth)
1323 unsigned int sfbi, l, n, i;
1325 if (granule->ch[0].block_type !=
1326 granule->ch[1].block_type ||
1327 (granule->ch[0].flags & mixed_block_flag) !=
1328 (granule->ch[1].flags & mixed_block_flag))
1329 return MAD_ERROR_BADSTEREO;
1331 for (i = 0; i < 39; ++i)
1332 modes[i] = header->mode_extension;
1334 /* intensity stereo */
1336 if (header->mode_extension & I_STEREO) {
1337 struct channel const *right_ch = &granule->ch[1];
1338 mad_fixed_t const *right_xr = xr[1];
1339 unsigned int is_pos;
1341 header->flags |= MAD_FLAG_I_STEREO;
1343 /* first determine which scalefactor bands are to be processed */
1345 if (right_ch->block_type == 2) {
1346 unsigned int lower, start, max, bound[3], w;
1348 lower = start = max = bound[0] = bound[1] = bound[2] = 0;
1352 if (right_ch->flags & mixed_block_flag) {
1354 n = sfbwidth[sfbi++];
1356 for (i = 0; i < n; ++i) {
1372 n = sfbwidth[sfbi++];
1374 for (i = 0; i < n; ++i) {
1376 max = bound[w] = sfbi;
1391 for (i = 0; i < lower; ++i)
1392 modes[i] = header->mode_extension & ~I_STEREO;
1397 for (i = start; i < max; ++i) {
1399 modes[i] = header->mode_extension & ~I_STEREO;
1404 else { /* right_ch->block_type != 2 */
1408 for (sfbi = l = 0; l < 576; l += n) {
1409 n = sfbwidth[sfbi++];
1411 for (i = 0; i < n; ++i) {
1421 for (i = 0; i < bound; ++i)
1422 modes[i] = header->mode_extension & ~I_STEREO;
1425 /* now do the actual processing */
1427 if (header->flags & MAD_FLAG_LSF_EXT) {
1428 unsigned char const *illegal_pos = granule[1].ch[1].scalefac;
1429 mad_fixed_t const *lsf_scale;
1431 /* intensity_scale */
1432 lsf_scale = is_lsf_table[right_ch->scalefac_compress & 0x1];
1434 for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
1437 if (!(modes[sfbi] & I_STEREO))
1440 if (illegal_pos[sfbi]) {
1441 modes[sfbi] &= ~I_STEREO;
1445 is_pos = right_ch->scalefac[sfbi];
1447 for (i = 0; i < n; ++i) {
1448 register mad_fixed_t left;
1450 left = xr[0][l + i];
1453 xr[1][l + i] = left;
1455 register mad_fixed_t opposite;
1457 opposite = mad_f_mul(left, lsf_scale[(is_pos - 1) / 2]);
1460 xr[0][l + i] = opposite;
1461 xr[1][l + i] = left;
1464 xr[1][l + i] = opposite;
1469 else { /* !(header->flags & MAD_FLAG_LSF_EXT) */
1470 for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
1473 if (!(modes[sfbi] & I_STEREO))
1476 is_pos = right_ch->scalefac[sfbi];
1478 if (is_pos >= 7) { /* illegal intensity position */
1479 modes[sfbi] &= ~I_STEREO;
1483 for (i = 0; i < n; ++i) {
1484 register mad_fixed_t left;
1486 left = xr[0][l + i];
1488 xr[0][l + i] = mad_f_mul(left, is_table[ is_pos]);
1489 xr[1][l + i] = mad_f_mul(left, is_table[6 - is_pos]);
1495 /* middle/side stereo */
1497 if (header->mode_extension & MS_STEREO) {
1498 register mad_fixed_t invsqrt2;
1500 header->flags |= MAD_FLAG_MS_STEREO;
1502 invsqrt2 = root_table[3 + -2];
1504 for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
1507 if (modes[sfbi] != MS_STEREO)
1510 for (i = 0; i < n; ++i) {
1511 register mad_fixed_t m, s;
1516 xr[0][l + i] = mad_f_mul(m + s, invsqrt2); /* l = (m + s) / sqrt(2) */
1517 xr[1][l + i] = mad_f_mul(m - s, invsqrt2); /* r = (m - s) / sqrt(2) */
1522 return MAD_ERROR_NONE;
1526 * NAME: III_aliasreduce()
1527 * DESCRIPTION: perform frequency line alias reduction
1530 void III_aliasreduce(mad_fixed_t xr[576], int lines)
1532 mad_fixed_t const *bound;
1536 for (xr += 18; xr < bound; xr += 18) {
1537 for (i = 0; i < 8; ++i) {
1538 register mad_fixed_t a, b;
1539 register mad_fixed64hi_t hi;
1540 register mad_fixed64lo_t lo;
1545 # if defined(ASO_ZEROCHECK)
1548 MAD_F_ML0(hi, lo, a, cs[i]);
1549 MAD_F_MLA(hi, lo, -b, ca[i]);
1551 xr[-1 - i] = MAD_F_MLZ(hi, lo);
1553 MAD_F_ML0(hi, lo, b, cs[i]);
1554 MAD_F_MLA(hi, lo, a, ca[i]);
1556 xr[ i] = MAD_F_MLZ(hi, lo);
1557 # if defined(ASO_ZEROCHECK)
1564 # if defined(ASO_IMDCT)
1565 void III_imdct_l(mad_fixed_t const [18], mad_fixed_t [36], unsigned int);
1569 void fastsdct(mad_fixed_t const x[9], mad_fixed_t y[18])
1571 mad_fixed_t a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12;
1572 mad_fixed_t a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25;
1573 mad_fixed_t m0, m1, m2, m3, m4, m5, m6, m7;
1576 c0 = MAD_F(0x1f838b8d), /* 2 * cos( 1 * PI / 18) */
1577 c1 = MAD_F(0x1bb67ae8), /* 2 * cos( 3 * PI / 18) */
1578 c2 = MAD_F(0x18836fa3), /* 2 * cos( 4 * PI / 18) */
1579 c3 = MAD_F(0x1491b752), /* 2 * cos( 5 * PI / 18) */
1580 c4 = MAD_F(0x0af1d43a), /* 2 * cos( 7 * PI / 18) */
1581 c5 = MAD_F(0x058e86a0), /* 2 * cos( 8 * PI / 18) */
1582 c6 = -MAD_F(0x1e11f642) /* 2 * cos(16 * PI / 18) */
1605 m0 = mad_f_mul(a17, -c3);
1606 m1 = mad_f_mul(a16, -c0);
1607 m2 = mad_f_mul(a15, -c4);
1608 m3 = mad_f_mul(a14, -c1);
1609 m4 = mad_f_mul(a5, -c1);
1610 m5 = mad_f_mul(a11, -c6);
1611 m6 = mad_f_mul(a10, -c5);
1612 m7 = mad_f_mul(a9, -c2);
1615 a19 = 2 * x[4] - a4;
1623 /* output to every other slot for convenience */
1631 y[12] = a12 - 2 * a18;
1637 void sdctII(mad_fixed_t const x[18], mad_fixed_t X[18])
1642 /* scale[i] = 2 * cos(PI * (2 * i + 1) / (2 * 18)) */
1643 static mad_fixed_t const scale[9] = {
1644 MAD_F(0x1fe0d3b4), MAD_F(0x1ee8dd47), MAD_F(0x1d007930),
1645 MAD_F(0x1a367e59), MAD_F(0x16a09e66), MAD_F(0x125abcf8),
1646 MAD_F(0x0d8616bc), MAD_F(0x08483ee1), MAD_F(0x02c9fad7)
1649 /* divide the 18-point SDCT-II into two 9-point SDCT-IIs */
1651 /* even input butterfly */
1653 for (i = 0; i < 9; i += 3) {
1654 tmp[i + 0] = x[i + 0] + x[18 - (i + 0) - 1];
1655 tmp[i + 1] = x[i + 1] + x[18 - (i + 1) - 1];
1656 tmp[i + 2] = x[i + 2] + x[18 - (i + 2) - 1];
1659 fastsdct(tmp, &X[0]);
1661 /* odd input butterfly and scaling */
1663 for (i = 0; i < 9; i += 3) {
1664 tmp[i + 0] = mad_f_mul(x[i + 0] - x[18 - (i + 0) - 1], scale[i + 0]);
1665 tmp[i + 1] = mad_f_mul(x[i + 1] - x[18 - (i + 1) - 1], scale[i + 1]);
1666 tmp[i + 2] = mad_f_mul(x[i + 2] - x[18 - (i + 2) - 1], scale[i + 2]);
1669 fastsdct(tmp, &X[1]);
1671 /* output accumulation */
1673 for (i = 3; i < 18; i += 8) {
1674 X[i + 0] -= X[(i + 0) - 2];
1675 X[i + 2] -= X[(i + 2) - 2];
1676 X[i + 4] -= X[(i + 4) - 2];
1677 X[i + 6] -= X[(i + 6) - 2];
1682 void dctIV(mad_fixed_t const y[18], mad_fixed_t X[18])
1684 mad_fixed_t tmp[18];
1687 /* scale[i] = 2 * cos(PI * (2 * i + 1) / (4 * 18)) */
1688 static mad_fixed_t const scale[18] = {
1689 MAD_F(0x1ff833fa), MAD_F(0x1fb9ea93), MAD_F(0x1f3dd120),
1690 MAD_F(0x1e84d969), MAD_F(0x1d906bcf), MAD_F(0x1c62648b),
1691 MAD_F(0x1afd100f), MAD_F(0x1963268b), MAD_F(0x1797c6a4),
1692 MAD_F(0x159e6f5b), MAD_F(0x137af940), MAD_F(0x11318ef3),
1693 MAD_F(0x0ec6a507), MAD_F(0x0c3ef153), MAD_F(0x099f61c5),
1694 MAD_F(0x06ed12c5), MAD_F(0x042d4544), MAD_F(0x0165547c)
1699 for (i = 0; i < 18; i += 3) {
1700 tmp[i + 0] = mad_f_mul(y[i + 0], scale[i + 0]);
1701 tmp[i + 1] = mad_f_mul(y[i + 1], scale[i + 1]);
1702 tmp[i + 2] = mad_f_mul(y[i + 2], scale[i + 2]);
1709 /* scale reduction and output accumulation */
1712 for (i = 1; i < 17; i += 4) {
1713 X[i + 0] = X[i + 0] / 2 - X[(i + 0) - 1];
1714 X[i + 1] = X[i + 1] / 2 - X[(i + 1) - 1];
1715 X[i + 2] = X[i + 2] / 2 - X[(i + 2) - 1];
1716 X[i + 3] = X[i + 3] / 2 - X[(i + 3) - 1];
1718 X[17] = X[17] / 2 - X[16];
1723 * DESCRIPTION: perform X[18]->x[36] IMDCT using Szu-Wei Lee's fast algorithm
1726 void imdct36(mad_fixed_t const x[18], mad_fixed_t y[36])
1728 mad_fixed_t tmp[18];
1735 /* convert 18-point DCT-IV to 36-point IMDCT */
1737 for (i = 0; i < 9; i += 3) {
1738 y[i + 0] = tmp[9 + (i + 0)];
1739 y[i + 1] = tmp[9 + (i + 1)];
1740 y[i + 2] = tmp[9 + (i + 2)];
1742 for (i = 9; i < 27; i += 3) {
1743 y[i + 0] = -tmp[36 - (9 + (i + 0)) - 1];
1744 y[i + 1] = -tmp[36 - (9 + (i + 1)) - 1];
1745 y[i + 2] = -tmp[36 - (9 + (i + 2)) - 1];
1747 for (i = 27; i < 36; i += 3) {
1748 y[i + 0] = -tmp[(i + 0) - 27];
1749 y[i + 1] = -tmp[(i + 1) - 27];
1750 y[i + 2] = -tmp[(i + 2) - 27];
1756 * DESCRIPTION: perform X[18]->x[36] IMDCT
1759 void imdct36(mad_fixed_t const X[18], mad_fixed_t x[36])
1761 mad_fixed_t t0, t1, t2, t3, t4, t5, t6, t7;
1762 mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15;
1763 register mad_fixed64hi_t hi;
1764 register mad_fixed64lo_t lo;
1766 MAD_F_ML0(hi, lo, X[4], MAD_F(0x0ec835e8));
1767 MAD_F_MLA(hi, lo, X[13], MAD_F(0x061f78aa));
1769 t6 = MAD_F_MLZ(hi, lo);
1771 MAD_F_MLA(hi, lo, (t14 = X[1] - X[10]), -MAD_F(0x061f78aa));
1772 MAD_F_MLA(hi, lo, (t15 = X[7] + X[16]), -MAD_F(0x0ec835e8));
1774 t0 = MAD_F_MLZ(hi, lo);
1776 MAD_F_MLA(hi, lo, (t8 = X[0] - X[11] - X[12]), MAD_F(0x0216a2a2));
1777 MAD_F_MLA(hi, lo, (t9 = X[2] - X[9] - X[14]), MAD_F(0x09bd7ca0));
1778 MAD_F_MLA(hi, lo, (t10 = X[3] - X[8] - X[15]), -MAD_F(0x0cb19346));
1779 MAD_F_MLA(hi, lo, (t11 = X[5] - X[6] - X[17]), -MAD_F(0x0fdcf549));
1781 x[7] = MAD_F_MLZ(hi, lo);
1784 MAD_F_ML0(hi, lo, t8, -MAD_F(0x0cb19346));
1785 MAD_F_MLA(hi, lo, t9, MAD_F(0x0fdcf549));
1786 MAD_F_MLA(hi, lo, t10, MAD_F(0x0216a2a2));
1787 MAD_F_MLA(hi, lo, t11, -MAD_F(0x09bd7ca0));
1789 x[19] = x[34] = MAD_F_MLZ(hi, lo) - t0;
1791 t12 = X[0] - X[3] + X[8] - X[11] - X[12] + X[15];
1792 t13 = X[2] + X[5] - X[6] - X[9] - X[14] - X[17];
1794 MAD_F_ML0(hi, lo, t12, -MAD_F(0x0ec835e8));
1795 MAD_F_MLA(hi, lo, t13, MAD_F(0x061f78aa));
1797 x[22] = x[31] = MAD_F_MLZ(hi, lo) + t0;
1799 MAD_F_ML0(hi, lo, X[1], -MAD_F(0x09bd7ca0));
1800 MAD_F_MLA(hi, lo, X[7], MAD_F(0x0216a2a2));
1801 MAD_F_MLA(hi, lo, X[10], -MAD_F(0x0fdcf549));
1802 MAD_F_MLA(hi, lo, X[16], MAD_F(0x0cb19346));
1804 t1 = MAD_F_MLZ(hi, lo) + t6;
1806 MAD_F_ML0(hi, lo, X[0], MAD_F(0x03768962));
1807 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0e313245));
1808 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0ffc19fd));
1809 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0acf37ad));
1810 MAD_F_MLA(hi, lo, X[6], MAD_F(0x04cfb0e2));
1811 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0898c779));
1812 MAD_F_MLA(hi, lo, X[9], MAD_F(0x0d7e8807));
1813 MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f426cb5));
1814 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0bcbe352));
1815 MAD_F_MLA(hi, lo, X[14], MAD_F(0x00b2aa3e));
1816 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x07635284));
1817 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0f9ee890));
1819 x[6] = MAD_F_MLZ(hi, lo) + t1;
1822 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f426cb5));
1823 MAD_F_MLA(hi, lo, X[2], -MAD_F(0x00b2aa3e));
1824 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0898c779));
1825 MAD_F_MLA(hi, lo, X[5], MAD_F(0x0f9ee890));
1826 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0acf37ad));
1827 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x07635284));
1828 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0e313245));
1829 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0bcbe352));
1830 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x03768962));
1831 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0d7e8807));
1832 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0ffc19fd));
1833 MAD_F_MLA(hi, lo, X[17], MAD_F(0x04cfb0e2));
1835 x[23] = x[30] = MAD_F_MLZ(hi, lo) + t1;
1837 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0bcbe352));
1838 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0d7e8807));
1839 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x07635284));
1840 MAD_F_MLA(hi, lo, X[5], MAD_F(0x04cfb0e2));
1841 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f9ee890));
1842 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0ffc19fd));
1843 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x00b2aa3e));
1844 MAD_F_MLA(hi, lo, X[11], MAD_F(0x03768962));
1845 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0f426cb5));
1846 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0e313245));
1847 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0898c779));
1848 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0acf37ad));
1850 x[18] = x[35] = MAD_F_MLZ(hi, lo) - t1;
1852 MAD_F_ML0(hi, lo, X[4], MAD_F(0x061f78aa));
1853 MAD_F_MLA(hi, lo, X[13], -MAD_F(0x0ec835e8));
1855 t7 = MAD_F_MLZ(hi, lo);
1857 MAD_F_MLA(hi, lo, X[1], -MAD_F(0x0cb19346));
1858 MAD_F_MLA(hi, lo, X[7], MAD_F(0x0fdcf549));
1859 MAD_F_MLA(hi, lo, X[10], MAD_F(0x0216a2a2));
1860 MAD_F_MLA(hi, lo, X[16], -MAD_F(0x09bd7ca0));
1862 t2 = MAD_F_MLZ(hi, lo);
1864 MAD_F_MLA(hi, lo, X[0], MAD_F(0x04cfb0e2));
1865 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0ffc19fd));
1866 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0d7e8807));
1867 MAD_F_MLA(hi, lo, X[5], MAD_F(0x03768962));
1868 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0bcbe352));
1869 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0e313245));
1870 MAD_F_MLA(hi, lo, X[9], MAD_F(0x07635284));
1871 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0acf37ad));
1872 MAD_F_MLA(hi, lo, X[12], MAD_F(0x0f9ee890));
1873 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0898c779));
1874 MAD_F_MLA(hi, lo, X[15], MAD_F(0x00b2aa3e));
1875 MAD_F_MLA(hi, lo, X[17], MAD_F(0x0f426cb5));
1877 x[5] = MAD_F_MLZ(hi, lo);
1880 MAD_F_ML0(hi, lo, X[0], MAD_F(0x0acf37ad));
1881 MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0898c779));
1882 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0e313245));
1883 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0f426cb5));
1884 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x03768962));
1885 MAD_F_MLA(hi, lo, X[8], MAD_F(0x00b2aa3e));
1886 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0ffc19fd));
1887 MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f9ee890));
1888 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x04cfb0e2));
1889 MAD_F_MLA(hi, lo, X[14], MAD_F(0x07635284));
1890 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0d7e8807));
1891 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0bcbe352));
1893 x[0] = MAD_F_MLZ(hi, lo) + t2;
1896 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f9ee890));
1897 MAD_F_MLA(hi, lo, X[2], -MAD_F(0x07635284));
1898 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x00b2aa3e));
1899 MAD_F_MLA(hi, lo, X[5], MAD_F(0x0bcbe352));
1900 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f426cb5));
1901 MAD_F_MLA(hi, lo, X[8], MAD_F(0x0d7e8807));
1902 MAD_F_MLA(hi, lo, X[9], MAD_F(0x0898c779));
1903 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x04cfb0e2));
1904 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0acf37ad));
1905 MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0ffc19fd));
1906 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0e313245));
1907 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x03768962));
1909 x[24] = x[29] = MAD_F_MLZ(hi, lo) + t2;
1911 MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0216a2a2));
1912 MAD_F_MLA(hi, lo, X[7], -MAD_F(0x09bd7ca0));
1913 MAD_F_MLA(hi, lo, X[10], MAD_F(0x0cb19346));
1914 MAD_F_MLA(hi, lo, X[16], MAD_F(0x0fdcf549));
1916 t3 = MAD_F_MLZ(hi, lo) + t7;
1918 MAD_F_ML0(hi, lo, X[0], MAD_F(0x00b2aa3e));
1919 MAD_F_MLA(hi, lo, X[2], MAD_F(0x03768962));
1920 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x04cfb0e2));
1921 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x07635284));
1922 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0898c779));
1923 MAD_F_MLA(hi, lo, X[8], MAD_F(0x0acf37ad));
1924 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0bcbe352));
1925 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0d7e8807));
1926 MAD_F_MLA(hi, lo, X[12], MAD_F(0x0e313245));
1927 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f426cb5));
1928 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0f9ee890));
1929 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0ffc19fd));
1931 x[8] = MAD_F_MLZ(hi, lo) + t3;
1934 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0e313245));
1935 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0bcbe352));
1936 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0f9ee890));
1937 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0898c779));
1938 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0ffc19fd));
1939 MAD_F_MLA(hi, lo, X[8], MAD_F(0x04cfb0e2));
1940 MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f426cb5));
1941 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x00b2aa3e));
1942 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0d7e8807));
1943 MAD_F_MLA(hi, lo, X[14], -MAD_F(0x03768962));
1944 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0acf37ad));
1945 MAD_F_MLA(hi, lo, X[17], MAD_F(0x07635284));
1947 x[21] = x[32] = MAD_F_MLZ(hi, lo) + t3;
1949 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0d7e8807));
1950 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0f426cb5));
1951 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0acf37ad));
1952 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0ffc19fd));
1953 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x07635284));
1954 MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f9ee890));
1955 MAD_F_MLA(hi, lo, X[9], MAD_F(0x03768962));
1956 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0e313245));
1957 MAD_F_MLA(hi, lo, X[12], MAD_F(0x00b2aa3e));
1958 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0bcbe352));
1959 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x04cfb0e2));
1960 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0898c779));
1962 x[20] = x[33] = MAD_F_MLZ(hi, lo) - t3;
1964 MAD_F_ML0(hi, lo, t14, -MAD_F(0x0ec835e8));
1965 MAD_F_MLA(hi, lo, t15, MAD_F(0x061f78aa));
1967 t4 = MAD_F_MLZ(hi, lo) - t7;
1969 MAD_F_ML0(hi, lo, t12, MAD_F(0x061f78aa));
1970 MAD_F_MLA(hi, lo, t13, MAD_F(0x0ec835e8));
1972 x[4] = MAD_F_MLZ(hi, lo) + t4;
1975 MAD_F_ML0(hi, lo, t8, MAD_F(0x09bd7ca0));
1976 MAD_F_MLA(hi, lo, t9, -MAD_F(0x0216a2a2));
1977 MAD_F_MLA(hi, lo, t10, MAD_F(0x0fdcf549));
1978 MAD_F_MLA(hi, lo, t11, -MAD_F(0x0cb19346));
1980 x[1] = MAD_F_MLZ(hi, lo) + t4;
1983 MAD_F_ML0(hi, lo, t8, -MAD_F(0x0fdcf549));
1984 MAD_F_MLA(hi, lo, t9, -MAD_F(0x0cb19346));
1985 MAD_F_MLA(hi, lo, t10, -MAD_F(0x09bd7ca0));
1986 MAD_F_MLA(hi, lo, t11, -MAD_F(0x0216a2a2));
1988 x[25] = x[28] = MAD_F_MLZ(hi, lo) + t4;
1990 MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0fdcf549));
1991 MAD_F_MLA(hi, lo, X[7], -MAD_F(0x0cb19346));
1992 MAD_F_MLA(hi, lo, X[10], -MAD_F(0x09bd7ca0));
1993 MAD_F_MLA(hi, lo, X[16], -MAD_F(0x0216a2a2));
1995 t5 = MAD_F_MLZ(hi, lo) - t6;
1997 MAD_F_ML0(hi, lo, X[0], MAD_F(0x0898c779));
1998 MAD_F_MLA(hi, lo, X[2], MAD_F(0x04cfb0e2));
1999 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0bcbe352));
2000 MAD_F_MLA(hi, lo, X[5], MAD_F(0x00b2aa3e));
2001 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0e313245));
2002 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x03768962));
2003 MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f9ee890));
2004 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x07635284));
2005 MAD_F_MLA(hi, lo, X[12], MAD_F(0x0ffc19fd));
2006 MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0acf37ad));
2007 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0f426cb5));
2008 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0d7e8807));
2010 x[2] = MAD_F_MLZ(hi, lo) + t5;
2013 MAD_F_ML0(hi, lo, X[0], MAD_F(0x07635284));
2014 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0acf37ad));
2015 MAD_F_MLA(hi, lo, X[3], MAD_F(0x03768962));
2016 MAD_F_MLA(hi, lo, X[5], MAD_F(0x0d7e8807));
2017 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x00b2aa3e));
2018 MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f426cb5));
2019 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x04cfb0e2));
2020 MAD_F_MLA(hi, lo, X[11], MAD_F(0x0ffc19fd));
2021 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0898c779));
2022 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f9ee890));
2023 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0bcbe352));
2024 MAD_F_MLA(hi, lo, X[17], MAD_F(0x0e313245));
2026 x[3] = MAD_F_MLZ(hi, lo) + t5;
2029 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0ffc19fd));
2030 MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0f9ee890));
2031 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0f426cb5));
2032 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0e313245));
2033 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0d7e8807));
2034 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0bcbe352));
2035 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0acf37ad));
2036 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0898c779));
2037 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x07635284));
2038 MAD_F_MLA(hi, lo, X[14], -MAD_F(0x04cfb0e2));
2039 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x03768962));
2040 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x00b2aa3e));
2042 x[26] = x[27] = MAD_F_MLZ(hi, lo) + t5;
2047 * NAME: III_imdct_l()
2048 * DESCRIPTION: perform IMDCT and windowing for long blocks
2051 void III_imdct_l(mad_fixed_t const X[18], mad_fixed_t z[36],
2052 unsigned int block_type)
2062 switch (block_type) {
2063 case 0: /* normal window */
2064 # if defined(ASO_INTERLEAVE1)
2066 register mad_fixed_t tmp1, tmp2;
2071 for (i = 0; i < 34; i += 2) {
2072 z[i + 0] = mad_f_mul(z[i + 0], tmp1);
2073 tmp1 = window_l[i + 2];
2074 z[i + 1] = mad_f_mul(z[i + 1], tmp2);
2075 tmp2 = window_l[i + 3];
2078 z[34] = mad_f_mul(z[34], tmp1);
2079 z[35] = mad_f_mul(z[35], tmp2);
2081 # elif defined(ASO_INTERLEAVE2)
2083 register mad_fixed_t tmp1, tmp2;
2088 for (i = 0; i < 35; ++i) {
2089 z[i] = mad_f_mul(tmp1, tmp2);
2091 tmp2 = window_l[i + 1];
2094 z[35] = mad_f_mul(tmp1, tmp2);
2097 for (i = 0; i < 36; i += 4) {
2098 z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]);
2099 z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]);
2100 z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]);
2101 z[i + 3] = mad_f_mul(z[i + 3], window_l[i + 3]);
2104 for (i = 0; i < 36; ++i) z[i] = mad_f_mul(z[i], window_l[i]);
2108 case 1: /* start block */
2109 for (i = 0; i < 18; i += 3) {
2110 z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]);
2111 z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]);
2112 z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]);
2114 /* (i = 18; i < 24; ++i) z[i] unchanged */
2115 for (i = 24; i < 30; ++i) z[i] = mad_f_mul(z[i], window_s[i - 18]);
2116 for (i = 30; i < 36; ++i) z[i] = 0;
2119 case 3: /* stop block */
2120 for (i = 0; i < 6; ++i) z[i] = 0;
2121 for (i = 6; i < 12; ++i) z[i] = mad_f_mul(z[i], window_s[i - 6]);
2122 /* (i = 12; i < 18; ++i) z[i] unchanged */
2123 for (i = 18; i < 36; i += 3) {
2124 z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]);
2125 z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]);
2126 z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]);
2131 # endif /* ASO_IMDCT */
2134 * NAME: III_imdct_s()
2135 * DESCRIPTION: perform IMDCT and windowing for short blocks
2138 void III_imdct_s(mad_fixed_t const X[18], mad_fixed_t z[36])
2140 mad_fixed_t y[36], *yptr;
2141 mad_fixed_t const *wptr;
2143 register mad_fixed64hi_t hi;
2144 register mad_fixed64lo_t lo;
2150 for (w = 0; w < 3; ++w) {
2151 register mad_fixed_t const (*s)[6];
2155 for (i = 0; i < 3; ++i) {
2156 MAD_F_ML0(hi, lo, X[0], (*s)[0]);
2157 MAD_F_MLA(hi, lo, X[1], (*s)[1]);
2158 MAD_F_MLA(hi, lo, X[2], (*s)[2]);
2159 MAD_F_MLA(hi, lo, X[3], (*s)[3]);
2160 MAD_F_MLA(hi, lo, X[4], (*s)[4]);
2161 MAD_F_MLA(hi, lo, X[5], (*s)[5]);
2163 yptr[i + 0] = MAD_F_MLZ(hi, lo);
2164 yptr[5 - i] = -yptr[i + 0];
2168 MAD_F_ML0(hi, lo, X[0], (*s)[0]);
2169 MAD_F_MLA(hi, lo, X[1], (*s)[1]);
2170 MAD_F_MLA(hi, lo, X[2], (*s)[2]);
2171 MAD_F_MLA(hi, lo, X[3], (*s)[3]);
2172 MAD_F_MLA(hi, lo, X[4], (*s)[4]);
2173 MAD_F_MLA(hi, lo, X[5], (*s)[5]);
2175 yptr[ i + 6] = MAD_F_MLZ(hi, lo);
2176 yptr[11 - i] = yptr[i + 6];
2185 /* windowing, overlapping and concatenation */
2188 wptr = &window_s[0];
2190 for (i = 0; i < 6; ++i) {
2192 z[i + 6] = mad_f_mul(yptr[ 0 + 0], wptr[0]);
2194 MAD_F_ML0(hi, lo, yptr[ 0 + 6], wptr[6]);
2195 MAD_F_MLA(hi, lo, yptr[12 + 0], wptr[0]);
2197 z[i + 12] = MAD_F_MLZ(hi, lo);
2199 MAD_F_ML0(hi, lo, yptr[12 + 6], wptr[6]);
2200 MAD_F_MLA(hi, lo, yptr[24 + 0], wptr[0]);
2202 z[i + 18] = MAD_F_MLZ(hi, lo);
2204 z[i + 24] = mad_f_mul(yptr[24 + 6], wptr[6]);
2213 * NAME: III_overlap()
2214 * DESCRIPTION: perform overlap-add of windowed IMDCT outputs
2217 void III_overlap(mad_fixed_t const output[36], mad_fixed_t overlap[18],
2218 mad_fixed_t sample[18][32], unsigned int sb)
2222 # if defined(ASO_INTERLEAVE2)
2224 register mad_fixed_t tmp1, tmp2;
2229 for (i = 0; i < 16; i += 2) {
2230 sample[i + 0][sb] = output[i + 0 + 0] + tmp1;
2231 overlap[i + 0] = output[i + 0 + 18];
2232 tmp1 = overlap[i + 2];
2234 sample[i + 1][sb] = output[i + 1 + 0] + tmp2;
2235 overlap[i + 1] = output[i + 1 + 18];
2236 tmp2 = overlap[i + 3];
2239 sample[16][sb] = output[16 + 0] + tmp1;
2240 overlap[16] = output[16 + 18];
2241 sample[17][sb] = output[17 + 0] + tmp2;
2242 overlap[17] = output[17 + 18];
2245 for (i = 0; i < 18; i += 2) {
2246 sample[i + 0][sb] = output[i + 0 + 0] + overlap[i + 0];
2247 overlap[i + 0] = output[i + 0 + 18];
2249 sample[i + 1][sb] = output[i + 1 + 0] + overlap[i + 1];
2250 overlap[i + 1] = output[i + 1 + 18];
2253 for (i = 0; i < 18; ++i) {
2254 sample[i][sb] = output[i + 0] + overlap[i];
2255 overlap[i] = output[i + 18];
2261 * NAME: III_overlap_z()
2262 * DESCRIPTION: perform "overlap-add" of zero IMDCT outputs
2265 void III_overlap_z(mad_fixed_t overlap[18],
2266 mad_fixed_t sample[18][32], unsigned int sb)
2270 # if defined(ASO_INTERLEAVE2)
2272 register mad_fixed_t tmp1, tmp2;
2277 for (i = 0; i < 16; i += 2) {
2278 sample[i + 0][sb] = tmp1;
2280 tmp1 = overlap[i + 2];
2282 sample[i + 1][sb] = tmp2;
2284 tmp2 = overlap[i + 3];
2287 sample[16][sb] = tmp1;
2289 sample[17][sb] = tmp2;
2293 for (i = 0; i < 18; ++i) {
2294 sample[i][sb] = overlap[i];
2301 * NAME: III_freqinver()
2302 * DESCRIPTION: perform subband frequency inversion for odd sample lines
2305 void III_freqinver(mad_fixed_t sample[18][32], unsigned int sb)
2309 # if 1 || defined(ASO_INTERLEAVE1) || defined(ASO_INTERLEAVE2)
2311 register mad_fixed_t tmp1, tmp2;
2313 tmp1 = sample[1][sb];
2314 tmp2 = sample[3][sb];
2316 for (i = 1; i < 13; i += 4) {
2317 sample[i + 0][sb] = -tmp1;
2318 tmp1 = sample[i + 4][sb];
2319 sample[i + 2][sb] = -tmp2;
2320 tmp2 = sample[i + 6][sb];
2323 sample[13][sb] = -tmp1;
2324 tmp1 = sample[17][sb];
2325 sample[15][sb] = -tmp2;
2326 sample[17][sb] = -tmp1;
2329 for (i = 1; i < 18; i += 2)
2330 sample[i][sb] = -sample[i][sb];
2335 * NAME: III_decode()
2336 * DESCRIPTION: decode frame main_data
2339 enum mad_error III_decode(struct mad_bitptr *ptr, struct mad_frame *frame,
2340 struct sideinfo *si, unsigned int nch)
2342 struct mad_header *header = &frame->header;
2343 unsigned int sfreqi, ngr, gr;
2348 sfreq = header->samplerate;
2349 if (header->flags & MAD_FLAG_MPEG_2_5_EXT)
2352 /* 48000 => 0, 44100 => 1, 32000 => 2,
2353 24000 => 3, 22050 => 4, 16000 => 5 */
2354 sfreqi = ((sfreq >> 7) & 0x000f) +
2355 ((sfreq >> 15) & 0x0001) - 8;
2357 if (header->flags & MAD_FLAG_MPEG_2_5_EXT)
2361 /* scalefactors, Huffman decoding, requantization */
2363 ngr = (header->flags & MAD_FLAG_LSF_EXT) ? 1 : 2;
2365 for (gr = 0; gr < ngr; ++gr) {
2366 struct granule *granule = &si->gr[gr];
2367 unsigned char const *sfbwidth[2];
2368 mad_fixed_t xr[2][576];
2370 enum mad_error error;
2372 for (ch = 0; ch < nch; ++ch) {
2373 struct channel *channel = &granule->ch[ch];
2374 unsigned int part2_length;
2376 sfbwidth[ch] = sfbwidth_table[sfreqi].l;
2377 if (channel->block_type == 2) {
2378 sfbwidth[ch] = (channel->flags & mixed_block_flag) ?
2379 sfbwidth_table[sfreqi].m : sfbwidth_table[sfreqi].s;
2382 if (header->flags & MAD_FLAG_LSF_EXT) {
2383 part2_length = III_scalefactors_lsf(ptr, channel,
2384 ch == 0 ? 0 : &si->gr[1].ch[1],
2385 header->mode_extension);
2388 part2_length = III_scalefactors(ptr, channel, &si->gr[0].ch[ch],
2389 gr == 0 ? 0 : si->scfsi[ch]);
2392 error = III_huffdecode(ptr, xr[ch], channel, sfbwidth[ch], part2_length);
2397 /* joint stereo processing */
2399 if (header->mode == MAD_MODE_JOINT_STEREO && header->mode_extension) {
2400 error = III_stereo(xr, granule, header, sfbwidth[0]);
2405 /* reordering, alias reduction, IMDCT, overlap-add, frequency inversion */
2407 for (ch = 0; ch < nch; ++ch) {
2408 struct channel const *channel = &granule->ch[ch];
2409 mad_fixed_t (*sample)[32] = &frame->sbsample[ch][18 * gr];
2410 unsigned int sb, l, i, sblimit;
2411 mad_fixed_t output[36];
2413 if (channel->block_type == 2) {
2414 III_reorder(xr[ch], channel, sfbwidth[ch]);
2416 # if !defined(OPT_STRICT)
2418 * According to ISO/IEC 11172-3, "Alias reduction is not applied for
2419 * granules with block_type == 2 (short block)." However, other
2420 * sources suggest alias reduction should indeed be performed on the
2421 * lower two subbands of mixed blocks. Most other implementations do
2422 * this, so by default we will too.
2424 if (channel->flags & mixed_block_flag)
2425 III_aliasreduce(xr[ch], 36);
2429 III_aliasreduce(xr[ch], 576);
2435 if (channel->block_type != 2 || (channel->flags & mixed_block_flag)) {
2436 unsigned int block_type;
2438 block_type = channel->block_type;
2439 if (channel->flags & mixed_block_flag)
2443 for (sb = 0; sb < 2; ++sb, l += 18) {
2444 III_imdct_l(&xr[ch][l], output, block_type);
2445 III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
2450 for (sb = 0; sb < 2; ++sb, l += 18) {
2451 III_imdct_s(&xr[ch][l], output);
2452 III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
2456 III_freqinver(sample, 1);
2458 /* (nonzero) subbands 2-31 */
2461 while (i > 36 && xr[ch][i - 1] == 0)
2464 sblimit = 32 - (576 - i) / 18;
2466 if (channel->block_type != 2) {
2468 for (sb = 2; sb < sblimit; ++sb, l += 18) {
2469 III_imdct_l(&xr[ch][l], output, channel->block_type);
2470 III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
2473 III_freqinver(sample, sb);
2478 for (sb = 2; sb < sblimit; ++sb, l += 18) {
2479 III_imdct_s(&xr[ch][l], output);
2480 III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
2483 III_freqinver(sample, sb);
2487 /* remaining (zero) subbands */
2489 for (sb = sblimit; sb < 32; ++sb) {
2490 III_overlap_z((*frame->overlap)[ch][sb], sample, sb);
2493 III_freqinver(sample, sb);
2498 return MAD_ERROR_NONE;
2502 * NAME: layer->III()
2503 * DESCRIPTION: decode a single Layer III frame
2505 int mad_layer_III(struct mad_stream *stream, struct mad_frame *frame)
2507 struct mad_header *header = &frame->header;
2508 unsigned int nch, priv_bitlen, next_md_begin = 0;
2509 unsigned int si_len, data_bitlen, md_len;
2510 unsigned int frame_space, frame_used, frame_free;
2511 struct mad_bitptr ptr;
2513 enum mad_error error;
2516 /* allocate Layer III dynamic structures */
2518 if (stream->main_data == 0) {
2519 stream->main_data = malloc(MAD_BUFFER_MDLEN);
2520 if (stream->main_data == 0) {
2521 stream->error = MAD_ERROR_NOMEM;
2526 if (frame->overlap == 0) {
2527 frame->overlap = calloc(2 * 32 * 18, sizeof(mad_fixed_t));
2528 if (frame->overlap == 0) {
2529 stream->error = MAD_ERROR_NOMEM;
2534 nch = MAD_NCHANNELS(header);
2535 si_len = (header->flags & MAD_FLAG_LSF_EXT) ?
2536 (nch == 1 ? 9 : 17) : (nch == 1 ? 17 : 32);
2538 /* check frame sanity */
2540 if (stream->next_frame - mad_bit_nextbyte(&stream->ptr) <
2541 (signed int) si_len) {
2542 stream->error = MAD_ERROR_BADFRAMELEN;
2547 /* check CRC word */
2549 if (header->flags & MAD_FLAG_PROTECTION) {
2551 mad_bit_crc(stream->ptr, si_len * CHAR_BIT, header->crc_check);
2553 if (header->crc_check != header->crc_target &&
2554 !(frame->options & MAD_OPTION_IGNORECRC)) {
2555 stream->error = MAD_ERROR_BADCRC;
2560 /* decode frame side information */
2562 error = III_sideinfo(&stream->ptr, nch, header->flags & MAD_FLAG_LSF_EXT,
2563 &si, &data_bitlen, &priv_bitlen);
2564 if (error && result == 0) {
2565 stream->error = error;
2569 header->flags |= priv_bitlen;
2570 header->private_bits |= si.private_bits;
2572 /* find main_data of next frame */
2575 struct mad_bitptr peek;
2576 unsigned long header;
2578 mad_bit_init(&peek, stream->next_frame);
2580 header = mad_bit_read(&peek, 32);
2581 if ((header & 0xffe60000L) /* syncword | layer */ == 0xffe20000L) {
2582 if (!(header & 0x00010000L)) /* protection_bit */
2583 mad_bit_skip(&peek, 16); /* crc_check */
2586 mad_bit_read(&peek, (header & 0x00080000L) /* ID */ ? 9 : 8);
2589 mad_bit_finish(&peek);
2592 /* find main_data of this frame */
2594 frame_space = stream->next_frame - mad_bit_nextbyte(&stream->ptr);
2596 if (next_md_begin > si.main_data_begin + frame_space)
2599 md_len = si.main_data_begin + frame_space - next_md_begin;
2603 if (si.main_data_begin == 0) {
2607 frame_used = md_len;
2610 if (si.main_data_begin > stream->md_len) {
2612 stream->error = MAD_ERROR_BADDATAPTR;
2618 *stream->main_data + stream->md_len - si.main_data_begin);
2620 if (md_len > si.main_data_begin) {
2621 assert(stream->md_len + md_len -
2622 si.main_data_begin <= MAD_BUFFER_MDLEN);
2624 memcpy(*stream->main_data + stream->md_len,
2625 mad_bit_nextbyte(&stream->ptr),
2626 frame_used = md_len - si.main_data_begin);
2627 stream->md_len += frame_used;
2632 frame_free = frame_space - frame_used;
2634 /* decode main_data */
2637 error = III_decode(&ptr, frame, &si, nch);
2639 stream->error = error;
2643 /* designate ancillary bits */
2645 stream->anc_ptr = ptr;
2646 stream->anc_bitlen = md_len * CHAR_BIT - data_bitlen;
2649 # if 0 && defined(DEBUG)
2651 "main_data_begin:%u, md_len:%u, frame_free:%u, "
2652 "data_bitlen:%u, anc_bitlen: %u\n",
2653 si.main_data_begin, md_len, frame_free,
2654 data_bitlen, stream->anc_bitlen);
2657 /* preload main_data buffer with up to 511 bytes for next frame(s) */
2659 if (frame_free >= next_md_begin) {
2660 memcpy(*stream->main_data,
2661 stream->next_frame - next_md_begin, next_md_begin);
2662 stream->md_len = next_md_begin;
2665 if (md_len < si.main_data_begin) {
2668 extra = si.main_data_begin - md_len;
2669 if (extra + frame_free > next_md_begin)
2670 extra = next_md_begin - frame_free;
2672 if (extra < stream->md_len) {
2673 memmove(*stream->main_data,
2674 *stream->main_data + stream->md_len - extra, extra);
2675 stream->md_len = extra;
2681 memcpy(*stream->main_data + stream->md_len,
2682 stream->next_frame - frame_free, frame_free);
2683 stream->md_len += frame_free;