summaryrefslogtreecommitdiff
path: root/apps/codecs/libmad/layer3.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/libmad/layer3.c')
-rw-r--r--apps/codecs/libmad/layer3.c2698
1 files changed, 2698 insertions, 0 deletions
diff --git a/apps/codecs/libmad/layer3.c b/apps/codecs/libmad/layer3.c
new file mode 100644
index 0000000000..7a59e70241
--- /dev/null
+++ b/apps/codecs/libmad/layer3.c
@@ -0,0 +1,2698 @@
1/*
2 * libmad - MPEG audio decoder library
3 * Copyright (C) 2000-2004 Underbit Technologies, Inc.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 *
19 * $Id$
20 */
21
22# ifdef HAVE_CONFIG_H
23# include "config.h"
24# endif
25
26# include "global.h"
27
28# include <stdlib.h>
29# include <string.h>
30
31# ifdef HAVE_ASSERT_H
32# include <assert.h>
33# endif
34
35# ifdef HAVE_LIMITS_H
36# include <limits.h>
37# else
38# define CHAR_BIT 8
39# endif
40
41# include "fixed.h"
42# include "bit.h"
43# include "stream.h"
44# include "frame.h"
45# include "huffman.h"
46# include "layer3.h"
47
48/* --- Layer III ----------------------------------------------------------- */
49
50enum {
51 count1table_select = 0x01,
52 scalefac_scale = 0x02,
53 preflag = 0x04,
54 mixed_block_flag = 0x08
55};
56
57enum {
58 I_STEREO = 0x1,
59 MS_STEREO = 0x2
60};
61
62struct sideinfo {
63 unsigned int main_data_begin;
64 unsigned int private_bits;
65
66 unsigned char scfsi[2];
67
68 struct granule {
69 struct channel {
70 /* from side info */
71 unsigned short part2_3_length;
72 unsigned short big_values;
73 unsigned short global_gain;
74 unsigned short scalefac_compress;
75
76 unsigned char flags;
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;
82
83 /* from main_data */
84 unsigned char scalefac[39]; /* scalefac_l and/or scalefac_s */
85 } ch[2];
86 } gr[2];
87};
88
89/*
90 * scalefactor bit lengths
91 * derived from section 2.4.2.7 of ISO/IEC 11172-3
92 */
93static
94struct {
95 unsigned char slen1;
96 unsigned char slen2;
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 }
102};
103
104/*
105 * number of LSF scalefactor band values
106 * derived from section 2.4.3.2 of ISO/IEC 13818-3
107 */
108static
109unsigned char const nsfb_table[6][3][4] = {
110 { { 6, 5, 5, 5 },
111 { 9, 9, 9, 9 },
112 { 6, 9, 9, 9 } },
113
114 { { 6, 5, 7, 3 },
115 { 9, 9, 12, 6 },
116 { 6, 9, 12, 6 } },
117
118 { { 11, 10, 0, 0 },
119 { 18, 18, 0, 0 },
120 { 15, 18, 0, 0 } },
121
122 { { 7, 7, 7, 0 },
123 { 12, 12, 12, 0 },
124 { 6, 15, 12, 0 } },
125
126 { { 6, 6, 6, 3 },
127 { 12, 9, 9, 6 },
128 { 6, 12, 9, 6 } },
129
130 { { 8, 8, 5, 0 },
131 { 15, 12, 9, 0 },
132 { 6, 18, 9, 0 } }
133};
134
135/*
136 * MPEG-1 scalefactor band widths
137 * derived from Table B.8 of ISO/IEC 11172-3
138 */
139static
140unsigned 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
143};
144
145static
146unsigned 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
149};
150
151static
152unsigned 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
155};
156
157static
158unsigned 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
162};
163
164static
165unsigned 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
169};
170
171static
172unsigned 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
176};
177
178static
179unsigned 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
184};
185
186static
187unsigned 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
192};
193
194static
195unsigned 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
200};
201
202/*
203 * MPEG-2 scalefactor band widths
204 * derived from Table B.2 of ISO/IEC 13818-3
205 */
206static
207unsigned 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
210};
211
212static
213unsigned 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
216};
217
218# define sfb_16000_long sfb_22050_long
219
220static
221unsigned 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
225};
226
227static
228unsigned 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
232};
233
234static
235unsigned 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
239};
240
241static
242unsigned 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
247};
248
249static
250unsigned 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
255};
256
257static
258unsigned 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
263};
264
265/*
266 * MPEG 2.5 scalefactor band widths
267 * derived from public sources
268 */
269# define sfb_12000_long sfb_16000_long
270# define sfb_11025_long sfb_12000_long
271
272static
273unsigned 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
276};
277
278# define sfb_12000_short sfb_16000_short
279# define sfb_11025_short sfb_12000_short
280
281static
282unsigned 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
286};
287
288# define sfb_12000_mixed sfb_16000_mixed
289# define sfb_11025_mixed sfb_12000_mixed
290
291/* the 8000 Hz short block scalefactor bands do not break after
292 the first 36 frequency lines, so this is probably wrong */
293static
294unsigned 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
299};
300
301static
302struct {
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 }
316};
317
318/*
319 * scalefactor band preemphasis (used only when preflag is set)
320 * derived from Table B.6 of ISO/IEC 11172-3
321 */
322static
323unsigned 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
325};
326
327/*
328 * table for requantization
329 *
330 * rq_table[x].mantissa * 2^(rq_table[x].exponent) = x^(4/3)
331 */
332static
333struct fixedfloat {
334 unsigned long mantissa : 27;
335 unsigned short exponent : 5;
336} const rq_table[8207] = {
337# include "rq_table.dat"
338};
339
340/*
341 * fractional powers of two
342 * used for requantization and joint stereo decoding
343 *
344 * root_table[3 + x] = 2^(x/4)
345 */
346static
347mad_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 */
355};
356
357/*
358 * coefficients for aliasing reduction
359 * derived from Table B.9 of ISO/IEC 11172-3
360 *
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)
364 */
365static
366mad_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 */
371};
372
373static
374mad_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 */
379};
380
381/*
382 * IMDCT coefficients for short blocks
383 * derived from section 2.4.3.4.10.2 of ISO/IEC 11172-3
384 *
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))
387 */
388static
389mad_fixed_t const imdct_s[6][6] = {
390# include "imdct_s.dat"
391};
392
393# if !defined(ASO_IMDCT)
394/*
395 * windowing coefficients for long blocks
396 * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3
397 *
398 * window_l[i] = sin((PI / 36) * (i + 1/2))
399 */
400static
401mad_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 */,
408
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 */,
415
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 */,
422};
423# endif /* ASO_IMDCT */
424
425/*
426 * windowing coefficients for short blocks
427 * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3
428 *
429 * window_s[i] = sin((PI / 12) * (i + 1/2))
430 */
431static
432mad_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 */,
439};
440
441/*
442 * coefficients for intensity stereo processing
443 * derived from section 2.4.3.4.9.3 of ISO/IEC 11172-3
444 *
445 * is_ratio[i] = tan(i * (PI / 12))
446 * is_table[i] = is_ratio[i] / (1 + is_ratio[i])
447 */
448static
449mad_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 */
457};
458
459/*
460 * coefficients for LSF intensity stereo processing
461 * derived from section 2.4.3.2 of ISO/IEC 13818-3
462 *
463 * is_lsf_table[0][i] = (1 / sqrt(sqrt(2)))^(i + 1)
464 * is_lsf_table[1][i] = (1 / sqrt(2)) ^(i + 1)
465 */
466static
467mad_fixed_t const is_lsf_table[2][15] = {
468 {
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 */
484 }, {
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 */
500 }
501};
502
503/*
504 * NAME: III_sideinfo()
505 * DESCRIPTION: decode frame side information from a bitstream
506 */
507static
508enum 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)
512{
513 unsigned int ngr, gr, ch, i;
514 enum mad_error result = MAD_ERROR_NONE;
515
516 *data_bitlen = 0;
517 *priv_bitlen = lsf ? ((nch == 1) ? 1 : 2) : ((nch == 1) ? 5 : 3);
518
519 si->main_data_begin = mad_bit_read(ptr, lsf ? 8 : 9);
520 si->private_bits = mad_bit_read(ptr, *priv_bitlen);
521
522 ngr = 1;
523 if (!lsf) {
524 ngr = 2;
525
526 for (ch = 0; ch < nch; ++ch)
527 si->scfsi[ch] = mad_bit_read(ptr, 4);
528 }
529
530 for (gr = 0; gr < ngr; ++gr) {
531 struct granule *granule = &si->gr[gr];
532
533 for (ch = 0; ch < nch; ++ch) {
534 struct channel *channel = &granule->ch[ch];
535
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);
540
541 *data_bitlen += channel->part2_3_length;
542
543 if (channel->big_values > 288 && result == 0)
544 result = MAD_ERROR_BADBIGVALUES;
545
546 channel->flags = 0;
547
548 /* window_switching_flag */
549 if (mad_bit_read(ptr, 1)) {
550 channel->block_type = mad_bit_read(ptr, 2);
551
552 if (channel->block_type == 0 && result == 0)
553 result = MAD_ERROR_BADBLOCKTYPE;
554
555 if (!lsf && channel->block_type == 2 && si->scfsi[ch] && result == 0)
556 result = MAD_ERROR_BADSCFSI;
557
558 channel->region0_count = 7;
559 channel->region1_count = 36;
560
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;
565
566 for (i = 0; i < 2; ++i)
567 channel->table_select[i] = mad_bit_read(ptr, 5);
568
569# if defined(DEBUG)
570 channel->table_select[2] = 4; /* not used */
571# endif
572
573 for (i = 0; i < 3; ++i)
574 channel->subblock_gain[i] = mad_bit_read(ptr, 3);
575 }
576 else {
577 channel->block_type = 0;
578
579 for (i = 0; i < 3; ++i)
580 channel->table_select[i] = mad_bit_read(ptr, 5);
581
582 channel->region0_count = mad_bit_read(ptr, 4);
583 channel->region1_count = mad_bit_read(ptr, 3);
584 }
585
586 /* [preflag,] scalefac_scale, count1table_select */
587 channel->flags |= mad_bit_read(ptr, lsf ? 2 : 3);
588 }
589 }
590
591 return result;
592}
593
594/*
595 * NAME: III_scalefactors_lsf()
596 * DESCRIPTION: decode channel scalefactors for LSF from a bitstream
597 */
598static
599unsigned int III_scalefactors_lsf(struct mad_bitptr *ptr,
600 struct channel *channel,
601 struct channel *gr1ch, int mode_extension)
602{
603 struct mad_bitptr start;
604 unsigned int scalefac_compress, index, slen[4], part, n, i;
605 unsigned char const *nsfb;
606
607 start = *ptr;
608
609 scalefac_compress = channel->scalefac_compress;
610 index = (channel->block_type == 2) ?
611 ((channel->flags & mixed_block_flag) ? 2 : 1) : 0;
612
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;
619
620 nsfb = nsfb_table[0][index];
621 }
622 else if (scalefac_compress < 500) {
623 scalefac_compress -= 400;
624
625 slen[0] = (scalefac_compress >> 2) / 5;
626 slen[1] = (scalefac_compress >> 2) % 5;
627 slen[2] = scalefac_compress % 4;
628 slen[3] = 0;
629
630 nsfb = nsfb_table[1][index];
631 }
632 else {
633 scalefac_compress -= 500;
634
635 slen[0] = scalefac_compress / 3;
636 slen[1] = scalefac_compress % 3;
637 slen[2] = 0;
638 slen[3] = 0;
639
640 channel->flags |= preflag;
641
642 nsfb = nsfb_table[2][index];
643 }
644
645 n = 0;
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]);
649 }
650
651 while (n < 39)
652 channel->scalefac[n++] = 0;
653 }
654 else { /* (mode_extension & I_STEREO) && gr1ch (i.e. ch == 1) */
655 scalefac_compress >>= 1;
656
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;
661 slen[3] = 0;
662
663 nsfb = nsfb_table[3][index];
664 }
665 else if (scalefac_compress < 244) {
666 scalefac_compress -= 180;
667
668 slen[0] = (scalefac_compress % 64) >> 4;
669 slen[1] = (scalefac_compress % 16) >> 2;
670 slen[2] = scalefac_compress % 4;
671 slen[3] = 0;
672
673 nsfb = nsfb_table[4][index];
674 }
675 else {
676 scalefac_compress -= 244;
677
678 slen[0] = scalefac_compress / 3;
679 slen[1] = scalefac_compress % 3;
680 slen[2] = 0;
681 slen[3] = 0;
682
683 nsfb = nsfb_table[5][index];
684 }
685
686 n = 0;
687 for (part = 0; part < 4; ++part) {
688 unsigned int max, is_pos;
689
690 max = (1 << slen[part]) - 1;
691
692 for (i = 0; i < nsfb[part]; ++i) {
693 is_pos = mad_bit_read(ptr, slen[part]);
694
695 channel->scalefac[n] = is_pos;
696 gr1ch->scalefac[n++] = (is_pos == max);
697 }
698 }
699
700 while (n < 39) {
701 channel->scalefac[n] = 0;
702 gr1ch->scalefac[n++] = 0; /* apparently not illegal */
703 }
704 }
705
706 return mad_bit_length(&start, ptr);
707}
708
709/*
710 * NAME: III_scalefactors()
711 * DESCRIPTION: decode channel scalefactors of one granule from a bitstream
712 */
713static
714unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel,
715 struct channel const *gr0ch, unsigned int scfsi)
716{
717 struct mad_bitptr start;
718 unsigned int slen1, slen2, sfbi;
719
720 start = *ptr;
721
722 slen1 = sflen_table[channel->scalefac_compress].slen1;
723 slen2 = sflen_table[channel->scalefac_compress].slen2;
724
725 if (channel->block_type == 2) {
726 unsigned int nsfb;
727
728 sfbi = 0;
729
730 nsfb = (channel->flags & mixed_block_flag) ? 8 + 3 * 3 : 6 * 3;
731 while (nsfb--)
732 channel->scalefac[sfbi++] = mad_bit_read(ptr, slen1);
733
734 nsfb = 6 * 3;
735 while (nsfb--)
736 channel->scalefac[sfbi++] = mad_bit_read(ptr, slen2);
737
738 nsfb = 1 * 3;
739 while (nsfb--)
740 channel->scalefac[sfbi++] = 0;
741 }
742 else { /* channel->block_type != 2 */
743 if (scfsi & 0x8) {
744 for (sfbi = 0; sfbi < 6; ++sfbi)
745 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
746 }
747 else {
748 for (sfbi = 0; sfbi < 6; ++sfbi)
749 channel->scalefac[sfbi] = mad_bit_read(ptr, slen1);
750 }
751
752 if (scfsi & 0x4) {
753 for (sfbi = 6; sfbi < 11; ++sfbi)
754 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
755 }
756 else {
757 for (sfbi = 6; sfbi < 11; ++sfbi)
758 channel->scalefac[sfbi] = mad_bit_read(ptr, slen1);
759 }
760
761 if (scfsi & 0x2) {
762 for (sfbi = 11; sfbi < 16; ++sfbi)
763 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
764 }
765 else {
766 for (sfbi = 11; sfbi < 16; ++sfbi)
767 channel->scalefac[sfbi] = mad_bit_read(ptr, slen2);
768 }
769
770 if (scfsi & 0x1) {
771 for (sfbi = 16; sfbi < 21; ++sfbi)
772 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
773 }
774 else {
775 for (sfbi = 16; sfbi < 21; ++sfbi)
776 channel->scalefac[sfbi] = mad_bit_read(ptr, slen2);
777 }
778
779 channel->scalefac[21] = 0;
780 }
781
782 return mad_bit_length(&start, ptr);
783}
784
785/*
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:
788 *
789 * long blocks:
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]))
794 *
795 * short blocks:
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])
799 *
800 * where:
801 * scalefac_multiplier = (scalefac_scale + 1) / 2
802 *
803 * The routines III_exponents() and III_requantize() facilitate this
804 * calculation.
805 */
806
807/*
808 * NAME: III_exponents()
809 * DESCRIPTION: calculate scalefactor exponents
810 */
811static
812void III_exponents(struct channel const *channel,
813 unsigned char const *sfbwidth, signed int exponents[39])
814{
815 signed int gain;
816 unsigned int scalefac_multiplier, sfbi;
817
818 gain = (signed int) channel->global_gain - 210;
819 scalefac_multiplier = (channel->flags & scalefac_scale) ? 2 : 1;
820
821 if (channel->block_type == 2) {
822 unsigned int l;
823 signed int gain0, gain1, gain2;
824
825 sfbi = l = 0;
826
827 if (channel->flags & mixed_block_flag) {
828 unsigned int premask;
829
830 premask = (channel->flags & preflag) ? ~0 : 0;
831
832 /* long block subbands 0-1 */
833
834 while (l < 36) {
835 exponents[sfbi] = gain -
836 (signed int) ((channel->scalefac[sfbi] + (pretab[sfbi] & premask)) <<
837 scalefac_multiplier);
838
839 l += sfbwidth[sfbi++];
840 }
841 }
842
843 /* this is probably wrong for 8000 Hz short/mixed blocks */
844
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];
848
849 while (l < 576) {
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);
856
857 l += 3 * sfbwidth[sfbi];
858 sfbi += 3;
859 }
860 }
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);
867 }
868 }
869 else {
870 for (sfbi = 0; sfbi < 22; ++sfbi) {
871 exponents[sfbi] = gain -
872 (signed int) (channel->scalefac[sfbi] << scalefac_multiplier);
873 }
874 }
875 }
876}
877
878/*
879 * NAME: III_requantize()
880 * DESCRIPTION: requantize one (positive) value
881 */
882static
883mad_fixed_t III_requantize(unsigned int value, signed int exp)
884{
885 mad_fixed_t requantized;
886 signed int frac;
887 struct fixedfloat const *power;
888
889 frac = exp % 4; /* assumes sign(frac) == sign(exp) */
890 exp /= 4;
891
892 power = &rq_table[value];
893 requantized = power->mantissa;
894 exp += power->exponent;
895
896 if (exp < 0) {
897 if (-exp >= sizeof(mad_fixed_t) * CHAR_BIT) {
898 /* underflow */
899 requantized = 0;
900 }
901 else {
902 requantized += 1L << (-exp - 1);
903 requantized >>= -exp;
904 }
905 }
906 else {
907 if (exp >= 5) {
908 /* overflow */
909# if defined(DEBUG)
910 fprintf(stderr, "requantize overflow (%f * 2^%d)\n",
911 mad_f_todouble(requantized), exp);
912# endif
913 requantized = MAD_F_MAX;
914 }
915 else
916 requantized <<= exp;
917 }
918
919 return frac ? mad_f_mul(requantized, root_table[3 + frac]) : requantized;
920}
921
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)))
927
928/*
929 * NAME: III_huffdecode()
930 * DESCRIPTION: decode Huffman code words of one channel of one granule
931 */
932static
933enum 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)
937{
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;
945
946 bits_left = (signed) channel->part2_3_length - (signed) part2_length;
947 if (bits_left < 0)
948 return MAD_ERROR_BADPART3LEN;
949
950 III_exponents(channel, sfbwidth, exponents);
951
952 peek = *ptr;
953 mad_bit_skip(ptr, bits_left);
954
955 /* align bit reads to byte boundaries */
956 cachesz = mad_bit_bitsleft(&peek);
957 cachesz += ((32 - 1 - 24) + (24 - cachesz)) & ~7;
958
959 bitcache = mad_bit_read(&peek, cachesz);
960 bits_left -= cachesz;
961
962 xrptr = &xr[0];
963
964 /* big_values */
965 {
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];
971
972 sfbound = xrptr + *sfbwidth++;
973 rcount = channel->region0_count + 1;
974
975 entry = &mad_huff_pair_table[channel->table_select[region = 0]];
976 table = entry->table;
977 linbits = entry->linbits;
978 startbits = entry->startbits;
979
980 if (table == 0)
981 return MAD_ERROR_BADHUFFTABLE;
982
983 expptr = &exponents[0];
984 exp = *expptr++;
985 reqhits = 0;
986
987 big_values = channel->big_values;
988
989 while (big_values-- && cachesz + bits_left > 0) {
990 union huffpair const *pair;
991 unsigned int clumpsz, value;
992 register mad_fixed_t requantized;
993
994 if (xrptr == sfbound) {
995 sfbound += *sfbwidth++;
996
997 /* change table if region boundary */
998
999 if (--rcount == 0) {
1000 if (region == 0)
1001 rcount = channel->region1_count + 1;
1002 else
1003 rcount = 0; /* all remaining */
1004
1005 entry = &mad_huff_pair_table[channel->table_select[++region]];
1006 table = entry->table;
1007 linbits = entry->linbits;
1008 startbits = entry->startbits;
1009
1010 if (table == 0)
1011 return MAD_ERROR_BADHUFFTABLE;
1012 }
1013
1014 if (exp != *expptr) {
1015 exp = *expptr;
1016 reqhits = 0;
1017 }
1018
1019 ++expptr;
1020 }
1021
1022 if (cachesz < 21) {
1023 unsigned int bits;
1024
1025 bits = ((32 - 1 - 21) + (21 - cachesz)) & ~7;
1026 bitcache = (bitcache << bits) | mad_bit_read(&peek, bits);
1027 cachesz += bits;
1028 bits_left -= bits;
1029 }
1030
1031 /* hcod (0..19) */
1032
1033 clumpsz = startbits;
1034 pair = &table[MASK(bitcache, cachesz, clumpsz)];
1035
1036 while (!pair->final) {
1037 cachesz -= clumpsz;
1038
1039 clumpsz = pair->ptr.bits;
1040 pair = &table[pair->ptr.offset + MASK(bitcache, cachesz, clumpsz)];
1041 }
1042
1043 cachesz -= pair->value.hlen;
1044
1045 if (linbits) {
1046 /* x (0..14) */
1047
1048 value = pair->value.x;
1049
1050 switch (value) {
1051 case 0:
1052 xrptr[0] = 0;
1053 break;
1054
1055 case 15:
1056 if (cachesz < linbits + 2) {
1057 bitcache = (bitcache << 16) | mad_bit_read(&peek, 16);
1058 cachesz += 16;
1059 bits_left -= 16;
1060 }
1061
1062 value += MASK(bitcache, cachesz, linbits);
1063 cachesz -= linbits;
1064
1065 requantized = III_requantize(value, exp);
1066 goto x_final;
1067
1068 default:
1069 if (reqhits & (1 << value))
1070 requantized = reqcache[value];
1071 else {
1072 reqhits |= (1 << value);
1073 requantized = reqcache[value] = III_requantize(value, exp);
1074 }
1075
1076 x_final:
1077 xrptr[0] = MASK1BIT(bitcache, cachesz--) ?
1078 -requantized : requantized;
1079 }
1080
1081 /* y (0..14) */
1082
1083 value = pair->value.y;
1084
1085 switch (value) {
1086 case 0:
1087 xrptr[1] = 0;
1088 break;
1089
1090 case 15:
1091 if (cachesz < linbits + 1) {
1092 bitcache = (bitcache << 16) | mad_bit_read(&peek, 16);
1093 cachesz += 16;
1094 bits_left -= 16;
1095 }
1096
1097 value += MASK(bitcache, cachesz, linbits);
1098 cachesz -= linbits;
1099
1100 requantized = III_requantize(value, exp);
1101 goto y_final;
1102
1103 default:
1104 if (reqhits & (1 << value))
1105 requantized = reqcache[value];
1106 else {
1107 reqhits |= (1 << value);
1108 requantized = reqcache[value] = III_requantize(value, exp);
1109 }
1110
1111 y_final:
1112 xrptr[1] = MASK1BIT(bitcache, cachesz--) ?
1113 -requantized : requantized;
1114 }
1115 }
1116 else {
1117 /* x (0..1) */
1118
1119 value = pair->value.x;
1120
1121 if (value == 0)
1122 xrptr[0] = 0;
1123 else {
1124 if (reqhits & (1 << value))
1125 requantized = reqcache[value];
1126 else {
1127 reqhits |= (1 << value);
1128 requantized = reqcache[value] = III_requantize(value, exp);
1129 }
1130
1131 xrptr[0] = MASK1BIT(bitcache, cachesz--) ?
1132 -requantized : requantized;
1133 }
1134
1135 /* y (0..1) */
1136
1137 value = pair->value.y;
1138
1139 if (value == 0)
1140 xrptr[1] = 0;
1141 else {
1142 if (reqhits & (1 << value))
1143 requantized = reqcache[value];
1144 else {
1145 reqhits |= (1 << value);
1146 requantized = reqcache[value] = III_requantize(value, exp);
1147 }
1148
1149 xrptr[1] = MASK1BIT(bitcache, cachesz--) ?
1150 -requantized : requantized;
1151 }
1152 }
1153
1154 xrptr += 2;
1155 }
1156 }
1157
1158 if (cachesz + bits_left < 0)
1159 return MAD_ERROR_BADHUFFDATA; /* big_values overrun */
1160
1161 /* count1 */
1162 {
1163 union huffquad const *table;
1164 register mad_fixed_t requantized;
1165
1166 table = mad_huff_quad_table[channel->flags & count1table_select];
1167
1168 requantized = III_requantize(1, exp);
1169
1170 while (cachesz + bits_left > 0 && xrptr <= &xr[572]) {
1171 union huffquad const *quad;
1172
1173 /* hcod (1..6) */
1174
1175 if (cachesz < 10) {
1176 bitcache = (bitcache << 16) | mad_bit_read(&peek, 16);
1177 cachesz += 16;
1178 bits_left -= 16;
1179 }
1180
1181 quad = &table[MASK(bitcache, cachesz, 4)];
1182
1183 /* quad tables guaranteed to have at most one extra lookup */
1184 if (!quad->final) {
1185 cachesz -= 4;
1186
1187 quad = &table[quad->ptr.offset +
1188 MASK(bitcache, cachesz, quad->ptr.bits)];
1189 }
1190
1191 cachesz -= quad->value.hlen;
1192
1193 if (xrptr == sfbound) {
1194 sfbound += *sfbwidth++;
1195
1196 if (exp != *expptr) {
1197 exp = *expptr;
1198 requantized = III_requantize(1, exp);
1199 }
1200
1201 ++expptr;
1202 }
1203
1204 /* v (0..1) */
1205
1206 xrptr[0] = quad->value.v ?
1207 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
1208
1209 /* w (0..1) */
1210
1211 xrptr[1] = quad->value.w ?
1212 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
1213
1214 xrptr += 2;
1215
1216 if (xrptr == sfbound) {
1217 sfbound += *sfbwidth++;
1218
1219 if (exp != *expptr) {
1220 exp = *expptr;
1221 requantized = III_requantize(1, exp);
1222 }
1223
1224 ++expptr;
1225 }
1226
1227 /* x (0..1) */
1228
1229 xrptr[0] = quad->value.x ?
1230 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
1231
1232 /* y (0..1) */
1233
1234 xrptr[1] = quad->value.y ?
1235 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
1236
1237 xrptr += 2;
1238 }
1239
1240 if (cachesz + bits_left < 0) {
1241# if 0 && defined(DEBUG)
1242 fprintf(stderr, "huffman count1 overrun (%d bits)\n",
1243 -(cachesz + bits_left));
1244# endif
1245
1246 /* technically the bitstream is misformatted, but apparently
1247 some encoders are just a bit sloppy with stuffing bits */
1248
1249 xrptr -= 4;
1250 }
1251 }
1252
1253 assert(-bits_left <= MAD_BUFFER_GUARD * CHAR_BIT);
1254
1255# if 0 && defined(DEBUG)
1256 if (bits_left < 0)
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);
1260# endif
1261
1262 /* rzero */
1263 while (xrptr < &xr[576]) {
1264 xrptr[0] = 0;
1265 xrptr[1] = 0;
1266
1267 xrptr += 2;
1268 }
1269
1270 return MAD_ERROR_NONE;
1271}
1272
1273# undef MASK
1274# undef MASK1BIT
1275
1276/*
1277 * NAME: III_reorder()
1278 * DESCRIPTION: reorder frequency lines of a short block into subband order
1279 */
1280static
1281void III_reorder(mad_fixed_t xr[576], struct channel const *channel,
1282 unsigned char const sfbwidth[39])
1283{
1284 mad_fixed_t tmp[32][3][6];
1285 unsigned int sb, l, f, w, sbw[3], sw[3];
1286
1287 /* this is probably wrong for 8000 Hz mixed blocks */
1288
1289 sb = 0;
1290 if (channel->flags & mixed_block_flag) {
1291 sb = 2;
1292
1293 l = 0;
1294 while (l < 36)
1295 l += *sfbwidth++;
1296 }
1297
1298 for (w = 0; w < 3; ++w) {
1299 sbw[w] = sb;
1300 sw[w] = 0;
1301 }
1302
1303 f = *sfbwidth++;
1304 w = 0;
1305
1306 for (l = 18 * sb; l < 576; ++l) {
1307 if (f-- == 0) {
1308 f = *sfbwidth++ - 1;
1309 w = (w + 1) % 3;
1310 }
1311
1312 tmp[sbw[w]][w][sw[w]++] = xr[l];
1313
1314 if (sw[w] == 6) {
1315 sw[w] = 0;
1316 ++sbw[w];
1317 }
1318 }
1319
1320 memcpy(&xr[18 * sb], &tmp[sb], (576 - 18 * sb) * sizeof(mad_fixed_t));
1321}
1322
1323/*
1324 * NAME: III_stereo()
1325 * DESCRIPTION: perform joint stereo processing on a granule
1326 */
1327static
1328enum 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)
1332{
1333 short modes[39];
1334 unsigned int sfbi, l, n, i;
1335
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;
1341
1342 for (i = 0; i < 39; ++i)
1343 modes[i] = header->mode_extension;
1344
1345 /* intensity stereo */
1346
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;
1351
1352 header->flags |= MAD_FLAG_I_STEREO;
1353
1354 /* first determine which scalefactor bands are to be processed */
1355
1356 if (right_ch->block_type == 2) {
1357 unsigned int lower, start, max, bound[3], w;
1358
1359 lower = start = max = bound[0] = bound[1] = bound[2] = 0;
1360
1361 sfbi = l = 0;
1362
1363 if (right_ch->flags & mixed_block_flag) {
1364 while (l < 36) {
1365 n = sfbwidth[sfbi++];
1366
1367 for (i = 0; i < n; ++i) {
1368 if (right_xr[i]) {
1369 lower = sfbi;
1370 break;
1371 }
1372 }
1373
1374 right_xr += n;
1375 l += n;
1376 }
1377
1378 start = sfbi;
1379 }
1380
1381 w = 0;
1382 while (l < 576) {
1383 n = sfbwidth[sfbi++];
1384
1385 for (i = 0; i < n; ++i) {
1386 if (right_xr[i]) {
1387 max = bound[w] = sfbi;
1388 break;
1389 }
1390 }
1391
1392 right_xr += n;
1393 l += n;
1394 w = (w + 1) % 3;
1395 }
1396
1397 if (max)
1398 lower = start;
1399
1400 /* long blocks */
1401
1402 for (i = 0; i < lower; ++i)
1403 modes[i] = header->mode_extension & ~I_STEREO;
1404
1405 /* short blocks */
1406
1407 w = 0;
1408 for (i = start; i < max; ++i) {
1409 if (i < bound[w])
1410 modes[i] = header->mode_extension & ~I_STEREO;
1411
1412 w = (w + 1) % 3;
1413 }
1414 }
1415 else { /* right_ch->block_type != 2 */
1416 unsigned int bound;
1417
1418 bound = 0;
1419 for (sfbi = l = 0; l < 576; l += n) {
1420 n = sfbwidth[sfbi++];
1421
1422 for (i = 0; i < n; ++i) {
1423 if (right_xr[i]) {
1424 bound = sfbi;
1425 break;
1426 }
1427 }
1428
1429 right_xr += n;
1430 }
1431
1432 for (i = 0; i < bound; ++i)
1433 modes[i] = header->mode_extension & ~I_STEREO;
1434 }
1435
1436 /* now do the actual processing */
1437
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;
1441
1442 /* intensity_scale */
1443 lsf_scale = is_lsf_table[right_ch->scalefac_compress & 0x1];
1444
1445 for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
1446 n = sfbwidth[sfbi];
1447
1448 if (!(modes[sfbi] & I_STEREO))
1449 continue;
1450
1451 if (illegal_pos[sfbi]) {
1452 modes[sfbi] &= ~I_STEREO;
1453 continue;
1454 }
1455
1456 is_pos = right_ch->scalefac[sfbi];
1457
1458 for (i = 0; i < n; ++i) {
1459 register mad_fixed_t left;
1460
1461 left = xr[0][l + i];
1462
1463 if (is_pos == 0)
1464 xr[1][l + i] = left;
1465 else {
1466 register mad_fixed_t opposite;
1467
1468 opposite = mad_f_mul(left, lsf_scale[(is_pos - 1) / 2]);
1469
1470 if (is_pos & 1) {
1471 xr[0][l + i] = opposite;
1472 xr[1][l + i] = left;
1473 }
1474 else
1475 xr[1][l + i] = opposite;
1476 }
1477 }
1478 }
1479 }
1480 else { /* !(header->flags & MAD_FLAG_LSF_EXT) */
1481 for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
1482 n = sfbwidth[sfbi];
1483
1484 if (!(modes[sfbi] & I_STEREO))
1485 continue;
1486
1487 is_pos = right_ch->scalefac[sfbi];
1488
1489 if (is_pos >= 7) { /* illegal intensity position */
1490 modes[sfbi] &= ~I_STEREO;
1491 continue;
1492 }
1493
1494 for (i = 0; i < n; ++i) {
1495 register mad_fixed_t left;
1496
1497 left = xr[0][l + i];
1498
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]);
1501 }
1502 }
1503 }
1504 }
1505
1506 /* middle/side stereo */
1507
1508 if (header->mode_extension & MS_STEREO) {
1509 register mad_fixed_t invsqrt2;
1510
1511 header->flags |= MAD_FLAG_MS_STEREO;
1512
1513 invsqrt2 = root_table[3 + -2];
1514
1515 for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
1516 n = sfbwidth[sfbi];
1517
1518 if (modes[sfbi] != MS_STEREO)
1519 continue;
1520
1521 for (i = 0; i < n; ++i) {
1522 register mad_fixed_t m, s;
1523
1524 m = xr[0][l + i];
1525 s = xr[1][l + i];
1526
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) */
1529 }
1530 }
1531 }
1532
1533 return MAD_ERROR_NONE;
1534}
1535
1536/*
1537 * NAME: III_aliasreduce()
1538 * DESCRIPTION: perform frequency line alias reduction
1539 */
1540static
1541void III_aliasreduce(mad_fixed_t xr[576], int lines)
1542{
1543 mad_fixed_t const *bound;
1544 int i;
1545
1546 bound = &xr[lines];
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;
1552
1553 a = xr[-1 - i];
1554 b = xr[ i];
1555
1556# if defined(ASO_ZEROCHECK)
1557 if (a | b) {
1558# endif
1559 MAD_F_ML0(hi, lo, a, cs[i]);
1560 MAD_F_MLA(hi, lo, -b, ca[i]);
1561
1562 xr[-1 - i] = MAD_F_MLZ(hi, lo);
1563
1564 MAD_F_ML0(hi, lo, b, cs[i]);
1565 MAD_F_MLA(hi, lo, a, ca[i]);
1566
1567 xr[ i] = MAD_F_MLZ(hi, lo);
1568# if defined(ASO_ZEROCHECK)
1569 }
1570# endif
1571 }
1572 }
1573}
1574
1575# if defined(ASO_IMDCT)
1576void III_imdct_l(mad_fixed_t const [18], mad_fixed_t [36], unsigned int);
1577# else
1578# if 1
1579static
1580void fastsdct(mad_fixed_t const x[9], mad_fixed_t y[18])
1581{
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;
1585
1586 enum {
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) */
1594 };
1595
1596 a0 = x[3] + x[5];
1597 a1 = x[3] - x[5];
1598 a2 = x[6] + x[2];
1599 a3 = x[6] - x[2];
1600 a4 = x[1] + x[7];
1601 a5 = x[1] - x[7];
1602 a6 = x[8] + x[0];
1603 a7 = x[8] - x[0];
1604
1605 a8 = a0 + a2;
1606 a9 = a0 - a2;
1607 a10 = a0 - a6;
1608 a11 = a2 - a6;
1609 a12 = a8 + a6;
1610 a13 = a1 - a3;
1611 a14 = a13 + a7;
1612 a15 = a3 + a7;
1613 a16 = a1 - a7;
1614 a17 = a1 + a3;
1615
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);
1624
1625 a18 = x[4] + a4;
1626 a19 = 2 * x[4] - a4;
1627 a20 = a19 + m5;
1628 a21 = a19 - m5;
1629 a22 = a19 + m6;
1630 a23 = m4 + m2;
1631 a24 = m4 - m2;
1632 a25 = m4 + m1;
1633
1634 /* output to every other slot for convenience */
1635
1636 y[ 0] = a18 + a12;
1637 y[ 2] = m0 - a25;
1638 y[ 4] = m7 - a20;
1639 y[ 6] = m3;
1640 y[ 8] = a21 - m6;
1641 y[10] = a24 - m1;
1642 y[12] = a12 - 2 * a18;
1643 y[14] = a23 + m0;
1644 y[16] = a22 + m7;
1645}
1646
1647static inline
1648void sdctII(mad_fixed_t const x[18], mad_fixed_t X[18])
1649{
1650 mad_fixed_t tmp[9];
1651 int i;
1652
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)
1658 };
1659
1660 /* divide the 18-point SDCT-II into two 9-point SDCT-IIs */
1661
1662 /* even input butterfly */
1663
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];
1668 }
1669
1670 fastsdct(tmp, &X[0]);
1671
1672 /* odd input butterfly and scaling */
1673
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]);
1678 }
1679
1680 fastsdct(tmp, &X[1]);
1681
1682 /* output accumulation */
1683
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];
1689 }
1690}
1691
1692static inline
1693void dctIV(mad_fixed_t const y[18], mad_fixed_t X[18])
1694{
1695 mad_fixed_t tmp[18];
1696 int i;
1697
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)
1706 };
1707
1708 /* scaling */
1709
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]);
1714 }
1715
1716 /* SDCT-II */
1717
1718 sdctII(tmp, X);
1719
1720 /* scale reduction and output accumulation */
1721
1722 X[0] /= 2;
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];
1728 }
1729 X[17] = X[17] / 2 - X[16];
1730}
1731
1732/*
1733 * NAME: imdct36
1734 * DESCRIPTION: perform X[18]->x[36] IMDCT using Szu-Wei Lee's fast algorithm
1735 */
1736static inline
1737void imdct36(mad_fixed_t const x[18], mad_fixed_t y[36])
1738{
1739 mad_fixed_t tmp[18];
1740 int i;
1741
1742 /* DCT-IV */
1743
1744 dctIV(x, tmp);
1745
1746 /* convert 18-point DCT-IV to 36-point IMDCT */
1747
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)];
1752 }
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];
1757 }
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];
1762 }
1763}
1764# else
1765/*
1766 * NAME: imdct36
1767 * DESCRIPTION: perform X[18]->x[36] IMDCT
1768 */
1769static inline
1770void imdct36(mad_fixed_t const X[18], mad_fixed_t x[36])
1771{
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;
1776
1777 MAD_F_ML0(hi, lo, X[4], MAD_F(0x0ec835e8));
1778 MAD_F_MLA(hi, lo, X[13], MAD_F(0x061f78aa));
1779
1780 t6 = MAD_F_MLZ(hi, lo);
1781
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));
1784
1785 t0 = MAD_F_MLZ(hi, lo);
1786
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));
1791
1792 x[7] = MAD_F_MLZ(hi, lo);
1793 x[10] = -x[7];
1794
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));
1799
1800 x[19] = x[34] = MAD_F_MLZ(hi, lo) - t0;
1801
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];
1804
1805 MAD_F_ML0(hi, lo, t12, -MAD_F(0x0ec835e8));
1806 MAD_F_MLA(hi, lo, t13, MAD_F(0x061f78aa));
1807
1808 x[22] = x[31] = MAD_F_MLZ(hi, lo) + t0;
1809
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));
1814
1815 t1 = MAD_F_MLZ(hi, lo) + t6;
1816
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));
1829
1830 x[6] = MAD_F_MLZ(hi, lo) + t1;
1831 x[11] = -x[6];
1832
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));
1845
1846 x[23] = x[30] = MAD_F_MLZ(hi, lo) + t1;
1847
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));
1860
1861 x[18] = x[35] = MAD_F_MLZ(hi, lo) - t1;
1862
1863 MAD_F_ML0(hi, lo, X[4], MAD_F(0x061f78aa));
1864 MAD_F_MLA(hi, lo, X[13], -MAD_F(0x0ec835e8));
1865
1866 t7 = MAD_F_MLZ(hi, lo);
1867
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));
1872
1873 t2 = MAD_F_MLZ(hi, lo);
1874
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));
1887
1888 x[5] = MAD_F_MLZ(hi, lo);
1889 x[12] = -x[5];
1890
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));
1903
1904 x[0] = MAD_F_MLZ(hi, lo) + t2;
1905 x[17] = -x[0];
1906
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));
1919
1920 x[24] = x[29] = MAD_F_MLZ(hi, lo) + t2;
1921
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));
1926
1927 t3 = MAD_F_MLZ(hi, lo) + t7;
1928
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));
1941
1942 x[8] = MAD_F_MLZ(hi, lo) + t3;
1943 x[9] = -x[8];
1944
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));
1957
1958 x[21] = x[32] = MAD_F_MLZ(hi, lo) + t3;
1959
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));
1972
1973 x[20] = x[33] = MAD_F_MLZ(hi, lo) - t3;
1974
1975 MAD_F_ML0(hi, lo, t14, -MAD_F(0x0ec835e8));
1976 MAD_F_MLA(hi, lo, t15, MAD_F(0x061f78aa));
1977
1978 t4 = MAD_F_MLZ(hi, lo) - t7;
1979
1980 MAD_F_ML0(hi, lo, t12, MAD_F(0x061f78aa));
1981 MAD_F_MLA(hi, lo, t13, MAD_F(0x0ec835e8));
1982
1983 x[4] = MAD_F_MLZ(hi, lo) + t4;
1984 x[13] = -x[4];
1985
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));
1990
1991 x[1] = MAD_F_MLZ(hi, lo) + t4;
1992 x[16] = -x[1];
1993
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));
1998
1999 x[25] = x[28] = MAD_F_MLZ(hi, lo) + t4;
2000
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));
2005
2006 t5 = MAD_F_MLZ(hi, lo) - t6;
2007
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));
2020
2021 x[2] = MAD_F_MLZ(hi, lo) + t5;
2022 x[15] = -x[2];
2023
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));
2036
2037 x[3] = MAD_F_MLZ(hi, lo) + t5;
2038 x[14] = -x[3];
2039
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));
2052
2053 x[26] = x[27] = MAD_F_MLZ(hi, lo) + t5;
2054}
2055# endif
2056
2057/*
2058 * NAME: III_imdct_l()
2059 * DESCRIPTION: perform IMDCT and windowing for long blocks
2060 */
2061static
2062void III_imdct_l(mad_fixed_t const X[18], mad_fixed_t z[36],
2063 unsigned int block_type)
2064{
2065 unsigned int i;
2066
2067 /* IMDCT */
2068
2069 imdct36(X, z);
2070
2071 /* windowing */
2072
2073 switch (block_type) {
2074 case 0: /* normal window */
2075# if defined(ASO_INTERLEAVE1)
2076 {
2077 register mad_fixed_t tmp1, tmp2;
2078
2079 tmp1 = window_l[0];
2080 tmp2 = window_l[1];
2081
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];
2087 }
2088
2089 z[34] = mad_f_mul(z[34], tmp1);
2090 z[35] = mad_f_mul(z[35], tmp2);
2091 }
2092# elif defined(ASO_INTERLEAVE2)
2093 {
2094 register mad_fixed_t tmp1, tmp2;
2095
2096 tmp1 = z[0];
2097 tmp2 = window_l[0];
2098
2099 for (i = 0; i < 35; ++i) {
2100 z[i] = mad_f_mul(tmp1, tmp2);
2101 tmp1 = z[i + 1];
2102 tmp2 = window_l[i + 1];
2103 }
2104
2105 z[35] = mad_f_mul(tmp1, tmp2);
2106 }
2107# elif 1
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]);
2113 }
2114# else
2115 for (i = 0; i < 36; ++i) z[i] = mad_f_mul(z[i], window_l[i]);
2116# endif
2117 break;
2118
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]);
2124 }
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;
2128 break;
2129
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]);
2138 }
2139 break;
2140 }
2141}
2142# endif /* ASO_IMDCT */
2143
2144/*
2145 * NAME: III_imdct_s()
2146 * DESCRIPTION: perform IMDCT and windowing for short blocks
2147 */
2148static
2149void III_imdct_s(mad_fixed_t const X[18], mad_fixed_t z[36])
2150{
2151 mad_fixed_t y[36], *yptr;
2152 mad_fixed_t const *wptr;
2153 int w, i;
2154 register mad_fixed64hi_t hi;
2155 register mad_fixed64lo_t lo;
2156
2157 /* IMDCT */
2158
2159 yptr = &y[0];
2160
2161 for (w = 0; w < 3; ++w) {
2162 register mad_fixed_t const (*s)[6];
2163
2164 s = imdct_s;
2165
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]);
2173
2174 yptr[i + 0] = MAD_F_MLZ(hi, lo);
2175 yptr[5 - i] = -yptr[i + 0];
2176
2177 ++s;
2178
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]);
2185
2186 yptr[ i + 6] = MAD_F_MLZ(hi, lo);
2187 yptr[11 - i] = yptr[i + 6];
2188
2189 ++s;
2190 }
2191
2192 yptr += 12;
2193 X += 6;
2194 }
2195
2196 /* windowing, overlapping and concatenation */
2197
2198 yptr = &y[0];
2199 wptr = &window_s[0];
2200
2201 for (i = 0; i < 6; ++i) {
2202 z[i + 0] = 0;
2203 z[i + 6] = mad_f_mul(yptr[ 0 + 0], wptr[0]);
2204
2205 MAD_F_ML0(hi, lo, yptr[ 0 + 6], wptr[6]);
2206 MAD_F_MLA(hi, lo, yptr[12 + 0], wptr[0]);
2207
2208 z[i + 12] = MAD_F_MLZ(hi, lo);
2209
2210 MAD_F_ML0(hi, lo, yptr[12 + 6], wptr[6]);
2211 MAD_F_MLA(hi, lo, yptr[24 + 0], wptr[0]);
2212
2213 z[i + 18] = MAD_F_MLZ(hi, lo);
2214
2215 z[i + 24] = mad_f_mul(yptr[24 + 6], wptr[6]);
2216 z[i + 30] = 0;
2217
2218 ++yptr;
2219 ++wptr;
2220 }
2221}
2222
2223/*
2224 * NAME: III_overlap()
2225 * DESCRIPTION: perform overlap-add of windowed IMDCT outputs
2226 */
2227static
2228void III_overlap(mad_fixed_t const output[36], mad_fixed_t overlap[18],
2229 mad_fixed_t sample[18][32], unsigned int sb)
2230{
2231 unsigned int i;
2232
2233# if defined(ASO_INTERLEAVE2)
2234 {
2235 register mad_fixed_t tmp1, tmp2;
2236
2237 tmp1 = overlap[0];
2238 tmp2 = overlap[1];
2239
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];
2244
2245 sample[i + 1][sb] = output[i + 1 + 0] + tmp2;
2246 overlap[i + 1] = output[i + 1 + 18];
2247 tmp2 = overlap[i + 3];
2248 }
2249
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];
2254 }
2255# elif 0
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];
2259
2260 sample[i + 1][sb] = output[i + 1 + 0] + overlap[i + 1];
2261 overlap[i + 1] = output[i + 1 + 18];
2262 }
2263# else
2264 for (i = 0; i < 18; ++i) {
2265 sample[i][sb] = output[i + 0] + overlap[i];
2266 overlap[i] = output[i + 18];
2267 }
2268# endif
2269}
2270
2271/*
2272 * NAME: III_overlap_z()
2273 * DESCRIPTION: perform "overlap-add" of zero IMDCT outputs
2274 */
2275static inline
2276void III_overlap_z(mad_fixed_t overlap[18],
2277 mad_fixed_t sample[18][32], unsigned int sb)
2278{
2279 unsigned int i;
2280
2281# if defined(ASO_INTERLEAVE2)
2282 {
2283 register mad_fixed_t tmp1, tmp2;
2284
2285 tmp1 = overlap[0];
2286 tmp2 = overlap[1];
2287
2288 for (i = 0; i < 16; i += 2) {
2289 sample[i + 0][sb] = tmp1;
2290 overlap[i + 0] = 0;
2291 tmp1 = overlap[i + 2];
2292
2293 sample[i + 1][sb] = tmp2;
2294 overlap[i + 1] = 0;
2295 tmp2 = overlap[i + 3];
2296 }
2297
2298 sample[16][sb] = tmp1;
2299 overlap[16] = 0;
2300 sample[17][sb] = tmp2;
2301 overlap[17] = 0;
2302 }
2303# else
2304 for (i = 0; i < 18; ++i) {
2305 sample[i][sb] = overlap[i];
2306 overlap[i] = 0;
2307 }
2308# endif
2309}
2310
2311/*
2312 * NAME: III_freqinver()
2313 * DESCRIPTION: perform subband frequency inversion for odd sample lines
2314 */
2315static
2316void III_freqinver(mad_fixed_t sample[18][32], unsigned int sb)
2317{
2318 unsigned int i;
2319
2320# if 1 || defined(ASO_INTERLEAVE1) || defined(ASO_INTERLEAVE2)
2321 {
2322 register mad_fixed_t tmp1, tmp2;
2323
2324 tmp1 = sample[1][sb];
2325 tmp2 = sample[3][sb];
2326
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];
2332 }
2333
2334 sample[13][sb] = -tmp1;
2335 tmp1 = sample[17][sb];
2336 sample[15][sb] = -tmp2;
2337 sample[17][sb] = -tmp1;
2338 }
2339# else
2340 for (i = 1; i < 18; i += 2)
2341 sample[i][sb] = -sample[i][sb];
2342# endif
2343}
2344
2345/*
2346 * NAME: III_decode()
2347 * DESCRIPTION: decode frame main_data
2348 */
2349static
2350enum mad_error III_decode(struct mad_bitptr *ptr, struct mad_frame *frame,
2351 struct sideinfo *si, unsigned int nch)
2352{
2353 struct mad_header *header = &frame->header;
2354 unsigned int sfreqi, ngr, gr;
2355
2356 {
2357 unsigned int sfreq;
2358
2359 sfreq = header->samplerate;
2360 if (header->flags & MAD_FLAG_MPEG_2_5_EXT)
2361 sfreq *= 2;
2362
2363 /* 48000 => 0, 44100 => 1, 32000 => 2,
2364 24000 => 3, 22050 => 4, 16000 => 5 */
2365 sfreqi = ((sfreq >> 7) & 0x000f) +
2366 ((sfreq >> 15) & 0x0001) - 8;
2367
2368 if (header->flags & MAD_FLAG_MPEG_2_5_EXT)
2369 sfreqi += 3;
2370 }
2371
2372 /* scalefactors, Huffman decoding, requantization */
2373
2374 ngr = (header->flags & MAD_FLAG_LSF_EXT) ? 1 : 2;
2375
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];
2380 unsigned int ch;
2381 enum mad_error error;
2382
2383 for (ch = 0; ch < nch; ++ch) {
2384 struct channel *channel = &granule->ch[ch];
2385 unsigned int part2_length;
2386
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;
2391 }
2392
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);
2397 }
2398 else {
2399 part2_length = III_scalefactors(ptr, channel, &si->gr[0].ch[ch],
2400 gr == 0 ? 0 : si->scfsi[ch]);
2401 }
2402
2403 error = III_huffdecode(ptr, xr[ch], channel, sfbwidth[ch], part2_length);
2404 if (error)
2405 return error;
2406 }
2407
2408 /* joint stereo processing */
2409
2410 if (header->mode == MAD_MODE_JOINT_STEREO && header->mode_extension) {
2411 error = III_stereo(xr, granule, header, sfbwidth[0]);
2412 if (error)
2413 return error;
2414 }
2415
2416 /* reordering, alias reduction, IMDCT, overlap-add, frequency inversion */
2417
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];
2423
2424 if (channel->block_type == 2) {
2425 III_reorder(xr[ch], channel, sfbwidth[ch]);
2426
2427# if !defined(OPT_STRICT)
2428 /*
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.
2434 */
2435 if (channel->flags & mixed_block_flag)
2436 III_aliasreduce(xr[ch], 36);
2437# endif
2438 }
2439 else
2440 III_aliasreduce(xr[ch], 576);
2441
2442 l = 0;
2443
2444 /* subbands 0-1 */
2445
2446 if (channel->block_type != 2 || (channel->flags & mixed_block_flag)) {
2447 unsigned int block_type;
2448
2449 block_type = channel->block_type;
2450 if (channel->flags & mixed_block_flag)
2451 block_type = 0;
2452
2453 /* long blocks */
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);
2457 }
2458 }
2459 else {
2460 /* short blocks */
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);
2464 }
2465 }
2466
2467 III_freqinver(sample, 1);
2468
2469 /* (nonzero) subbands 2-31 */
2470
2471 i = 576;
2472 while (i > 36 && xr[ch][i - 1] == 0)
2473 --i;
2474
2475 sblimit = 32 - (576 - i) / 18;
2476
2477 if (channel->block_type != 2) {
2478 /* long blocks */
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);
2482
2483 if (sb & 1)
2484 III_freqinver(sample, sb);
2485 }
2486 }
2487 else {
2488 /* short blocks */
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);
2492
2493 if (sb & 1)
2494 III_freqinver(sample, sb);
2495 }
2496 }
2497
2498 /* remaining (zero) subbands */
2499
2500 for (sb = sblimit; sb < 32; ++sb) {
2501 III_overlap_z((*frame->overlap)[ch][sb], sample, sb);
2502
2503 if (sb & 1)
2504 III_freqinver(sample, sb);
2505 }
2506 }
2507 }
2508
2509 return MAD_ERROR_NONE;
2510}
2511
2512/*
2513 * NAME: layer->III()
2514 * DESCRIPTION: decode a single Layer III frame
2515 */
2516int mad_layer_III(struct mad_stream *stream, struct mad_frame *frame)
2517{
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;
2523 struct sideinfo si;
2524 enum mad_error error;
2525 int result = 0;
2526
2527 /* allocate Layer III dynamic structures */
2528
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;
2533 return -1;
2534 }
2535 }
2536
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;
2541 return -1;
2542 }
2543 }
2544
2545 nch = MAD_NCHANNELS(header);
2546 si_len = (header->flags & MAD_FLAG_LSF_EXT) ?
2547 (nch == 1 ? 9 : 17) : (nch == 1 ? 17 : 32);
2548
2549 /* check frame sanity */
2550
2551 if (stream->next_frame - mad_bit_nextbyte(&stream->ptr) <
2552 (signed int) si_len) {
2553 stream->error = MAD_ERROR_BADFRAMELEN;
2554 stream->md_len = 0;
2555 return -1;
2556 }
2557
2558 /* check CRC word */
2559
2560 if (header->flags & MAD_FLAG_PROTECTION) {
2561 header->crc_check =
2562 mad_bit_crc(stream->ptr, si_len * CHAR_BIT, header->crc_check);
2563
2564 if (header->crc_check != header->crc_target &&
2565 !(frame->options & MAD_OPTION_IGNORECRC)) {
2566 stream->error = MAD_ERROR_BADCRC;
2567 result = -1;
2568 }
2569 }
2570
2571 /* decode frame side information */
2572
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;
2577 result = -1;
2578 }
2579
2580 header->flags |= priv_bitlen;
2581 header->private_bits |= si.private_bits;
2582
2583 /* find main_data of next frame */
2584
2585 {
2586 struct mad_bitptr peek;
2587 unsigned long header;
2588
2589 mad_bit_init(&peek, stream->next_frame);
2590
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 */
2595
2596 next_md_begin =
2597 mad_bit_read(&peek, (header & 0x00080000L) /* ID */ ? 9 : 8);
2598 }
2599
2600 mad_bit_finish(&peek);
2601 }
2602
2603 /* find main_data of this frame */
2604
2605 frame_space = stream->next_frame - mad_bit_nextbyte(&stream->ptr);
2606
2607 if (next_md_begin > si.main_data_begin + frame_space)
2608 next_md_begin = 0;
2609
2610 md_len = si.main_data_begin + frame_space - next_md_begin;
2611
2612 frame_used = 0;
2613
2614 if (si.main_data_begin == 0) {
2615 ptr = stream->ptr;
2616 stream->md_len = 0;
2617
2618 frame_used = md_len;
2619 }
2620 else {
2621 if (si.main_data_begin > stream->md_len) {
2622 if (result == 0) {
2623 stream->error = MAD_ERROR_BADDATAPTR;
2624 result = -1;
2625 }
2626 }
2627 else {
2628 mad_bit_init(&ptr,
2629 *stream->main_data + stream->md_len - si.main_data_begin);
2630
2631 if (md_len > si.main_data_begin) {
2632 assert(stream->md_len + md_len -
2633 si.main_data_begin <= MAD_BUFFER_MDLEN);
2634
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;
2639 }
2640 }
2641 }
2642
2643 frame_free = frame_space - frame_used;
2644
2645 /* decode main_data */
2646
2647 if (result == 0) {
2648 error = III_decode(&ptr, frame, &si, nch);
2649 if (error) {
2650 stream->error = error;
2651 result = -1;
2652 }
2653
2654 /* designate ancillary bits */
2655
2656 stream->anc_ptr = ptr;
2657 stream->anc_bitlen = md_len * CHAR_BIT - data_bitlen;
2658 }
2659
2660# if 0 && defined(DEBUG)
2661 fprintf(stderr,
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);
2666# endif
2667
2668 /* preload main_data buffer with up to 511 bytes for next frame(s) */
2669
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;
2674 }
2675 else {
2676 if (md_len < si.main_data_begin) {
2677 unsigned int extra;
2678
2679 extra = si.main_data_begin - md_len;
2680 if (extra + frame_free > next_md_begin)
2681 extra = next_md_begin - frame_free;
2682
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;
2687 }
2688 }
2689 else
2690 stream->md_len = 0;
2691
2692 memcpy(*stream->main_data + stream->md_len,
2693 stream->next_frame - frame_free, frame_free);
2694 stream->md_len += frame_free;
2695 }
2696
2697 return result;
2698}