1/*
2  This file is derived from
3
4  amp MPEG audio decoder (version 0.7.3)
5  (C) Tomislav Uzelac  1996,1997
6
7This software can be used freely for any purpose. It can be distributed
8freely, as long as it is not sold commercially without permission from
9Tomislav Uzelac <tuzelac@rasip.fer.hr>. However, including this software
10on CD_ROMs containing other free software is explicitly permitted even
11when a modest distribution fee is charged for the CD, as long as this
12software is not a primary selling argument for the CD.
13
14Building derived versions of this software is permitted, as long as they
15are not sold commercially without permission from Tomislav Uzelac
16<tuzelac@rasip.fer.hr>. Any derived versions must be clearly marked as
17such, and must be called by a name other than amp. Any derived versions
18must retain this copyright notice.
19*/
20
21/* buffer for the 'bit reservoir'
22*/
23#define BUFFER_SIZE     4096
24#define BUFFER_AUX      2048
25
26typedef struct mp3Info {
27  unsigned int headerInt;
28  int gotHeader;
29  int bytesPerFrame;
30  int id;
31  int fullID;
32  int cnt;
33  char rest[18][32][8][4];
34  int restlen;
35  int ind;
36  int bufind;
37  unsigned char buffer[BUFFER_SIZE+BUFFER_AUX];
38  int append;
39  int data;
40  float u[2][2][32][16];
41  int u_start[2];
42  int u_div[2];
43  int bitrate;
44  unsigned char lastByte;
45  unsigned char sr_index;
46
47  int nch;
48  int scalefac_l[2][2][22];
49  int scalefac_s[2][2][13][3];
50
51  int is[2][578];
52  float xr[2][32][18];
53  int *t_l,*t_s;
54  int non_zero[2]; /* this is 2*bigvalues+4*count1, i guess...*/
55  int is_max[21]; /* the maximum value of is_pos. for short blocks is_max[sfb=0] == is_max[6],
56                   * it's sloppy but i'm sick of waisting storage. blaah...
57                   */
58  int intensity_scale;
59
60  float stereo_samples[18][32][2];
61  float mono_samples[18][32];
62  float s[2][32][18];
63  float res[32][18];
64  /* append, data, buffer handled by swapping values */
65
66} mp3Info;
67
68/* "audio.h" */
69
70struct AUDIO_HEADER {
71        int ID;
72        int fullID;
73        int layer;
74        int protection_bit;
75        int bitrate_index;
76        int sampling_frequency;
77        int padding_bit;
78        int private_bit;
79        int mode;
80        int mode_extension;
81        int copyright;
82        int original;
83        int emphasis;
84};
85
86struct SIDE_INFO {
87        int main_data_begin;
88        int scfsi[2][4];
89        int part2_3_length[2][2];
90        int big_values[2][2];
91        int global_gain[2][2];
92        int scalefac_compress[2][2];
93        int window_switching_flag[2][2];
94        int block_type[2][2];
95        int mixed_block_flag[2][2];
96        int table_select[2][2][3];
97        int subblock_gain[2][2][3];
98        int region0_count[2][2];
99        int region1_count[2][2];
100        int preflag[2][2];
101        int scalefac_scale[2][2];
102        int count1table_select[2][2];
103        int error[2];
104};
105
106/*
107 * These three are changed as we access a specific sound
108*/
109unsigned char *gblBuffer;
110int gblAppend;
111int gblData;
112/* end move to local */
113
114/* win is pre loaded with window data, read-only*/
115float win[4][36];
116/*
117int t_sampling_frequency[2][3] = {
118   { 22050 , 24000 , 16000},
119   { 44100 , 48000 , 32000}
120};
121
122*/
123/* id=row,sr_index=element*/
124int t_sampling_frequency[4][3] = {
125{ 11025 , 12000 , 8000},  /* 0=v2.5*/
126{ 0,0,0},                 /*1=invalid*/
127{ 22050 , 24000 , 16000}, /*2=v2*/
128{ 44100 , 48000 , 32000}, /*3=v1 */
129};
130#if 0
131int SHOW_HEADER,SHOW_HEADER_DETAIL;
132int SHOW_SIDE_INFO,SHOW_SIDE_INFO_DETAIL;
133int SHOW_MDB,SHOW_MDB_DETAIL;
134int SHOW_HUFFMAN_ERRORS,SHOW_HUFFBITS;
135int SHOW_SCFSI,SHOW_BLOCK_TYPE,SHOW_TABLES,SHOW_BITRATE;
136int A_QUIET,A_SHOW_CNT,A_FORMAT_WAVE,A_DUMP_BINARY, A_OSCI;
137int A_WRITE_TO_FILE;
138int A_AUDIO_PLAY;
139int A_SET_VOLUME, A_SHOW_TIME;
140int A_MSG_STDOUT;
141#endif
142int sr_lookup[2] = {72000, 144000};
143short t_bitrate[2][3][15] = {{
144{0,32,48,56,64,80,96,112,128,144,160,176,192,224,256},
145{0,8,16,24,32,40,48,56,64,80,96,112,128,144,160},
146{0,8,16,24,32,40,48,56,64,80,96,112,128,144,160}
147},{
148{0,32,64,96,128,160,192,224,256,288,320,352,384,416,448},
149{0,32,48,56,64,80,96,112,128,160,192,224,256,320,384},
150{0,32,40,48,56,64,80,96,112,128,160,192,224,256,320}
151}};
152
153/* the last sfb is given implicitly on pg.28. of the standard. scalefactors
154 * for that one are 0, pretab also
155 */
156/* leftmost index denotes ID, so first three tables are for MPEG2 (header->ID==0)
157 * and the other three are for MPEG1 (header->ID==1)
158 */
159/* 22.05, 24, 16 */
160int t_b8_l[2][3][22]={{ /* table B.8b ISO/IEC 11172-3 */
161{5,11,17,23,29,35,43,53,65,79,95,115,139,167,199,237,283,335,395,463,521,575},
162{5,11,17,23,29,35,43,53,65,79,95,113,135,161,193,231,277,331,393,463,539,575},
163{5,11,17,23,29,35,43,53,65,79,95,115,139,167,199,237,283,335,395,463,521,575}
164},{
165{3,7,11,15,19,23,29,35,43,51,61,73,89,109,133,161,195,237,287,341,417,575},
166{3,7,11,15,19,23,29,35,41,49,59,71,87,105,127,155,189,229,275,329,383,575},
167{3,7,11,15,19,23,29,35,43,53,65,81,101,125,155,193,239,295,363,447,549,575}
168}};
169int t_b8_s[2][3][13]={{ /* table B.8b ISO/IEC 11172-3 */
170{3,7,11,17,23,31,41,55,73,99,131,173,191},
171{3,7,11,17,25,35,47,61,79,103,135,179,191},
172{3,7,11,17,25,35,47,61,79,103,133,173,191}
173},{
174{3,7,11,15,21,29,39,51,65,83,105,135,191},
175{3,7,11,15,21,27,37,49,63,79,99,125,191},
176{3,7,11,15,21,29,41,57,77,103,137,179,191}
177}};
178
179/* "getbits.h" */
180
181/* gethdr() error codes: NS == not supported
182*/
183#define GETHDR_ERR 1
184#define GETHDR_NS  2
185
186
187/* internal buffer, _bptr holds the position in _bits_
188*/
189static unsigned char _buffer[32];
190static int _bptr;
191
192static unsigned int _getbits(int n);
193static int _fillbfr(int size);
194static void getinfo(struct AUDIO_HEADER *header,struct SIDE_INFO *info);
195static int gethdr(struct AUDIO_HEADER *header);
196static void getcrc();
197static int fillbfr(int advance);
198static unsigned int viewbits(int n);
199static void sackbits(int n);
200static unsigned int getbits(int n);
201
202/* getdata.h */
203
204static char t_slen1[16]={0,0,0,0,3,1,1,1,2,2,2,3,3,3,4,4};
205static char t_slen2[16]={0,1,2,3,0,1,2,3,1,2,3,1,2,3,2,3};
206static int t_linbits[32]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,6,8,10,13,4,5,6,7,8,9,11,13};
207
208static  int _qsign(int x,int *q);
209static int decode_scalefactors(mp3Info *ext, struct SIDE_INFO *info,struct AUDIO_HEADER *header,int gr,int ch);
210static int decode_huffman_data(mp3Info *ext, struct SIDE_INFO *info,int gr,int ch,int ssize);
211void calculate_t43(void);
212
213/* my implementation of MPEG2 scalefactor decoding is, admitably, horrible
214 * anyway, just take a look at pg.18 of MPEG2 specs, and you'll know what
215 * this is all about
216 */
217static const char spooky_table[2][3][3][4]={
218{
219{ {6,5,5,5},   {9,9,9,9},   {6,9,9,9} },
220{ {6,5,7,3},   {9,9,12,6},  {6,9,12,6}},
221{ {11,10,0,0}, {18,18,0,0}, {15,18,0,0}}
222},
223{
224{ {7,7,7,0},   {12,12,12,0}, {6,15,12,0}},
225{ {6,6,6,3},   {12,9,9,6},   {6,12,9,6}},
226{ {8,8,5,0},   {15,12,9,0},  {6,18,9,0}}
227}};
228
229/* misc2.h */
230
231#define i_sq2   0.707106781188
232#define IS_ILLEGAL 0xfeed
233
234static void requantize_mono(mp3Info *ext, int gr,int ch,struct SIDE_INFO *info,struct AUDIO_HEADER *header);
235static void requantize_ms(mp3Info *ext, int gr,struct SIDE_INFO *info,struct AUDIO_HEADER *header);
236static void alias_reduction(mp3Info *ext, int ch);
237
238static  float fras_l(int sfb,int global_gain,int scalefac_scale,int scalefac,int preflag);
239static  float fras_s(int global_gain,int subblock_gain,int scalefac_scale,int scalefac);
240/*static  float fras2(int is,float a);*/
241static int find_isbound(mp3Info *ext, int isbound[3],int gr,struct SIDE_INFO *info,struct AUDIO_HEADER *header);
242static  void stereo_s(mp3Info *ext, int l,float a[2],int pos,int ms_flag,int is_pos,struct AUDIO_HEADER *header);
243static  void stereo_l(mp3Info *ext, int l,float a[2],int ms_flag,int is_pos,struct AUDIO_HEADER *header);
244static int hasSync (unsigned char *buf);
245static int locateNextFrame (unsigned char *tmp);
246int no_of_imdcts[2];
247
248static const int t_pretab[22]={0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,2,0};
249static const float t_is[7]={ 1.0f, 0.788675134596f, 0.633974596215f,
250                 0.5f, 0.366025403784f, 0.211324865405f, 0.0f};
251static const float t_is2[2][32]={
252{             1.0f,       0.840896f,       0.707107f,       0.594604f,            0.5f,       0.420448f,
253       0.353553f,       0.297302f,           0.25f,       0.210224f,       0.176777f,       0.148651f,
254          0.125f,       0.105112f,      0.0883883f,      0.0743254f},
255{             1.0f,       0.707107f,            0.5f,       0.353553f,           0.25f,       0.176777f,
256          0.125f,      0.0883883f,         0.0625f,      0.0441942f,        0.03125f,      0.0220971f,
257       0.015625f,      0.0110485f,      0.0078125f,     0.00552427f}
258};
259static const float Cs[8]={0.857492925712f, 0.881741997318f, 0.949628649103f,
260              0.983314592492f, 0.995517816065f, 0.999160558175f,
261              0.999899195243f, 0.999993155067f};
262static const float Ca[8]={-0.5144957554270f, -0.4717319685650f, -0.3133774542040f,
263              -0.1819131996110f, -0.0945741925262f, -0.0409655828852f,
264              -0.0141985685725f,        -0.00369997467375f};
265static const float tab[4]={1.f,1.189207115f,1.414213562f,1.6817928301f};
266static const float tabi[4]={1.f,0.840896415f,0.707106781f,0.594603557f};
267
268/* leftmost index denotes header->ID, so first three are for MPEG2
269 * and the others are for MPEG1
270 */
271static const short t_reorder[2][3][576]={{
272{  0,   1,   2,   3,   6,   7,   8,   9,  12,  13,  14,  15,   4,   5,  18,  19,  10,  11,  24,  25,
273  16,  17,  30,  31,  20,  21,  22,  23,  26,  27,  28,  29,  32,  33,  34,  35,  36,  37,  38,  39,
274  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
275  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  90,  91,
276  78,  79,  80,  81,  82,  83,  96,  97,  84,  85,  86,  87,  88,  89, 102, 103,  92,  93,  94,  95,
277 108, 109, 110, 111, 112, 113,  98,  99, 100, 101, 114, 115, 116, 117, 118, 119, 104, 105, 106, 107,
278 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 144, 145, 146, 147, 148, 149, 162, 163,
279 132, 133, 134, 135, 136, 137, 150, 151, 152, 153, 154, 155, 168, 169, 138, 139, 140, 141, 142, 143,
280 156, 157, 158, 159, 160, 161, 174, 175, 164, 165, 166, 167, 180, 181, 182, 183, 184, 185, 198, 199,
281 200, 201, 202, 203, 216, 217, 170, 171, 172, 173, 186, 187, 188, 189, 190, 191, 204, 205, 206, 207,
282 208, 209, 222, 223, 176, 177, 178, 179, 192, 193, 194, 195, 196, 197, 210, 211, 212, 213, 214, 215,
283 228, 229, 218, 219, 220, 221, 234, 235, 236, 237, 238, 239, 252, 253, 254, 255, 256, 257, 270, 271,
284 272, 273, 274, 275, 288, 289, 290, 291, 224, 225, 226, 227, 240, 241, 242, 243, 244, 245, 258, 259,
285 260, 261, 262, 263, 276, 277, 278, 279, 280, 281, 294, 295, 296, 297, 230, 231, 232, 233, 246, 247,
286 248, 249, 250, 251, 264, 265, 266, 267, 268, 269, 282, 283, 284, 285, 286, 287, 300, 301, 302, 303,
287 292, 293, 306, 307, 308, 309, 310, 311, 324, 325, 326, 327, 328, 329, 342, 343, 344, 345, 346, 347,
288 360, 361, 362, 363, 364, 365, 378, 379, 380, 381, 382, 383, 298, 299, 312, 313, 314, 315, 316, 317,
289 330, 331, 332, 333, 334, 335, 348, 349, 350, 351, 352, 353, 366, 367, 368, 369, 370, 371, 384, 385,
290 386, 387, 388, 389, 304, 305, 318, 319, 320, 321, 322, 323, 336, 337, 338, 339, 340, 341, 354, 355,
291 356, 357, 358, 359, 372, 373, 374, 375, 376, 377, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399,
292 400, 401, 414, 415, 416, 417, 418, 419, 432, 433, 434, 435, 436, 437, 450, 451, 452, 453, 454, 455,
293 468, 469, 470, 471, 472, 473, 486, 487, 488, 489, 490, 491, 504, 505, 506, 507, 508, 509, 402, 403,
294 404, 405, 406, 407, 420, 421, 422, 423, 424, 425, 438, 439, 440, 441, 442, 443, 456, 457, 458, 459,
295 460, 461, 474, 475, 476, 477, 478, 479, 492, 493, 494, 495, 496, 497, 510, 511, 512, 513, 514, 515,
296 408, 409, 410, 411, 412, 413, 426, 427, 428, 429, 430, 431, 444, 445, 446, 447, 448, 449, 462, 463,
297 464, 465, 466, 467, 480, 481, 482, 483, 484, 485, 498, 499, 500, 501, 502, 503, 516, 517, 518, 519,
298 520, 521, 522, 523, 524, 525, 526, 527, 540, 541, 542, 543, 544, 545, 558, 559, 560, 561, 562, 563,
299 528, 529, 530, 531, 532, 533, 546, 547, 548, 549, 550, 551, 564, 565, 566, 567, 568, 569, 534, 535,
300 536, 537, 538, 539, 552, 553, 554, 555, 556, 557, 570, 571, 572, 573, 574, 575},
301
302{  0,   1,   2,   3,   6,   7,   8,   9,  12,  13,  14,  15,   4,   5,  18,  19,  10,  11,  24,  25,
303  16,  17,  30,  31,  20,  21,  22,  23,  26,  27,  28,  29,  32,  33,  34,  35,  36,  37,  38,  39,
304  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
305  72,  73,  60,  61,  62,  63,  64,  65,  78,  79,  66,  67,  68,  69,  70,  71,  84,  85,  74,  75,
306  76,  77,  90,  91,  92,  93,  94,  95,  80,  81,  82,  83,  96,  97,  98,  99, 100, 101,  86,  87,
307  88,  89, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 126, 127, 128, 129, 130, 131,
308 114, 115, 116, 117, 118, 119, 132, 133, 134, 135, 136, 137, 120, 121, 122, 123, 124, 125, 138, 139,
309 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 162, 163, 164, 165, 166, 167, 180, 181, 150, 151,
310 152, 153, 154, 155, 168, 169, 170, 171, 172, 173, 186, 187, 156, 157, 158, 159, 160, 161, 174, 175,
311 176, 177, 178, 179, 192, 193, 182, 183, 184, 185, 198, 199, 200, 201, 202, 203, 216, 217, 218, 219,
312 220, 221, 234, 235, 188, 189, 190, 191, 204, 205, 206, 207, 208, 209, 222, 223, 224, 225, 226, 227,
313 240, 241, 194, 195, 196, 197, 210, 211, 212, 213, 214, 215, 228, 229, 230, 231, 232, 233, 246, 247,
314 236, 237, 238, 239, 252, 253, 254, 255, 256, 257, 270, 271, 272, 273, 274, 275, 288, 289, 290, 291,
315 292, 293, 306, 307, 242, 243, 244, 245, 258, 259, 260, 261, 262, 263, 276, 277, 278, 279, 280, 281,
316 294, 295, 296, 297, 298, 299, 312, 313, 248, 249, 250, 251, 264, 265, 266, 267, 268, 269, 282, 283,
317 284, 285, 286, 287, 300, 301, 302, 303, 304, 305, 318, 319, 308, 309, 310, 311, 324, 325, 326, 327,
318 328, 329, 342, 343, 344, 345, 346, 347, 360, 361, 362, 363, 364, 365, 378, 379, 380, 381, 382, 383,
319 396, 397, 398, 399, 314, 315, 316, 317, 330, 331, 332, 333, 334, 335, 348, 349, 350, 351, 352, 353,
320 366, 367, 368, 369, 370, 371, 384, 385, 386, 387, 388, 389, 402, 403, 404, 405, 320, 321, 322, 323,
321 336, 337, 338, 339, 340, 341, 354, 355, 356, 357, 358, 359, 372, 373, 374, 375, 376, 377, 390, 391,
322 392, 393, 394, 395, 408, 409, 410, 411, 400, 401, 414, 415, 416, 417, 418, 419, 432, 433, 434, 435,
323 436, 437, 450, 451, 452, 453, 454, 455, 468, 469, 470, 471, 472, 473, 486, 487, 488, 489, 490, 491,
324 504, 505, 506, 507, 508, 509, 522, 523, 524, 525, 526, 527, 406, 407, 420, 421, 422, 423, 424, 425,
325 438, 439, 440, 441, 442, 443, 456, 457, 458, 459, 460, 461, 474, 475, 476, 477, 478, 479, 492, 493,
326 494, 495, 496, 497, 510, 511, 512, 513, 514, 515, 528, 529, 530, 531, 532, 533, 412, 413, 426, 427,
327 428, 429, 430, 431, 444, 445, 446, 447, 448, 449, 462, 463, 464, 465, 466, 467, 480, 481, 482, 483,
328 484, 485, 498, 499, 500, 501, 502, 503, 516, 517, 518, 519, 520, 521, 534, 535, 536, 537, 538, 539,
329 540, 541, 542, 543, 544, 545, 558, 559, 560, 561, 562, 563, 546, 547, 548, 549, 550, 551, 564, 565,
330 566, 567, 568, 569, 552, 553, 554, 555, 556, 557, 570, 571, 572, 573, 574, 575},
331
332{  0,   1,   2,   3,   6,   7,   8,   9,  12,  13,  14,  15,   4,   5,  18,  19,  10,  11,  24,  25,
333  16,  17,  30,  31,  20,  21,  22,  23,  26,  27,  28,  29,  32,  33,  34,  35,  36,  37,  38,  39,
334  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
335  72,  73,  60,  61,  62,  63,  64,  65,  78,  79,  66,  67,  68,  69,  70,  71,  84,  85,  74,  75,
336  76,  77,  90,  91,  92,  93,  94,  95,  80,  81,  82,  83,  96,  97,  98,  99, 100, 101,  86,  87,
337  88,  89, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 126, 127, 128, 129, 130, 131,
338 114, 115, 116, 117, 118, 119, 132, 133, 134, 135, 136, 137, 120, 121, 122, 123, 124, 125, 138, 139,
339 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 162, 163, 164, 165, 166, 167, 180, 181, 150, 151,
340 152, 153, 154, 155, 168, 169, 170, 171, 172, 173, 186, 187, 156, 157, 158, 159, 160, 161, 174, 175,
341 176, 177, 178, 179, 192, 193, 182, 183, 184, 185, 198, 199, 200, 201, 202, 203, 216, 217, 218, 219,
342 220, 221, 234, 235, 188, 189, 190, 191, 204, 205, 206, 207, 208, 209, 222, 223, 224, 225, 226, 227,
343 240, 241, 194, 195, 196, 197, 210, 211, 212, 213, 214, 215, 228, 229, 230, 231, 232, 233, 246, 247,
344 236, 237, 238, 239, 252, 253, 254, 255, 256, 257, 270, 271, 272, 273, 274, 275, 288, 289, 290, 291,
345 292, 293, 306, 307, 242, 243, 244, 245, 258, 259, 260, 261, 262, 263, 276, 277, 278, 279, 280, 281,
346 294, 295, 296, 297, 298, 299, 312, 313, 248, 249, 250, 251, 264, 265, 266, 267, 268, 269, 282, 283,
347 284, 285, 286, 287, 300, 301, 302, 303, 304, 305, 318, 319, 308, 309, 310, 311, 324, 325, 326, 327,
348 328, 329, 342, 343, 344, 345, 346, 347, 360, 361, 362, 363, 364, 365, 378, 379, 380, 381, 382, 383,
349 396, 397, 314, 315, 316, 317, 330, 331, 332, 333, 334, 335, 348, 349, 350, 351, 352, 353, 366, 367,
350 368, 369, 370, 371, 384, 385, 386, 387, 388, 389, 402, 403, 320, 321, 322, 323, 336, 337, 338, 339,
351 340, 341, 354, 355, 356, 357, 358, 359, 372, 373, 374, 375, 376, 377, 390, 391, 392, 393, 394, 395,
352 408, 409, 398, 399, 400, 401, 414, 415, 416, 417, 418, 419, 432, 433, 434, 435, 436, 437, 450, 451,
353 452, 453, 454, 455, 468, 469, 470, 471, 472, 473, 486, 487, 488, 489, 490, 491, 504, 505, 506, 507,
354 508, 509, 404, 405, 406, 407, 420, 421, 422, 423, 424, 425, 438, 439, 440, 441, 442, 443, 456, 457,
355 458, 459, 460, 461, 474, 475, 476, 477, 478, 479, 492, 493, 494, 495, 496, 497, 510, 511, 512, 513,
356 514, 515, 410, 411, 412, 413, 426, 427, 428, 429, 430, 431, 444, 445, 446, 447, 448, 449, 462, 463,
357 464, 465, 466, 467, 480, 481, 482, 483, 484, 485, 498, 499, 500, 501, 502, 503, 516, 517, 518, 519,
358 520, 521, 522, 523, 524, 525, 526, 527, 540, 541, 542, 543, 544, 545, 558, 559, 560, 561, 562, 563,
359 528, 529, 530, 531, 532, 533, 546, 547, 548, 549, 550, 551, 564, 565, 566, 567, 568, 569, 534, 535,
360 536, 537, 538, 539, 552, 553, 554, 555, 556, 557, 570, 571, 572, 573, 574, 575}
361},
362{
363{  0,   1,   2,   3,   6,   7,   8,   9,  12,  13,  14,  15,   4,   5,  18,  19,  10,  11,  24,  25,
364  16,  17,  30,  31,  20,  21,  22,  23,  26,  27,  28,  29,  32,  33,  34,  35,  36,  37,  38,  39,
365  42,  43,  44,  45,  48,  49,  50,  51,  40,  41,  54,  55,  56,  57,  46,  47,  60,  61,  62,  63,
366  52,  53,  66,  67,  68,  69,  58,  59,  72,  73,  74,  75,  76,  77,  64,  65,  78,  79,  80,  81,
367  82,  83,  70,  71,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95, 108, 109, 110, 111,
368  96,  97,  98,  99, 100, 101, 114, 115, 116, 117, 102, 103, 104, 105, 106, 107, 120, 121, 122, 123,
369 112, 113, 126, 127, 128, 129, 130, 131, 144, 145, 146, 147, 118, 119, 132, 133, 134, 135, 136, 137,
370 150, 151, 152, 153, 124, 125, 138, 139, 140, 141, 142, 143, 156, 157, 158, 159, 148, 149, 162, 163,
371 164, 165, 166, 167, 180, 181, 182, 183, 184, 185, 154, 155, 168, 169, 170, 171, 172, 173, 186, 187,
372 188, 189, 190, 191, 160, 161, 174, 175, 176, 177, 178, 179, 192, 193, 194, 195, 196, 197, 198, 199,
373 200, 201, 202, 203, 216, 217, 218, 219, 220, 221, 234, 235, 236, 237, 238, 239, 204, 205, 206, 207,
374 208, 209, 222, 223, 224, 225, 226, 227, 240, 241, 242, 243, 244, 245, 210, 211, 212, 213, 214, 215,
375 228, 229, 230, 231, 232, 233, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 270, 271,
376 272, 273, 274, 275, 288, 289, 290, 291, 292, 293, 306, 307, 308, 309, 258, 259, 260, 261, 262, 263,
377 276, 277, 278, 279, 280, 281, 294, 295, 296, 297, 298, 299, 312, 313, 314, 315, 264, 265, 266, 267,
378 268, 269, 282, 283, 284, 285, 286, 287, 300, 301, 302, 303, 304, 305, 318, 319, 320, 321, 310, 311,
379 324, 325, 326, 327, 328, 329, 342, 343, 344, 345, 346, 347, 360, 361, 362, 363, 364, 365, 378, 379,
380 380, 381, 382, 383, 396, 397, 398, 399, 316, 317, 330, 331, 332, 333, 334, 335, 348, 349, 350, 351,
381 352, 353, 366, 367, 368, 369, 370, 371, 384, 385, 386, 387, 388, 389, 402, 403, 404, 405, 322, 323,
382 336, 337, 338, 339, 340, 341, 354, 355, 356, 357, 358, 359, 372, 373, 374, 375, 376, 377, 390, 391,
383 392, 393, 394, 395, 408, 409, 410, 411, 400, 401, 414, 415, 416, 417, 418, 419, 432, 433, 434, 435,
384 436, 437, 450, 451, 452, 453, 454, 455, 468, 469, 470, 471, 472, 473, 486, 487, 488, 489, 490, 491,
385 504, 505, 506, 507, 508, 509, 522, 523, 524, 525, 526, 527, 540, 541, 542, 543, 544, 545, 558, 559,
386 560, 561, 562, 563, 406, 407, 420, 421, 422, 423, 424, 425, 438, 439, 440, 441, 442, 443, 456, 457,
387 458, 459, 460, 461, 474, 475, 476, 477, 478, 479, 492, 493, 494, 495, 496, 497, 510, 511, 512, 513,
388 514, 515, 528, 529, 530, 531, 532, 533, 546, 547, 548, 549, 550, 551, 564, 565, 566, 567, 568, 569,
389 412, 413, 426, 427, 428, 429, 430, 431, 444, 445, 446, 447, 448, 449, 462, 463, 464, 465, 466, 467,
390 480, 481, 482, 483, 484, 485, 498, 499, 500, 501, 502, 503, 516, 517, 518, 519, 520, 521, 534, 535,
391 536, 537, 538, 539, 552, 553, 554, 555, 556, 557, 570, 571, 572, 573, 574, 575},
392
393{  0,   1,   2,   3,   6,   7,   8,   9,  12,  13,  14,  15,   4,   5,  18,  19,  10,  11,  24,  25,
394  16,  17,  30,  31,  20,  21,  22,  23,  26,  27,  28,  29,  32,  33,  34,  35,  36,  37,  38,  39,
395  42,  43,  44,  45,  48,  49,  50,  51,  40,  41,  54,  55,  56,  57,  46,  47,  60,  61,  62,  63,
396  52,  53,  66,  67,  68,  69,  58,  59,  72,  73,  74,  75,  64,  65,  78,  79,  80,  81,  70,  71,
397  84,  85,  86,  87,  76,  77,  90,  91,  92,  93,  94,  95, 108, 109,  82,  83,  96,  97,  98,  99,
398 100, 101, 114, 115,  88,  89, 102, 103, 104, 105, 106, 107, 120, 121, 110, 111, 112, 113, 126, 127,
399 128, 129, 130, 131, 144, 145, 116, 117, 118, 119, 132, 133, 134, 135, 136, 137, 150, 151, 122, 123,
400 124, 125, 138, 139, 140, 141, 142, 143, 156, 157, 146, 147, 148, 149, 162, 163, 164, 165, 166, 167,
401 180, 181, 182, 183, 152, 153, 154, 155, 168, 169, 170, 171, 172, 173, 186, 187, 188, 189, 158, 159,
402 160, 161, 174, 175, 176, 177, 178, 179, 192, 193, 194, 195, 184, 185, 198, 199, 200, 201, 202, 203,
403 216, 217, 218, 219, 220, 221, 234, 235, 190, 191, 204, 205, 206, 207, 208, 209, 222, 223, 224, 225,
404 226, 227, 240, 241, 196, 197, 210, 211, 212, 213, 214, 215, 228, 229, 230, 231, 232, 233, 246, 247,
405 236, 237, 238, 239, 252, 253, 254, 255, 256, 257, 270, 271, 272, 273, 274, 275, 288, 289, 290, 291,
406 242, 243, 244, 245, 258, 259, 260, 261, 262, 263, 276, 277, 278, 279, 280, 281, 294, 295, 296, 297,
407 248, 249, 250, 251, 264, 265, 266, 267, 268, 269, 282, 283, 284, 285, 286, 287, 300, 301, 302, 303,
408 292, 293, 306, 307, 308, 309, 310, 311, 324, 325, 326, 327, 328, 329, 342, 343, 344, 345, 346, 347,
409 360, 361, 362, 363, 364, 365, 298, 299, 312, 313, 314, 315, 316, 317, 330, 331, 332, 333, 334, 335,
410 348, 349, 350, 351, 352, 353, 366, 367, 368, 369, 370, 371, 304, 305, 318, 319, 320, 321, 322, 323,
411 336, 337, 338, 339, 340, 341, 354, 355, 356, 357, 358, 359, 372, 373, 374, 375, 376, 377, 378, 379,
412 380, 381, 382, 383, 396, 397, 398, 399, 400, 401, 414, 415, 416, 417, 418, 419, 432, 433, 434, 435,
413 436, 437, 450, 451, 452, 453, 454, 455, 468, 469, 470, 471, 472, 473, 486, 487, 488, 489, 490, 491,
414 504, 505, 506, 507, 508, 509, 522, 523, 524, 525, 526, 527, 540, 541, 542, 543, 544, 545, 558, 559,
415 560, 561, 562, 563, 384, 385, 386, 387, 388, 389, 402, 403, 404, 405, 406, 407, 420, 421, 422, 423,
416 424, 425, 438, 439, 440, 441, 442, 443, 456, 457, 458, 459, 460, 461, 474, 475, 476, 477, 478, 479,
417 492, 493, 494, 495, 496, 497, 510, 511, 512, 513, 514, 515, 528, 529, 530, 531, 532, 533, 546, 547,
418 548, 549, 550, 551, 564, 565, 566, 567, 568, 569, 390, 391, 392, 393, 394, 395, 408, 409, 410, 411,
419 412, 413, 426, 427, 428, 429, 430, 431, 444, 445, 446, 447, 448, 449, 462, 463, 464, 465, 466, 467,
420 480, 481, 482, 483, 484, 485, 498, 499, 500, 501, 502, 503, 516, 517, 518, 519, 520, 521, 534, 535,
421 536, 537, 538, 539, 552, 553, 554, 555, 556, 557, 570, 571, 572, 573, 574, 575},
422
423{  0,   1,   2,   3,   6,   7,   8,   9,  12,  13,  14,  15,   4,   5,  18,  19,  10,  11,  24,  25,
424  16,  17,  30,  31,  20,  21,  22,  23,  26,  27,  28,  29,  32,  33,  34,  35,  36,  37,  38,  39,
425  42,  43,  44,  45,  48,  49,  50,  51,  40,  41,  54,  55,  56,  57,  46,  47,  60,  61,  62,  63,
426  52,  53,  66,  67,  68,  69,  58,  59,  72,  73,  74,  75,  76,  77,  64,  65,  78,  79,  80,  81,
427  82,  83,  70,  71,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95, 108, 109, 110, 111,
428 112, 113,  96,  97,  98,  99, 100, 101, 114, 115, 116, 117, 118, 119, 102, 103, 104, 105, 106, 107,
429 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 144, 145, 146, 147, 148, 149, 162, 163,
430 164, 165, 132, 133, 134, 135, 136, 137, 150, 151, 152, 153, 154, 155, 168, 169, 170, 171, 138, 139,
431 140, 141, 142, 143, 156, 157, 158, 159, 160, 161, 174, 175, 176, 177, 166, 167, 180, 181, 182, 183,
432 184, 185, 198, 199, 200, 201, 202, 203, 216, 217, 218, 219, 220, 221, 172, 173, 186, 187, 188, 189,
433 190, 191, 204, 205, 206, 207, 208, 209, 222, 223, 224, 225, 226, 227, 178, 179, 192, 193, 194, 195,
434 196, 197, 210, 211, 212, 213, 214, 215, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
435 252, 253, 254, 255, 256, 257, 270, 271, 272, 273, 274, 275, 288, 289, 290, 291, 292, 293, 306, 307,
436 240, 241, 242, 243, 244, 245, 258, 259, 260, 261, 262, 263, 276, 277, 278, 279, 280, 281, 294, 295,
437 296, 297, 298, 299, 312, 313, 246, 247, 248, 249, 250, 251, 264, 265, 266, 267, 268, 269, 282, 283,
438 284, 285, 286, 287, 300, 301, 302, 303, 304, 305, 318, 319, 308, 309, 310, 311, 324, 325, 326, 327,
439 328, 329, 342, 343, 344, 345, 346, 347, 360, 361, 362, 363, 364, 365, 378, 379, 380, 381, 382, 383,
440 396, 397, 398, 399, 400, 401, 314, 315, 316, 317, 330, 331, 332, 333, 334, 335, 348, 349, 350, 351,
441 352, 353, 366, 367, 368, 369, 370, 371, 384, 385, 386, 387, 388, 389, 402, 403, 404, 405, 406, 407,
442 320, 321, 322, 323, 336, 337, 338, 339, 340, 341, 354, 355, 356, 357, 358, 359, 372, 373, 374, 375,
443 376, 377, 390, 391, 392, 393, 394, 395, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419,
444 432, 433, 434, 435, 436, 437, 450, 451, 452, 453, 454, 455, 468, 469, 470, 471, 472, 473, 486, 487,
445 488, 489, 490, 491, 504, 505, 506, 507, 508, 509, 522, 523, 524, 525, 526, 527, 420, 421, 422, 423,
446 424, 425, 438, 439, 440, 441, 442, 443, 456, 457, 458, 459, 460, 461, 474, 475, 476, 477, 478, 479,
447 492, 493, 494, 495, 496, 497, 510, 511, 512, 513, 514, 515, 528, 529, 530, 531, 532, 533, 426, 427,
448 428, 429, 430, 431, 444, 445, 446, 447, 448, 449, 462, 463, 464, 465, 466, 467, 480, 481, 482, 483,
449 484, 485, 498, 499, 500, 501, 502, 503, 516, 517, 518, 519, 520, 521, 534, 535, 536, 537, 538, 539,
450 540, 541, 542, 543, 544, 545, 558, 559, 560, 561, 562, 563, 546, 547, 548, 549, 550, 551, 564, 565,
451 566, 567, 568, 569, 552, 553, 554, 555, 556, 557, 570, 571, 572, 573, 574, 575}
452}};
453/* TFW: increased size from 8192 to 8206 to accomodate some encoders that use additional 14 lookups
454        also changed static initializer with function to improve accuracy and reduce chance of typo
455*/
456static float t_43[8207];
457
458/* huffman.h  */
459
460static int huffman_decode(int tbl,int *x,int *y);
461
462#define N_CUE 16
463#define NC_O  4
464
465/* these are the huffman tables, rearranged for lookup
466*/
467unsigned int h0[1]={0x0};
468unsigned int h1[4]={0x311, 0x20000301, 0x40000210, 0x80000100};
469unsigned int h2[9]={0x622, 0x4000602, 0x8000512, 0x10000521, 0x18000520, 0x20000311, 0x40000301, 0x60000310,
470 0x80000100};
471unsigned int h3[9]={ 0x622, 0x4000602, 0x8000512, 0x10000521, 0x18000520, 0x20000310, 0x40000211, 0x80000201,
472 0xc0000200};
473unsigned int h5[16]={0x833, 0x1000823, 0x2000732, 0x4000631, 0x8000713, 0xa000703, 0xc000730, 0xe000722,
474 0x10000612, 0x14000621, 0x18000602, 0x1c000620, 0x20000311, 0x40000301, 0x60000310, 0x80000100};
475unsigned int h6[16]={0x733, 0x2000703, 0x4000623, 0x8000632, 0xc000630, 0x10000513, 0x18000531, 0x20000522,
476 0x28000502, 0x30000412, 0x40000421, 0x50000420, 0x60000301, 0x80000211, 0xc0000310, 0xe0000300};
477unsigned int h7[36]={ 0xa55, 0x400a45, 0x800a54, 0xc00a53, 0x1000935, 0x1800944, 0x2000925, 0x2800952,
478 0x3000815, 0x4000851, 0x5000905, 0x5800934, 0x6000850, 0x7000943, 0x7800933, 0x8000824,
479 0x9000842, 0xa000714, 0xc000741, 0xe000740, 0x10000804, 0x11000823, 0x12000832, 0x13000803,
480 0x14000713, 0x16000731, 0x18000730, 0x1a000722, 0x1c000612, 0x20000521, 0x28000602, 0x2c000620,
481 0x30000411, 0x40000301, 0x60000310, 0x80000100};
482unsigned int h8[36]={0xb55, 0x200b54, 0x400a45, 0x800953, 0x1000a35, 0x1400a44, 0x1800925, 0x2000952,
483 0x2800905, 0x3000815, 0x4000851, 0x5000934, 0x5800943, 0x6000950, 0x6800933, 0x7000824,
484 0x8000842, 0x9000814, 0xa000741, 0xc000804, 0xd000840, 0xe000823, 0xf000832, 0x10000813,
485 0x11000831, 0x12000803, 0x13000830, 0x14000622, 0x18000602, 0x1c000620, 0x20000412, 0x30000421,
486 0x40000211, 0x80000301, 0xa0000310, 0xc0000200};
487unsigned int h9[36]={ 0x955, 0x800945, 0x1000835, 0x2000853, 0x3000954, 0x3800905, 0x4000844, 0x5000825,
488 0x6000852, 0x7000815, 0x8000751, 0xa000734, 0xc000743, 0xe000850, 0xf000804, 0x10000724,
489 0x12000742, 0x14000733, 0x16000740, 0x18000614, 0x1c000641, 0x20000623, 0x24000632, 0x28000513,
490 0x30000531, 0x38000603, 0x3c000630, 0x40000522, 0x48000502, 0x50000412, 0x60000421, 0x70000420,
491 0x80000311, 0xa0000301, 0xc0000310, 0xe0000300};
492unsigned int h10[64]={ 0xb77, 0x200b67, 0x400b76, 0x600b57, 0x800b75, 0xa00b66, 0xc00a47, 0x1000a74,
493 0x1400a56, 0x1800a65, 0x1c00a37, 0x2000a73, 0x2400a46, 0x2800b55, 0x2a00b54, 0x2c00a63,
494 0x3000927, 0x3800972, 0x4000a64, 0x4400a07, 0x4800970, 0x5000962, 0x5800a45, 0x5c00a35,
495 0x6000906, 0x6800a53, 0x6c00a44, 0x7000817, 0x8000871, 0x9000936, 0x9800926, 0xa000a25,
496 0xa400a52, 0xa800915, 0xb000951, 0xb800a34, 0xbc00a43, 0xc000816, 0xd000861, 0xe000860,
497 0xf000905, 0xf800950, 0x10000924, 0x10800942, 0x11000933, 0x11800904, 0x12000814, 0x13000841,
498 0x14000840, 0x15000823, 0x16000832, 0x17000803, 0x18000713, 0x1a000731, 0x1c000730, 0x1e000722,
499 0x20000612, 0x24000621, 0x28000602, 0x2c000620, 0x30000411, 0x40000301, 0x60000310, 0x80000100};
500unsigned int h11[64]={ 0xa77, 0x400a67, 0x800a76, 0xc00a75, 0x1000a66, 0x1400a47, 0x1800a74, 0x1c00b57,
501 0x1e00b55, 0x2000a56, 0x2400a65, 0x2800937, 0x3000973, 0x3800946, 0x4000a45, 0x4400a54,
502 0x4800a35, 0x4c00a53, 0x5000827, 0x6000872, 0x7000964, 0x7800907, 0x8000771, 0xa000817,
503 0xb000870, 0xc000836, 0xd000863, 0xe000860, 0xf000944, 0xf800925, 0x10000952, 0x10800905,
504 0x11000815, 0x12000762, 0x14000826, 0x15000806, 0x16000716, 0x18000761, 0x1a000851, 0x1b000834,
505 0x1c000850, 0x1d000943, 0x1d800933, 0x1e000824, 0x1f000842, 0x20000814, 0x21000841, 0x22000804,
506 0x23000840, 0x24000723, 0x26000732, 0x28000613, 0x2c000631, 0x30000703, 0x32000730, 0x34000622,
507 0x38000521, 0x40000412, 0x50000502, 0x58000520, 0x60000311, 0x80000301, 0xa0000310, 0xc0000200};
508unsigned int h12[64]={ 0xa77, 0x400a67, 0x800976, 0x1000957, 0x1800975, 0x2000966, 0x2800947, 0x3000974,
509 0x3800965, 0x4000856, 0x5000837, 0x6000973, 0x6800955, 0x7000827, 0x8000872, 0x9000846,
510 0xa000864, 0xb000817, 0xc000871, 0xd000907, 0xd800970, 0xe000836, 0xf000863, 0x10000845,
511 0x11000854, 0x12000844, 0x13000906, 0x13800905, 0x14000726, 0x16000762, 0x18000761, 0x1a000816,
512 0x1b000860, 0x1c000835, 0x1d000853, 0x1e000825, 0x1f000852, 0x20000715, 0x22000751, 0x24000734,
513 0x26000743, 0x28000850, 0x29000804, 0x2a000724, 0x2c000742, 0x2e000714, 0x30000633, 0x34000641,
514 0x38000623, 0x3c000632, 0x40000740, 0x42000703, 0x44000630, 0x48000513, 0x50000531, 0x58000522,
515 0x60000412, 0x70000421, 0x80000502, 0x88000520, 0x90000400, 0xa0000311, 0xc0000301, 0xe0000310};
516unsigned int h13[256]={
517 0x13fe, 0x33fc, 0x52fd, 0x91ed, 0x110ff, 0x210ef, 0x310df, 0x410ee,
518 0x510cf, 0x610de, 0x710bf, 0x810fb, 0x910ce, 0xa10dc, 0xb11af, 0xb91e9,
519 0xc0fec, 0xe0fdd, 0x1010fa, 0x1110cd, 0x120fbe, 0x140feb, 0x160f9f, 0x180ff9,
520 0x1a0fea, 0x1c0fbd, 0x1e0fdb, 0x200f8f, 0x220ff8, 0x240fcc, 0x2610ae, 0x27109e,
521 0x280f8e, 0x2a107f, 0x2b107e, 0x2c0ef7, 0x300eda, 0x340fad, 0x360fbc, 0x380fcb,
522 0x3a0ff6, 0x3c0e6f, 0x400ee8, 0x440e5f, 0x480e9d, 0x4c0ed9, 0x500ef5, 0x540ee7,
523 0x580eac, 0x5c0ebb, 0x600e4f, 0x640ef4, 0x680fca, 0x6a0fe6, 0x6c0ef3, 0x700d3f,
524 0x780e8d, 0x7c0ed8, 0x800d2f, 0x880df2, 0x900e6e, 0x940e9c, 0x980d0f, 0xa00ec9,
525 0xa40e5e, 0xa80dab, 0xb00e7d, 0xb40ed7, 0xb80d4e, 0xc00ec8, 0xc40ed6, 0xc80d3e,
526 0xd00db9, 0xd80e9b, 0xdc0eaa, 0xe00c1f, 0xf00cf1, 0x1000cf0, 0x1100dba, 0x1180de5,
527 0x1200de4, 0x1280d8c, 0x1300d6d, 0x1380de3, 0x1400ce2, 0x1500d2e, 0x1580d0e, 0x1600c1e,
528 0x1700ce1, 0x1800de0, 0x1880d5d, 0x1900dd5, 0x1980d7c, 0x1a00dc7, 0x1a80d4d, 0x1b00d8b,
529 0x1b80db8, 0x1c00dd4, 0x1c80d9a, 0x1d00da9, 0x1d80d6c, 0x1e00cc6, 0x1f00c3d, 0x2000dd3,
530 0x2080d7b, 0x2100c2d, 0x2200cd2, 0x2300c1d, 0x2400cb7, 0x2500d5c, 0x2580dc5, 0x2600d99,
531 0x2680d7a, 0x2700cc3, 0x2800da7, 0x2880d97, 0x2900c4b, 0x2a00bd1, 0x2c00c0d, 0x2d00cd0,
532 0x2e00c8a, 0x2f00ca8, 0x3000c4c, 0x3100cc4, 0x3200c6b, 0x3300cb6, 0x3400b3c, 0x3600b2c,
533 0x3800bc2, 0x3a00b5b, 0x3c00cb5, 0x3d00c89, 0x3e00b1c, 0x4000bc1, 0x4200c98, 0x4300c0c,
534 0x4400bc0, 0x4600cb4, 0x4700c6a, 0x4800ca6, 0x4900c79, 0x4a00b3b, 0x4c00bb3, 0x4e00c88,
535 0x4f00c5a, 0x5000b2b, 0x5200ca5, 0x5300c69, 0x5400ba4, 0x5600c78, 0x5700c87, 0x5800b94,
536 0x5a00c77, 0x5b00c76, 0x5c00ab2, 0x6000a1b, 0x6400ab1, 0x6800b0b, 0x6a00bb0, 0x6c00b96,
537 0x6e00b4a, 0x7000b3a, 0x7200ba3, 0x7400b59, 0x7600b95, 0x7800a2a, 0x7c00aa2, 0x8000a1a,
538 0x8400aa1, 0x8800b0a, 0x8a00b68, 0x8c00aa0, 0x9000b86, 0x9200b49, 0x9400a93, 0x9800b39,
539 0x9a00b58, 0x9c00b85, 0x9e00b67, 0xa000a29, 0xa400a92, 0xa800b57, 0xaa00b75, 0xac00a38,
540 0xb000a83, 0xb400b66, 0xb600b47, 0xb800b74, 0xba00b56, 0xbc00b65, 0xbe00b73, 0xc000919,
541 0xc800991, 0xd000a09, 0xd400a90, 0xd800a48, 0xdc00a84, 0xe000a72, 0xe400b46, 0xe600b64,
542 0xe800928, 0xf000982, 0xf800918, 0x10000a37, 0x10400a27, 0x10800917, 0x11000971, 0x11800a55,
543 0x11c00a07, 0x12000a70, 0x12400a36, 0x12800a63, 0x12c00a45, 0x13000a54, 0x13400a26, 0x13800a62,
544 0x13c00a35, 0x14000881, 0x15000908, 0x15800980, 0x16000916, 0x16800961, 0x17000906, 0x17800960,
545 0x18000a53, 0x18400a44, 0x18800925, 0x19000952, 0x19800905, 0x1a000815, 0x1b000851, 0x1c000934,
546 0x1c800943, 0x1d000950, 0x1d800924, 0x1e000942, 0x1e800933, 0x1f000814, 0x20000741, 0x22000804,
547 0x23000840, 0x24000823, 0x25000832, 0x26000713, 0x28000731, 0x2a000703, 0x2c000730, 0x2e000722,
548 0x30000612, 0x34000621, 0x38000602, 0x3c000620, 0x40000411, 0x50000401, 0x60000310, 0x80000100};
549unsigned int h15[256]={ 0xdff, 0x80def, 0x100dfe, 0x180ddf, 0x200cee, 0x300dfd, 0x380dcf, 0x400dfc,
550 0x480dde, 0x500ded, 0x580dbf, 0x600cfb, 0x700dce, 0x780dec, 0x800cdd, 0x900caf,
551 0xa00cfa, 0xb00cbe, 0xc00ceb, 0xd00ccd, 0xe00cdc, 0xf00c9f, 0x1000cf9, 0x1100cea,
552 0x1200cbd, 0x1300cdb, 0x1400c8f, 0x1500cf8, 0x1600ccc, 0x1700c9e, 0x1800ce9, 0x1900c7f,
553 0x1a00cf7, 0x1b00cad, 0x1c00cda, 0x1d00cbc, 0x1e00c6f, 0x1f00dae, 0x1f80d0f, 0x2000bcb,
554 0x2200bf6, 0x2400c8e, 0x2500ce8, 0x2600c5f, 0x2700c9d, 0x2800bf5, 0x2a00b7e, 0x2c00be7,
555 0x2e00bac, 0x3000bca, 0x3200bbb, 0x3400cd9, 0x3500c8d, 0x3600b4f, 0x3800bf4, 0x3a00b3f,
556 0x3c00bf3, 0x3e00bd8, 0x4000be6, 0x4200b2f, 0x4400bf2, 0x4600c6e, 0x4700cf0, 0x4800b1f,
557 0x4a00bf1, 0x4c00b9c, 0x4e00bc9, 0x5000b5e, 0x5200bab, 0x5400bba, 0x5600be5, 0x5800b7d,
558 0x5a00bd7, 0x5c00b4e, 0x5e00be4, 0x6000b8c, 0x6200bc8, 0x6400b3e, 0x6600b6d, 0x6800bd6,
559 0x6a00be3, 0x6c00b9b, 0x6e00bb9, 0x7000b2e, 0x7200baa, 0x7400be2, 0x7600b1e, 0x7800be1,
560 0x7a00c0e, 0x7b00ce0, 0x7c00b5d, 0x7e00bd5, 0x8000b7c, 0x8200bc7, 0x8400b4d, 0x8600b8b,
561 0x8800ad4, 0x8c00bb8, 0x8e00b9a, 0x9000ba9, 0x9200b6c, 0x9400bc6, 0x9600b3d, 0x9800ad3,
562 0x9c00ad2, 0xa000b2d, 0xa200b0d, 0xa400a1d, 0xa800a7b, 0xac00ab7, 0xb000ad1, 0xb400b5c,
563 0xb600bd0, 0xb800ac5, 0xbc00a8a, 0xc000aa8, 0xc400a4c, 0xc800ac4, 0xcc00a6b, 0xd000ab6,
564 0xd400b99, 0xd600b0c, 0xd800a3c, 0xdc00ac3, 0xe000a7a, 0xe400aa7, 0xe800aa6, 0xec00bc0,
565 0xee00b0b, 0xf0009c2, 0xf800a2c, 0xfc00a5b, 0x10000ab5, 0x10400a1c, 0x10800a89, 0x10c00a98,
566 0x11000ac1, 0x11400a4b, 0x11800ab4, 0x11c00a6a, 0x12000a3b, 0x12400a79, 0x128009b3, 0x13000a97,
567 0x13400a88, 0x13800a2b, 0x13c00a5a, 0x140009b2, 0x14800aa5, 0x14c00a1b, 0x150009b1, 0x15800ab0,
568 0x15c00a69, 0x16000a96, 0x16400a4a, 0x16800aa4, 0x16c00a78, 0x17000a87, 0x17400a3a, 0x178009a3,
569 0x18000959, 0x18800995, 0x1900092a, 0x198009a2, 0x1a00091a, 0x1a8009a1, 0x1b000a0a, 0x1b400aa0,
570 0x1b800968, 0x1c000986, 0x1c800949, 0x1d000994, 0x1d800939, 0x1e000993, 0x1e800a77, 0x1ec00a09,
571 0x1f000958, 0x1f800985, 0x20000929, 0x20800967, 0x21000976, 0x21800992, 0x22000891, 0x23000919,
572 0x23800990, 0x24000948, 0x24800984, 0x25000957, 0x25800975, 0x26000938, 0x26800983, 0x27000966,
573 0x27800947, 0x28000828, 0x29000882, 0x2a000818, 0x2b000881, 0x2c000974, 0x2c800908, 0x2d000980,
574 0x2d800956, 0x2e000965, 0x2e800937, 0x2f000973, 0x2f800946, 0x30000827, 0x31000872, 0x32000864,
575 0x33000817, 0x34000855, 0x35000871, 0x36000907, 0x36800970, 0x37000836, 0x38000863, 0x39000845,
576 0x3a000854, 0x3b000826, 0x3c000862, 0x3d000816, 0x3e000906, 0x3e800960, 0x3f000835, 0x40000761,
577 0x42000853, 0x43000844, 0x44000725, 0x46000752, 0x48000715, 0x4a000751, 0x4c000805, 0x4d000850,
578 0x4e000734, 0x50000743, 0x52000724, 0x54000742, 0x56000733, 0x58000641, 0x5c000714, 0x5e000704,
579 0x60000623, 0x64000632, 0x68000740, 0x6a000703, 0x6c000613, 0x70000631, 0x74000630, 0x78000522,
580 0x80000512, 0x88000521, 0x90000502, 0x98000520, 0xa0000311, 0xc0000401, 0xd0000410, 0xe0000300};
581unsigned int h16[256]={ 0xbef, 0x200bfe, 0x400bdf, 0x600bfd, 0x800bcf, 0xa00bfc, 0xc00bbf, 0xe00bfb,
582 0x1000aaf, 0x1400bfa, 0x1600b9f, 0x1800bf9, 0x1a00bf8, 0x1c00a8f, 0x2000a7f, 0x2400af7,
583 0x2800a6f, 0x2c00af6, 0x30008ff, 0x4000a5f, 0x4400af5, 0x480094f, 0x50009f4, 0x58009f3,
584 0x60009f0, 0x6800a3f, 0x6c010ce, 0x6c111ec, 0x6c191dd, 0x6c20fde, 0x6c40fe9, 0x6c610ea,
585 0x6c710d9, 0x6c80eee, 0x6cc0fed, 0x6ce0feb, 0x6d00ebe, 0x6d40ecd, 0x6d80fdc, 0x6da0fdb,
586 0x6dc0eae, 0x6e00ecc, 0x6e40fad, 0x6e60fda, 0x6e80f7e, 0x6ea0fac, 0x6ec0eca, 0x6f00fc9,
587 0x6f20f7d, 0x6f40e5e, 0x6f80dbd, 0x70008f2, 0x800092f, 0x880090f, 0x900081f, 0xa0008f1,
588 0xb000d9e, 0xb080ebc, 0xb0c0ecb, 0xb100e8e, 0xb140ee8, 0xb180e9d, 0xb1c0ee7, 0xb200ebb,
589 0xb240e8d, 0xb280ed8, 0xb2c0e6e, 0xb300de6, 0xb380d9c, 0xb400eab, 0xb440eba, 0xb480ee5,
590 0xb4c0ed7, 0xb500d4e, 0xb580ee4, 0xb5c0e8c, 0xb600dc8, 0xb680d3e, 0xb700d6d, 0xb780ed6,
591 0xb7c0e9b, 0xb800eb9, 0xb840eaa, 0xb880de1, 0xb900dd4, 0xb980eb8, 0xb9c0ea9, 0xba00d7b,
592 0xba80eb7, 0xbac0ed0, 0xbb00ce3, 0xbc00d0e, 0xbc80de0, 0xbd00d5d, 0xbd80dd5, 0xbe00d7c,
593 0xbe80dc7, 0xbf00d4d, 0xbf80d8b, 0xc000d9a, 0xc080d6c, 0xc100dc6, 0xc180d3d, 0xc200d5c,
594 0xc280dc5, 0xc300c0d, 0xc400d8a, 0xc480da8, 0xc500d99, 0xc580d4c, 0xc600db6, 0xc680d7a,
595 0xc700c3c, 0xc800d5b, 0xc880d89, 0xc900c1c, 0xca00cc0, 0xcb00d98, 0xcb80d79, 0xcc00be2,
596 0xce00c2e, 0xcf00c1e, 0xd000cd3, 0xd100c2d, 0xd200cd2, 0xd300cd1, 0xd400c3b, 0xd500d97,
597 0xd580d88, 0xd600b1d, 0xd800cc4, 0xd900c6b, 0xda00cc3, 0xdb00ca7, 0xdc00b2c, 0xde00cc2,
598 0xdf00cb5, 0xe000cc1, 0xe100c0c, 0xe200c4b, 0xe300cb4, 0xe400c6a, 0xe500ca6, 0xe600bb3,
599 0xe800c5a, 0xe900ca5, 0xea00b2b, 0xec00bb2, 0xee00b1b, 0xf000bb1, 0xf200c0b, 0xf300cb0,
600 0xf400c69, 0xf500c96, 0xf600c4a, 0xf700ca4, 0xf800c78, 0xf900c87, 0xfa00ba3, 0xfc00c3a,
601  0xfd00c59, 0xfe00b2a, 0x10000c95, 0x10100c68, 0x10200ba1, 0x10400c86, 0x10500c77, 0x10600b94,
602 0x10800c49, 0x10900c57, 0x10a00b67, 0x10c00aa2, 0x11000a1a, 0x11400b0a, 0x11600ba0, 0x11800b39,
603 0x11a00b93, 0x11c00b58, 0x11e00b85, 0x12000a29, 0x12400a92, 0x12800b76, 0x12a00b09, 0x12c00a19,
604 0x13000a91, 0x13400b90, 0x13600b48, 0x13800b84, 0x13a00b75, 0x13c00b38, 0x13e00b83, 0x14000b66,
605 0x14200b28, 0x14400a82, 0x14800b47, 0x14a00b74, 0x14c00a18, 0x15000a81, 0x15400a80, 0x15800b08,
606 0x15a00b56, 0x15c00a37, 0x16000a73, 0x16400b65, 0x16600b46, 0x16800a27, 0x16c00a72, 0x17000b64,
607 0x17200b55, 0x17400a07, 0x17800917, 0x18000971, 0x18800a70, 0x18c00a36, 0x19000a63, 0x19400a45,
608 0x19800a54, 0x19c00a26, 0x1a000962, 0x1a800916, 0x1b000961, 0x1b800a06, 0x1bc00a60, 0x1c000953,
609 0x1c800a35, 0x1cc00a44, 0x1d000925, 0x1d800952, 0x1e000851, 0x1f000915, 0x1f800905, 0x20000934,
610 0x20800943, 0x21000950, 0x21800924, 0x22000942, 0x22800933, 0x23000814, 0x24000841, 0x25000904,
611 0x25800940, 0x26000823, 0x27000832, 0x28000713, 0x2a000731, 0x2c000803, 0x2d000830, 0x2e000722,
612 0x30000612, 0x34000621, 0x38000602, 0x3c000620, 0x40000411, 0x50000401, 0x60000310, 0x80000100};
613unsigned int h24[256]={ 0x8ef, 0x10008fe, 0x20008df, 0x30008fd, 0x40008cf, 0x50008fc, 0x60008bf, 0x70008fb,
614 0x80007fa, 0xa0008af, 0xb00089f, 0xc0007f9, 0xe0007f8, 0x1000088f, 0x1100087f, 0x120007f7,
615 0x1400076f, 0x160007f6, 0x1800075f, 0x1a0007f5, 0x1c00074f, 0x1e0007f4, 0x2000073f, 0x220007f3,
616 0x2400072f, 0x260007f2, 0x280007f1, 0x2a00081f, 0x2b0008f0, 0x2c00090f, 0x2c800bee, 0x2ca00bde,
617 0x2cc00bed, 0x2ce00bce, 0x2d000bec, 0x2d200bdd, 0x2d400bbe, 0x2d600beb, 0x2d800bcd, 0x2da00bdc,
618 0x2dc00bae, 0x2de00bea, 0x2e000bbd, 0x2e200bdb, 0x2e400bcc, 0x2e600b9e, 0x2e800be9, 0x2ea00bad,
619 0x2ec00bda, 0x2ee00bbc, 0x2f000bcb, 0x2f200b8e, 0x2f400be8, 0x2f600b9d, 0x2f800bd9, 0x2fa00b7e,
620 0x2fc00be7, 0x2fe00bac, 0x300004ff, 0x40000bca, 0x40200bbb, 0x40400b8d, 0x40600bd8, 0x40800c0e,
621 0x40900ce0, 0x40a00b0d, 0x40c00ae6, 0x41000b6e, 0x41200b9c, 0x41400ac9, 0x41800a5e, 0x41c00aba,
622 0x42000ae5, 0x42400bab, 0x42600b7d, 0x42800ad7, 0x42c00ae4, 0x43000a8c, 0x43400ac8, 0x43800b4e,
623 0x43a00b2e, 0x43c00a3e, 0x44000a6d, 0x44400ad6, 0x44800ae3, 0x44c00a9b, 0x45000ab9, 0x45400aaa,
624 0x45800ae2, 0x45c00a1e, 0x46000ae1, 0x46400a5d, 0x46800ad5, 0x46c00a7c, 0x47000ac7, 0x47400a4d,
625 0x47800a8b, 0x47c00ab8, 0x48000ad4, 0x48400a9a, 0x48800aa9, 0x48c00a6c, 0x49000ac6, 0x49400a3d,
626 0x49800ad3, 0x49c00a2d, 0x4a000ad2, 0x4a400a1d, 0x4a800a7b, 0x4ac00ab7, 0x4b000ad1, 0x4b400a5c,
627 0x4b800ac5, 0x4bc00a8a, 0x4c000aa8, 0x4c400a99, 0x4c800a4c, 0x4cc00ac4, 0x4d000a6b, 0x4d400ab6,
628 0x4d800bd0, 0x4da00b0c, 0x4dc00a3c, 0x4e000ac3, 0x4e400a7a, 0x4e800aa7, 0x4ec00a2c, 0x4f000ac2,
629 0x4f400a5b, 0x4f800ab5, 0x4fc00a1c, 0x50000a89, 0x50400a98, 0x50800ac1, 0x50c00a4b, 0x51000bc0,
630 0x51200b0b, 0x51400a3b, 0x51800bb0, 0x51a00b0a, 0x51c00a1a, 0x520009b4, 0x52800a6a, 0x52c00aa6,
631 0x53000a79, 0x53400a97, 0x53800ba0, 0x53a00b09, 0x53c00a90, 0x540009b3, 0x54800988, 0x55000a2b,
632 0x55400a5a, 0x558009b2, 0x56000aa5, 0x56400a1b, 0x56800ab1, 0x56c00a69, 0x57000996, 0x578009a4,
633 0x58000a4a, 0x58400a78, 0x58800987, 0x5900093a, 0x598009a3, 0x5a000959, 0x5a800995, 0x5b00092a,
634  0x5b8009a2, 0x5c0009a1, 0x5c800968, 0x5d000986, 0x5d800977, 0x5e000949, 0x5e800994, 0x5f000939,
635 0x5f800993, 0x60000958, 0x60800985, 0x61000929, 0x61800967, 0x62000976, 0x62800992, 0x63000919,
636 0x63800991, 0x64000948, 0x64800984, 0x65000957, 0x65800975, 0x66000938, 0x66800983, 0x67000966,
637 0x67800928, 0x68000982, 0x68800918, 0x69000947, 0x69800974, 0x6a000981, 0x6a800a08, 0x6ac00a80,
638 0x6b000956, 0x6b800965, 0x6c000917, 0x6c800a07, 0x6cc00a70, 0x6d000873, 0x6e000937, 0x6e800927,
639 0x6f000872, 0x70000846, 0x71000864, 0x72000855, 0x73000871, 0x74000836, 0x75000863, 0x76000845,
640 0x77000854, 0x78000826, 0x79000862, 0x7a000816, 0x7b000861, 0x7c000906, 0x7c800960, 0x7d000835,
641 0x7e000853, 0x7f000844, 0x80000825, 0x81000852, 0x82000815, 0x83000905, 0x83800950, 0x84000751,
642 0x86000834, 0x87000843, 0x88000724, 0x8a000742, 0x8c000733, 0x8e000714, 0x90000741, 0x92000804,
643 0x93000840, 0x94000723, 0x96000732, 0x98000613, 0x9c000631, 0xa0000703, 0xa2000730, 0xa4000622,
644 0xa8000512, 0xb0000521, 0xb8000602, 0xbc000620, 0xc0000411, 0xd0000401, 0xe0000410, 0xf0000400};
645unsigned int hA[16]={ 0x6b0, 0x40006f0, 0x80006d0, 0xc0006e0, 0x10000670, 0x14000650, 0x18000590, 0x20000560,
646 0x28000530, 0x300005a0, 0x380005c0, 0x40000420, 0x50000410, 0x60000440, 0x70000480, 0x80000100};
647unsigned int hB[16]={  0x4f0, 0x100004e0, 0x200004d0, 0x300004c0, 0x400004b0, 0x500004a0, 0x60000490, 0x70000480,
648 0x80000470, 0x90000460, 0xa0000450, 0xb0000440, 0xc0000430, 0xd0000420, 0xe0000410, 0xf0000400};
649
650/* now the cues, remember to change these tables if you change N_CUE
651*/
652unsigned char h_cue[34][N_CUE]={
653{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
654{0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3},
655{0,3,5,5,6,6,7,7,8,8,8,8,8,8,8,8},
656{0,3,5,5,6,6,6,6,7,7,7,7,8,8,8,8},
657{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
658{0,8,12,12,13,13,14,14,15,15,15,15,15,15,15,15},
659{0,5,7,9,10,11,12,12,13,13,13,13,14,14,15,15},
660{0,20,29,32,33,33,34,34,35,35,35,35,35,35,35,35},
661{0,23,30,31,32,32,32,32,33,33,34,34,35,35,35,35},
662{0,15,21,24,27,29,30,31,32,32,33,33,34,34,35,35},
663{0,42,56,60,61,61,62,62,63,63,63,63,63,63,63,63},
664{0,30,45,53,57,58,60,60,61,61,62,62,63,63,63,63},
665{0,23,37,46,50,54,56,57,58,60,61,61,62,62,63,63},
666{0,203,238,248,252,253,254,254,255,255,255,255,255,255,255,255},
667{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
668{0,132,178,205,223,233,240,245,248,250,252,252,253,254,255,255},
669{0,162,231,248,252,253,254,254,255,255,255,255,255,255,255,255},
670{0,162,231,248,252,253,254,254,255,255,255,255,255,255,255,255},
671{0,162,231,248,252,253,254,254,255,255,255,255,255,255,255,255},
672{0,162,231,248,252,253,254,254,255,255,255,255,255,255,255,255},
673{0,162,231,248,252,253,254,254,255,255,255,255,255,255,255,255},
674{0,162,231,248,252,253,254,254,255,255,255,255,255,255,255,255},
675{0,162,231,248,252,253,254,254,255,255,255,255,255,255,255,255},
676{0,162,231,248,252,253,254,254,255,255,255,255,255,255,255,255},
677{0,13,22,58,59,131,177,209,226,238,245,249,252,253,254,255},
678{0,13,22,58,59,131,177,209,226,238,245,249,252,253,254,255},
679{0,13,22,58,59,131,177,209,226,238,245,249,252,253,254,255},
680{0,13,22,58,59,131,177,209,226,238,245,249,252,253,254,255},
681{0,13,22,58,59,131,177,209,226,238,245,249,252,253,254,255},
682{0,13,22,58,59,131,177,209,226,238,245,249,252,253,254,255},
683{0,13,22,58,59,131,177,209,226,238,245,249,252,253,254,255},
684{0,13,22,58,59,131,177,209,226,238,245,249,252,253,254,255},
685{0,4,7,9,11,12,13,14,15,15,15,15,15,15,15,15},
686{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
687};
688
689/* hmmm, a sto sa h4 i h14, preslikati ih u h5/h15
690*/
691unsigned int *tables[34]={h0,h1,h2,h3,0,h5,h6,h7,h8,h9,h10,h11,h12,h13,0,h15,
692        h16,h16,h16,h16,h16,h16,h16,h16,h24,h24,h24,h24,h24,h24,h24,h24,hA,hB};
693
694/* transform.h */
695
696static void imdct_init();
697void imdct(mp3Info *ext, int win_type,int sb,int ch);
698void poly(mp3Info *ext, const int ch, int i);
699static void premultiply();
700
701static const float t_sin[4][36]={{
702   -0.032160f,    0.103553f,   -0.182543f,    0.266729f,   -0.353554f,    0.440377f,
703   -0.524563f,    0.603553f,   -0.674947f,    0.736575f,   -0.786566f,    0.823400f,
704   -0.845957f,    0.853554f,   -0.845957f,    0.823399f,   -0.786566f,    0.736575f,
705   -0.674947f,    0.603553f,   -0.524564f,    0.440378f,   -0.353553f,    0.266729f,
706   -0.182544f,    0.103553f,   -0.032160f,   -0.029469f,    0.079459f,   -0.116293f,
707    0.138851f,   -0.146446f,    0.138851f,   -0.116293f,    0.079459f,   -0.029469f
708},{
709   -0.032160f,    0.103553f,   -0.182543f,    0.266729f,   -0.353554f,    0.440377f,
710   -0.524563f,    0.603553f,   -0.674947f,    0.736575f,   -0.786566f,    0.823400f,
711   -0.845957f,    0.853554f,   -0.845957f,    0.823399f,   -0.786566f,    0.736575f,
712   -0.675590f,    0.608761f,   -0.537300f,    0.461749f,   -0.382683f,    0.300706f,
713   -0.214588f,    0.120590f,   -0.034606f,   -0.026554f,    0.049950f,   -0.028251f,
714    0.000000f,    0.000000f,    0.000000f,    0.000000f,    0.000000f,    0.000000f
715},{
716   -0.103553f,    0.353554f,   -0.603553f,    0.786566f,   -0.853554f,    0.786566f,
717   -0.603553f,    0.353553f,   -0.103553f,   -0.079459f,    0.146446f,   -0.079459f,
718    0.000000f,    0.000000f,    0.000000f,    0.000000f,    0.000000f,    0.000000f,
719    0.000000f,    0.000000f,    0.000000f,    0.000000f,    0.000000f,    0.000000f,
720    0.000000f,    0.000000f,    0.000000f,    0.000000f,    0.000000f,    0.000000f,
721    0.000000f,    0.000000f,    0.000000f,    0.000000f,    0.000000f,    0.000000f
722},{
723    0.000000f,    0.000000f,    0.000000f,    0.000000f,    0.000000f,    0.000000f,
724   -0.127432f,    0.379410f,   -0.608182f,    0.792598f,   -0.915976f,    0.967944f,
725   -0.953717f,    0.923880f,   -0.887011f,    0.843391f,   -0.793353f,    0.737277f,
726   -0.674947f,    0.603553f,   -0.524564f,    0.440378f,   -0.353553f,    0.266729f,
727   -0.182544f,    0.103553f,   -0.032160f,   -0.029469f,    0.079459f,   -0.116293f,
728    0.138851f,   -0.146446f,    0.138851f,   -0.116293f,    0.079459f,   -0.029469f
729}};
730
731static const float t_2cos[4][18]={
732{ -0.174311f,  -0.517638f,  -0.845237f,  -1.147153f,
733  -1.414214f,  -1.638304f, -1.812616f,  -1.931852f,
734  -1.992389f,   0.174311f,   0.517638f,   0.845237f,
735   1.147153f,   1.414214f,   1.638304f, 1.812616f,
736   1.931852f,   1.992389f},
737{ -0.174311f,  -0.517638f,  -0.845237f,  -1.147153f,
738  -1.414214f,  -1.638304f, -1.812616f,  -1.931852f,
739  -1.992389f,   0.174311f,   0.517638f,   0.845237f,
740   1.147153f,   1.414214f,   1.638304f, 1.812616f,
741   1.931852f,   1.992389f},
742{ -0.517638f, -1.41421f, -1.93185f, 0.517638f, 1.41421f
743    , 1.93185f,.0f,.0f,.0f,.0f,.0f,.0f,.0f,.0f,.0f,.0f,.0f,.0f},
744{ -0.174311f,  -0.517638f,  -0.845237f,  -1.147153f,
745  -1.414214f,  -1.638304f, -1.812616f,  -1.931852f,  -1.992389f,
746   0.174311f,   0.517638f,   0.845237f,   1.147153f,
747   1.414214f,   1.638304f, 1.812616f,   1.931852f,   1.992389f}
748};
749
750static const float b1 = 1.997590912f;
751static const float b2 = 1.990369453f;
752static const float b3 = 1.978353019f;
753static const float b4 = 1.961570560f;
754static const float b5 = 1.940062506f;
755static const float b6 = 1.913880671f;
756static const float b7 = 1.883088130f;
757static const float b8 = 1.847759065f;
758static const float b9 = 1.807978586f;
759static const float b10= 1.763842529f;
760static const float b11= 1.715457220f;
761static const float b12= 1.662939225f;
762static const float b13= 1.606415063f;
763static const float b14= 1.546020907f;
764static const float b15= 1.481902251f;
765static const float b16= 1.414213562f;
766static const float b17= 1.343117910f;
767static const float b18= 1.268786568f;
768static const float b19= 1.191398609f;
769static const float b20= 1.111140466f;
770static const float b21= 1.028205488f;
771static const float b22= 0.942793474f;
772static const float b23= 0.855110187f;
773static const float b24= 0.765366865f;
774static const float b25= 0.673779707f;
775static const float b26= 0.580569355f;
776static const float b27= 0.485960360f;
777static const float b28= 0.390180644f;
778static const float b29= 0.293460949f;
779static const float b30= 0.196034281f;
780static const float b31= 0.098135349f;
781
782static float t_dewindow[16][32] = {
783{0.000000000f ,-0.000442505f , 0.003250122f ,-0.007003784f , 0.031082153f ,-0.078628540f , 0.100311279f ,-0.572036743f ,
784 1.144989014f , 0.572036743f , 0.100311279f , 0.078628540f , 0.031082153f , 0.007003784f , 0.003250122f , 0.000442505f ,
785-0.000015259f ,-0.000473022f , 0.003326416f ,-0.007919312f , 0.030517578f ,-0.084182739f , 0.090927124f ,-0.600219727f ,
786 1.144287109f , 0.543823242f , 0.108856201f , 0.073059082f , 0.031478882f , 0.006118774f , 0.003173828f , 0.000396729f },
787
788{-0.000015259f ,-0.000534058f , 0.003387451f ,-0.008865356f , 0.029785156f ,-0.089706421f , 0.080688477f ,-0.628295898f ,
789 1.142211914f , 0.515609741f , 0.116577148f , 0.067520142f , 0.031738281f , 0.005294800f , 0.003082275f , 0.000366211f ,
790-0.000015259f ,-0.000579834f , 0.003433228f ,-0.009841919f , 0.028884888f ,-0.095169067f , 0.069595337f ,-0.656219482f ,
791 1.138763428f , 0.487472534f , 0.123474121f , 0.061996460f , 0.031845093f , 0.004486084f , 0.002990723f , 0.000320435f },
792
793{-0.000015259f ,-0.000625610f , 0.003463745f ,-0.010848999f , 0.027801514f ,-0.100540161f , 0.057617187f ,-0.683914185f ,
794 1.133926392f , 0.459472656f , 0.129577637f , 0.056533813f , 0.031814575f , 0.003723145f , 0.002899170f , 0.000289917f ,
795-0.000015259f ,-0.000686646f , 0.003479004f ,-0.011886597f , 0.026535034f ,-0.105819702f , 0.044784546f ,-0.711318970f ,
796 1.127746582f , 0.431655884f , 0.134887695f , 0.051132202f , 0.031661987f , 0.003005981f , 0.002792358f , 0.000259399f },
797
798{-0.000015259f ,-0.000747681f , 0.003479004f ,-0.012939453f , 0.025085449f ,-0.110946655f , 0.031082153f ,-0.738372803f ,
799 1.120223999f , 0.404083252f , 0.139450073f , 0.045837402f , 0.031387329f , 0.002334595f , 0.002685547f , 0.000244141f ,
800-0.000030518f ,-0.000808716f , 0.003463745f ,-0.014022827f , 0.023422241f ,-0.115921021f , 0.016510010f ,-0.765029907f ,
801 1.111373901f , 0.376800537f , 0.143264771f , 0.040634155f , 0.031005859f , 0.001693726f , 0.002578735f , 0.000213623f },
802
803{-0.000030518f ,-0.000885010f , 0.003417969f ,-0.015121460f , 0.021575928f ,-0.120697021f , 0.001068115f ,-0.791213989f ,
804 1.101211548f , 0.349868774f , 0.146362305f , 0.035552979f , 0.030532837f , 0.001098633f , 0.002456665f , 0.000198364f ,
805-0.000030518f ,-0.000961304f , 0.003372192f ,-0.016235352f , 0.019531250f ,-0.125259399f ,-0.015228271f ,-0.816864014f ,
806 1.089782715f , 0.323318481f , 0.148773193f , 0.030609131f , 0.029937744f , 0.000549316f , 0.002349854f , 0.000167847f },
807
808{-0.000030518f ,-0.001037598f , 0.003280640f ,-0.017349243f , 0.017257690f ,-0.129562378f ,-0.032379150f ,-0.841949463f ,
809 1.077117920f , 0.297210693f , 0.150497437f , 0.025817871f , 0.029281616f , 0.000030518f , 0.002243042f , 0.000152588f ,
810-0.000045776f ,-0.001113892f , 0.003173828f ,-0.018463135f , 0.014801025f ,-0.133590698f ,-0.050354004f ,-0.866363525f ,
811 1.063217163f , 0.271591187f , 0.151596069f , 0.021179199f , 0.028533936f ,-0.000442505f , 0.002120972f , 0.000137329f },
812
813{-0.000045776f ,-0.001205444f , 0.003051758f ,-0.019577026f , 0.012115479f ,-0.137298584f ,-0.069168091f ,-0.890090942f ,
814 1.048156738f , 0.246505737f , 0.152069092f , 0.016708374f , 0.027725220f ,-0.000869751f , 0.002014160f , 0.000122070f ,
815-0.000061035f ,-0.001296997f , 0.002883911f ,-0.020690918f , 0.009231567f ,-0.140670776f ,-0.088775635f ,-0.913055420f ,
816 1.031936646f , 0.221984863f , 0.151962280f , 0.012420654f , 0.026840210f ,-0.001266479f , 0.001907349f , 0.000106812f },
817
818{-0.000061035f ,-0.001388550f , 0.002700806f ,-0.021789551f , 0.006134033f ,-0.143676758f ,-0.109161377f ,-0.935195923f ,
819 1.014617920f , 0.198059082f , 0.151306152f , 0.008316040f , 0.025909424f ,-0.001617432f , 0.001785278f , 0.000106812f ,
820-0.000076294f ,-0.001480103f , 0.002487183f ,-0.022857666f , 0.002822876f ,-0.146255493f ,-0.130310059f ,-0.956481934f ,
821 0.996246338f , 0.174789429f , 0.150115967f , 0.004394531f , 0.024932861f ,-0.001937866f , 0.001693726f , 0.000091553f },
822
823{-0.000076294f ,-0.001586914f , 0.002227783f ,-0.023910522f ,-0.000686646f ,-0.148422241f ,-0.152206421f ,-0.976852417f ,
824 0.976852417f , 0.152206421f , 0.148422241f , 0.000686646f , 0.023910522f ,-0.002227783f , 0.001586914f , 0.000076294f ,
825-0.000091553f ,-0.001693726f , 0.001937866f ,-0.024932861f ,-0.004394531f ,-0.150115967f ,-0.174789429f ,-0.996246338f ,
826 0.956481934f , 0.130310059f , 0.146255493f ,-0.002822876f , 0.022857666f ,-0.002487183f , 0.001480103f , 0.000076294f },
827
828{-0.000106812f ,-0.001785278f , 0.001617432f ,-0.025909424f ,-0.008316040f ,-0.151306152f ,-0.198059082f ,-1.014617920f ,
829 0.935195923f , 0.109161377f , 0.143676758f ,-0.006134033f , 0.021789551f ,-0.002700806f , 0.001388550f , 0.000061035f ,
830-0.000106812f ,-0.001907349f , 0.001266479f ,-0.026840210f ,-0.012420654f ,-0.151962280f ,-0.221984863f ,-1.031936646f ,
831 0.913055420f , 0.088775635f , 0.140670776f ,-0.009231567f , 0.020690918f ,-0.002883911f , 0.001296997f , 0.000061035f },
832
833{-0.000122070f ,-0.002014160f , 0.000869751f ,-0.027725220f ,-0.016708374f ,-0.152069092f ,-0.246505737f ,-1.048156738f ,
834 0.890090942f , 0.069168091f , 0.137298584f ,-0.012115479f , 0.019577026f ,-0.003051758f , 0.001205444f , 0.000045776f ,
835-0.000137329f ,-0.002120972f , 0.000442505f ,-0.028533936f ,-0.021179199f ,-0.151596069f ,-0.271591187f ,-1.063217163f ,
836 0.866363525f , 0.050354004f , 0.133590698f ,-0.014801025f , 0.018463135f ,-0.003173828f , 0.001113892f , 0.000045776f },
837
838{-0.000152588f ,-0.002243042f ,-0.000030518f ,-0.029281616f ,-0.025817871f ,-0.150497437f ,-0.297210693f ,-1.077117920f ,
839 0.841949463f , 0.032379150f , 0.129562378f ,-0.017257690f , 0.017349243f ,-0.003280640f , 0.001037598f , 0.000030518f ,
840-0.000167847f ,-0.002349854f ,-0.000549316f ,-0.029937744f ,-0.030609131f ,-0.148773193f ,-0.323318481f ,-1.089782715f ,
841 0.816864014f , 0.015228271f , 0.125259399f ,-0.019531250f , 0.016235352f ,-0.003372192f , 0.000961304f , 0.000030518f },
842
843{-0.000198364f ,-0.002456665f ,-0.001098633f ,-0.030532837f ,-0.035552979f ,-0.146362305f ,-0.349868774f ,-1.101211548f ,
844 0.791213989f ,-0.001068115f , 0.120697021f ,-0.021575928f , 0.015121460f ,-0.003417969f , 0.000885010f , 0.000030518f ,
845-0.000213623f ,-0.002578735f ,-0.001693726f ,-0.031005859f ,-0.040634155f ,-0.143264771f ,-0.376800537f ,-1.111373901f ,
846 0.765029907f ,-0.016510010f , 0.115921021f ,-0.023422241f , 0.014022827f ,-0.003463745f , 0.000808716f , 0.000030518f },
847
848{-0.000244141f ,-0.002685547f ,-0.002334595f ,-0.031387329f ,-0.045837402f ,-0.139450073f ,-0.404083252f ,-1.120223999f ,
849 0.738372803f ,-0.031082153f , 0.110946655f ,-0.025085449f , 0.012939453f ,-0.003479004f , 0.000747681f , 0.000015259f ,
850-0.000259399f ,-0.002792358f ,-0.003005981f ,-0.031661987f ,-0.051132202f ,-0.134887695f ,-0.431655884f ,-1.127746582f ,
851 0.711318970f ,-0.044784546f , 0.105819702f ,-0.026535034f , 0.011886597f ,-0.003479004f , 0.000686646f , 0.000015259f },
852
853{-0.000289917f ,-0.002899170f ,-0.003723145f ,-0.031814575f ,-0.056533813f ,-0.129577637f ,-0.459472656f ,-1.133926392f ,
854 0.683914185f ,-0.057617187f , 0.100540161f ,-0.027801514f , 0.010848999f ,-0.003463745f , 0.000625610f , 0.000015259f ,
855-0.000320435f ,-0.002990723f ,-0.004486084f ,-0.031845093f ,-0.061996460f ,-0.123474121f ,-0.487472534f ,-1.138763428f ,
856 0.656219482f ,-0.069595337f , 0.095169067f ,-0.028884888f , 0.009841919f ,-0.003433228f , 0.000579834f , 0.000015259f },
857
858{-0.000366211f ,-0.003082275f ,-0.005294800f ,-0.031738281f ,-0.067520142f ,-0.116577148f ,-0.515609741f ,-1.142211914f ,
859 0.628295898f ,-0.080688477f , 0.089706421f ,-0.029785156f , 0.008865356f ,-0.003387451f , 0.000534058f , 0.000015259f ,
860-0.000396729f ,-0.003173828f ,-0.006118774f ,-0.031478882f ,-0.073059082f ,-0.108856201f ,-0.543823242f ,-1.144287109f ,
861   0.600219727f ,-0.090927124f , 0.084182739f ,-0.030517578f , 0.007919312f ,-0.003326416f , 0.000473022f , 0.000015259f}
862};
863