1 /*
2  * libmad - MPEG audio decoder library
3  * Copyright (C) 2000-2004 Underbit Technologies, Inc.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  *
19  * $Id: layer3.c,v 1.43 2004/01/23 09:41:32 rob Exp $
20  */
21 
22 # 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 
50 enum {
51   count1table_select = 0x01,
52   scalefac_scale     = 0x02,
53   preflag	     = 0x04,
54   mixed_block_flag   = 0x08
55 };
56 
57 enum {
58   I_STEREO  = 0x1,
59   MS_STEREO = 0x2
60 };
61 
62 struct 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  */
93 static
94 struct {
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  */
108 static
109 unsigned 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  */
139 static
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
143 };
144 
145 static
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
149 };
150 
151 static
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
155 };
156 
157 static
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
162 };
163 
164 static
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
169 };
170 
171 static
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
176 };
177 
178 static
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
184 };
185 
186 static
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
192 };
193 
194 static
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
200 };
201 
202 /*
203  * MPEG-2 scalefactor band widths
204  * derived from Table B.2 of ISO/IEC 13818-3
205  */
206 static
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
210 };
211 
212 static
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
216 };
217 
218 # define sfb_16000_long  sfb_22050_long
219 
220 static
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
225 };
226 
227 static
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
232 };
233 
234 static
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
239 };
240 
241 static
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
247 };
248 
249 static
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
255 };
256 
257 static
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
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 
272 static
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
276 };
277 
278 # define sfb_12000_short  sfb_16000_short
279 # define sfb_11025_short  sfb_12000_short
280 
281 static
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
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 */
293 static
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
299 };
300 
301 static
302 struct {
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  */
322 static
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
325 };
326 
327 /*
328  * table for requantization
329  *
330  * rq_table[x].mantissa * 2^(rq_table[x].exponent) = x^(4/3)
331  */
332 static
333 struct 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  */
346 static
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 */
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  */
365 static
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 */
371 };
372 
373 static
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 */
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  */
388 static
389 mad_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  */
400 static
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 */,
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  */
431 static
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 */,
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  */
448 static
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 */
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  */
466 static
467 mad_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  */
507 static
III_sideinfo(struct mad_bitptr * ptr,unsigned int nch,int lsf,struct sideinfo * si,unsigned int * data_bitlen,unsigned int * priv_bitlen)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)
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  */
598 static
III_scalefactors_lsf(struct mad_bitptr * ptr,struct channel * channel,struct channel * gr1ch,int mode_extension)599 unsigned 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  */
713 static
III_scalefactors(struct mad_bitptr * ptr,struct channel * channel,struct channel const * gr0ch,unsigned int scfsi)714 unsigned 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  */
811 static
III_exponents(struct channel const * channel,unsigned char const * sfbwidth,signed int exponents[39])812 void 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  */
882 static
III_requantize(unsigned int value,signed int exp)883 mad_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  */
932 static
III_huffdecode(struct mad_bitptr * ptr,mad_fixed_t xr[576],struct channel * channel,unsigned char const * sfbwidth,unsigned int part2_length)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)
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  */
1280 static
III_reorder(mad_fixed_t xr[576],struct channel const * channel,unsigned char const sfbwidth[39])1281 void 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  */
1327 static
III_stereo(mad_fixed_t xr[2][576],struct granule const * granule,struct mad_header * header,unsigned char const * sfbwidth)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)
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  */
1540 static
III_aliasreduce(mad_fixed_t xr[576],int lines)1541 void 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)
1576 void III_imdct_l(mad_fixed_t const [18], mad_fixed_t [36], unsigned int);
1577 # else
1578 #  if 1
1579 static
fastsdct(mad_fixed_t const x[9],mad_fixed_t y[18])1580 void 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 
1647 static inline
sdctII(mad_fixed_t const x[18],mad_fixed_t X[18])1648 void 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 
1692 static inline
dctIV(mad_fixed_t const y[18],mad_fixed_t X[18])1693 void 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  */
1736 static inline
imdct36(mad_fixed_t const x[18],mad_fixed_t y[36])1737 void 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  */
1769 static inline
imdct36(mad_fixed_t const X[18],mad_fixed_t x[36])1770 void 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  */
2061 static
III_imdct_l(mad_fixed_t const X[18],mad_fixed_t z[36],unsigned int block_type)2062 void 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  */
2148 static
III_imdct_s(mad_fixed_t const X[18],mad_fixed_t z[36])2149 void 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  */
2227 static
III_overlap(mad_fixed_t const output[36],mad_fixed_t overlap[18],mad_fixed_t sample[18][32],unsigned int sb)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)
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  */
2275 static inline
III_overlap_z(mad_fixed_t overlap[18],mad_fixed_t sample[18][32],unsigned int sb)2276 void 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  */
2315 static
III_freqinver(mad_fixed_t sample[18][32],unsigned int sb)2316 void 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  */
2349 static
III_decode(struct mad_bitptr * ptr,struct mad_frame * frame,struct sideinfo * si,unsigned int nch)2350 enum 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  */
mad_layer_III(struct mad_stream * stream,struct mad_frame * frame)2516 int 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   if (md_len + MAD_BUFFER_GUARD > MAD_BUFFER_MDLEN)
2612   {
2613 	stream->error = MAD_ERROR_LOSTSYNC;
2614 	stream->sync = 0;
2615 	return -1;
2616   }
2617 
2618   frame_used = 0;
2619 
2620   if (si.main_data_begin == 0) {
2621     ptr = stream->ptr;
2622     stream->md_len = 0;
2623 
2624     frame_used = md_len;
2625   }
2626   else {
2627     if (si.main_data_begin > stream->md_len) {
2628       if (result == 0) {
2629 	stream->error = MAD_ERROR_BADDATAPTR;
2630 	result = -1;
2631       }
2632     }
2633     else {
2634       mad_bit_init(&ptr,
2635 		   *stream->main_data + stream->md_len - si.main_data_begin);
2636 
2637       if (md_len > si.main_data_begin) {
2638 	assert(stream->md_len + md_len -
2639 	       si.main_data_begin <= MAD_BUFFER_MDLEN);
2640 
2641 	memcpy(*stream->main_data + stream->md_len,
2642 	       mad_bit_nextbyte(&stream->ptr),
2643 	       frame_used = md_len - si.main_data_begin);
2644 	stream->md_len += frame_used;
2645       }
2646     }
2647   }
2648 
2649   frame_free = frame_space - frame_used;
2650 
2651   /* decode main_data */
2652 
2653   if (result == 0) {
2654     error = III_decode(&ptr, frame, &si, nch);
2655     if (error) {
2656       stream->error = error;
2657       result = -1;
2658     }
2659 
2660     /* designate ancillary bits */
2661 
2662     stream->anc_ptr    = ptr;
2663     stream->anc_bitlen = md_len * CHAR_BIT - data_bitlen;
2664   }
2665 
2666 # if 0 && defined(DEBUG)
2667   fprintf(stderr,
2668 	  "main_data_begin:%u, md_len:%u, frame_free:%u, "
2669 	  "data_bitlen:%u, anc_bitlen: %u\n",
2670 	  si.main_data_begin, md_len, frame_free,
2671 	  data_bitlen, stream->anc_bitlen);
2672 # endif
2673 
2674   /* preload main_data buffer with up to 511 bytes for next frame(s) */
2675 
2676   if (frame_free >= next_md_begin) {
2677     memcpy(*stream->main_data,
2678 	   stream->next_frame - next_md_begin, next_md_begin);
2679     stream->md_len = next_md_begin;
2680   }
2681   else {
2682     if (md_len < si.main_data_begin) {
2683       unsigned int extra;
2684 
2685       extra = si.main_data_begin - md_len;
2686       if (extra + frame_free > next_md_begin)
2687 	extra = next_md_begin - frame_free;
2688 
2689       if (extra < stream->md_len) {
2690 	memmove(*stream->main_data,
2691 		*stream->main_data + stream->md_len - extra, extra);
2692 	stream->md_len = extra;
2693       }
2694     }
2695     else
2696       stream->md_len = 0;
2697 
2698     memcpy(*stream->main_data + stream->md_len,
2699 	   stream->next_frame - frame_free, frame_free);
2700     stream->md_len += frame_free;
2701   }
2702 
2703   return result;
2704 }
2705