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 1042 2004-05-17 22:42:18Z fbaumgart $
48
/* --- Layer III ----------------------------------------------------------- */
51
count1table_select = 0x01,
52
scalefac_scale = 0x02,
54
mixed_block_flag = 0x08
63
unsigned int main_data_begin;
64
unsigned int private_bits;
66
unsigned char scfsi[2];
71
unsigned short part2_3_length;
72
unsigned short big_values;
73
unsigned short global_gain;
74
unsigned short scalefac_compress;
77
unsigned char block_type;
78
unsigned char table_select[3];
79
unsigned char subblock_gain[3];
80
unsigned char region0_count;
81
unsigned char region1_count;
84
unsigned char scalefac[39]; /* scalefac_l and/or scalefac_s */
90
* scalefactor bit lengths
91
* derived from section 2.4.2.7 of ISO/IEC 11172-3
97
} const sflen_table[16] = {
98
{ 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 },
99
{ 3, 0 }, { 1, 1 }, { 1, 2 }, { 1, 3 },
100
{ 2, 1 }, { 2, 2 }, { 2, 3 }, { 3, 1 },
101
{ 3, 2 }, { 3, 3 }, { 4, 2 }, { 4, 3 }
105
* number of LSF scalefactor band values
106
* derived from section 2.4.3.2 of ISO/IEC 13818-3
109
unsigned char const nsfb_table[6][3][4] = {
136
* MPEG-1 scalefactor band widths
137
* derived from Table B.8 of ISO/IEC 11172-3
140
unsigned char const sfb_48000_long[] = {
141
4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10,
142
12, 16, 18, 22, 28, 34, 40, 46, 54, 54, 192
146
unsigned char const sfb_44100_long[] = {
147
4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10,
148
12, 16, 20, 24, 28, 34, 42, 50, 54, 76, 158
152
unsigned char const sfb_32000_long[] = {
153
4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12,
154
16, 20, 24, 30, 38, 46, 56, 68, 84, 102, 26
158
unsigned char const sfb_48000_short[] = {
159
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6,
160
6, 6, 6, 6, 6, 10, 10, 10, 12, 12, 12, 14, 14,
161
14, 16, 16, 16, 20, 20, 20, 26, 26, 26, 66, 66, 66
165
unsigned char const sfb_44100_short[] = {
166
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6,
167
6, 6, 8, 8, 8, 10, 10, 10, 12, 12, 12, 14, 14,
168
14, 18, 18, 18, 22, 22, 22, 30, 30, 30, 56, 56, 56
172
unsigned char const sfb_32000_short[] = {
173
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6,
174
6, 6, 8, 8, 8, 12, 12, 12, 16, 16, 16, 20, 20,
175
20, 26, 26, 26, 34, 34, 34, 42, 42, 42, 12, 12, 12
179
unsigned char const sfb_48000_mixed[] = {
180
/* long */ 4, 4, 4, 4, 4, 4, 6, 6,
181
/* short */ 4, 4, 4, 6, 6, 6, 6, 6, 6, 10,
182
10, 10, 12, 12, 12, 14, 14, 14, 16, 16,
183
16, 20, 20, 20, 26, 26, 26, 66, 66, 66
187
unsigned char const sfb_44100_mixed[] = {
188
/* long */ 4, 4, 4, 4, 4, 4, 6, 6,
189
/* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 10,
190
10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
191
18, 22, 22, 22, 30, 30, 30, 56, 56, 56
195
unsigned char const sfb_32000_mixed[] = {
196
/* long */ 4, 4, 4, 4, 4, 4, 6, 6,
197
/* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 12,
198
12, 12, 16, 16, 16, 20, 20, 20, 26, 26,
199
26, 34, 34, 34, 42, 42, 42, 12, 12, 12
203
* MPEG-2 scalefactor band widths
204
* derived from Table B.2 of ISO/IEC 13818-3
207
unsigned char const sfb_24000_long[] = {
208
6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
209
18, 22, 26, 32, 38, 46, 54, 62, 70, 76, 36
213
unsigned char const sfb_22050_long[] = {
214
6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
215
20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54
218
# define sfb_16000_long sfb_22050_long
221
unsigned char const sfb_24000_short[] = {
222
4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8,
223
8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
224
18, 24, 24, 24, 32, 32, 32, 44, 44, 44, 12, 12, 12
228
unsigned char const sfb_22050_short[] = {
229
4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6,
230
6, 6, 8, 8, 8, 10, 10, 10, 14, 14, 14, 18, 18,
231
18, 26, 26, 26, 32, 32, 32, 42, 42, 42, 18, 18, 18
235
unsigned char const sfb_16000_short[] = {
236
4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8,
237
8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
238
18, 24, 24, 24, 30, 30, 30, 40, 40, 40, 18, 18, 18
242
unsigned char const sfb_24000_mixed[] = {
243
/* long */ 6, 6, 6, 6, 6, 6,
244
/* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12,
245
12, 12, 14, 14, 14, 18, 18, 18, 24, 24,
246
24, 32, 32, 32, 44, 44, 44, 12, 12, 12
250
unsigned char const sfb_22050_mixed[] = {
251
/* long */ 6, 6, 6, 6, 6, 6,
252
/* short */ 6, 6, 6, 6, 6, 6, 8, 8, 8, 10,
253
10, 10, 14, 14, 14, 18, 18, 18, 26, 26,
254
26, 32, 32, 32, 42, 42, 42, 18, 18, 18
258
unsigned char const sfb_16000_mixed[] = {
259
/* long */ 6, 6, 6, 6, 6, 6,
260
/* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12,
261
12, 12, 14, 14, 14, 18, 18, 18, 24, 24,
262
24, 30, 30, 30, 40, 40, 40, 18, 18, 18
266
* MPEG 2.5 scalefactor band widths
267
* derived from public sources
269
# define sfb_12000_long sfb_16000_long
270
# define sfb_11025_long sfb_12000_long
273
unsigned char const sfb_8000_long[] = {
274
12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32,
275
40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2
278
# define sfb_12000_short sfb_16000_short
279
# define sfb_11025_short sfb_12000_short
282
unsigned char const sfb_8000_short[] = {
283
8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 16,
284
16, 16, 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36,
285
36, 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26
288
# define sfb_12000_mixed sfb_16000_mixed
289
# define sfb_11025_mixed sfb_12000_mixed
291
/* the 8000 Hz short block scalefactor bands do not break after
292
the first 36 frequency lines, so this is probably wrong */
294
unsigned char const sfb_8000_mixed[] = {
295
/* long */ 12, 12, 12,
296
/* short */ 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16,
297
20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, 36,
298
2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26
303
unsigned char const *l;
304
unsigned char const *s;
305
unsigned char const *m;
306
} const sfbwidth_table[9] = {
307
{ sfb_48000_long, sfb_48000_short, sfb_48000_mixed },
308
{ sfb_44100_long, sfb_44100_short, sfb_44100_mixed },
309
{ sfb_32000_long, sfb_32000_short, sfb_32000_mixed },
310
{ sfb_24000_long, sfb_24000_short, sfb_24000_mixed },
311
{ sfb_22050_long, sfb_22050_short, sfb_22050_mixed },
312
{ sfb_16000_long, sfb_16000_short, sfb_16000_mixed },
313
{ sfb_12000_long, sfb_12000_short, sfb_12000_mixed },
314
{ sfb_11025_long, sfb_11025_short, sfb_11025_mixed },
315
{ sfb_8000_long, sfb_8000_short, sfb_8000_mixed }
319
* scalefactor band preemphasis (used only when preflag is set)
320
* derived from Table B.6 of ISO/IEC 11172-3
323
unsigned char const pretab[22] = {
324
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0
328
* table for requantization
330
* rq_table[x].mantissa * 2^(rq_table[x].exponent) = x^(4/3)
334
unsigned long mantissa : 27;
335
unsigned short exponent : 5;
336
} const rq_table[8207] = {
337
# include "rq_table.dat"
341
* fractional powers of two
342
* used for requantization and joint stereo decoding
344
* root_table[3 + x] = 2^(x/4)
347
mad_fixed_t const root_table[7] = {
348
MAD_F(0x09837f05) /* 2^(-3/4) == 0.59460355750136 */,
349
MAD_F(0x0b504f33) /* 2^(-2/4) == 0.70710678118655 */,
350
MAD_F(0x0d744fcd) /* 2^(-1/4) == 0.84089641525371 */,
351
MAD_F(0x10000000) /* 2^( 0/4) == 1.00000000000000 */,
352
MAD_F(0x1306fe0a) /* 2^(+1/4) == 1.18920711500272 */,
353
MAD_F(0x16a09e66) /* 2^(+2/4) == 1.41421356237310 */,
354
MAD_F(0x1ae89f99) /* 2^(+3/4) == 1.68179283050743 */
358
* coefficients for aliasing reduction
359
* derived from Table B.9 of ISO/IEC 11172-3
361
* c[] = { -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037 }
362
* cs[i] = 1 / sqrt(1 + c[i]^2)
363
* ca[i] = c[i] / sqrt(1 + c[i]^2)
366
mad_fixed_t const cs[8] = {
367
+MAD_F(0x0db84a81) /* +0.857492926 */, +MAD_F(0x0e1b9d7f) /* +0.881741997 */,
368
+MAD_F(0x0f31adcf) /* +0.949628649 */, +MAD_F(0x0fbba815) /* +0.983314592 */,
369
+MAD_F(0x0feda417) /* +0.995517816 */, +MAD_F(0x0ffc8fc8) /* +0.999160558 */,
370
+MAD_F(0x0fff964c) /* +0.999899195 */, +MAD_F(0x0ffff8d3) /* +0.999993155 */
374
mad_fixed_t const ca[8] = {
375
-MAD_F(0x083b5fe7) /* -0.514495755 */, -MAD_F(0x078c36d2) /* -0.471731969 */,
376
-MAD_F(0x05039814) /* -0.313377454 */, -MAD_F(0x02e91dd1) /* -0.181913200 */,
377
-MAD_F(0x0183603a) /* -0.094574193 */, -MAD_F(0x00a7cb87) /* -0.040965583 */,
378
-MAD_F(0x003a2847) /* -0.014198569 */, -MAD_F(0x000f27b4) /* -0.003699975 */
382
* IMDCT coefficients for short blocks
383
* derived from section 2.4.3.4.10.2 of ISO/IEC 11172-3
385
* imdct_s[i/even][k] = cos((PI / 24) * (2 * (i / 2) + 7) * (2 * k + 1))
386
* imdct_s[i /odd][k] = cos((PI / 24) * (2 * (6 + (i-1)/2) + 7) * (2 * k + 1))
389
mad_fixed_t const imdct_s[6][6] = {
390
# include "imdct_s.dat"
393
# if !defined(ASO_IMDCT)
395
* windowing coefficients for long blocks
396
* derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3
398
* window_l[i] = sin((PI / 36) * (i + 1/2))
401
mad_fixed_t const window_l[36] = {
402
MAD_F(0x00b2aa3e) /* 0.043619387 */, MAD_F(0x0216a2a2) /* 0.130526192 */,
403
MAD_F(0x03768962) /* 0.216439614 */, MAD_F(0x04cfb0e2) /* 0.300705800 */,
404
MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x07635284) /* 0.461748613 */,
405
MAD_F(0x0898c779) /* 0.537299608 */, MAD_F(0x09bd7ca0) /* 0.608761429 */,
406
MAD_F(0x0acf37ad) /* 0.675590208 */, MAD_F(0x0bcbe352) /* 0.737277337 */,
407
MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x0d7e8807) /* 0.843391446 */,
409
MAD_F(0x0e313245) /* 0.887010833 */, MAD_F(0x0ec835e8) /* 0.923879533 */,
410
MAD_F(0x0f426cb5) /* 0.953716951 */, MAD_F(0x0f9ee890) /* 0.976296007 */,
411
MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ffc19fd) /* 0.999048222 */,
412
MAD_F(0x0ffc19fd) /* 0.999048222 */, MAD_F(0x0fdcf549) /* 0.991444861 */,
413
MAD_F(0x0f9ee890) /* 0.976296007 */, MAD_F(0x0f426cb5) /* 0.953716951 */,
414
MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0e313245) /* 0.887010833 */,
416
MAD_F(0x0d7e8807) /* 0.843391446 */, MAD_F(0x0cb19346) /* 0.793353340 */,
417
MAD_F(0x0bcbe352) /* 0.737277337 */, MAD_F(0x0acf37ad) /* 0.675590208 */,
418
MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0898c779) /* 0.537299608 */,
419
MAD_F(0x07635284) /* 0.461748613 */, MAD_F(0x061f78aa) /* 0.382683432 */,
420
MAD_F(0x04cfb0e2) /* 0.300705800 */, MAD_F(0x03768962) /* 0.216439614 */,
421
MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x00b2aa3e) /* 0.043619387 */,
423
# endif /* ASO_IMDCT */
426
* windowing coefficients for short blocks
427
* derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3
429
* window_s[i] = sin((PI / 12) * (i + 1/2))
432
mad_fixed_t const window_s[12] = {
433
MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x061f78aa) /* 0.382683432 */,
434
MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0cb19346) /* 0.793353340 */,
435
MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0fdcf549) /* 0.991444861 */,
436
MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ec835e8) /* 0.923879533 */,
437
MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x09bd7ca0) /* 0.608761429 */,
438
MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x0216a2a2) /* 0.130526192 */,
442
* coefficients for intensity stereo processing
443
* derived from section 2.4.3.4.9.3 of ISO/IEC 11172-3
445
* is_ratio[i] = tan(i * (PI / 12))
446
* is_table[i] = is_ratio[i] / (1 + is_ratio[i])
449
mad_fixed_t const is_table[7] = {
450
MAD_F(0x00000000) /* 0.000000000 */,
451
MAD_F(0x0361962f) /* 0.211324865 */,
452
MAD_F(0x05db3d74) /* 0.366025404 */,
453
MAD_F(0x08000000) /* 0.500000000 */,
454
MAD_F(0x0a24c28c) /* 0.633974596 */,
455
MAD_F(0x0c9e69d1) /* 0.788675135 */,
456
MAD_F(0x10000000) /* 1.000000000 */
460
* coefficients for LSF intensity stereo processing
461
* derived from section 2.4.3.2 of ISO/IEC 13818-3
463
* is_lsf_table[0][i] = (1 / sqrt(sqrt(2)))^(i + 1)
464
* is_lsf_table[1][i] = (1 / sqrt(2)) ^(i + 1)
467
mad_fixed_t const is_lsf_table[2][15] = {
469
MAD_F(0x0d744fcd) /* 0.840896415 */,
470
MAD_F(0x0b504f33) /* 0.707106781 */,
471
MAD_F(0x09837f05) /* 0.594603558 */,
472
MAD_F(0x08000000) /* 0.500000000 */,
473
MAD_F(0x06ba27e6) /* 0.420448208 */,
474
MAD_F(0x05a8279a) /* 0.353553391 */,
475
MAD_F(0x04c1bf83) /* 0.297301779 */,
476
MAD_F(0x04000000) /* 0.250000000 */,
477
MAD_F(0x035d13f3) /* 0.210224104 */,
478
MAD_F(0x02d413cd) /* 0.176776695 */,
479
MAD_F(0x0260dfc1) /* 0.148650889 */,
480
MAD_F(0x02000000) /* 0.125000000 */,
481
MAD_F(0x01ae89fa) /* 0.105112052 */,
482
MAD_F(0x016a09e6) /* 0.088388348 */,
483
MAD_F(0x01306fe1) /* 0.074325445 */
485
MAD_F(0x0b504f33) /* 0.707106781 */,
486
MAD_F(0x08000000) /* 0.500000000 */,
487
MAD_F(0x05a8279a) /* 0.353553391 */,
488
MAD_F(0x04000000) /* 0.250000000 */,
489
MAD_F(0x02d413cd) /* 0.176776695 */,
490
MAD_F(0x02000000) /* 0.125000000 */,
491
MAD_F(0x016a09e6) /* 0.088388348 */,
492
MAD_F(0x01000000) /* 0.062500000 */,
493
MAD_F(0x00b504f3) /* 0.044194174 */,
494
MAD_F(0x00800000) /* 0.031250000 */,
495
MAD_F(0x005a827a) /* 0.022097087 */,
496
MAD_F(0x00400000) /* 0.015625000 */,
497
MAD_F(0x002d413d) /* 0.011048543 */,
498
MAD_F(0x00200000) /* 0.007812500 */,
499
MAD_F(0x0016a09e) /* 0.005524272 */
504
* NAME: III_sideinfo()
505
* DESCRIPTION: decode frame side information from a bitstream
508
enum mad_error III_sideinfo(struct mad_bitptr *ptr, unsigned int nch,
509
int lsf, struct sideinfo *si,
510
unsigned int *data_bitlen,
511
unsigned int *priv_bitlen)
513
unsigned int ngr, gr, ch, i;
514
enum mad_error result = MAD_ERROR_NONE;
517
*priv_bitlen = lsf ? ((nch == 1) ? 1 : 2) : ((nch == 1) ? 5 : 3);
519
si->main_data_begin = mad_bit_read(ptr, lsf ? 8 : 9);
520
si->private_bits = mad_bit_read(ptr, *priv_bitlen);
526
for (ch = 0; ch < nch; ++ch)
527
si->scfsi[ch] = mad_bit_read(ptr, 4);
530
for (gr = 0; gr < ngr; ++gr) {
531
struct granule *granule = &si->gr[gr];
533
for (ch = 0; ch < nch; ++ch) {
534
struct channel *channel = &granule->ch[ch];
536
channel->part2_3_length = mad_bit_read(ptr, 12);
537
channel->big_values = mad_bit_read(ptr, 9);
538
channel->global_gain = mad_bit_read(ptr, 8);
539
channel->scalefac_compress = mad_bit_read(ptr, lsf ? 9 : 4);
541
*data_bitlen += channel->part2_3_length;
543
if (channel->big_values > 288 && result == 0)
544
result = MAD_ERROR_BADBIGVALUES;
548
/* window_switching_flag */
549
if (mad_bit_read(ptr, 1)) {
550
channel->block_type = mad_bit_read(ptr, 2);
552
if (channel->block_type == 0 && result == 0)
553
result = MAD_ERROR_BADBLOCKTYPE;
555
if (!lsf && channel->block_type == 2 && si->scfsi[ch] && result == 0)
556
result = MAD_ERROR_BADSCFSI;
558
channel->region0_count = 7;
559
channel->region1_count = 36;
561
if (mad_bit_read(ptr, 1))
562
channel->flags |= mixed_block_flag;
563
else if (channel->block_type == 2)
564
channel->region0_count = 8;
566
for (i = 0; i < 2; ++i)
567
channel->table_select[i] = mad_bit_read(ptr, 5);
570
channel->table_select[2] = 4; /* not used */
573
for (i = 0; i < 3; ++i)
574
channel->subblock_gain[i] = mad_bit_read(ptr, 3);
577
channel->block_type = 0;
579
for (i = 0; i < 3; ++i)
580
channel->table_select[i] = mad_bit_read(ptr, 5);
582
channel->region0_count = mad_bit_read(ptr, 4);
583
channel->region1_count = mad_bit_read(ptr, 3);
586
/* [preflag,] scalefac_scale, count1table_select */
587
channel->flags |= mad_bit_read(ptr, lsf ? 2 : 3);
595
* NAME: III_scalefactors_lsf()
596
* DESCRIPTION: decode channel scalefactors for LSF from a bitstream
599
unsigned int III_scalefactors_lsf(struct mad_bitptr *ptr,
600
struct channel *channel,
601
struct channel *gr1ch, int mode_extension)
603
struct mad_bitptr start;
604
unsigned int scalefac_compress, index, slen[4], part, n, i;
605
unsigned char const *nsfb;
609
scalefac_compress = channel->scalefac_compress;
610
index = (channel->block_type == 2) ?
611
((channel->flags & mixed_block_flag) ? 2 : 1) : 0;
613
if (!((mode_extension & I_STEREO) && gr1ch)) {
614
if (scalefac_compress < 400) {
615
slen[0] = (scalefac_compress >> 4) / 5;
616
slen[1] = (scalefac_compress >> 4) % 5;
617
slen[2] = (scalefac_compress % 16) >> 2;
618
slen[3] = scalefac_compress % 4;
620
nsfb = nsfb_table[0][index];
622
else if (scalefac_compress < 500) {
623
scalefac_compress -= 400;
625
slen[0] = (scalefac_compress >> 2) / 5;
626
slen[1] = (scalefac_compress >> 2) % 5;
627
slen[2] = scalefac_compress % 4;
630
nsfb = nsfb_table[1][index];
633
scalefac_compress -= 500;
635
slen[0] = scalefac_compress / 3;
636
slen[1] = scalefac_compress % 3;
640
channel->flags |= preflag;
642
nsfb = nsfb_table[2][index];
646
for (part = 0; part < 4; ++part) {
647
for (i = 0; i < nsfb[part]; ++i)
648
channel->scalefac[n++] = mad_bit_read(ptr, slen[part]);
652
channel->scalefac[n++] = 0;
654
else { /* (mode_extension & I_STEREO) && gr1ch (i.e. ch == 1) */
655
scalefac_compress >>= 1;
657
if (scalefac_compress < 180) {
658
slen[0] = scalefac_compress / 36;
659
slen[1] = (scalefac_compress % 36) / 6;
660
slen[2] = (scalefac_compress % 36) % 6;
663
nsfb = nsfb_table[3][index];
665
else if (scalefac_compress < 244) {
666
scalefac_compress -= 180;
668
slen[0] = (scalefac_compress % 64) >> 4;
669
slen[1] = (scalefac_compress % 16) >> 2;
670
slen[2] = scalefac_compress % 4;
673
nsfb = nsfb_table[4][index];
676
scalefac_compress -= 244;
678
slen[0] = scalefac_compress / 3;
679
slen[1] = scalefac_compress % 3;
683
nsfb = nsfb_table[5][index];
687
for (part = 0; part < 4; ++part) {
688
unsigned int max, is_pos;
690
max = (1 << slen[part]) - 1;
692
for (i = 0; i < nsfb[part]; ++i) {
693
is_pos = mad_bit_read(ptr, slen[part]);
695
channel->scalefac[n] = is_pos;
696
gr1ch->scalefac[n++] = (is_pos == max);
701
channel->scalefac[n] = 0;
702
gr1ch->scalefac[n++] = 0; /* apparently not illegal */
706
return mad_bit_length(&start, ptr);
710
* NAME: III_scalefactors()
711
* DESCRIPTION: decode channel scalefactors of one granule from a bitstream
714
unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel,
715
struct channel const *gr0ch, unsigned int scfsi)
717
struct mad_bitptr start;
718
unsigned int slen1, slen2, sfbi;
722
slen1 = sflen_table[channel->scalefac_compress].slen1;
723
slen2 = sflen_table[channel->scalefac_compress].slen2;
725
if (channel->block_type == 2) {
730
nsfb = (channel->flags & mixed_block_flag) ? 8 + 3 * 3 : 6 * 3;
732
channel->scalefac[sfbi++] = mad_bit_read(ptr, slen1);
736
channel->scalefac[sfbi++] = mad_bit_read(ptr, slen2);
740
channel->scalefac[sfbi++] = 0;
742
else { /* channel->block_type != 2 */
744
for (sfbi = 0; sfbi < 6; ++sfbi)
745
channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
748
for (sfbi = 0; sfbi < 6; ++sfbi)
749
channel->scalefac[sfbi] = mad_bit_read(ptr, slen1);
753
for (sfbi = 6; sfbi < 11; ++sfbi)
754
channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
757
for (sfbi = 6; sfbi < 11; ++sfbi)
758
channel->scalefac[sfbi] = mad_bit_read(ptr, slen1);
762
for (sfbi = 11; sfbi < 16; ++sfbi)
763
channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
766
for (sfbi = 11; sfbi < 16; ++sfbi)
767
channel->scalefac[sfbi] = mad_bit_read(ptr, slen2);
771
for (sfbi = 16; sfbi < 21; ++sfbi)
772
channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
775
for (sfbi = 16; sfbi < 21; ++sfbi)
776
channel->scalefac[sfbi] = mad_bit_read(ptr, slen2);
779
channel->scalefac[21] = 0;
782
return mad_bit_length(&start, ptr);
786
* The Layer III formula for requantization and scaling is defined by
787
* section 2.4.3.4.7.1 of ISO/IEC 11172-3, as follows:
790
* xr[i] = sign(is[i]) * abs(is[i])^(4/3) *
791
* 2^((1/4) * (global_gain - 210)) *
792
* 2^-(scalefac_multiplier *
793
* (scalefac_l[sfb] + preflag * pretab[sfb]))
796
* xr[i] = sign(is[i]) * abs(is[i])^(4/3) *
797
* 2^((1/4) * (global_gain - 210 - 8 * subblock_gain[w])) *
798
* 2^-(scalefac_multiplier * scalefac_s[sfb][w])
801
* scalefac_multiplier = (scalefac_scale + 1) / 2
803
* The routines III_exponents() and III_requantize() facilitate this
808
* NAME: III_exponents()
809
* DESCRIPTION: calculate scalefactor exponents
812
void III_exponents(struct channel const *channel,
813
unsigned char const *sfbwidth, signed int exponents[39])
816
unsigned int scalefac_multiplier, sfbi;
818
gain = (signed int) channel->global_gain - 210;
819
scalefac_multiplier = (channel->flags & scalefac_scale) ? 2 : 1;
821
if (channel->block_type == 2) {
823
signed int gain0, gain1, gain2;
827
if (channel->flags & mixed_block_flag) {
828
unsigned int premask;
830
premask = (channel->flags & preflag) ? ~0 : 0;
832
/* long block subbands 0-1 */
835
exponents[sfbi] = gain -
836
(signed int) ((channel->scalefac[sfbi] + (pretab[sfbi] & premask)) <<
837
scalefac_multiplier);
839
l += sfbwidth[sfbi++];
843
/* this is probably wrong for 8000 Hz short/mixed blocks */
845
gain0 = gain - 8 * (signed int) channel->subblock_gain[0];
846
gain1 = gain - 8 * (signed int) channel->subblock_gain[1];
847
gain2 = gain - 8 * (signed int) channel->subblock_gain[2];
850
exponents[sfbi + 0] = gain0 -
851
(signed int) (channel->scalefac[sfbi + 0] << scalefac_multiplier);
852
exponents[sfbi + 1] = gain1 -
853
(signed int) (channel->scalefac[sfbi + 1] << scalefac_multiplier);
854
exponents[sfbi + 2] = gain2 -
855
(signed int) (channel->scalefac[sfbi + 2] << scalefac_multiplier);
857
l += 3 * sfbwidth[sfbi];
861
else { /* channel->block_type != 2 */
862
if (channel->flags & preflag) {
863
for (sfbi = 0; sfbi < 22; ++sfbi) {
864
exponents[sfbi] = gain -
865
(signed int) ((channel->scalefac[sfbi] + pretab[sfbi]) <<
866
scalefac_multiplier);
870
for (sfbi = 0; sfbi < 22; ++sfbi) {
871
exponents[sfbi] = gain -
872
(signed int) (channel->scalefac[sfbi] << scalefac_multiplier);
879
* NAME: III_requantize()
880
* DESCRIPTION: requantize one (positive) value
883
mad_fixed_t III_requantize(unsigned int value, signed int exp)
885
mad_fixed_t requantized;
887
struct fixedfloat const *power;
889
frac = exp % 4; /* assumes sign(frac) == sign(exp) */
892
power = &rq_table[value];
893
requantized = power->mantissa;
894
exp += power->exponent;
897
if (-exp >= sizeof(mad_fixed_t) * CHAR_BIT) {
902
requantized += 1L << (-exp - 1);
903
requantized >>= -exp;
910
fprintf(stderr, "requantize overflow (%f * 2^%d)\n",
911
mad_f_todouble(requantized), exp);
913
requantized = MAD_F_MAX;
919
return frac ? mad_f_mul(requantized, root_table[3 + frac]) : requantized;
922
/* we must take care that sz >= bits and sz < sizeof(long) lest bits == 0 */
923
# define MASK(cache, sz, bits) \
924
(((cache) >> ((sz) - (bits))) & ((1 << (bits)) - 1))
925
# define MASK1BIT(cache, sz) \
926
((cache) & (1 << ((sz) - 1)))
929
* NAME: III_huffdecode()
930
* DESCRIPTION: decode Huffman code words of one channel of one granule
933
enum mad_error III_huffdecode(struct mad_bitptr *ptr, mad_fixed_t xr[576],
934
struct channel *channel,
935
unsigned char const *sfbwidth,
936
unsigned int part2_length)
938
signed int exponents[39], exp;
939
signed int const *expptr;
940
struct mad_bitptr peek;
941
signed int bits_left, cachesz;
942
register mad_fixed_t *xrptr;
943
mad_fixed_t const *sfbound;
944
register unsigned long bitcache;
946
bits_left = (signed) channel->part2_3_length - (signed) part2_length;
948
return MAD_ERROR_BADPART3LEN;
950
III_exponents(channel, sfbwidth, exponents);
953
mad_bit_skip(ptr, bits_left);
955
/* align bit reads to byte boundaries */
956
cachesz = mad_bit_bitsleft(&peek);
957
cachesz += ((32 - 1 - 24) + (24 - cachesz)) & ~7;
959
bitcache = mad_bit_read(&peek, cachesz);
960
bits_left -= cachesz;
966
unsigned int region, rcount;
967
struct hufftable const *entry;
968
union huffpair const *table;
969
unsigned int linbits, startbits, big_values, reqhits;
970
mad_fixed_t reqcache[16];
972
sfbound = xrptr + *sfbwidth++;
973
rcount = channel->region0_count + 1;
975
entry = &mad_huff_pair_table[channel->table_select[region = 0]];
976
table = entry->table;
977
linbits = entry->linbits;
978
startbits = entry->startbits;
981
return MAD_ERROR_BADHUFFTABLE;
983
expptr = &exponents[0];
987
big_values = channel->big_values;
989
while (big_values-- && cachesz + bits_left > 0) {
990
union huffpair const *pair;
991
unsigned int clumpsz, value;
992
register mad_fixed_t requantized;
994
if (xrptr == sfbound) {
995
sfbound += *sfbwidth++;
997
/* change table if region boundary */
1001
rcount = channel->region1_count + 1;
1003
rcount = 0; /* all remaining */
1005
entry = &mad_huff_pair_table[channel->table_select[++region]];
1006
table = entry->table;
1007
linbits = entry->linbits;
1008
startbits = entry->startbits;
1011
return MAD_ERROR_BADHUFFTABLE;
1014
if (exp != *expptr) {
1025
bits = ((32 - 1 - 21) + (21 - cachesz)) & ~7;
1026
bitcache = (bitcache << bits) | mad_bit_read(&peek, bits);
1033
clumpsz = startbits;
1034
pair = &table[MASK(bitcache, cachesz, clumpsz)];
1036
while (!pair->final) {
1039
clumpsz = pair->ptr.bits;
1040
pair = &table[pair->ptr.offset + MASK(bitcache, cachesz, clumpsz)];
1043
cachesz -= pair->value.hlen;
1048
value = pair->value.x;
1056
if (cachesz < linbits + 2) {
1057
bitcache = (bitcache << 16) | mad_bit_read(&peek, 16);
1062
value += MASK(bitcache, cachesz, linbits);
1065
requantized = III_requantize(value, exp);
1069
if (reqhits & (1 << value))
1070
requantized = reqcache[value];
1072
reqhits |= (1 << value);
1073
requantized = reqcache[value] = III_requantize(value, exp);
1077
xrptr[0] = MASK1BIT(bitcache, cachesz--) ?
1078
-requantized : requantized;
1083
value = pair->value.y;
1091
if (cachesz < linbits + 1) {
1092
bitcache = (bitcache << 16) | mad_bit_read(&peek, 16);
1097
value += MASK(bitcache, cachesz, linbits);
1100
requantized = III_requantize(value, exp);
1104
if (reqhits & (1 << value))
1105
requantized = reqcache[value];
1107
reqhits |= (1 << value);
1108
requantized = reqcache[value] = III_requantize(value, exp);
1112
xrptr[1] = MASK1BIT(bitcache, cachesz--) ?
1113
-requantized : requantized;
1119
value = pair->value.x;
1124
if (reqhits & (1 << value))
1125
requantized = reqcache[value];
1127
reqhits |= (1 << value);
1128
requantized = reqcache[value] = III_requantize(value, exp);
1131
xrptr[0] = MASK1BIT(bitcache, cachesz--) ?
1132
-requantized : requantized;
1137
value = pair->value.y;
1142
if (reqhits & (1 << value))
1143
requantized = reqcache[value];
1145
reqhits |= (1 << value);
1146
requantized = reqcache[value] = III_requantize(value, exp);
1149
xrptr[1] = MASK1BIT(bitcache, cachesz--) ?
1150
-requantized : requantized;
1158
if (cachesz + bits_left < 0)
1159
return MAD_ERROR_BADHUFFDATA; /* big_values overrun */
1163
union huffquad const *table;
1164
register mad_fixed_t requantized;
1166
table = mad_huff_quad_table[channel->flags & count1table_select];
1168
requantized = III_requantize(1, exp);
1170
while (cachesz + bits_left > 0 && xrptr <= &xr[572]) {
1171
union huffquad const *quad;
1176
bitcache = (bitcache << 16) | mad_bit_read(&peek, 16);
1181
quad = &table[MASK(bitcache, cachesz, 4)];
1183
/* quad tables guaranteed to have at most one extra lookup */
1187
quad = &table[quad->ptr.offset +
1188
MASK(bitcache, cachesz, quad->ptr.bits)];
1191
cachesz -= quad->value.hlen;
1193
if (xrptr == sfbound) {
1194
sfbound += *sfbwidth++;
1196
if (exp != *expptr) {
1198
requantized = III_requantize(1, exp);
1206
xrptr[0] = quad->value.v ?
1207
(MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
1211
xrptr[1] = quad->value.w ?
1212
(MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
1216
if (xrptr == sfbound) {
1217
sfbound += *sfbwidth++;
1219
if (exp != *expptr) {
1221
requantized = III_requantize(1, exp);
1229
xrptr[0] = quad->value.x ?
1230
(MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
1234
xrptr[1] = quad->value.y ?
1235
(MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
1240
if (cachesz + bits_left < 0) {
1241
# if 0 && defined(DEBUG)
1242
fprintf(stderr, "huffman count1 overrun (%d bits)\n",
1243
-(cachesz + bits_left));
1246
/* technically the bitstream is misformatted, but apparently
1247
some encoders are just a bit sloppy with stuffing bits */
1253
assert(-bits_left <= MAD_BUFFER_GUARD * CHAR_BIT);
1255
# if 0 && defined(DEBUG)
1257
fprintf(stderr, "read %d bits too many\n", -bits_left);
1258
else if (cachesz + bits_left > 0)
1259
fprintf(stderr, "%d stuffing bits\n", cachesz + bits_left);
1263
while (xrptr < &xr[576]) {
1270
return MAD_ERROR_NONE;
1277
* NAME: III_reorder()
1278
* DESCRIPTION: reorder frequency lines of a short block into subband order
1281
void III_reorder(mad_fixed_t xr[576], struct channel const *channel,
1282
unsigned char const sfbwidth[39])
1284
mad_fixed_t tmp[32][3][6];
1285
unsigned int sb, l, f, w, sbw[3], sw[3];
1287
/* this is probably wrong for 8000 Hz mixed blocks */
1290
if (channel->flags & mixed_block_flag) {
1298
for (w = 0; w < 3; ++w) {
1306
for (l = 18 * sb; l < 576; ++l) {
1308
f = *sfbwidth++ - 1;
1312
tmp[sbw[w]][w][sw[w]++] = xr[l];
1320
memcpy(&xr[18 * sb], &tmp[sb], (576 - 18 * sb) * sizeof(mad_fixed_t));
1324
* NAME: III_stereo()
1325
* DESCRIPTION: perform joint stereo processing on a granule
1328
enum mad_error III_stereo(mad_fixed_t xr[2][576],
1329
struct granule const *granule,
1330
struct mad_header *header,
1331
unsigned char const *sfbwidth)
1334
unsigned int sfbi, l, n, i;
1336
if (granule->ch[0].block_type !=
1337
granule->ch[1].block_type ||
1338
(granule->ch[0].flags & mixed_block_flag) !=
1339
(granule->ch[1].flags & mixed_block_flag))
1340
return MAD_ERROR_BADSTEREO;
1342
for (i = 0; i < 39; ++i)
1343
modes[i] = header->mode_extension;
1345
/* intensity stereo */
1347
if (header->mode_extension & I_STEREO) {
1348
struct channel const *right_ch = &granule->ch[1];
1349
mad_fixed_t const *right_xr = xr[1];
1350
unsigned int is_pos;
1352
header->flags |= MAD_FLAG_I_STEREO;
1354
/* first determine which scalefactor bands are to be processed */
1356
if (right_ch->block_type == 2) {
1357
unsigned int lower, start, max, bound[3], w;
1359
lower = start = max = bound[0] = bound[1] = bound[2] = 0;
1363
if (right_ch->flags & mixed_block_flag) {
1365
n = sfbwidth[sfbi++];
1367
for (i = 0; i < n; ++i) {
1383
n = sfbwidth[sfbi++];
1385
for (i = 0; i < n; ++i) {
1387
max = bound[w] = sfbi;
1402
for (i = 0; i < lower; ++i)
1403
modes[i] = header->mode_extension & ~I_STEREO;
1408
for (i = start; i < max; ++i) {
1410
modes[i] = header->mode_extension & ~I_STEREO;
1415
else { /* right_ch->block_type != 2 */
1419
for (sfbi = l = 0; l < 576; l += n) {
1420
n = sfbwidth[sfbi++];
1422
for (i = 0; i < n; ++i) {
1432
for (i = 0; i < bound; ++i)
1433
modes[i] = header->mode_extension & ~I_STEREO;
1436
/* now do the actual processing */
1438
if (header->flags & MAD_FLAG_LSF_EXT) {
1439
unsigned char const *illegal_pos = granule[1].ch[1].scalefac;
1440
mad_fixed_t const *lsf_scale;
1442
/* intensity_scale */
1443
lsf_scale = is_lsf_table[right_ch->scalefac_compress & 0x1];
1445
for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
1448
if (!(modes[sfbi] & I_STEREO))
1451
if (illegal_pos[sfbi]) {
1452
modes[sfbi] &= ~I_STEREO;
1456
is_pos = right_ch->scalefac[sfbi];
1458
for (i = 0; i < n; ++i) {
1459
register mad_fixed_t left;
1461
left = xr[0][l + i];
1464
xr[1][l + i] = left;
1466
register mad_fixed_t opposite;
1468
opposite = mad_f_mul(left, lsf_scale[(is_pos - 1) / 2]);
1471
xr[0][l + i] = opposite;
1472
xr[1][l + i] = left;
1475
xr[1][l + i] = opposite;
1480
else { /* !(header->flags & MAD_FLAG_LSF_EXT) */
1481
for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
1484
if (!(modes[sfbi] & I_STEREO))
1487
is_pos = right_ch->scalefac[sfbi];
1489
if (is_pos >= 7) { /* illegal intensity position */
1490
modes[sfbi] &= ~I_STEREO;
1494
for (i = 0; i < n; ++i) {
1495
register mad_fixed_t left;
1497
left = xr[0][l + i];
1499
xr[0][l + i] = mad_f_mul(left, is_table[ is_pos]);
1500
xr[1][l + i] = mad_f_mul(left, is_table[6 - is_pos]);
1506
/* middle/side stereo */
1508
if (header->mode_extension & MS_STEREO) {
1509
register mad_fixed_t invsqrt2;
1511
header->flags |= MAD_FLAG_MS_STEREO;
1513
invsqrt2 = root_table[3 + -2];
1515
for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
1518
if (modes[sfbi] != MS_STEREO)
1521
for (i = 0; i < n; ++i) {
1522
register mad_fixed_t m, s;
1527
xr[0][l + i] = mad_f_mul(m + s, invsqrt2); /* l = (m + s) / sqrt(2) */
1528
xr[1][l + i] = mad_f_mul(m - s, invsqrt2); /* r = (m - s) / sqrt(2) */
1533
return MAD_ERROR_NONE;
1537
* NAME: III_aliasreduce()
1538
* DESCRIPTION: perform frequency line alias reduction
1541
void III_aliasreduce(mad_fixed_t xr[576], int lines)
1543
mad_fixed_t const *bound;
1547
for (xr += 18; xr < bound; xr += 18) {
1548
for (i = 0; i < 8; ++i) {
1549
register mad_fixed_t a, b;
1550
register mad_fixed64hi_t hi;
1551
register mad_fixed64lo_t lo;
1556
# if defined(ASO_ZEROCHECK)
1559
MAD_F_ML0(hi, lo, a, cs[i]);
1560
MAD_F_MLA(hi, lo, -b, ca[i]);
1562
xr[-1 - i] = MAD_F_MLZ(hi, lo);
1564
MAD_F_ML0(hi, lo, b, cs[i]);
1565
MAD_F_MLA(hi, lo, a, ca[i]);
1567
xr[ i] = MAD_F_MLZ(hi, lo);
1568
# if defined(ASO_ZEROCHECK)
1575
# if defined(ASO_IMDCT)
1576
void III_imdct_l(mad_fixed_t const [18], mad_fixed_t [36], unsigned int);
1580
void fastsdct(mad_fixed_t const x[9], mad_fixed_t y[18])
1582
mad_fixed_t a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12;
1583
mad_fixed_t a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25;
1584
mad_fixed_t m0, m1, m2, m3, m4, m5, m6, m7;
1587
c0 = MAD_F(0x1f838b8d), /* 2 * cos( 1 * PI / 18) */
1588
c1 = MAD_F(0x1bb67ae8), /* 2 * cos( 3 * PI / 18) */
1589
c2 = MAD_F(0x18836fa3), /* 2 * cos( 4 * PI / 18) */
1590
c3 = MAD_F(0x1491b752), /* 2 * cos( 5 * PI / 18) */
1591
c4 = MAD_F(0x0af1d43a), /* 2 * cos( 7 * PI / 18) */
1592
c5 = MAD_F(0x058e86a0), /* 2 * cos( 8 * PI / 18) */
1593
c6 = -MAD_F(0x1e11f642) /* 2 * cos(16 * PI / 18) */
1616
m0 = mad_f_mul(a17, -c3);
1617
m1 = mad_f_mul(a16, -c0);
1618
m2 = mad_f_mul(a15, -c4);
1619
m3 = mad_f_mul(a14, -c1);
1620
m4 = mad_f_mul(a5, -c1);
1621
m5 = mad_f_mul(a11, -c6);
1622
m6 = mad_f_mul(a10, -c5);
1623
m7 = mad_f_mul(a9, -c2);
1626
a19 = 2 * x[4] - a4;
1634
/* output to every other slot for convenience */
1642
y[12] = a12 - 2 * a18;
1648
void sdctII(mad_fixed_t const x[18], mad_fixed_t X[18])
1653
/* scale[i] = 2 * cos(PI * (2 * i + 1) / (2 * 18)) */
1654
static mad_fixed_t const scale[9] = {
1655
MAD_F(0x1fe0d3b4), MAD_F(0x1ee8dd47), MAD_F(0x1d007930),
1656
MAD_F(0x1a367e59), MAD_F(0x16a09e66), MAD_F(0x125abcf8),
1657
MAD_F(0x0d8616bc), MAD_F(0x08483ee1), MAD_F(0x02c9fad7)
1660
/* divide the 18-point SDCT-II into two 9-point SDCT-IIs */
1662
/* even input butterfly */
1664
for (i = 0; i < 9; i += 3) {
1665
tmp[i + 0] = x[i + 0] + x[18 - (i + 0) - 1];
1666
tmp[i + 1] = x[i + 1] + x[18 - (i + 1) - 1];
1667
tmp[i + 2] = x[i + 2] + x[18 - (i + 2) - 1];
1670
fastsdct(tmp, &X[0]);
1672
/* odd input butterfly and scaling */
1674
for (i = 0; i < 9; i += 3) {
1675
tmp[i + 0] = mad_f_mul(x[i + 0] - x[18 - (i + 0) - 1], scale[i + 0]);
1676
tmp[i + 1] = mad_f_mul(x[i + 1] - x[18 - (i + 1) - 1], scale[i + 1]);
1677
tmp[i + 2] = mad_f_mul(x[i + 2] - x[18 - (i + 2) - 1], scale[i + 2]);
1680
fastsdct(tmp, &X[1]);
1682
/* output accumulation */
1684
for (i = 3; i < 18; i += 8) {
1685
X[i + 0] -= X[(i + 0) - 2];
1686
X[i + 2] -= X[(i + 2) - 2];
1687
X[i + 4] -= X[(i + 4) - 2];
1688
X[i + 6] -= X[(i + 6) - 2];
1693
void dctIV(mad_fixed_t const y[18], mad_fixed_t X[18])
1695
mad_fixed_t tmp[18];
1698
/* scale[i] = 2 * cos(PI * (2 * i + 1) / (4 * 18)) */
1699
static mad_fixed_t const scale[18] = {
1700
MAD_F(0x1ff833fa), MAD_F(0x1fb9ea93), MAD_F(0x1f3dd120),
1701
MAD_F(0x1e84d969), MAD_F(0x1d906bcf), MAD_F(0x1c62648b),
1702
MAD_F(0x1afd100f), MAD_F(0x1963268b), MAD_F(0x1797c6a4),
1703
MAD_F(0x159e6f5b), MAD_F(0x137af940), MAD_F(0x11318ef3),
1704
MAD_F(0x0ec6a507), MAD_F(0x0c3ef153), MAD_F(0x099f61c5),
1705
MAD_F(0x06ed12c5), MAD_F(0x042d4544), MAD_F(0x0165547c)
1710
for (i = 0; i < 18; i += 3) {
1711
tmp[i + 0] = mad_f_mul(y[i + 0], scale[i + 0]);
1712
tmp[i + 1] = mad_f_mul(y[i + 1], scale[i + 1]);
1713
tmp[i + 2] = mad_f_mul(y[i + 2], scale[i + 2]);
1720
/* scale reduction and output accumulation */
1723
for (i = 1; i < 17; i += 4) {
1724
X[i + 0] = X[i + 0] / 2 - X[(i + 0) - 1];
1725
X[i + 1] = X[i + 1] / 2 - X[(i + 1) - 1];
1726
X[i + 2] = X[i + 2] / 2 - X[(i + 2) - 1];
1727
X[i + 3] = X[i + 3] / 2 - X[(i + 3) - 1];
1729
X[17] = X[17] / 2 - X[16];
1734
* DESCRIPTION: perform X[18]->x[36] IMDCT using Szu-Wei Lee's fast algorithm
1737
void imdct36(mad_fixed_t const x[18], mad_fixed_t y[36])
1739
mad_fixed_t tmp[18];
1746
/* convert 18-point DCT-IV to 36-point IMDCT */
1748
for (i = 0; i < 9; i += 3) {
1749
y[i + 0] = tmp[9 + (i + 0)];
1750
y[i + 1] = tmp[9 + (i + 1)];
1751
y[i + 2] = tmp[9 + (i + 2)];
1753
for (i = 9; i < 27; i += 3) {
1754
y[i + 0] = -tmp[36 - (9 + (i + 0)) - 1];
1755
y[i + 1] = -tmp[36 - (9 + (i + 1)) - 1];
1756
y[i + 2] = -tmp[36 - (9 + (i + 2)) - 1];
1758
for (i = 27; i < 36; i += 3) {
1759
y[i + 0] = -tmp[(i + 0) - 27];
1760
y[i + 1] = -tmp[(i + 1) - 27];
1761
y[i + 2] = -tmp[(i + 2) - 27];
1767
* DESCRIPTION: perform X[18]->x[36] IMDCT
1770
void imdct36(mad_fixed_t const X[18], mad_fixed_t x[36])
1772
mad_fixed_t t0, t1, t2, t3, t4, t5, t6, t7;
1773
mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15;
1774
register mad_fixed64hi_t hi;
1775
register mad_fixed64lo_t lo;
1777
MAD_F_ML0(hi, lo, X[4], MAD_F(0x0ec835e8));
1778
MAD_F_MLA(hi, lo, X[13], MAD_F(0x061f78aa));
1780
t6 = MAD_F_MLZ(hi, lo);
1782
MAD_F_MLA(hi, lo, (t14 = X[1] - X[10]), -MAD_F(0x061f78aa));
1783
MAD_F_MLA(hi, lo, (t15 = X[7] + X[16]), -MAD_F(0x0ec835e8));
1785
t0 = MAD_F_MLZ(hi, lo);
1787
MAD_F_MLA(hi, lo, (t8 = X[0] - X[11] - X[12]), MAD_F(0x0216a2a2));
1788
MAD_F_MLA(hi, lo, (t9 = X[2] - X[9] - X[14]), MAD_F(0x09bd7ca0));
1789
MAD_F_MLA(hi, lo, (t10 = X[3] - X[8] - X[15]), -MAD_F(0x0cb19346));
1790
MAD_F_MLA(hi, lo, (t11 = X[5] - X[6] - X[17]), -MAD_F(0x0fdcf549));
1792
x[7] = MAD_F_MLZ(hi, lo);
1795
MAD_F_ML0(hi, lo, t8, -MAD_F(0x0cb19346));
1796
MAD_F_MLA(hi, lo, t9, MAD_F(0x0fdcf549));
1797
MAD_F_MLA(hi, lo, t10, MAD_F(0x0216a2a2));
1798
MAD_F_MLA(hi, lo, t11, -MAD_F(0x09bd7ca0));
1800
x[19] = x[34] = MAD_F_MLZ(hi, lo) - t0;
1802
t12 = X[0] - X[3] + X[8] - X[11] - X[12] + X[15];
1803
t13 = X[2] + X[5] - X[6] - X[9] - X[14] - X[17];
1805
MAD_F_ML0(hi, lo, t12, -MAD_F(0x0ec835e8));
1806
MAD_F_MLA(hi, lo, t13, MAD_F(0x061f78aa));
1808
x[22] = x[31] = MAD_F_MLZ(hi, lo) + t0;
1810
MAD_F_ML0(hi, lo, X[1], -MAD_F(0x09bd7ca0));
1811
MAD_F_MLA(hi, lo, X[7], MAD_F(0x0216a2a2));
1812
MAD_F_MLA(hi, lo, X[10], -MAD_F(0x0fdcf549));
1813
MAD_F_MLA(hi, lo, X[16], MAD_F(0x0cb19346));
1815
t1 = MAD_F_MLZ(hi, lo) + t6;
1817
MAD_F_ML0(hi, lo, X[0], MAD_F(0x03768962));
1818
MAD_F_MLA(hi, lo, X[2], MAD_F(0x0e313245));
1819
MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0ffc19fd));
1820
MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0acf37ad));
1821
MAD_F_MLA(hi, lo, X[6], MAD_F(0x04cfb0e2));
1822
MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0898c779));
1823
MAD_F_MLA(hi, lo, X[9], MAD_F(0x0d7e8807));
1824
MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f426cb5));
1825
MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0bcbe352));
1826
MAD_F_MLA(hi, lo, X[14], MAD_F(0x00b2aa3e));
1827
MAD_F_MLA(hi, lo, X[15], -MAD_F(0x07635284));
1828
MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0f9ee890));
1830
x[6] = MAD_F_MLZ(hi, lo) + t1;
1833
MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f426cb5));
1834
MAD_F_MLA(hi, lo, X[2], -MAD_F(0x00b2aa3e));
1835
MAD_F_MLA(hi, lo, X[3], MAD_F(0x0898c779));
1836
MAD_F_MLA(hi, lo, X[5], MAD_F(0x0f9ee890));
1837
MAD_F_MLA(hi, lo, X[6], MAD_F(0x0acf37ad));
1838
MAD_F_MLA(hi, lo, X[8], -MAD_F(0x07635284));
1839
MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0e313245));
1840
MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0bcbe352));
1841
MAD_F_MLA(hi, lo, X[12], -MAD_F(0x03768962));
1842
MAD_F_MLA(hi, lo, X[14], MAD_F(0x0d7e8807));
1843
MAD_F_MLA(hi, lo, X[15], MAD_F(0x0ffc19fd));
1844
MAD_F_MLA(hi, lo, X[17], MAD_F(0x04cfb0e2));
1846
x[23] = x[30] = MAD_F_MLZ(hi, lo) + t1;
1848
MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0bcbe352));
1849
MAD_F_MLA(hi, lo, X[2], MAD_F(0x0d7e8807));
1850
MAD_F_MLA(hi, lo, X[3], -MAD_F(0x07635284));
1851
MAD_F_MLA(hi, lo, X[5], MAD_F(0x04cfb0e2));
1852
MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f9ee890));
1853
MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0ffc19fd));
1854
MAD_F_MLA(hi, lo, X[9], -MAD_F(0x00b2aa3e));
1855
MAD_F_MLA(hi, lo, X[11], MAD_F(0x03768962));
1856
MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0f426cb5));
1857
MAD_F_MLA(hi, lo, X[14], MAD_F(0x0e313245));
1858
MAD_F_MLA(hi, lo, X[15], MAD_F(0x0898c779));
1859
MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0acf37ad));
1861
x[18] = x[35] = MAD_F_MLZ(hi, lo) - t1;
1863
MAD_F_ML0(hi, lo, X[4], MAD_F(0x061f78aa));
1864
MAD_F_MLA(hi, lo, X[13], -MAD_F(0x0ec835e8));
1866
t7 = MAD_F_MLZ(hi, lo);
1868
MAD_F_MLA(hi, lo, X[1], -MAD_F(0x0cb19346));
1869
MAD_F_MLA(hi, lo, X[7], MAD_F(0x0fdcf549));
1870
MAD_F_MLA(hi, lo, X[10], MAD_F(0x0216a2a2));
1871
MAD_F_MLA(hi, lo, X[16], -MAD_F(0x09bd7ca0));
1873
t2 = MAD_F_MLZ(hi, lo);
1875
MAD_F_MLA(hi, lo, X[0], MAD_F(0x04cfb0e2));
1876
MAD_F_MLA(hi, lo, X[2], MAD_F(0x0ffc19fd));
1877
MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0d7e8807));
1878
MAD_F_MLA(hi, lo, X[5], MAD_F(0x03768962));
1879
MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0bcbe352));
1880
MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0e313245));
1881
MAD_F_MLA(hi, lo, X[9], MAD_F(0x07635284));
1882
MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0acf37ad));
1883
MAD_F_MLA(hi, lo, X[12], MAD_F(0x0f9ee890));
1884
MAD_F_MLA(hi, lo, X[14], MAD_F(0x0898c779));
1885
MAD_F_MLA(hi, lo, X[15], MAD_F(0x00b2aa3e));
1886
MAD_F_MLA(hi, lo, X[17], MAD_F(0x0f426cb5));
1888
x[5] = MAD_F_MLZ(hi, lo);
1891
MAD_F_ML0(hi, lo, X[0], MAD_F(0x0acf37ad));
1892
MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0898c779));
1893
MAD_F_MLA(hi, lo, X[3], MAD_F(0x0e313245));
1894
MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0f426cb5));
1895
MAD_F_MLA(hi, lo, X[6], -MAD_F(0x03768962));
1896
MAD_F_MLA(hi, lo, X[8], MAD_F(0x00b2aa3e));
1897
MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0ffc19fd));
1898
MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f9ee890));
1899
MAD_F_MLA(hi, lo, X[12], -MAD_F(0x04cfb0e2));
1900
MAD_F_MLA(hi, lo, X[14], MAD_F(0x07635284));
1901
MAD_F_MLA(hi, lo, X[15], MAD_F(0x0d7e8807));
1902
MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0bcbe352));
1904
x[0] = MAD_F_MLZ(hi, lo) + t2;
1907
MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f9ee890));
1908
MAD_F_MLA(hi, lo, X[2], -MAD_F(0x07635284));
1909
MAD_F_MLA(hi, lo, X[3], -MAD_F(0x00b2aa3e));
1910
MAD_F_MLA(hi, lo, X[5], MAD_F(0x0bcbe352));
1911
MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f426cb5));
1912
MAD_F_MLA(hi, lo, X[8], MAD_F(0x0d7e8807));
1913
MAD_F_MLA(hi, lo, X[9], MAD_F(0x0898c779));
1914
MAD_F_MLA(hi, lo, X[11], -MAD_F(0x04cfb0e2));
1915
MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0acf37ad));
1916
MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0ffc19fd));
1917
MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0e313245));
1918
MAD_F_MLA(hi, lo, X[17], -MAD_F(0x03768962));
1920
x[24] = x[29] = MAD_F_MLZ(hi, lo) + t2;
1922
MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0216a2a2));
1923
MAD_F_MLA(hi, lo, X[7], -MAD_F(0x09bd7ca0));
1924
MAD_F_MLA(hi, lo, X[10], MAD_F(0x0cb19346));
1925
MAD_F_MLA(hi, lo, X[16], MAD_F(0x0fdcf549));
1927
t3 = MAD_F_MLZ(hi, lo) + t7;
1929
MAD_F_ML0(hi, lo, X[0], MAD_F(0x00b2aa3e));
1930
MAD_F_MLA(hi, lo, X[2], MAD_F(0x03768962));
1931
MAD_F_MLA(hi, lo, X[3], -MAD_F(0x04cfb0e2));
1932
MAD_F_MLA(hi, lo, X[5], -MAD_F(0x07635284));
1933
MAD_F_MLA(hi, lo, X[6], MAD_F(0x0898c779));
1934
MAD_F_MLA(hi, lo, X[8], MAD_F(0x0acf37ad));
1935
MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0bcbe352));
1936
MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0d7e8807));
1937
MAD_F_MLA(hi, lo, X[12], MAD_F(0x0e313245));
1938
MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f426cb5));
1939
MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0f9ee890));
1940
MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0ffc19fd));
1942
x[8] = MAD_F_MLZ(hi, lo) + t3;
1945
MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0e313245));
1946
MAD_F_MLA(hi, lo, X[2], MAD_F(0x0bcbe352));
1947
MAD_F_MLA(hi, lo, X[3], MAD_F(0x0f9ee890));
1948
MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0898c779));
1949
MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0ffc19fd));
1950
MAD_F_MLA(hi, lo, X[8], MAD_F(0x04cfb0e2));
1951
MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f426cb5));
1952
MAD_F_MLA(hi, lo, X[11], -MAD_F(0x00b2aa3e));
1953
MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0d7e8807));
1954
MAD_F_MLA(hi, lo, X[14], -MAD_F(0x03768962));
1955
MAD_F_MLA(hi, lo, X[15], MAD_F(0x0acf37ad));
1956
MAD_F_MLA(hi, lo, X[17], MAD_F(0x07635284));
1958
x[21] = x[32] = MAD_F_MLZ(hi, lo) + t3;
1960
MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0d7e8807));
1961
MAD_F_MLA(hi, lo, X[2], MAD_F(0x0f426cb5));
1962
MAD_F_MLA(hi, lo, X[3], MAD_F(0x0acf37ad));
1963
MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0ffc19fd));
1964
MAD_F_MLA(hi, lo, X[6], -MAD_F(0x07635284));
1965
MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f9ee890));
1966
MAD_F_MLA(hi, lo, X[9], MAD_F(0x03768962));
1967
MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0e313245));
1968
MAD_F_MLA(hi, lo, X[12], MAD_F(0x00b2aa3e));
1969
MAD_F_MLA(hi, lo, X[14], MAD_F(0x0bcbe352));
1970
MAD_F_MLA(hi, lo, X[15], -MAD_F(0x04cfb0e2));
1971
MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0898c779));
1973
x[20] = x[33] = MAD_F_MLZ(hi, lo) - t3;
1975
MAD_F_ML0(hi, lo, t14, -MAD_F(0x0ec835e8));
1976
MAD_F_MLA(hi, lo, t15, MAD_F(0x061f78aa));
1978
t4 = MAD_F_MLZ(hi, lo) - t7;
1980
MAD_F_ML0(hi, lo, t12, MAD_F(0x061f78aa));
1981
MAD_F_MLA(hi, lo, t13, MAD_F(0x0ec835e8));
1983
x[4] = MAD_F_MLZ(hi, lo) + t4;
1986
MAD_F_ML0(hi, lo, t8, MAD_F(0x09bd7ca0));
1987
MAD_F_MLA(hi, lo, t9, -MAD_F(0x0216a2a2));
1988
MAD_F_MLA(hi, lo, t10, MAD_F(0x0fdcf549));
1989
MAD_F_MLA(hi, lo, t11, -MAD_F(0x0cb19346));
1991
x[1] = MAD_F_MLZ(hi, lo) + t4;
1994
MAD_F_ML0(hi, lo, t8, -MAD_F(0x0fdcf549));
1995
MAD_F_MLA(hi, lo, t9, -MAD_F(0x0cb19346));
1996
MAD_F_MLA(hi, lo, t10, -MAD_F(0x09bd7ca0));
1997
MAD_F_MLA(hi, lo, t11, -MAD_F(0x0216a2a2));
1999
x[25] = x[28] = MAD_F_MLZ(hi, lo) + t4;
2001
MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0fdcf549));
2002
MAD_F_MLA(hi, lo, X[7], -MAD_F(0x0cb19346));
2003
MAD_F_MLA(hi, lo, X[10], -MAD_F(0x09bd7ca0));
2004
MAD_F_MLA(hi, lo, X[16], -MAD_F(0x0216a2a2));
2006
t5 = MAD_F_MLZ(hi, lo) - t6;
2008
MAD_F_ML0(hi, lo, X[0], MAD_F(0x0898c779));
2009
MAD_F_MLA(hi, lo, X[2], MAD_F(0x04cfb0e2));
2010
MAD_F_MLA(hi, lo, X[3], MAD_F(0x0bcbe352));
2011
MAD_F_MLA(hi, lo, X[5], MAD_F(0x00b2aa3e));
2012
MAD_F_MLA(hi, lo, X[6], MAD_F(0x0e313245));
2013
MAD_F_MLA(hi, lo, X[8], -MAD_F(0x03768962));
2014
MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f9ee890));
2015
MAD_F_MLA(hi, lo, X[11], -MAD_F(0x07635284));
2016
MAD_F_MLA(hi, lo, X[12], MAD_F(0x0ffc19fd));
2017
MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0acf37ad));
2018
MAD_F_MLA(hi, lo, X[15], MAD_F(0x0f426cb5));
2019
MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0d7e8807));
2021
x[2] = MAD_F_MLZ(hi, lo) + t5;
2024
MAD_F_ML0(hi, lo, X[0], MAD_F(0x07635284));
2025
MAD_F_MLA(hi, lo, X[2], MAD_F(0x0acf37ad));
2026
MAD_F_MLA(hi, lo, X[3], MAD_F(0x03768962));
2027
MAD_F_MLA(hi, lo, X[5], MAD_F(0x0d7e8807));
2028
MAD_F_MLA(hi, lo, X[6], -MAD_F(0x00b2aa3e));
2029
MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f426cb5));
2030
MAD_F_MLA(hi, lo, X[9], -MAD_F(0x04cfb0e2));
2031
MAD_F_MLA(hi, lo, X[11], MAD_F(0x0ffc19fd));
2032
MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0898c779));
2033
MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f9ee890));
2034
MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0bcbe352));
2035
MAD_F_MLA(hi, lo, X[17], MAD_F(0x0e313245));
2037
x[3] = MAD_F_MLZ(hi, lo) + t5;
2040
MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0ffc19fd));
2041
MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0f9ee890));
2042
MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0f426cb5));
2043
MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0e313245));
2044
MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0d7e8807));
2045
MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0bcbe352));
2046
MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0acf37ad));
2047
MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0898c779));
2048
MAD_F_MLA(hi, lo, X[12], -MAD_F(0x07635284));
2049
MAD_F_MLA(hi, lo, X[14], -MAD_F(0x04cfb0e2));
2050
MAD_F_MLA(hi, lo, X[15], -MAD_F(0x03768962));
2051
MAD_F_MLA(hi, lo, X[17], -MAD_F(0x00b2aa3e));
2053
x[26] = x[27] = MAD_F_MLZ(hi, lo) + t5;
2058
* NAME: III_imdct_l()
2059
* DESCRIPTION: perform IMDCT and windowing for long blocks
2062
void III_imdct_l(mad_fixed_t const X[18], mad_fixed_t z[36],
2063
unsigned int block_type)
2073
switch (block_type) {
2074
case 0: /* normal window */
2075
# if defined(ASO_INTERLEAVE1)
2077
register mad_fixed_t tmp1, tmp2;
2082
for (i = 0; i < 34; i += 2) {
2083
z[i + 0] = mad_f_mul(z[i + 0], tmp1);
2084
tmp1 = window_l[i + 2];
2085
z[i + 1] = mad_f_mul(z[i + 1], tmp2);
2086
tmp2 = window_l[i + 3];
2089
z[34] = mad_f_mul(z[34], tmp1);
2090
z[35] = mad_f_mul(z[35], tmp2);
2092
# elif defined(ASO_INTERLEAVE2)
2094
register mad_fixed_t tmp1, tmp2;
2099
for (i = 0; i < 35; ++i) {
2100
z[i] = mad_f_mul(tmp1, tmp2);
2102
tmp2 = window_l[i + 1];
2105
z[35] = mad_f_mul(tmp1, tmp2);
2108
for (i = 0; i < 36; i += 4) {
2109
z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]);
2110
z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]);
2111
z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]);
2112
z[i + 3] = mad_f_mul(z[i + 3], window_l[i + 3]);
2115
for (i = 0; i < 36; ++i) z[i] = mad_f_mul(z[i], window_l[i]);
2119
case 1: /* start block */
2120
for (i = 0; i < 18; i += 3) {
2121
z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]);
2122
z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]);
2123
z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]);
2125
/* (i = 18; i < 24; ++i) z[i] unchanged */
2126
for (i = 24; i < 30; ++i) z[i] = mad_f_mul(z[i], window_s[i - 18]);
2127
for (i = 30; i < 36; ++i) z[i] = 0;
2130
case 3: /* stop block */
2131
for (i = 0; i < 6; ++i) z[i] = 0;
2132
for (i = 6; i < 12; ++i) z[i] = mad_f_mul(z[i], window_s[i - 6]);
2133
/* (i = 12; i < 18; ++i) z[i] unchanged */
2134
for (i = 18; i < 36; i += 3) {
2135
z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]);
2136
z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]);
2137
z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]);
2142
# endif /* ASO_IMDCT */
2145
* NAME: III_imdct_s()
2146
* DESCRIPTION: perform IMDCT and windowing for short blocks
2149
void III_imdct_s(mad_fixed_t const X[18], mad_fixed_t z[36])
2151
mad_fixed_t y[36], *yptr;
2152
mad_fixed_t const *wptr;
2154
register mad_fixed64hi_t hi;
2155
register mad_fixed64lo_t lo;
2161
for (w = 0; w < 3; ++w) {
2162
register mad_fixed_t const (*s)[6];
2166
for (i = 0; i < 3; ++i) {
2167
MAD_F_ML0(hi, lo, X[0], (*s)[0]);
2168
MAD_F_MLA(hi, lo, X[1], (*s)[1]);
2169
MAD_F_MLA(hi, lo, X[2], (*s)[2]);
2170
MAD_F_MLA(hi, lo, X[3], (*s)[3]);
2171
MAD_F_MLA(hi, lo, X[4], (*s)[4]);
2172
MAD_F_MLA(hi, lo, X[5], (*s)[5]);
2174
yptr[i + 0] = MAD_F_MLZ(hi, lo);
2175
yptr[5 - i] = -yptr[i + 0];
2179
MAD_F_ML0(hi, lo, X[0], (*s)[0]);
2180
MAD_F_MLA(hi, lo, X[1], (*s)[1]);
2181
MAD_F_MLA(hi, lo, X[2], (*s)[2]);
2182
MAD_F_MLA(hi, lo, X[3], (*s)[3]);
2183
MAD_F_MLA(hi, lo, X[4], (*s)[4]);
2184
MAD_F_MLA(hi, lo, X[5], (*s)[5]);
2186
yptr[ i + 6] = MAD_F_MLZ(hi, lo);
2187
yptr[11 - i] = yptr[i + 6];
2196
/* windowing, overlapping and concatenation */
2199
wptr = &window_s[0];
2201
for (i = 0; i < 6; ++i) {
2203
z[i + 6] = mad_f_mul(yptr[ 0 + 0], wptr[0]);
2205
MAD_F_ML0(hi, lo, yptr[ 0 + 6], wptr[6]);
2206
MAD_F_MLA(hi, lo, yptr[12 + 0], wptr[0]);
2208
z[i + 12] = MAD_F_MLZ(hi, lo);
2210
MAD_F_ML0(hi, lo, yptr[12 + 6], wptr[6]);
2211
MAD_F_MLA(hi, lo, yptr[24 + 0], wptr[0]);
2213
z[i + 18] = MAD_F_MLZ(hi, lo);
2215
z[i + 24] = mad_f_mul(yptr[24 + 6], wptr[6]);
2224
* NAME: III_overlap()
2225
* DESCRIPTION: perform overlap-add of windowed IMDCT outputs
2228
void III_overlap(mad_fixed_t const output[36], mad_fixed_t overlap[18],
2229
mad_fixed_t sample[18][32], unsigned int sb)
2233
# if defined(ASO_INTERLEAVE2)
2235
register mad_fixed_t tmp1, tmp2;
2240
for (i = 0; i < 16; i += 2) {
2241
sample[i + 0][sb] = output[i + 0 + 0] + tmp1;
2242
overlap[i + 0] = output[i + 0 + 18];
2243
tmp1 = overlap[i + 2];
2245
sample[i + 1][sb] = output[i + 1 + 0] + tmp2;
2246
overlap[i + 1] = output[i + 1 + 18];
2247
tmp2 = overlap[i + 3];
2250
sample[16][sb] = output[16 + 0] + tmp1;
2251
overlap[16] = output[16 + 18];
2252
sample[17][sb] = output[17 + 0] + tmp2;
2253
overlap[17] = output[17 + 18];
2256
for (i = 0; i < 18; i += 2) {
2257
sample[i + 0][sb] = output[i + 0 + 0] + overlap[i + 0];
2258
overlap[i + 0] = output[i + 0 + 18];
2260
sample[i + 1][sb] = output[i + 1 + 0] + overlap[i + 1];
2261
overlap[i + 1] = output[i + 1 + 18];
2264
for (i = 0; i < 18; ++i) {
2265
sample[i][sb] = output[i + 0] + overlap[i];
2266
overlap[i] = output[i + 18];
2272
* NAME: III_overlap_z()
2273
* DESCRIPTION: perform "overlap-add" of zero IMDCT outputs
2276
void III_overlap_z(mad_fixed_t overlap[18],
2277
mad_fixed_t sample[18][32], unsigned int sb)
2281
# if defined(ASO_INTERLEAVE2)
2283
register mad_fixed_t tmp1, tmp2;
2288
for (i = 0; i < 16; i += 2) {
2289
sample[i + 0][sb] = tmp1;
2291
tmp1 = overlap[i + 2];
2293
sample[i + 1][sb] = tmp2;
2295
tmp2 = overlap[i + 3];
2298
sample[16][sb] = tmp1;
2300
sample[17][sb] = tmp2;
2304
for (i = 0; i < 18; ++i) {
2305
sample[i][sb] = overlap[i];
2312
* NAME: III_freqinver()
2313
* DESCRIPTION: perform subband frequency inversion for odd sample lines
2316
void III_freqinver(mad_fixed_t sample[18][32], unsigned int sb)
2320
# if 1 || defined(ASO_INTERLEAVE1) || defined(ASO_INTERLEAVE2)
2322
register mad_fixed_t tmp1, tmp2;
2324
tmp1 = sample[1][sb];
2325
tmp2 = sample[3][sb];
2327
for (i = 1; i < 13; i += 4) {
2328
sample[i + 0][sb] = -tmp1;
2329
tmp1 = sample[i + 4][sb];
2330
sample[i + 2][sb] = -tmp2;
2331
tmp2 = sample[i + 6][sb];
2334
sample[13][sb] = -tmp1;
2335
tmp1 = sample[17][sb];
2336
sample[15][sb] = -tmp2;
2337
sample[17][sb] = -tmp1;
2340
for (i = 1; i < 18; i += 2)
2341
sample[i][sb] = -sample[i][sb];
2346
* NAME: III_decode()
2347
* DESCRIPTION: decode frame main_data
2350
enum mad_error III_decode(struct mad_bitptr *ptr, struct mad_frame *frame,
2351
struct sideinfo *si, unsigned int nch)
2353
struct mad_header *header = &frame->header;
2354
unsigned int sfreqi, ngr, gr;
2359
sfreq = header->samplerate;
2360
if (header->flags & MAD_FLAG_MPEG_2_5_EXT)
2363
/* 48000 => 0, 44100 => 1, 32000 => 2,
2364
24000 => 3, 22050 => 4, 16000 => 5 */
2365
sfreqi = ((sfreq >> 7) & 0x000f) +
2366
((sfreq >> 15) & 0x0001) - 8;
2368
if (header->flags & MAD_FLAG_MPEG_2_5_EXT)
2372
/* scalefactors, Huffman decoding, requantization */
2374
ngr = (header->flags & MAD_FLAG_LSF_EXT) ? 1 : 2;
2376
for (gr = 0; gr < ngr; ++gr) {
2377
struct granule *granule = &si->gr[gr];
2378
unsigned char const *sfbwidth[2];
2379
mad_fixed_t xr[2][576];
2381
enum mad_error error;
2383
for (ch = 0; ch < nch; ++ch) {
2384
struct channel *channel = &granule->ch[ch];
2385
unsigned int part2_length;
2387
sfbwidth[ch] = sfbwidth_table[sfreqi].l;
2388
if (channel->block_type == 2) {
2389
sfbwidth[ch] = (channel->flags & mixed_block_flag) ?
2390
sfbwidth_table[sfreqi].m : sfbwidth_table[sfreqi].s;
2393
if (header->flags & MAD_FLAG_LSF_EXT) {
2394
part2_length = III_scalefactors_lsf(ptr, channel,
2395
ch == 0 ? 0 : &si->gr[1].ch[1],
2396
header->mode_extension);
2399
part2_length = III_scalefactors(ptr, channel, &si->gr[0].ch[ch],
2400
gr == 0 ? 0 : si->scfsi[ch]);
2403
error = III_huffdecode(ptr, xr[ch], channel, sfbwidth[ch], part2_length);
2408
/* joint stereo processing */
2410
if (header->mode == MAD_MODE_JOINT_STEREO && header->mode_extension) {
2411
error = III_stereo(xr, granule, header, sfbwidth[0]);
2416
/* reordering, alias reduction, IMDCT, overlap-add, frequency inversion */
2418
for (ch = 0; ch < nch; ++ch) {
2419
struct channel const *channel = &granule->ch[ch];
2420
mad_fixed_t (*sample)[32] = &frame->sbsample[ch][18 * gr];
2421
unsigned int sb, l, i, sblimit;
2422
mad_fixed_t output[36];
2424
if (channel->block_type == 2) {
2425
III_reorder(xr[ch], channel, sfbwidth[ch]);
2427
# if !defined(OPT_STRICT)
2429
* According to ISO/IEC 11172-3, "Alias reduction is not applied for
2430
* granules with block_type == 2 (short block)." However, other
2431
* sources suggest alias reduction should indeed be performed on the
2432
* lower two subbands of mixed blocks. Most other implementations do
2433
* this, so by default we will too.
2435
if (channel->flags & mixed_block_flag)
2436
III_aliasreduce(xr[ch], 36);
2440
III_aliasreduce(xr[ch], 576);
2446
if (channel->block_type != 2 || (channel->flags & mixed_block_flag)) {
2447
unsigned int block_type;
2449
block_type = channel->block_type;
2450
if (channel->flags & mixed_block_flag)
2454
for (sb = 0; sb < 2; ++sb, l += 18) {
2455
III_imdct_l(&xr[ch][l], output, block_type);
2456
III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
2461
for (sb = 0; sb < 2; ++sb, l += 18) {
2462
III_imdct_s(&xr[ch][l], output);
2463
III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
2467
III_freqinver(sample, 1);
2469
/* (nonzero) subbands 2-31 */
2472
while (i > 36 && xr[ch][i - 1] == 0)
2475
sblimit = 32 - (576 - i) / 18;
2477
if (channel->block_type != 2) {
2479
for (sb = 2; sb < sblimit; ++sb, l += 18) {
2480
III_imdct_l(&xr[ch][l], output, channel->block_type);
2481
III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
2484
III_freqinver(sample, sb);
2489
for (sb = 2; sb < sblimit; ++sb, l += 18) {
2490
III_imdct_s(&xr[ch][l], output);
2491
III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
2494
III_freqinver(sample, sb);
2498
/* remaining (zero) subbands */
2500
for (sb = sblimit; sb < 32; ++sb) {
2501
III_overlap_z((*frame->overlap)[ch][sb], sample, sb);
2504
III_freqinver(sample, sb);
2509
return MAD_ERROR_NONE;
2513
* NAME: layer->III()
2514
* DESCRIPTION: decode a single Layer III frame
2516
int mad_layer_III(struct mad_stream *stream, struct mad_frame *frame)
2518
struct mad_header *header = &frame->header;
2519
unsigned int nch, priv_bitlen, next_md_begin = 0;
2520
unsigned int si_len, data_bitlen, md_len;
2521
unsigned int frame_space, frame_used, frame_free;
2522
struct mad_bitptr ptr;
2524
enum mad_error error;
2527
/* allocate Layer III dynamic structures */
2529
if (stream->main_data == 0) {
2530
stream->main_data = malloc(MAD_BUFFER_MDLEN);
2531
if (stream->main_data == 0) {
2532
stream->error = MAD_ERROR_NOMEM;
2537
if (frame->overlap == 0) {
2538
frame->overlap = calloc(2 * 32 * 18, sizeof(mad_fixed_t));
2539
if (frame->overlap == 0) {
2540
stream->error = MAD_ERROR_NOMEM;
2545
nch = MAD_NCHANNELS(header);
2546
si_len = (header->flags & MAD_FLAG_LSF_EXT) ?
2547
(nch == 1 ? 9 : 17) : (nch == 1 ? 17 : 32);
2549
/* check frame sanity */
2551
if (stream->next_frame - mad_bit_nextbyte(&stream->ptr) <
2552
(signed int) si_len) {
2553
stream->error = MAD_ERROR_BADFRAMELEN;
2558
/* check CRC word */
2560
if (header->flags & MAD_FLAG_PROTECTION) {
2562
mad_bit_crc(stream->ptr, si_len * CHAR_BIT, header->crc_check);
2564
if (header->crc_check != header->crc_target &&
2565
!(frame->options & MAD_OPTION_IGNORECRC)) {
2566
stream->error = MAD_ERROR_BADCRC;
2571
/* decode frame side information */
2573
error = III_sideinfo(&stream->ptr, nch, header->flags & MAD_FLAG_LSF_EXT,
2574
&si, &data_bitlen, &priv_bitlen);
2575
if (error && result == 0) {
2576
stream->error = error;
2580
header->flags |= priv_bitlen;
2581
header->private_bits |= si.private_bits;
2583
/* find main_data of next frame */
2586
struct mad_bitptr peek;
2587
unsigned long header;
2589
mad_bit_init(&peek, stream->next_frame);
2591
header = mad_bit_read(&peek, 32);
2592
if ((header & 0xffe60000L) /* syncword | layer */ == 0xffe20000L) {
2593
if (!(header & 0x00010000L)) /* protection_bit */
2594
mad_bit_skip(&peek, 16); /* crc_check */
2597
mad_bit_read(&peek, (header & 0x00080000L) /* ID */ ? 9 : 8);
2600
mad_bit_finish(&peek);
2603
/* find main_data of this frame */
2605
frame_space = stream->next_frame - mad_bit_nextbyte(&stream->ptr);
2607
if (next_md_begin > si.main_data_begin + frame_space)
2610
md_len = si.main_data_begin + frame_space - next_md_begin;
2614
if (si.main_data_begin == 0) {
2618
frame_used = md_len;
2621
if (si.main_data_begin > stream->md_len) {
2623
stream->error = MAD_ERROR_BADDATAPTR;
2629
*stream->main_data + stream->md_len - si.main_data_begin);
2631
if (md_len > si.main_data_begin) {
2632
assert(stream->md_len + md_len -
2633
si.main_data_begin <= MAD_BUFFER_MDLEN);
2635
memcpy(*stream->main_data + stream->md_len,
2636
mad_bit_nextbyte(&stream->ptr),
2637
frame_used = md_len - si.main_data_begin);
2638
stream->md_len += frame_used;
2643
frame_free = frame_space - frame_used;
2645
/* decode main_data */
2648
error = III_decode(&ptr, frame, &si, nch);
2650
stream->error = error;
2654
/* designate ancillary bits */
2656
stream->anc_ptr = ptr;
2657
stream->anc_bitlen = md_len * CHAR_BIT - data_bitlen;
2660
# if 0 && defined(DEBUG)
2662
"main_data_begin:%u, md_len:%u, frame_free:%u, "
2663
"data_bitlen:%u, anc_bitlen: %u\n",
2664
si.main_data_begin, md_len, frame_free,
2665
data_bitlen, stream->anc_bitlen);
2668
/* preload main_data buffer with up to 511 bytes for next frame(s) */
2670
if (frame_free >= next_md_begin) {
2671
memcpy(*stream->main_data,
2672
stream->next_frame - next_md_begin, next_md_begin);
2673
stream->md_len = next_md_begin;
2676
if (md_len < si.main_data_begin) {
2679
extra = si.main_data_begin - md_len;
2680
if (extra + frame_free > next_md_begin)
2681
extra = next_md_begin - frame_free;
2683
if (extra < stream->md_len) {
2684
memmove(*stream->main_data,
2685
*stream->main_data + stream->md_len - extra, extra);
2686
stream->md_len = extra;
2692
memcpy(*stream->main_data + stream->md_len,
2693
stream->next_frame - frame_free, frame_free);
2694
stream->md_len += frame_free;