]> git.sesse.net Git - vlc/blob - modules/codec/shine/shine.c
Use var_Inherit* instead of var_CreateGet*.
[vlc] / modules / codec / shine / shine.c
1 /***************************************************************************
2  *             __________               __   ___.
3  *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
4  *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
5  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
6  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
7  *                     \/            \/     \/    \/            \/
8  * $Id$
9  *
10  * Copyright (C) 2006 Antonius Hellmann
11  *
12  * This program is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU General Public License
14  * as published by the Free Software Foundation; either version 2
15  * of the License, or (at your option) any later version.
16  *
17  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18  * KIND, either express or implied.
19  *
20  ****************************************************************************/
21
22 //    Shine is an MP3 encoder
23 //    Copyright (C) 1999-2000  Gabriel Bouvigne
24 //
25 //    This library is free software; you can redistribute it and/or
26 //    modify it under the terms of the GNU Library General Public
27 //    License as published by the Free Software Foundation; either
28 //    version 2 of the License, or (at your option) any later version.
29 //
30 //    This library is distributed in the hope that it will be useful,
31 //    but WITHOUT ANY WARRANTY; without even the implied warranty of
32 //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
33 //    Library General Public License for more details.
34
35 #define IBSS_ATTR
36
37 #ifdef WORDS_BIGENDIAN
38 #define ROCKBOX_BIG_ENDIAN
39 #else
40 #define ROCKBOX_LITTLE_ENDIAN
41 #endif
42
43 #include <stdbool.h>
44 #include <stdlib.h>
45 #include <inttypes.h>
46 #include <string.h>
47 #include <limits.h>
48 #include <assert.h>
49
50 #include "../wmafixed/bswap.h"
51 #include "enc_base.h"
52
53 #define ENC_PADDING_FRAMES1        2
54 #define ENC_PADDING_FRAMES2        4
55 #define ENC_DELAY_SAMP           576
56 #define ENC_DELAY_SIZE          (ENC_DELAY_SAMP*4)
57 #define SAMP_PER_FRAME1         1152
58 #define SAMP_PER_FRAME2          576
59 #define PCM_CHUNK_SIZE1         (SAMP_PER_FRAME1*4)
60 #define PCM_CHUNK_SIZE2         (SAMP_PER_FRAME2*4)
61 #define SAMPL2                576
62 #define SBLIMIT                32
63 #define HTN                    16
64
65 #define putlong(c, s)  if(s+sz <= 32) { cc = (cc << s) | c;      sz+= s; } \
66                        else           { putbits(cc, sz); cc = c; sz = s; }
67
68 typedef struct {
69     int   type; /* 0=(MPEG2 - 22.05,24,16kHz) 1=(MPEG1 - 44.1,48,32kHz) */
70     int   mode; /* 0=stereo, 1=jstereo, 2=dual, 3=mono  */
71     int   bitrate;
72     int   padding;
73     int   num_bands;
74     long  bitr_id;
75     int   smpl_id;
76 } mpeg_t;
77
78 /* Side information */
79 typedef struct {
80     uint32_t part2_3_length;
81     int    count1;          /* number of 0-1-quadruples  */
82     uint32_t global_gain;
83     uint32_t table_select[4];
84     uint32_t region_0_1;
85     uint32_t address1;
86     uint32_t address2;
87     uint32_t address3;
88     long     quantStep;
89     long     additStep;
90     uint32_t max_val;
91 } side_info_t;
92
93 typedef struct {
94     side_info_t       cod_info[2][2];
95     mpeg_t            mpg;
96     long              frac_per_frame;
97     long              byte_per_frame;
98     long              slot_lag;
99     int               sideinfo_len;
100     int               mean_bits;
101     int               ResvSize;
102     int               channels;
103     int               granules;
104     long              samplerate;
105 } config_t;
106
107 typedef struct {
108     int       bitpos;   /* current bitpos for writing */
109     uint32_t  bbuf[263];
110 } BF_Data;
111
112 struct huffcodetab {
113   int            len;    /* max. index                  */
114   const uint8_t  *table; /* pointer to array[len][len]  */
115   const uint8_t  *hlen;  /* pointer to array[len][len]  */
116 };
117
118 struct huffcodebig {
119   int          len;     /* max. index                   */
120   int          linbits; /* number of linbits            */
121   int          linmax;  /* max number stored in linbits */
122 };
123
124 #define shft4(x)    ((x +     8) >>  4)
125 #define shft9(x)    ((x +   256) >>  9)
126 #define shft13(x)   ((x +  4096) >> 13)
127 #define shft15(x)   ((x + 16384) >> 15)
128 #define shft16(x)   ((x + 32768) >> 16)
129 #define shft_n(x,n) ((x) >> n)
130 #define SQRT        724 /* sqrt(2) * 512 */
131
132 static short     mfbuf       [2*(1152+512)]      IBSS_ATTR; /*  3328 Bytes */
133 static int       sb_data     [2][2][18][SBLIMIT] IBSS_ATTR; /* 13824 Bytes */
134 static int       mdct_freq   [SAMPL2]            IBSS_ATTR; /*  2304 Bytes */
135 static char      mdct_sign   [SAMPL2]            IBSS_ATTR; /*   576 Bytes */
136 static short     enc_data    [SAMPL2]            IBSS_ATTR; /*  1152 Bytes */
137 static uint32_t  scalefac    [23]                IBSS_ATTR; /*    92 Bytes */
138 static BF_Data   CodedData                       IBSS_ATTR; /*  1056 Bytes */
139 static int       ca          [8]                 IBSS_ATTR; /*    32 Bytes */
140 static int       cs          [8]                 IBSS_ATTR; /*    32 Bytes */
141 static int       cx          [9]                 IBSS_ATTR; /*    36 Bytes */
142 static int       win         [18][4]             IBSS_ATTR; /*   288 Bytes */
143 static short     enwindow    [15*27+24]          IBSS_ATTR; /*   862 Bytes */
144 static short     int2idx     [4096]              IBSS_ATTR; /*  8192 Bytes */
145 static uint8_t   ht_count    [2][2][16]          IBSS_ATTR; /*    64 Bytes */
146 static uint32_t  tab01       [ 16]               IBSS_ATTR; /*    64 Bytes */
147 static uint32_t  tab23       [  9]               IBSS_ATTR; /*    36 Bytes */
148 static uint32_t  tab56       [ 16]               IBSS_ATTR; /*    64 Bytes */
149 static uint32_t  tab1315     [256]               IBSS_ATTR; /*  1024 Bytes */
150 static uint32_t  tab1624     [256]               IBSS_ATTR; /*  1024 Bytes */
151 static uint32_t  tab789      [ 36]               IBSS_ATTR; /*   144 Bytes */
152 static uint32_t  tabABC      [ 64]               IBSS_ATTR; /*   256 Bytes */
153 static uint8_t   t1HB        [  4]               IBSS_ATTR;
154 static uint8_t   t2HB        [  9]               IBSS_ATTR;
155 static uint8_t   t3HB        [  9]               IBSS_ATTR;
156 static uint8_t   t5HB        [ 16]               IBSS_ATTR;
157 static uint8_t   t6HB        [ 16]               IBSS_ATTR;
158 static uint8_t   t7HB        [ 36]               IBSS_ATTR;
159 static uint8_t   t8HB        [ 36]               IBSS_ATTR;
160 static uint8_t   t9HB        [ 36]               IBSS_ATTR;
161 static uint8_t   t10HB       [ 64]               IBSS_ATTR;
162 static uint8_t   t11HB       [ 64]               IBSS_ATTR;
163 static uint8_t   t12HB       [ 64]               IBSS_ATTR;
164 static uint8_t   t13HB       [256]               IBSS_ATTR;
165 static uint8_t   t15HB       [256]               IBSS_ATTR;
166 static uint16_t  t16HB       [256]               IBSS_ATTR;
167 static uint16_t  t24HB       [256]               IBSS_ATTR;
168 static uint8_t   t1l         [  8]               IBSS_ATTR;
169 static uint8_t   t2l         [  9]               IBSS_ATTR;
170 static uint8_t   t3l         [  9]               IBSS_ATTR;
171 static uint8_t   t5l         [ 16]               IBSS_ATTR;
172 static uint8_t   t6l         [ 16]               IBSS_ATTR;
173 static uint8_t   t7l         [ 36]               IBSS_ATTR;
174 static uint8_t   t8l         [ 36]               IBSS_ATTR;
175 static uint8_t   t9l         [ 36]               IBSS_ATTR;
176 static uint8_t   t10l        [ 64]               IBSS_ATTR;
177 static uint8_t   t11l        [ 64]               IBSS_ATTR;
178 static uint8_t   t12l        [ 64]               IBSS_ATTR;
179 static uint8_t   t13l        [256]               IBSS_ATTR;
180 static uint8_t   t15l        [256]               IBSS_ATTR;
181 static uint8_t   t16l        [256]               IBSS_ATTR;
182 static uint8_t   t24l        [256]               IBSS_ATTR;
183 static struct huffcodetab ht [HTN]               IBSS_ATTR;
184
185 static unsigned pcm_chunk_size                   IBSS_ATTR;
186 static unsigned samp_per_frame                   IBSS_ATTR;
187
188 static config_t          cfg                     IBSS_ATTR;
189 //static char             *res_buffer;
190 static int32_t           err                     IBSS_ATTR;
191 static uint8_t           band_scale_f[22];
192
193 static const uint8_t ht_count_const[2][2][16] =
194 { { { 1,  5,  4,  5,  6,  5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1 },     /* table0 */
195     { 1,  5,  5,  7,  5,  8, 7, 9, 5, 7, 7, 9, 7, 9, 9,10 } },   /* hleng0 */
196   { {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 },     /* table1 */
197     { 4,  5,  5,  6,  5,  6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 } } }; /* hleng1 */
198
199 static const uint8_t  t1HB_const[4]  = {1,1,1,0};
200 static const uint8_t  t2HB_const[9]  = {1,2,1,3,1,1,3,2,0};
201 static const uint8_t  t3HB_const[9]  = {3,2,1,1,1,1,3,2,0};
202 static const uint8_t  t5HB_const[16] = {1,2,6,5,3,1,4,4,7,5,7,1,6,1,1,0};
203 static const uint8_t  t6HB_const[16] = {7,3,5,1,6,2,3,2,5,4,4,1,3,3,2,0};
204
205 static const uint8_t  t7HB_const[36] =
206 {  1, 2,10,19,16,10, 3, 3, 7,10, 5, 3,11, 4,13,17, 8, 4,
207   12,11,18,15,11, 2, 7, 6, 9,14, 3, 1, 6, 4, 5, 3, 2, 0 };
208
209 static const uint8_t  t8HB_const[36] =
210 {  3, 4, 6,18,12, 5, 5, 1, 2,16, 9, 3, 7, 3, 5,14, 7, 3,
211   19,17,15,13,10, 4,13, 5, 8,11, 5, 1,12, 4, 4, 1, 1, 0 };
212
213 static const uint8_t  t9HB_const[36] =
214 {  7, 5, 9,14,15, 7, 6, 4, 5, 5, 6, 7, 7, 6, 8, 8, 8, 5,
215   15, 6, 9,10, 5, 1,11, 7, 9, 6, 4, 1,14, 4, 6, 2, 6, 0 };
216
217 static const uint8_t t10HB_const[64] =
218 {1,2,10,23,35,30,12,17,3,3,8,12,18,21,12,7,11,9,15,21,32,
219  40,19,6,14,13,22,34,46,23,18,7,20,19,33,47,27,22,9,3,31,22,
220  41,26,21,20,5,3,14,13,10,11,16,6,5,1,9,8,7,8,4,4,2,0 };
221
222 static const uint8_t t11HB_const[64] =
223 {3,4,10,24,34,33,21,15,5,3,4,10,32,17,11,10,11,7,13,18,30,
224  31,20,5,25,11,19,59,27,18,12,5,35,33,31,58,30,16,7,5,28,26,
225  32,19,17,15,8,14,14,12,9,13,14,9,4,1,11,4,6,6,6,3,2,0 };
226
227 static const uint8_t t12HB_const[64] =
228 {9,6,16,33,41,39,38,26,7,5,6,9,23,16,26,11,17,7,11,14,21,
229 30,10,7,17,10,15,12,18,28,14,5,32,13,22,19,18,16,9,5,40,17,
230 31,29,17,13,4,2,27,12,11,15,10,7,4,1,27,12,8,12,6,3,1,0 };
231
232 static const uint8_t t13HB_const[256] =
233 {1,5,14,21,34,51,46,71,42,52,68,52,67,44,43,19,3,4,12,19,31,26,44,33,31,24,32,
234  24,31,35,22,14,15,13,23,36,59,49,77,65,29,40,30,40,27,33,42,16,22,20,37,61,56,
235  79,73,64,43,76,56,37,26,31,25,14,35,16,60,57,97,75,114,91,54,73,55,41,48,53,
236  23,24,58,27,50,96,76,70,93,84,77,58,79,29,74,49,41,17,47,45,78,74,115,94,90,
237  79,69,83,71,50,59,38,36,15,72,34,56,95,92,85,91,90,86,73,77,65,51,44,43,42,43,
238  20,30,44,55,78,72,87,78,61,46,54,37,30,20,16,53,25,41,37,44,59,54,81,66,76,57,
239  54,37,18,39,11,35,33,31,57,42,82,72,80,47,58,55,21,22,26,38,22,53,25,23,38,70,
240  60,51,36,55,26,34,23,27,14,9,7,34,32,28,39,49,75,30,52,48,40,52,28,18,17,9,5,
241  45,21,34,64,56,50,49,45,31,19,12,15,10,7,6,3,48,23,20,39,36,35,53,21,16,23,13,
242  10,6,1,4,2,16,15,17,27,25,20,29,11,17,12,16,8,1,1,0,1 };
243
244 static const uint8_t t15HB_const[256] =
245 {7,12,18,53,47,76,124,108,89,123,108,119,107,81,122,63,13,5,16,27,46,36,61,51,
246  42,70,52,83,65,41,59,36,19,17,15,24,41,34,59,48,40,64,50,78,62,80,56,33,29,28,
247  25,43,39,63,55,93,76,59,93,72,54,75,50,29,52,22,42,40,67,57,95,79,72,57,89,69,
248  49,66,46,27,77,37,35,66,58,52,91,74,62,48,79,63,90,62,40,38,125,32,60,56,50,
249  92,78,65,55,87,71,51,73,51,70,30,109,53,49,94,88,75,66,122,91,73,56,42,64,44,
250  21,25,90,43,41,77,73,63,56,92,77,66,47,67,48,53,36,20,71,34,67,60,58,49,88,76,
251  67,106,71,54,38,39,23,15,109,53,51,47,90,82,58,57,48,72,57,41,23,27,62,9,86,
252  42,40,37,70,64,52,43,70,55,42,25,29,18,11,11,118,68,30,55,50,46,74,65,49,39,
253  24,16,22,13,14,7,91,44,39,38,34,63,52,45,31,52,28,19,14,8,9,3,123,60,58,53,47,
254  43,32,22,37,24,17,12,15,10,2,1,71,37,34,30,28,20,17,26,21,16,10,6,8,6,2,0};
255
256 static const uint16_t t16HB_const[256] =
257 {1,5,14,44,74,63,110,93,172,149,138,242,225,195,376,17,3,4,12,20,35,62,53,47,
258  83,75,68,119,201,107,207,9,15,13,23,38,67,58,103,90,161,72,127,117,110,209,
259  206,16,45,21,39,69,64,114,99,87,158,140,252,212,199,387,365,26,75,36,68,65,
260  115,101,179,164,155,264,246,226,395,382,362,9,66,30,59,56,102,185,173,265,142,
261  253,232,400,388,378,445,16,111,54,52,100,184,178,160,133,257,244,228,217,385,
262  366,715,10,98,48,91,88,165,157,148,261,248,407,397,372,380,889,884,8,85,84,81,
263  159,156,143,260,249,427,401,392,383,727,713,708,7,154,76,73,141,131,256,245,
264  426,406,394,384,735,359,710,352,11,139,129,67,125,247,233,229,219,393,743,737,
265  720,885,882,439,4,243,120,118,115,227,223,396,746,742,736,721,712,706,223,436,
266  6,202,224,222,218,216,389,386,381,364,888,443,707,440,437,1728,4,747,211,210,
267  208,370,379,734,723,714,1735,883,877,876,3459,865,2,377,369,102,187,726,722,
268  358,711,709,866,1734,871,3458,870,434,0,12,10,7,11,10,17,11,9,13,12,10,7,5,3,
269  1,3};
270
271 static const uint16_t t24HB_const[256] =
272 {15,13,46,80,146,262,248,434,426,669,653,649,621,517,1032,88,14,12,21,38,71,
273  130,122,216,209,198,327,345,319,297,279,42,47,22,41,74,68,128,120,221,207,194,
274  182,340,315,295,541,18,81,39,75,70,134,125,116,220,204,190,178,325,311,293,
275  271,16,147,72,69,135,127,118,112,210,200,188,352,323,306,285,540,14,263,66,
276  129,126,119,114,214,202,192,180,341,317,301,281,262,12,249,123,121,117,113,
277  215,206,195,185,347,330,308,291,272,520,10,435,115,111,109,211,203,196,187,
278  353,332,313,298,283,531,381,17,427,212,208,205,201,193,186,177,169,320,303,
279  286,268,514,377,16,335,199,197,191,189,181,174,333,321,305,289,275,521,379,
280  371,11,668,184,183,179,175,344,331,314,304,290,277,530,383,373,366,10,652,346,
281  171,168,164,318,309,299,287,276,263,513,375,368,362,6,648,322,316,312,307,302,
282  292,284,269,261,512,376,370,364,359,4,620,300,296,294,288,282,273,266,515,380,
283  374,369,365,361,357,2,1033,280,278,274,267,264,259,382,378,372,367,363,360,
284  358,356,0,43,20,19,17,15,13,11,9,7,6,4,7,5,3,1,3};
285
286 static const uint32_t tab1315_const[256] =
287 { 0x010003,0x050005,0x070006,0x080008,0x090008,0x0a0009,0x0a000a,0x0b000a,
288   0x0a000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0d000c,0x0e000d,0x0e000e,
289   0x040005,0x060005,0x080007,0x090008,0x0a0009,0x0a0009,0x0b000a,0x0b000a,
290   0x0b000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0e000c,0x0e000d,0x0e000d,
291   0x070006,0x080007,0x090007,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,
292   0x0b000a,0x0c000b,0x0c000b,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d,
293   0x080007,0x090008,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0c000b,
294   0x0c000b,0x0d000b,0x0d000c,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d,
295   0x090008,0x090008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0d000b,0x0d000b,
296   0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000d,
297   0x0a0009,0x0a0009,0x0b0009,0x0c000a,0x0c000a,0x0c000a,0x0d000b,0x0d000b,
298   0x0d000b,0x0d000b,0x0e000c,0x0d000c,0x0f000d,0x0f000d,0x10000d,0x10000e,
299   0x0a000a,0x0b0009,0x0c000a,0x0c000a,0x0d000a,0x0d000b,0x0d000b,0x0d000b,
300   0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x10000e,
301   0x0b000a,0x0b000a,0x0c000a,0x0d000b,0x0d000b,0x0d000b,0x0e000b,0x0e000c,
302   0x0e000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x12000d,0x12000e,
303   0x0a000a,0x0a000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0e000c,
304   0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x11000e,0x11000e,
305   0x0b000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0d000c,0x0f000c,
306   0x0e000c,0x0f000d,0x0f000d,0x10000d,0x10000d,0x10000e,0x12000e,0x11000e,
307   0x0b000b,0x0c000b,0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000c,
308   0x0e000c,0x0f000d,0x10000d,0x0f000d,0x10000d,0x11000e,0x12000f,0x13000e,
309   0x0c000b,0x0c000b,0x0c000b,0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0e000c,
310   0x0f000d,0x0f000d,0x0f000d,0x10000d,0x11000e,0x11000e,0x11000e,0x12000f,
311   0x0c000c,0x0d000c,0x0d000b,0x0e000c,0x0e000c,0x0f000c,0x0e000d,0x0f000d,
312   0x10000d,0x10000d,0x11000d,0x11000d,0x11000e,0x12000e,0x12000f,0x12000f,
313   0x0d000c,0x0d000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x10000d,
314   0x10000d,0x10000e,0x10000e,0x11000e,0x12000e,0x11000e,0x12000f,0x12000f,
315   0x0e000d,0x0e000d,0x0e000d,0x0f000d,0x0f000d,0x0f000d,0x11000d,0x10000d,
316   0x10000e,0x13000e,0x11000e,0x11000e,0x11000f,0x13000f,0x12000e,0x12000f,
317   0x0d000d,0x0e000d,0x0f000d,0x10000d,0x10000d,0x10000d,0x11000d,0x10000e,
318   0x11000e,0x11000e,0x12000e,0x12000e,0x15000f,0x14000f,0x15000f,0x12000f };
319
320 static const uint32_t tab01_const[16] =
321 { 0x10004,0x50005,0x50005,0x70006,0x50005,0x80006,0x70006,0x90007,
322   0x50005,0x70006,0x70006,0x90007,0x70006,0x90007,0x90007,0xa0008 };
323
324 static const uint32_t tab23_const[ 9] =
325 { 0x10002,0x40003,0x70007,0x40004,0x50004,0x70007,0x60006,0x70007,0x80008 };
326
327 static const uint32_t tab56_const[16] =
328 { 0x10003,0x40004,0x70006,0x80008,0x40004,0x50004,0x80006,0x90007,
329   0x70005,0x80006,0x90007,0xa0008,0x80007,0x80007,0x90008,0xa0009 };
330
331 static const uint32_t tab789_const[36] =
332 {0x00100803,0x00401004,0x00701c06,0x00902407,0x00902409,0x00a0280a,0x00401004,
333  0x00601005,0x00801806,0x00902807,0x00902808,0x00a0280a,0x00701c05,0x00701806,
334  0x00902007,0x00a02808,0x00a02809,0x00b02c0a,0x00802407,0x00902807,0x00a02808,
335  0x00b02c09,0x00b02c09,0x00b0300a,0x00802408,0x00902408,0x00a02809,0x00b02c09,
336  0x00b0300a,0x00c0300b,0x00902809,0x00a02809,0x00b02c0a,0x00c02c0a,0x00c0340b,
337  0x00c0340b};
338
339 static const uint32_t tabABC_const[64] =
340 {0x00100804,0x00401004,0x00701806,0x00902008,0x00a02409,0x00a0280a,0x00a0240a,
341  0x00b0280a,0x00401004,0x00601405,0x00801806,0x00902007,0x00a02809,0x00b02809,
342  0x00a0240a,0x00a0280a,0x00701806,0x00801c06,0x00902007,0x00a02408,0x00b02809,
343  0x00c02c0a,0x00b02809,0x00b0280a,0x00802007,0x00902007,0x00a02408,0x00b02c08,
344  0x00c02809,0x00c0300a,0x00b0280a,0x00c02c0a,0x00902408,0x00a02808,0x00b02809,
345  0x00c02c09,0x00c02c0a,0x00c0300a,0x00c02c0a,0x00c0300b,0x00a02409,0x00b02809,
346  0x00c02c0a,0x00c0300a,0x00d0300a,0x00d0340b,0x00c0300a,0x00d0340b,0x00902409,
347  0x00a02409,0x00b02409,0x00c0280a,0x00c02c0a,0x00c0300b,0x00d0300b,0x00d0300c,
348  0x00a0240a,0x00a0240a,0x00b0280a,0x00c02c0b,0x00c0300b,0x00d0300b,0x00d0300b,
349  0x00d0300c};
350
351 static const uint32_t tab1624_const[256] =
352 {0x00010004,0x00050005,0x00070007,0x00090008,0x000a0009,0x000a000a,0x000b000a,
353  0x000b000b,0x000c000b,0x000c000c,0x000c000c,0x000d000c,0x000d000c,0x000d000c,
354  0x000e000d,0x000a000a,0x00040005,0x00060006,0x00080007,0x00090008,0x000a0009,
355  0x000b000a,0x000b000a,0x000b000b,0x000c000b,0x000c000b,0x000c000c,0x000d000c,
356  0x000e000c,0x000d000c,0x000e000c,0x000a000a,0x00070007,0x00080007,0x00090008,
357  0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000b,0x000d000b,0x000c000b,
358  0x000d000b,0x000d000c,0x000d000c,0x000e000c,0x000e000d,0x000b0009,0x00090008,
359  0x00090008,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a,0x000c000b,
360  0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c,0x000f000c,
361  0x000c0009,0x000a0009,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a,
362  0x000d000a,0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c,
363  0x000f000c,0x000f000d,0x000b0009,0x000a000a,0x000a0009,0x000b000a,0x000b000a,
364  0x000c000a,0x000d000a,0x000d000b,0x000e000b,0x000d000b,0x000e000b,0x000e000c,
365  0x000f000c,0x000f000c,0x000f000c,0x0010000c,0x000c0009,0x000b000a,0x000b000a,
366  0x000b000a,0x000c000a,0x000d000a,0x000d000b,0x000d000b,0x000d000b,0x000e000b,
367  0x000e000c,0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000d,0x000c0009,
368  0x000b000b,0x000b000a,0x000c000a,0x000c000a,0x000d000b,0x000d000b,0x000d000b,
369  0x000e000b,0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000d,
370  0x0011000d,0x000c000a,0x000b000b,0x000c000b,0x000c000b,0x000d000b,0x000d000b,
371  0x000d000b,0x000e000b,0x000e000b,0x000f000b,0x000f000c,0x000f000c,0x000f000c,
372  0x0010000c,0x0010000d,0x0010000d,0x000c000a,0x000c000b,0x000c000b,0x000c000b,
373  0x000d000b,0x000d000b,0x000e000b,0x000e000b,0x000f000c,0x000f000c,0x000f000c,
374  0x000f000c,0x0010000c,0x000f000d,0x0010000d,0x000f000d,0x000d000a,0x000c000c,
375  0x000d000b,0x000c000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000e000c,
376  0x000f000c,0x0010000c,0x0010000c,0x0010000d,0x0011000d,0x0011000d,0x0010000d,
377  0x000c000a,0x000d000c,0x000d000c,0x000d000b,0x000d000b,0x000e000b,0x000e000c,
378  0x000f000c,0x0010000c,0x0010000c,0x0010000c,0x0010000c,0x0010000d,0x0010000d,
379  0x000f000d,0x0010000d,0x000d000a,0x000d000c,0x000e000c,0x000e000c,0x000e000c,
380  0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000c,0x0010000d,
381  0x0010000d,0x0010000d,0x0010000d,0x0012000d,0x000d000a,0x000f000c,0x000e000c,
382  0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000c,0x0010000c,0x0010000d,
383  0x0012000d,0x0011000d,0x0011000d,0x0011000d,0x0013000d,0x0011000d,0x000d000a,
384  0x000e000d,0x000f000c,0x000d000c,0x000e000c,0x0010000c,0x0010000c,0x000f000c,
385  0x0010000d,0x0010000d,0x0011000d,0x0012000d,0x0011000d,0x0013000d,0x0011000d,
386  0x0010000d,0x000d000a,0x000a0009,0x000a0009,0x000a0009,0x000b0009,0x000b0009,
387  0x000c0009,0x000c0009,0x000c0009,0x000d0009,0x000d0009,0x000d0009,0x000d000a,
388  0x000d000a,0x000d000a,0x000d000a,0x000a0006};
389
390 static const uint8_t t1l_const[8]  = {1,3,2,3,1,4,3,5};
391 static const uint8_t t2l_const[9]  = {1,3,6,3,3,5,5,5,6};
392 static const uint8_t t3l_const[9]  = {2,2,6,3,2,5,5,5,6};
393 static const uint8_t t5l_const[16] = {1,3,6,7,3,3,6,7,6,6,7,8,7,6,7,8};
394 static const uint8_t t6l_const[16] = {3,3,5,7,3,2,4,5,4,4,5,6,6,5,6,7};
395
396 static const uint8_t t7l_const[36] =
397 {1,3,6,8,8,9,3,4,6,7,7,8,6,5,7,8,8,9,7,7,8,9,9,9,7,7,8,9,9,10,8,8,9,10,10,10};
398
399 static const uint8_t t8l_const[36] =
400 {2,3,6,8,8,9,3,2,4,8,8,8,6,4,6,8,8,9,8,8,8,9,9,10,8,7,8,9,10,10,9,8,9,9,11,11};
401
402 static const uint8_t t9l_const[36] =
403 {3,3,5,6,8,9,3,3,4,5,6,8,4,4,5,6,7,8,6,5,6,7,7,8,7,6,7,7,8,9,8,7,8,8,9,9};
404
405 static const uint8_t t10l_const[64] =
406 {1,3,6,8,9,9,9,10,3,4,6,7,8,9,8,8,6,6,7,8,9,10,9,9,7,7,8,9,10,10,9,10,8,8,9,10,
407  10,10,10,10,9,9,10,10,11,11,10,11,8,8,9,10,10,10,11,11,9,8,9,10,10,11,11,11};
408
409 static const uint8_t t11l_const[64] =
410 {2,3,5,7,8,9,8,9,3,3,4,6,8,8,7,8,5,5,6,7,8,9,8,8,7,6,7,9,8,10,8,9,8,8,8,9,9,10,
411  9,10,8,8,9,10,10,11,10,11,8,7,7,8,9,10,10,10,8,7,8,9,10,10,10,10};
412
413 static const uint8_t t12l_const[64] =
414 {4,3,5,7,8,9,9,9,3,3,4,5,7,7,8,8,5,4,5,6,7,8,7,8,6,5,6,6,7,8,8,8,7,6,7,7,8,
415  8,8,9,8,7,8,8,8,9,8,9,8,7,7,8,8,9,9,10,9,8,8,9,9,9,9,10};
416
417 static const uint8_t t13l_const[256] =
418 {1,4,6,7,8,9,9,10,9,10,11,11,12,12,13,13,3,4,6,7,8,8,9,9,9,9,10,10,11,12,12,12,
419  6,6,7,8,9,9,10,10,9,10,10,11,11,12,13,13,7,7,8,9,9,10,10,10,10,11,11,11,11,12,
420  13,13,8,7,9,9,10,10,11,11,10,11,11,12,12,13,13,14,9,8,9,10,10,10,11,11,11,11,
421  12,11,13,13,14,14,9,9,10,10,11,11,11,11,11,12,12,12,13,13,14,14,10,9,10,11,11,
422  11,12,12,12,12,13,13,13,14,16,16,9,8,9,10,10,11,11,12,12,12,12,13,13,14,15,15,
423  10,9,10,10,11,11,11,13,12,13,13,14,14,14,16,15,10,10,10,11,11,12,12,13,12,13,
424  14,13,14,15,16,17,11,10,10,11,12,12,12,12,13,13,13,14,15,15,15,16,11,11,11,12,
425  12,13,12,13,14,14,15,15,15,16,16,16,12,11,12,13,13,13,14,14,14,14,14,15,16,15,
426  16,16,13,12,12,13,13,13,15,14,14,17,15,15,15,17,16,16,12,12,13,14,14,14,15,14,
427  15,15,16,16,19,18,19,16};
428
429 static const uint8_t t15l_const[256] =
430 {3,4,5,7,7,8,9,9,9,10,10,11,11,11,12,13,4,3,5,6,7,7,8,8,8,9,9,10,10,10,11,11,5,
431  5,5,6,7,7,8,8,8,9,9,10,10,11,11,11,6,6,6,7,7,8,8,9,9,9,10,10,10,11,11,11,7,6,
432  7,7,8,8,9,9,9,9,10,10,10,11,11,11,8,7,7,8,8,8,9,9,9,9,10,10,11,11,11,12,9,7,8,
433  8,8,9,9,9,9,10,10,10,11,11,12,12,9,8,8,9,9,9,9,10,10,10,10,10,11,11,11,12,9,8,
434  8,9,9,9,9,10,10,10,10,11,11,12,12,12,9,8,9,9,9,9,10,10,10,11,11,11,11,12,12,
435  12,10,9,9,9,10,10,10,10,10,11,11,11,11,12,13,12,10,9,9,9,10,10,10,10,11,11,11,
436  11,12,12,12,13,11,10,9,10,10,10,11,11,11,11,11,11,12,12,13,13,11,10,10,10,10,
437  11,11,11,11,12,12,12,12,12,13,13,12,11,11,11,11,11,11,11,12,12,12,12,13,13,12,
438  13,12,11,11,11,11,11,11,12,12,12,12,12,13,13,13,13};
439
440 static const uint8_t t16l_const[256] =
441 {1,4,6,8,9,9,10,10,11,11,11,12,12,12,13,9,3,4,6,7,8,9,9,9,10,10,10,11,12,11,12,
442  8,6,6,7,8,9,9,10,10,11,10,11,11,11,12,12,9,8,7,8,9,9,10,10,10,11,11,12,12,12,
443  13,13,10,9,8,9,9,10,10,11,11,11,12,12,12,13,13,13,9,9,8,9,9,10,11,11,12,11,12,
444  12,13,13,13,14,10,10,9,9,10,11,11,11,11,12,12,12,12,13,13,14,10,10,9,10,10,11,
445  11,11,12,12,13,13,13,13,15,15,10,10,10,10,11,11,11,12,12,13,13,13,13,14,14,14,
446  10,11,10,10,11,11,12,12,13,13,13,13,14,13,14,13,11,11,11,10,11,12,12,12,12,13,
447  14,14,14,15,15,14,10,12,11,11,11,12,12,13,14,14,14,14,14,14,13,14,11,12,12,12,
448  12,12,13,13,13,13,15,14,14,14,14,16,11,14,12,12,12,13,13,14,14,14,16,15,15,15,
449  17,15,11,13,13,11,12,14,14,13,14,14,15,16,15,17,15,14,11,9,8,8,9,9,10,10,10,
450  11,11,11,11,11,11,11,8};
451
452 static const uint8_t t24l_const[256] =
453 {4,4,6,7,8,9,9,10,10,11,11,11,11,11,12,9,4,4,5,6,7,8,8,9,9,9,10,10,10,10,10,8,
454  6,5,6,7,7,8,8,9,9,9,9,10,10,10,11,7,7,6,7,7,8,8,8,9,9,9,9,10,10,10,10,7,8,7,7,
455  8,8,8,8,9,9,9,10,10,10,10,11,7,9,7,8,8,8,8,9,9,9,9,10,10,10,10,10,7,9,8,8,8,8,
456  9,9,9,9,10,10,10,10,10,11,7,10,8,8,8,9,9,9,9,10,10,10,10,10,11,11,8,10,9,9,9,
457  9,9,9,9,9,10,10,10,10,11,11,8,10,9,9,9,9,9,9,10,10,10,10,10,11,11,11,8,11,9,9,
458  9,9,10,10,10,10,10,10,11,11,11,11,8,11,10,9,9,9,10,10,10,10,10,10,11,11,11,11,
459  8,11,10,10,10,10,10,10,10,10,10,11,11,11,11,11,8,11,10,10,10,10,10,10,10,11,
460  11,11,11,11,11,11,8,12,10,10,10,10,10,10,11,11,11,11,11,11,11,11,8,8,7,7,7,7,
461  7,7,7,7,7,7,8,8,8,8,4};
462
463 static const struct huffcodetab ht_const[HTN] =
464 { { 0, NULL, NULL}, /* Apparently not used */
465   { 2, t1HB,  t1l},
466   { 3, t2HB,  t2l},
467   { 3, t3HB,  t3l},
468   { 0, NULL, NULL}, /* Apparently not used */
469   { 4, t5HB,  t5l},
470   { 4, t6HB,  t6l},
471   { 6, t7HB,  t7l},
472   { 6, t8HB,  t8l},
473   { 6, t9HB,  t9l},
474   { 8, t10HB, t10l},
475   { 8, t11HB, t11l},
476   { 8, t12HB, t12l},
477   {16, t13HB, t13l},
478   { 0, NULL,  NULL}, /* Apparently not used */
479   {16, t15HB, t15l} };
480
481 static const struct huffcodebig ht_big[HTN] =
482 { { 16,  1,    1 },
483   { 16,  2,    3 },
484   { 16,  3,    7 },
485   { 16,  4,   15 },
486   { 16,  6,   63 },
487   { 16,  8,  255 },
488   { 16, 10, 1023 },
489   { 16, 13, 8191 },
490   { 16,  4,   15 },
491   { 16,  5,   31 },
492   { 16,  6,   63 },
493   { 16,  7,  127 },
494   { 16,  8,  255 },
495   { 16,  9,  511 },
496   { 16, 11, 2047 },
497   { 16, 13, 8191 } };
498
499 static const struct
500 {
501   uint32_t region0_cnt;
502   uint32_t region1_cnt;
503 } subdv_table[23] =
504 { {0, 0}, /*  0 bands */
505   {0, 0}, /*  1 bands */
506   {0, 0}, /*  2 bands */
507   {0, 0}, /*  3 bands */
508   {0, 0}, /*  4 bands */
509   {0, 1}, /*  5 bands */
510   {1, 1}, /*  6 bands */
511   {1, 1}, /*  7 bands */
512   {1, 2}, /*  8 bands */
513   {2, 2}, /*  9 bands */
514   {2, 3}, /* 10 bands */
515   {2, 3}, /* 11 bands */
516   {3, 4}, /* 12 bands */
517   {3, 4}, /* 13 bands */
518   {3, 4}, /* 14 bands */
519   {4, 5}, /* 15 bands */
520   {4, 5}, /* 16 bands */
521   {4, 6}, /* 17 bands */
522   {5, 6}, /* 18 bands */
523   {5, 6}, /* 19 bands */
524   {5, 7}, /* 20 bands */
525   {6, 7}, /* 21 bands */
526   {6, 7}, /* 22 bands */
527 };
528
529 static const uint32_t sfBand[6][23] =
530 {
531 /* Table B.2.b: 22.05 kHz */
532 {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
533 /* Table B.2.c: 24 kHz */
534 {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576},
535 /* Table B.2.a: 16 kHz */
536 {0,6,12,18,24,30,36,44,45,66,80,96,116,140,168,200,238,248,336,396,464,522,576},
537 /* Table B.8.b: 44.1 kHz */
538 {0,4, 8,12,16,20,24,30,36,44,52,62, 74, 90,110,134,162,196,238,288,342,418,576},
539 /* Table B.8.c: 48 kHz */
540 {0,4, 8,12,16,20,24,30,36,42,50,60, 72, 88,106,128,156,190,230,276,330,384,576},
541 /* Table B.8.a: 32 kHz */
542 {0,4, 8,12,16,20,24,30,36,44,54,66, 82,102,126,156,194,240,296,364,448,550,576} };
543
544
545 static const short int2idx_const[4096] = /*  int2idx[i] = sqrt(i*sqrt(i)); */
546 {
547   0,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  6,  6,  7,  7,  8,  8,  8,  9,  9,
548   9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16,
549  16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21,
550  22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26,
551  27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
552  32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36,
553  36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40,
554  41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45,
555  45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49,
556  49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53,
557  53, 53, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 57, 57, 57,
558  57, 57, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 61, 61,
559  61, 61, 61, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 65,
560  65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68,
561  68, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 72, 72, 72,
562  72, 72, 72, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75,
563  76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 79, 79, 79,
564  79, 79, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82,
565  83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 86, 86, 86,
566  86, 86, 86, 87, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89,
567  89, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 93,
568  93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 96, 96, 96,
569  96, 96, 96, 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99,
570  99, 99,100,100,100,100,100,100,101,101,101,101,101,101,102,102,102,102,102,102,
571 103,103,103,103,103,103,104,104,104,104,104,104,104,105,105,105,105,105,105,106,
572 106,106,106,106,106,107,107,107,107,107,107,107,108,108,108,108,108,108,109,109,
573 109,109,109,109,110,110,110,110,110,110,110,111,111,111,111,111,111,112,112,112,
574 112,112,112,112,113,113,113,113,113,113,114,114,114,114,114,114,115,115,115,115,
575 115,115,115,116,116,116,116,116,116,117,117,117,117,117,117,117,118,118,118,118,
576 118,118,118,119,119,119,119,119,119,120,120,120,120,120,120,120,121,121,121,121,
577 121,121,122,122,122,122,122,122,122,123,123,123,123,123,123,123,124,124,124,124,
578 124,124,125,125,125,125,125,125,125,126,126,126,126,126,126,126,127,127,127,127,
579 127,127,128,128,128,128,128,128,128,129,129,129,129,129,129,129,130,130,130,130,
580 130,130,131,131,131,131,131,131,131,132,132,132,132,132,132,132,133,133,133,133,
581 133,133,133,134,134,134,134,134,134,134,135,135,135,135,135,135,136,136,136,136,
582 136,136,136,137,137,137,137,137,137,137,138,138,138,138,138,138,138,139,139,139,
583 139,139,139,139,140,140,140,140,140,140,140,141,141,141,141,141,141,141,142,142,
584 142,142,142,142,142,143,143,143,143,143,143,143,144,144,144,144,144,144,144,145,
585 145,145,145,145,145,145,146,146,146,146,146,146,146,147,147,147,147,147,147,147,
586 148,148,148,148,148,148,148,149,149,149,149,149,149,149,150,150,150,150,150,150,
587 150,151,151,151,151,151,151,151,152,152,152,152,152,152,152,153,153,153,153,153,
588 153,153,154,154,154,154,154,154,154,154,155,155,155,155,155,155,155,156,156,156,
589 156,156,156,156,157,157,157,157,157,157,157,158,158,158,158,158,158,158,159,159,
590 159,159,159,159,159,160,160,160,160,160,160,160,160,161,161,161,161,161,161,161,
591 162,162,162,162,162,162,162,163,163,163,163,163,163,163,163,164,164,164,164,164,
592 164,164,165,165,165,165,165,165,165,166,166,166,166,166,166,166,167,167,167,167,
593 167,167,167,167,168,168,168,168,168,168,168,169,169,169,169,169,169,169,169,170,
594 170,170,170,170,170,170,171,171,171,171,171,171,171,172,172,172,172,172,172,172,
595 172,173,173,173,173,173,173,173,174,174,174,174,174,174,174,174,175,175,175,175,
596 175,175,175,176,176,176,176,176,176,176,176,177,177,177,177,177,177,177,178,178,
597 178,178,178,178,178,178,179,179,179,179,179,179,179,180,180,180,180,180,180,180,
598 180,181,181,181,181,181,181,181,182,182,182,182,182,182,182,182,183,183,183,183,
599 183,183,183,184,184,184,184,184,184,184,184,185,185,185,185,185,185,185,186,186,
600 186,186,186,186,186,186,187,187,187,187,187,187,187,187,188,188,188,188,188,188,
601 188,189,189,189,189,189,189,189,189,190,190,190,190,190,190,190,190,191,191,191,
602 191,191,191,191,192,192,192,192,192,192,192,192,193,193,193,193,193,193,193,193,
603 194,194,194,194,194,194,194,195,195,195,195,195,195,195,195,196,196,196,196,196,
604 196,196,196,197,197,197,197,197,197,197,197,198,198,198,198,198,198,198,199,199,
605 199,199,199,199,199,199,200,200,200,200,200,200,200,200,201,201,201,201,201,201,
606 201,201,202,202,202,202,202,202,202,202,203,203,203,203,203,203,203,204,204,204,
607 204,204,204,204,204,205,205,205,205,205,205,205,205,206,206,206,206,206,206,206,
608 206,207,207,207,207,207,207,207,207,208,208,208,208,208,208,208,208,209,209,209,
609 209,209,209,209,209,210,210,210,210,210,210,210,210,211,211,211,211,211,211,211,
610 211,212,212,212,212,212,212,212,212,213,213,213,213,213,213,213,213,214,214,214,
611 214,214,214,214,214,215,215,215,215,215,215,215,215,216,216,216,216,216,216,216,
612 216,217,217,217,217,217,217,217,217,218,218,218,218,218,218,218,218,219,219,219,
613 219,219,219,219,219,220,220,220,220,220,220,220,220,221,221,221,221,221,221,221,
614 221,222,222,222,222,222,222,222,222,223,223,223,223,223,223,223,223,224,224,224,
615 224,224,224,224,224,225,225,225,225,225,225,225,225,226,226,226,226,226,226,226,
616 226,227,227,227,227,227,227,227,227,228,228,228,228,228,228,228,228,229,229,229,
617 229,229,229,229,229,229,230,230,230,230,230,230,230,230,231,231,231,231,231,231,
618 231,231,232,232,232,232,232,232,232,232,233,233,233,233,233,233,233,233,234,234,
619 234,234,234,234,234,234,234,235,235,235,235,235,235,235,235,236,236,236,236,236,
620 236,236,236,237,237,237,237,237,237,237,237,238,238,238,238,238,238,238,238,238,
621 239,239,239,239,239,239,239,239,240,240,240,240,240,240,240,240,241,241,241,241,
622 241,241,241,241,242,242,242,242,242,242,242,242,242,243,243,243,243,243,243,243,
623 243,244,244,244,244,244,244,244,244,245,245,245,245,245,245,245,245,245,246,246,
624 246,246,246,246,246,246,247,247,247,247,247,247,247,247,248,248,248,248,248,248,
625 248,248,248,249,249,249,249,249,249,249,249,250,250,250,250,250,250,250,250,250,
626 251,251,251,251,251,251,251,251,252,252,252,252,252,252,252,252,253,253,253,253,
627 253,253,253,253,253,254,254,254,254,254,254,254,254,255,255,255,255,255,255,255,
628 255,255,256,256,256,256,256,256,256,256,257,257,257,257,257,257,257,257,257,258,
629 258,258,258,258,258,258,258,259,259,259,259,259,259,259,259,259,260,260,260,260,
630 260,260,260,260,261,261,261,261,261,261,261,261,261,262,262,262,262,262,262,262,
631 262,263,263,263,263,263,263,263,263,263,264,264,264,264,264,264,264,264,265,265,
632 265,265,265,265,265,265,265,266,266,266,266,266,266,266,266,267,267,267,267,267,
633 267,267,267,267,268,268,268,268,268,268,268,268,268,269,269,269,269,269,269,269,
634 269,270,270,270,270,270,270,270,270,270,271,271,271,271,271,271,271,271,271,272,
635 272,272,272,272,272,272,272,273,273,273,273,273,273,273,273,273,274,274,274,274,
636 274,274,274,274,275,275,275,275,275,275,275,275,275,276,276,276,276,276,276,276,
637 276,276,277,277,277,277,277,277,277,277,277,278,278,278,278,278,278,278,278,279,
638 279,279,279,279,279,279,279,279,280,280,280,280,280,280,280,280,280,281,281,281,
639 281,281,281,281,281,282,282,282,282,282,282,282,282,282,283,283,283,283,283,283,
640 283,283,283,284,284,284,284,284,284,284,284,284,285,285,285,285,285,285,285,285,
641 286,286,286,286,286,286,286,286,286,287,287,287,287,287,287,287,287,287,288,288,
642 288,288,288,288,288,288,288,289,289,289,289,289,289,289,289,289,290,290,290,290,
643 290,290,290,290,291,291,291,291,291,291,291,291,291,292,292,292,292,292,292,292,
644 292,292,293,293,293,293,293,293,293,293,293,294,294,294,294,294,294,294,294,294,
645 295,295,295,295,295,295,295,295,295,296,296,296,296,296,296,296,296,296,297,297,
646 297,297,297,297,297,297,297,298,298,298,298,298,298,298,298,299,299,299,299,299,
647 299,299,299,299,300,300,300,300,300,300,300,300,300,301,301,301,301,301,301,301,
648 301,301,302,302,302,302,302,302,302,302,302,303,303,303,303,303,303,303,303,303,
649 304,304,304,304,304,304,304,304,304,305,305,305,305,305,305,305,305,305,306,306,
650 306,306,306,306,306,306,306,307,307,307,307,307,307,307,307,307,308,308,308,308,
651 308,308,308,308,308,309,309,309,309,309,309,309,309,309,310,310,310,310,310,310,
652 310,310,310,311,311,311,311,311,311,311,311,311,312,312,312,312,312,312,312,312,
653 312,313,313,313,313,313,313,313,313,313,314,314,314,314,314,314,314,314,314,315,
654 315,315,315,315,315,315,315,315,316,316,316,316,316,316,316,316,316,317,317,317,
655 317,317,317,317,317,317,318,318,318,318,318,318,318,318,318,318,319,319,319,319,
656 319,319,319,319,319,320,320,320,320,320,320,320,320,320,321,321,321,321,321,321,
657 321,321,321,322,322,322,322,322,322,322,322,322,323,323,323,323,323,323,323,323,
658 323,324,324,324,324,324,324,324,324,324,325,325,325,325,325,325,325,325,325,325,
659 326,326,326,326,326,326,326,326,326,327,327,327,327,327,327,327,327,327,328,328,
660 328,328,328,328,328,328,328,329,329,329,329,329,329,329,329,329,330,330,330,330,
661 330,330,330,330,330,330,331,331,331,331,331,331,331,331,331,332,332,332,332,332,
662 332,332,332,332,333,333,333,333,333,333,333,333,333,334,334,334,334,334,334,334,
663 334,334,335,335,335,335,335,335,335,335,335,335,336,336,336,336,336,336,336,336,
664 336,337,337,337,337,337,337,337,337,337,338,338,338,338,338,338,338,338,338,338,
665 339,339,339,339,339,339,339,339,339,340,340,340,340,340,340,340,340,340,341,341,
666 341,341,341,341,341,341,341,341,342,342,342,342,342,342,342,342,342,343,343,343,
667 343,343,343,343,343,343,344,344,344,344,344,344,344,344,344,344,345,345,345,345,
668 345,345,345,345,345,346,346,346,346,346,346,346,346,346,347,347,347,347,347,347,
669 347,347,347,347,348,348,348,348,348,348,348,348,348,349,349,349,349,349,349,349,
670 349,349,350,350,350,350,350,350,350,350,350,350,351,351,351,351,351,351,351,351,
671 351,352,352,352,352,352,352,352,352,352,352,353,353,353,353,353,353,353,353,353,
672 354,354,354,354,354,354,354,354,354,355,355,355,355,355,355,355,355,355,355,356,
673 356,356,356,356,356,356,356,356,357,357,357,357,357,357,357,357,357,357,358,358,
674 358,358,358,358,358,358,358,359,359,359,359,359,359,359,359,359,359,360,360,360,
675 360,360,360,360,360,360,361,361,361,361,361,361,361,361,361,361,362,362,362,362,
676 362,362,362,362,362,363,363,363,363,363,363,363,363,363,363,364,364,364,364,364,
677 364,364,364,364,365,365,365,365,365,365,365,365,365,365,366,366,366,366,366,366,
678 366,366,366,367,367,367,367,367,367,367,367,367,367,368,368,368,368,368,368,368,
679 368,368,369,369,369,369,369,369,369,369,369,369,370,370,370,370,370,370,370,370,
680 370,370,371,371,371,371,371,371,371,371,371,372,372,372,372,372,372,372,372,372,
681 372,373,373,373,373,373,373,373,373,373,374,374,374,374,374,374,374,374,374,374,
682 375,375,375,375,375,375,375,375,375,375,376,376,376,376,376,376,376,376,376,377,
683 377,377,377,377,377,377,377,377,377,378,378,378,378,378,378,378,378,378,379,379,
684 379,379,379,379,379,379,379,379,380,380,380,380,380,380,380,380,380,380,381,381,
685 381,381,381,381,381,381,381,382,382,382,382,382,382,382,382,382,382,383,383,383,
686 383,383,383,383,383,383,383,384,384,384,384,384,384,384,384,384,385,385,385,385,
687 385,385,385,385,385,385,386,386,386,386,386,386,386,386,386,386,387,387,387,387,
688 387,387,387,387,387,387,388,388,388,388,388,388,388,388,388,389,389,389,389,389,
689 389,389,389,389,389,390,390,390,390,390,390,390,390,390,390,391,391,391,391,391,
690 391,391,391,391,391,392,392,392,392,392,392,392,392,392,393,393,393,393,393,393,
691 393,393,393,393,394,394,394,394,394,394,394,394,394,394,395,395,395,395,395,395,
692 395,395,395,395,396,396,396,396,396,396,396,396,396,397,397,397,397,397,397,397,
693 397,397,397,398,398,398,398,398,398,398,398,398,398,399,399,399,399,399,399,399,
694 399,399,399,400,400,400,400,400,400,400,400,400,400,401,401,401,401,401,401,401,
695 401,401,402,402,402,402,402,402,402,402,402,402,403,403,403,403,403,403,403,403,
696 403,403,404,404,404,404,404,404,404,404,404,404,405,405,405,405,405,405,405,405,
697 405,405,406,406,406,406,406,406,406,406,406,406,407,407,407,407,407,407,407,407,
698 407,407,408,408,408,408,408,408,408,408,408,408,409,409,409,409,409,409,409,409,
699 409,410,410,410,410,410,410,410,410,410,410,411,411,411,411,411,411,411,411,411,
700 411,412,412,412,412,412,412,412,412,412,412,413,413,413,413,413,413,413,413,413,
701 413,414,414,414,414,414,414,414,414,414,414,415,415,415,415,415,415,415,415,415,
702 415,416,416,416,416,416,416,416,416,416,416,417,417,417,417,417,417,417,417,417,
703 417,418,418,418,418,418,418,418,418,418,418,419,419,419,419,419,419,419,419,419,
704 419,420,420,420,420,420,420,420,420,420,420,421,421,421,421,421,421,421,421,421,
705 421,422,422,422,422,422,422,422,422,422,422,423,423,423,423,423,423,423,423,423,
706 423,424,424,424,424,424,424,424,424,424,424,425,425,425,425,425,425,425,425,425,
707 425,426,426,426,426,426,426,426,426,426,426,427,427,427,427,427,427,427,427,427,
708 427,428,428,428,428,428,428,428,428,428,428,429,429,429,429,429,429,429,429,429,
709 429,430,430,430,430,430,430,430,430,430,430,431,431,431,431,431,431,431,431,431,
710 431,432,432,432,432,432,432,432,432,432,432,433,433,433,433,433,433,433,433,433,
711 433,434,434,434,434,434,434,434,434,434,434,435,435,435,435,435,435,435,435,435,
712 435,435,436,436,436,436,436,436,436,436,436,436,437,437,437,437,437,437,437,437,
713 437,437,438,438,438,438,438,438,438,438,438,438,439,439,439,439,439,439,439,439,
714 439,439,440,440,440,440,440,440,440,440,440,440,441,441,441,441,441,441,441,441,
715 441,441,442,442,442,442,442,442,442,442,442,442,443,443,443,443,443,443,443,443,
716 443,443,443,444,444,444,444,444,444,444,444,444,444,445,445,445,445,445,445,445,
717 445,445,445,446,446,446,446,446,446,446,446,446,446,447,447,447,447,447,447,447,
718 447,447,447,448,448,448,448,448,448,448,448,448,448,448,449,449,449,449,449,449,
719 449,449,449,449,450,450,450,450,450,450,450,450,450,450,451,451,451,451,451,451,
720 451,451,451,451,452,452,452,452,452,452,452,452,452,452,453,453,453,453,453,453,
721 453,453,453,453,453,454,454,454,454,454,454,454,454,454,454,455,455,455,455,455,
722 455,455,455,455,455,456,456,456,456,456,456,456,456,456,456,457,457,457,457,457,
723 457,457,457,457,457,457,458,458,458,458,458,458,458,458,458,458,459,459,459,459,
724 459,459,459,459,459,459,460,460,460,460,460,460,460,460,460,460,460,461,461,461,
725 461,461,461,461,461,461,461,462,462,462,462,462,462,462,462,462,462,463,463,463,
726 463,463,463,463,463,463,463,463,464,464,464,464,464,464,464,464,464,464,465,465,
727 465,465,465,465,465,465,465,465,466,466,466,466,466,466,466,466,466,466,466,467,
728 467,467,467,467,467,467,467,467,467,468,468,468,468,468,468,468,468,468,468,469,
729 469,469,469,469,469,469,469,469,469,469,470,470,470,470,470,470,470,470,470,470,
730 471,471,471,471,471,471,471,471,471,471,472,472,472,472,472,472,472,472,472,472,
731 472,473,473,473,473,473,473,473,473,473,473,474,474,474,474,474,474,474,474,474,
732 474,475,475,475,475,475,475,475,475,475,475,475,476,476,476,476,476,476,476,476,
733 476,476,477,477,477,477,477,477,477,477,477,477,477,478,478,478,478,478,478,478,
734 478,478,478,479,479,479,479,479,479,479,479,479,479,479,480,480,480,480,480,480,
735 480,480,480,480,481,481,481,481,481,481,481,481,481,481,482,482,482,482,482,482,
736 482,482,482,482,482,483,483,483,483,483,483,483,483,483,483,484,484,484,484,484,
737 484,484,484,484,484,484,485,485,485,485,485,485,485,485,485,485,486,486,486,486,
738 486,486,486,486,486,486,486,487,487,487,487,487,487,487,487,487,487,488,488,488,
739 488,488,488,488,488,488,488,488,489,489,489,489,489,489,489,489,489,489,490,490,
740 490,490,490,490,490,490,490,490,490,491,491,491,491,491,491,491,491,491,491,492,
741 492,492,492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493,493,493,
742 494,494,494,494,494,494,494,494,494,494,494,495,495,495,495,495,495,495,495,495,
743 495,496,496,496,496,496,496,496,496,496,496,496,497,497,497,497,497,497,497,497,
744 497,497,497,498,498,498,498,498,498,498,498,498,498,499,499,499,499,499,499,499,
745 499,499,499,499,500,500,500,500,500,500,500,500,500,500,501,501,501,501,501,501,
746 501,501,501,501,501,502,502,502,502,502,502,502,502,502,502,503,503,503,503,503,
747 503,503,503,503,503,503,504,504,504,504,504,504,504,504,504,504,504,505,505,505,
748 505,505,505,505,505,505,505,506,506,506,506,506,506,506,506,506,506,506,507,507,
749 507,507,507,507,507,507,507,507,507,508,508,508,508,508,508,508,508,508,508,509,
750 509,509,509,509,509,509,509,509,509,509,510,510,510,510,510,510,510,510,510,510,
751 510,511,511,511,511,511,511,511,511,511,511,512,512,512,512,512 };
752
753 static const int order[32] =
754 { 0, 1, 16, 17, 8, 9, 24, 25, 4, 5, 20, 21, 12, 13, 28, 29,
755   2, 3, 18, 19,10,11, 26, 27, 6, 7, 22, 23, 14, 15, 30, 31 };
756
757 static const unsigned long sampr_index[2][3] =
758 { { 22050, 24000, 16000 },      /* MPEG 2 */
759   { 44100, 48000, 32000 } };    /* MPEG 1 */
760
761 static const long bitr_index[2][15] =
762 { {0, 8,16,24,32,40,48,56, 64, 80, 96,112,128,144,160},    /* MPEG 2 */
763   {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320} };  /* MPEG 1 */
764
765 static const int num_bands[3][15]  =
766 { {0,10,10,10,10,12,14,16, 20, 22, 24, 26, 28, 30, 32},
767   {0,10,10,10,10,10,12,14, 18, 24, 26, 28, 30, 32, 32},
768   {0,10,12,14,18,24,26,28, 30, 32, 32, 32, 32, 32, 32} };
769
770 static const int cx_const[9] =
771 { 16135, 10531,  5604, 15396, -2845,-12551, 14189,  8192, 16384 };
772
773 static const int ca_const[8] =
774 {-16859,-15458,-10269, -5961, -3099, -1342,  -465,  -121 };
775
776 static const int cs_const[8] =
777 { 28098, 28893, 31117, 32221, 32621, 32740, 32765, 32768 };
778
779 static const short enwindow_const[15*27+24] =
780 { 0,   65,  593,  1766, 22228, 2115, 611, 62,
781   8,  119, 1419, 10564,-11659,-1635,-154, -9,
782  -8, -119,-1419,-10564, 11659, 1635, 154,  9, 464,  100,  91,
783   0,   69,  604,  1635, 23148, 2363, 643, 62,
784   7,  107, 1368, 10449,-12733,-1818,-180,-11,
785  -7, -107,-1368,-10449, 12733, 1818, 180, 11, 420,  200, 164,
786   0,   72,  608,  1465, 23979, 2600, 671, 63,
787   7,   94, 1305, 10265,-13818,-2004,-207,-12,
788  -7,  -94,-1305,-10265, 13818, 2004, 207, 12, 380,  297, 220,
789   0,   76,  606,  1256, 24718, 2825, 693, 63,
790   6,   81, 1232, 10016,-14908,-2192,-236,-14,
791  -6,  -81,-1232,-10016, 14908, 2192, 236, 14, 342,  392, 262,
792   0,   78,  597,  1007, 25359, 3033, 712, 63,
793   6,   68, 1150,  9706,-15995,-2380,-267,-15,
794  -6,  -68,-1150, -9706, 15995, 2380, 267, 15, 307,  483, 289,
795   0,   80,  580,   719, 25901, 3224, 726, 62,
796   6,   54, 1060,  9343,-17072,-2565,-299,-17,
797  -6,  -54,-1060, -9343, 17072, 2565, 299, 17, 274,  569, 304,
798  -1,   82,  555,   391, 26339, 3395, 735, 61,
799   5,   40,  963,  8930,-18131,-2747,-332,-19,
800  -5,  -40, -963, -8930, 18131, 2747, 332, 19, 242,  650, 307,
801  -1,   83,  523,    26, 26672, 3545, 740, 60,
802   5,   27,  861,  8474,-19164,-2923,-366,-21,
803  -5,  -27, -861, -8474, 19164, 2923, 366, 21, 212,  724, 300,
804  -1,   83,  482,  -376, 26900, 3672, 739, 58,
805   4,   14,  756,  7981,-20163,-3092,-401,-24,
806  -4,  -14, -756, -7981, 20163, 3092, 401, 24, 183,  792, 283,
807  -1,   82,  433,  -812, 27022, 3776, 735, 56,
808   4,    1,  648,  7456,-21122,-3250,-435,-26,
809  -4,   -1, -648, -7456, 21122, 3250, 435, 26, 155,  851, 258,
810  -1,   81,  376, -1281, 27038, 3855, 726, 54,
811   3,  -11,  539,  6907,-22032,-3397,-470,-28,
812  -3,   11, -539, -6907, 22032, 3397, 470, 28, 128,  903, 226,
813  -1,   78,  312, -1778, 26951, 3910, 713, 52,
814   3,  -22,  430,  6338,-22887,-3530,-503,-31,
815  -3,   22, -430, -6338, 22887, 3530, 503, 31, 102,  946, 188,
816  -2,   75,  239, -2302, 26761, 3941, 696, 49,
817   3,  -33,  322,  5757,-23678,-3648,-537,-34,
818  -3,   33, -322, -5757, 23678, 3648, 537, 34,  76,  980, 145,
819  -2,   70,  160, -2848, 26472, 3948, 676, 47,
820   3,  -42,  217,  5167,-24399,-3749,-568,-36,
821  -3,   42, -217, -5167, 24399, 3749, 568, 36,  50, 1004,  99,
822  -2,   65,   74, -3412, 26087, 3931, 653, 44,
823   2,  -51,  115,  4577,-25045,-3830,-599,-39,
824  -2,   51, -115, -4577, 25045, 3830, 599, 39,  25, 1019,  50,
825
826  25610,3891,627,42,-3990,-18,58,-2,
827  21226,-21226,10604,-10604,1860,-1860,1458,-1458,576,-576,130,-130,60,-60,8,-8
828 };
829
830 static const int win_const[18][4] = {
831   { -3072, -134, -146, 3352 },
832   { -2747, -362, -471, 3579 },
833   { -2387, -529, -831, 3747 },
834   { -2004, -632,-1214, 3850 },
835   { -1609, -666,-1609, 3884 },
836   { -1214, -632,-2004, 3850 },
837   {  -831, -529,-2387, 3747 },
838   {  -471, -362,-2747, 3579 },
839   {  -146, -134,-3072, 3352 },
840   {   134,-3072,-3352, -146 },
841   {   362,-2747,-3579, -471 },
842   {   529,-2387,-3747, -831 },
843   {   632,-2004,-3850,-1214 },
844   {   666,-1609,-3884,-1609 },
845   {   632,-1214,-3850,-2004 },
846   {   529, -831,-3747,-2387 },
847   {   362, -471,-3579,-2747 },
848   {   134, -146,-3352,-3072 } };
849
850 /* forward declarations */
851 static int  HuffmanCode( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table);
852 static int  HuffmanCod1( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table);
853 static void putbits(uint32_t val, uint32_t nbit);
854 static int  find_best_2( short *ix, uint32_t start, uint32_t end, const uint32_t *table,
855                           uint32_t len, int *bits);
856 static int  find_best_3( short *ix, uint32_t start, uint32_t end, const uint32_t *table,
857                          uint32_t len, int *bits);
858 static int  count_bit1 ( short *ix, uint32_t start, uint32_t end, int *bits );
859 static int  count_bigv ( short *ix, uint32_t start, uint32_t end, int table0, int table1,
860                   int *bits);
861
862 /* implementations */
863 static void encodeSideInfo( side_info_t si[2][2] )
864 {
865   int gr, ch, header;
866   uint32_t  cc=0, sz=0;
867
868   /*
869    * MPEG header layout:
870    * AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM
871    * A (31-21) = frame sync
872    * B (20-19) = MPEG type
873    * C (18-17) = MPEG layer
874    * D (16)    = protection bit
875    * E (15-12) = bitrate index
876    * F (11-10) = samplerate index
877    * G (9)     = padding bit
878    * H (8)     = private bit
879    * I (7-6)   = channel mode
880    * J (5-4)   = mode extension (jstereo only)
881    * K (3)     = copyright bit
882    * L (2)     = original
883    * M (1-0)   = emphasis
884    */
885
886   header  = (0xfff00000) | /* frame sync (AAAAAAAAA AAA)
887                               mp3 type (upper):  1 (B)  */
888             (0x01 << 17) | /* mp3 layer:        01 (CC) */
889             ( 0x1 << 16) | /* mp3 crc:           1 (D)  */
890             ( 0x1 <<  2);  /* mp3 org:           1 (L)  */
891   header |= cfg.mpg.type    << 19;
892   header |= cfg.mpg.bitr_id << 12;
893   header |= cfg.mpg.smpl_id << 10;
894   header |= cfg.mpg.padding <<  9;
895   header |= cfg.mpg.mode    <<  6;
896   /* no emphasis (bits 0-1) */
897   putbits( header, 32 );
898
899   if(cfg.mpg.type == 1)
900   { /* MPEG1 */
901     if(cfg.channels == 2)  { putlong( 0, 20); }
902     else                   { putlong( 0, 18); }
903
904     for(gr=0; gr<cfg.granules; gr++)
905       for(ch=0; ch<cfg.channels; ch++)
906       {
907         side_info_t *gi = &si[gr][ch];
908
909         putlong((gi->part2_3_length+42),12 ); /* add scale_facs array size */
910         putlong( gi->address3>>1,        9 );
911         putlong( gi->global_gain,        8 );
912         putlong( 9,                      4 ); /* set scale_facs compr type */
913         putlong( gi->table_select[0],    6 );
914         putlong( gi->table_select[1],    5 );
915         putlong( gi->table_select[2],    5 );
916         putlong( gi->region_0_1,         7 );
917         putlong( 1                  ,    2 ); /* set scale_facs to 1bit */
918         putlong( gi->table_select[3],    1 );
919       }
920   }
921   else
922   { /* MPEG2 */
923     if(cfg.channels == 2)  { putlong( 0, 10); }
924     else                   { putlong( 0,  9); }
925
926     for(ch=0; ch<cfg.channels; ch++)
927     {
928       side_info_t *gi = &si[0][ch];
929
930       putlong((gi->part2_3_length+42),12 ); /* add scale_facs array size */
931       putlong( gi->address3>>1,        9 );
932       putlong( gi->global_gain,        8 );
933       putlong( 0xCA,                   9 ); /* set scale_facs compr type */
934       putlong( gi->table_select[0],    6 );
935       putlong( gi->table_select[1],    5 );
936       putlong( gi->table_select[2],    5 );
937       putlong( gi->region_0_1     ,    7 );
938       putlong( 1                  ,    1 ); /* set scale_facs to 1bit */
939       putlong( gi->table_select[3],    1 );
940     }
941   }
942   /* flush remaining bits */
943   putbits(cc, sz);
944 }
945
946 /* Note the discussion of huffmancodebits() on pages 28 and 29 of the IS,
947    as well as the definitions of the side information on pages 26 and 27. */
948 static void Huffmancodebits( short *ix, char *xr_sign, side_info_t *gi )
949 {
950   int    region1   = gi->address1;
951   int    region2   = gi->address2;
952   int    bigvals   = gi->address3;
953   int    count1    = bigvals + (gi->count1 << 2);
954   int    stuffBits = 0;
955   int    bits      = 0;
956   int    i, v;
957
958   for(i=v=0; i<32; i+=2)
959     v |= band_scale_f[i>>1] << (30-i);
960   putbits(v, 32); // store scale_facs (part1)
961
962   for(v=0; i<42; i+=2)
963     v |= band_scale_f[i>>1] << (40-i);
964   putbits(v, 10); // store scale_facs (part2)
965
966   if(region1 > 0)
967     bits += HuffmanCode(ix, xr_sign,   0    , region1, gi->table_select[0]);
968
969   if(region2 > region1)
970     bits += HuffmanCode(ix, xr_sign, region1, region2, gi->table_select[1]);
971
972   if(bigvals > region2)
973     bits += HuffmanCode(ix, xr_sign, region2, bigvals, gi->table_select[2]);
974
975   if(count1 > bigvals)
976     bits += HuffmanCod1(ix, xr_sign, bigvals,  count1, gi->table_select[3]);
977
978   if((stuffBits = gi->part2_3_length - bits) > 0)
979   {
980     int stuffWords = stuffBits >> 5;
981     int remainBits = stuffBits & 31;
982
983     if( remainBits )
984       putbits( ~0, remainBits );
985
986     while( stuffWords-- )
987       putbits( ~0, 32 ); /* Huffman code tables leed to padding ones */
988   }
989 }
990
991 int HuffmanCod1( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int tbl)
992 {
993   uint32_t  cc=0, sz=0;
994   uint32_t  i, d, p;
995   int     sumbit=0, s=0, l=0, v, w, x, y;
996   #define sgnv xr_sign[i+0]
997   #define sgnw xr_sign[i+1]
998   #define sgnx xr_sign[i+2]
999   #define sgny xr_sign[i+3]
1000
1001   for(i=begin; i<end; i+=4)
1002   {
1003     v = ix[i+0];
1004     w = ix[i+1];
1005     x = ix[i+2];
1006     y = ix[i+3];
1007     p = (v << 3) + (w << 2) + (x << 1) + y;
1008
1009     switch(p)
1010     {
1011       case  0: l=0; s = 0; break;
1012       case  1: l=1; s =                                           sgny; break;
1013       case  2: l=1; s =                              sgnx;              break;
1014       case  3: l=2; s =                             (sgnx << 1) + sgny; break;
1015       case  4: l=1; s =                sgnw;                            break;
1016       case  5: l=2; s =               (sgnw << 1)               + sgny; break;
1017       case  6: l=2; s =               (sgnw << 1) +  sgnx;              break;
1018       case  7: l=3; s =               (sgnw << 2) + (sgnx << 1) + sgny; break;
1019       case  8: l=1; s =  sgnv;                                          break;
1020       case  9: l=2; s = (sgnv << 1)                             + sgny; break;
1021       case 10: l=2; s = (sgnv << 1)               +  sgnx;              break;
1022       case 11: l=3; s = (sgnv << 2)               + (sgnx << 1) + sgny; break;
1023       case 12: l=2; s = (sgnv << 1) +  sgnw;                            break;
1024       case 13: l=3; s = (sgnv << 2) + (sgnw << 1)               + sgny; break;
1025       case 14: l=3; s = (sgnv << 2) + (sgnw << 1) +  sgnx;              break;
1026       case 15: l=4; s = (sgnv << 3) + (sgnw << 2) + (sgnx << 1) + sgny; break;
1027     }
1028
1029     d = (ht_count[tbl][0][p] << l) + s;
1030     l =  ht_count[tbl][1][p];
1031     putlong( d, l );
1032     sumbit += l;
1033   }
1034
1035   /* flush remaining bits */
1036   putbits(cc, sz);
1037
1038   return sumbit;
1039 }
1040
1041 /* Implements the pseudocode of page 98 of the IS */
1042 int HuffmanCode(short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table)
1043 {
1044   uint32_t       cc=0, sz=0, code;
1045   uint32_t       i, xl=0, yl=0, idx;
1046   int            x, y, bit, sumbit=0;
1047   #define sign_x xr_sign[i+0]
1048   #define sign_y xr_sign[i+1]
1049
1050   if(table == 0)
1051     return 0;
1052
1053   if( table > 15 )
1054   { /* ESC-table is used */
1055     uint32_t linbits  = ht_big[table-16].linbits;
1056     uint16_t *hffcode = table < 24 ? t16HB : t24HB;
1057     uint8_t  *hlen    = table < 24 ? t16l  : t24l;
1058
1059     for(i=begin; i<end; i+=2)
1060     {
1061       x = ix[ i ];
1062       y = ix[i+1];
1063
1064       if(x > 14) { xl = x - 15;  x = 15; }
1065       if(y > 14) { yl = y - 15;  y = 15; }
1066
1067       idx  = x * 16 + y;
1068       code = hffcode[idx];
1069       bit  = hlen   [idx];
1070
1071       if(x)
1072       {
1073         if(x > 14)
1074         {
1075           code = (code << linbits) | xl;
1076           bit += linbits;
1077         }
1078
1079         code = (code << 1) | sign_x;
1080         bit += 1;
1081       }
1082
1083       if(y)
1084       {
1085         if(y > 14)
1086         {
1087           if(bit + linbits + 1 > 32)
1088           {
1089             putlong( code, bit );
1090             sumbit += bit;
1091             code = bit = 0;
1092           }
1093
1094           code = (code << linbits) | yl;
1095           bit += linbits;
1096         }
1097
1098         code = (code << 1) | sign_y;
1099         bit += 1;
1100       }
1101
1102       putlong( code, bit );
1103       sumbit += bit;
1104     }
1105   }
1106   else
1107   { /* No ESC-words */
1108     const struct huffcodetab *h = &ht[table];
1109
1110     for(i=begin; i<end; i+=2)
1111     {
1112       x = ix[i];
1113       y = ix[i+1];
1114
1115       idx  = x * h->len + y;
1116       code = h->table[idx];
1117       bit  = h->hlen [idx];
1118
1119       if(x)
1120       {
1121         code = (code << 1) | sign_x;
1122         bit += 1;
1123       }
1124
1125       if(y)
1126       {
1127         code = (code << 1) | sign_y;
1128         bit += 1;
1129       }
1130
1131       putlong( code, bit );
1132       sumbit += bit;
1133     }
1134   }
1135
1136   /* flush remaining bits */
1137   putbits(cc, sz);
1138
1139   return sumbit;
1140 }
1141
1142 void putbits(uint32_t val, uint32_t nbit)
1143 {
1144   int new_bitpos = CodedData.bitpos + nbit;
1145   int ptrpos     = CodedData.bitpos >> 5;
1146
1147   val = val & (0xffffffff >> (32 - nbit));
1148
1149   /* data fit in one uint32_t */
1150   if(((new_bitpos - 1) >> 5) == ptrpos)
1151     CodedData.bbuf[ptrpos] |= val << ((32 - new_bitpos) & 31);
1152   else
1153   {
1154     CodedData.bbuf[ptrpos  ] |= val >> ((new_bitpos - 32) & 31);
1155     CodedData.bbuf[ptrpos+1] |= val << ((32 - new_bitpos) & 31);
1156   }
1157
1158   CodedData.bitpos = new_bitpos;
1159 }
1160
1161 /***************************************************************************/
1162 /*  Choose the Huffman table that will encode ix[begin..end] with          */
1163 /*  the fewest bits.                                                       */
1164 /*  Note: This code contains knowledge about the sizes and characteristic  */
1165 /*  of the Huffman tables as defined in the IS (Table B.7), and will not   */
1166 /*  work with any arbitrary tables.                                        */
1167 /***************************************************************************/
1168 static int choose_table( short *ix, uint32_t begin, uint32_t end, int *bits )
1169 {
1170   uint32_t i;
1171   int    max, table0, table1;
1172
1173   for(i=begin,max=0; i<end; i++)
1174     if(ix[i] > max)
1175       max = ix[i];
1176
1177   if(max < 16)
1178   {
1179     /* tables without linbits */
1180     /* indx: 0  1  2  3  4  5  6  7  8  9 10 11 12  13 14  15 */
1181     /*  len: 0, 2, 3, 3, 0, 4, 4, 6, 6, 6, 8, 8, 8, 16, 0, 16 */
1182     switch(max)
1183     {
1184       case 0:  return  0;
1185       case 1:  return       count_bit1(ix, begin, end, bits);
1186       case 2:  return  2 + find_best_2(ix, begin, end, tab23, 3, bits);
1187       case 3:  return  5 + find_best_2(ix, begin, end, tab56, 4, bits);
1188       case 4:
1189       case 5:  return  7 + find_best_3(ix, begin, end, tab789, 6, bits);
1190       case 6:
1191       case 7:  return 10 + find_best_3(ix, begin, end, tabABC, 8, bits);
1192       default: return 13 + find_best_2(ix, begin, end, tab1315, 16, bits) * 2;
1193     }
1194   }
1195   else
1196   {
1197     /* tables with linbits */
1198     max -= 15;
1199
1200     for(table0=0; table0<8; table0++)
1201       if(ht_big[table0].linmax >= max)
1202         break;
1203
1204     for(table1=8; table1<16; table1++)
1205       if(ht_big[table1].linmax >= max)
1206         break;
1207
1208     return 16 + count_bigv(ix, begin, end, table0, table1, bits);
1209   }
1210 }
1211
1212 int find_best_2(short *ix, uint32_t start, uint32_t end, const uint32_t *table,
1213                 uint32_t len, int *bits)
1214 {
1215   uint32_t i, sum = 0;
1216
1217   for(i=start; i<end; i+=2)
1218     sum += table[ix[i] * len + ix[i+1]];
1219
1220   if((sum & 0xffff) <= (sum >> 16))
1221   {
1222     *bits = (sum & 0xffff);
1223     return 1;
1224   }
1225   else
1226   {
1227     *bits = sum >> 16;
1228     return 0;
1229   }
1230 }
1231
1232 int find_best_3(short *ix, uint32_t start, uint32_t end, const uint32_t *table,
1233                 uint32_t len, int *bits)
1234 {
1235   uint32_t i, j, sum  = 0;
1236   int          sum1 = 0;
1237   int          sum2 = 0;
1238   int          sum3 = 0;
1239
1240   /* avoid overflow in packed additions: 78*13 < 1024 */
1241   for(i=start; i<end; )
1242   {
1243     j = i + 2*78 > end ? end : i + 2*78;
1244
1245     for(sum=0; i<j; i+=2)
1246       sum += table[ix[i] * len + ix[i+1]];
1247
1248     sum1 += (sum >> 20);
1249     sum2 += (sum >> 10) & 0x3ff;
1250     sum3 += (sum >>  0) & 0x3ff;
1251   }
1252
1253   i = 0;
1254   if(sum1 > sum2) { sum1 = sum2;  i = 1; }
1255   if(sum1 > sum3) { sum1 = sum3;  i = 2; }
1256
1257   *bits = sum1;
1258
1259   return i;
1260 }
1261
1262 /*************************************************************************/
1263 /* Function: Count the number of bits necessary to code the subregion.   */
1264 /*************************************************************************/
1265 int count_bit1(short *ix, uint32_t start, uint32_t end, int *bits )
1266 {
1267   uint32_t i, sum = 0;
1268
1269   for(i=start; i<end; i+=2)
1270     sum += t1l[4 + ix[i] * 2 + ix[i+1]];
1271
1272   *bits = sum;
1273
1274   return 1; /* this is table1 */
1275 }
1276
1277 int count_bigv(short *ix, uint32_t start, uint32_t end, int table0,
1278                int table1, int *bits )
1279 {
1280   uint32_t  i, sum0, sum1, sum=0, bigv=0, x, y;
1281
1282   /* ESC-table is used */
1283   for(i=start; i<end; i+=2)
1284   {
1285     x = ix[i];
1286     y = ix[i+1];
1287
1288     if(x > 14) { x = 15; bigv++; }
1289     if(y > 14) { y = 15; bigv++; }
1290
1291     sum += tab1624[x * 16 + y];
1292   }
1293
1294   sum0 = (sum  >>  16)  + bigv * ht_big[table0].linbits;
1295   sum1 = (sum & 0xffff) + bigv * ht_big[table1].linbits;
1296
1297   if(sum0 <= sum1)
1298   {
1299     *bits = sum0;
1300     return table0;
1301   }
1302   else
1303   {
1304     *bits = sum1;
1305     return table1;
1306   }
1307 }
1308
1309 /*************************************************************************/
1310 /* Function: Calculation of rzero, count1, address3                      */
1311 /* (Partitions ix into big values, quadruples and zeros).                */
1312 /*************************************************************************/
1313 static int calc_runlen( short *ix, side_info_t *si )
1314 {
1315   int  p, i, sum = 0;
1316
1317   for(i=SAMPL2; i-=2; )
1318     if(*(uint32_t*)&ix[i-2]) /* !!!! short *ix; !!!!! */
1319       break;
1320
1321   si->count1 = 0;
1322
1323   for( ; i>3; i-=4)
1324   {
1325     int v = ix[i-1];
1326     int w = ix[i-2];
1327     int x = ix[i-3];
1328     int y = ix[i-4];
1329
1330     if((v | w | x | y) <= 1)
1331     {
1332       p = (y<<3) + (x<<2) + (w<<1) + (v);
1333
1334       sum += tab01[p];
1335
1336       si->count1++;
1337     }
1338     else break;
1339   }
1340
1341   si->address3 = i;
1342
1343   if((sum >> 16) < (sum & 0xffff))
1344   {
1345     si->table_select[3] = 0;
1346     return sum >> 16;
1347   }
1348   else
1349   {
1350     si->table_select[3] = 1;
1351     return sum & 0xffff;
1352   }
1353 }
1354
1355
1356 /*************************************************************************/
1357 /*   Function: Quantization of the vector xr ( -> ix)                    */
1358 /*************************************************************************/
1359 static int quantize_int(int *xr, short *ix, side_info_t *si)
1360 {
1361   unsigned int i, idx, s, frac_pow[] = { 0x10000, 0xd745, 0xb505, 0x9838 };
1362
1363   s = frac_pow[si->quantStep & 3] >> si->quantStep / 4;
1364
1365   /* check for possible 'out of range' values */
1366   if(((si->max_val + 256) >> 8) * s >= (65536 << 8))
1367     return 0;
1368
1369   if(((si->max_val + 256) >> 8) * s < (4096 << 8))
1370   { /* all values fit the table size */
1371     for(i=SAMPL2; i--; )
1372       ix[i] = int2idx[(xr[i] * s + 0x8000) >> 16];
1373   }
1374   else
1375   { /* check each index wether it fits the table */
1376     for(i=SAMPL2; i--; )
1377     {
1378       idx = (xr[i] * s + 0x08000) >> 16;
1379
1380       if(idx > 4095)  ix[i] = int2idx[(idx + 8) >> 4] << 3;
1381       else            ix[i] = int2idx[idx];
1382     }
1383   }
1384
1385   return 1;
1386 }
1387
1388 /*************************************************************************/
1389 /* subdivides the bigvalue region which will use separate Huffman tables */
1390 /*************************************************************************/
1391 static void subdivide(side_info_t *si)
1392 {
1393   int scfb, count0, count1;
1394
1395   if( !si->address3 )
1396   { /* no bigvalue region */
1397     si->region_0_1 = 0;
1398     si->address1   = 0;
1399     si->address2   = 0;
1400   }
1401   else
1402   {
1403     /* Calculate scale factor band index */
1404     for(scfb=0; scalefac[scfb] < si->address3; )
1405       scfb++;
1406
1407     count0 = subdv_table[scfb].region0_cnt;
1408     count1 = subdv_table[scfb].region1_cnt;
1409
1410     si->region_0_1 = (count0 << 3) | count1;
1411     si->address1   = scalefac[count0 + 1];
1412     si->address2   = scalefac[count0 + 1 + count1 + 1];
1413   }
1414 }
1415
1416 /*******************************************************************/
1417 /* Count the number of bits necessary to code the bigvalues region */
1418 /*******************************************************************/
1419 static int bigv_bitcount(short *ix, side_info_t *gi)
1420 {
1421   int b1=0, b2=0, b3=0;
1422
1423   /* Select huffman code tables for bigvalues regions */
1424   gi->table_select[0] = 0;
1425   gi->table_select[1] = 0;
1426   gi->table_select[2] = 0;
1427
1428   if( gi->address1 > 0 )            /* region0 */
1429     gi->table_select[0] = choose_table(ix, 0           , gi->address1, &b1);
1430
1431   if( gi->address2 > gi->address1 ) /* region1 */
1432     gi->table_select[1] = choose_table(ix, gi->address1, gi->address2, &b2);
1433
1434   if( gi->address3 > gi->address2 ) /* region2 */
1435     gi->table_select[2] = choose_table(ix, gi->address2, gi->address3, &b3);
1436
1437   return b1+b2+b3;
1438 }
1439
1440 static int quantize_and_count_bits(int *xr, short *ix, side_info_t *si)
1441 {
1442   int bits = 10000;
1443
1444   if(quantize_int(xr, ix, si))
1445   {
1446     bits = calc_runlen(ix, si);      /* rzero,count1,address3  */
1447     subdivide(si);                   /* bigvalues sfb division */
1448     bits += bigv_bitcount(ix,si);    /* bit count */
1449   }
1450
1451   return bits;
1452 }
1453
1454 /************************************************************************/
1455 /* The code selects the best quantStep for a particular set of scalefacs*/
1456 /************************************************************************/
1457 static int inner_loop(int *xr, int max_bits, side_info_t *si)
1458 {
1459   int bits;
1460
1461   while((bits=quantize_and_count_bits(xr, enc_data, si)) < max_bits-64)
1462   {
1463     if(si->quantStep == 0)
1464       break;
1465
1466     if(si->quantStep <= 2)
1467       si->quantStep  = 0;
1468     else
1469       si->quantStep -= 2;
1470   }
1471
1472   while(bits > max_bits)
1473   {
1474     si->quantStep++;
1475     bits = quantize_and_count_bits(xr, enc_data, si);
1476   }
1477
1478   return bits;
1479 }
1480
1481 static void iteration_loop(int *xr, side_info_t *si, int gr_cnt)
1482 {
1483   int remain, tar_bits, max_bits = cfg.mean_bits;
1484
1485   /* distribute reserved bits to remaining granules */
1486   tar_bits = max_bits + (cfg.ResvSize / gr_cnt & ~7);
1487   if(tar_bits > max_bits + max_bits/2)
1488     tar_bits = max_bits + max_bits/2;
1489
1490   si->part2_3_length = inner_loop(xr, tar_bits, si);
1491   si->global_gain    = si->quantStep + 142 - si->additStep;
1492
1493   /* unused bits of the reservoir can be used for remaining granules */
1494   cfg.ResvSize += max_bits - si->part2_3_length;
1495
1496   /* end: distribute the reserved bits to one or two granules */
1497   if(gr_cnt == 1)
1498   {
1499     si->part2_3_length += cfg.ResvSize;
1500     /* mp3 format allows max 12bits for granule length */
1501     if(si->part2_3_length > 4092)
1502     {
1503       remain = (si->part2_3_length - 4092 + 31) >> 5;
1504       si->part2_3_length    -= remain << 5;
1505       si[-1].part2_3_length += remain << 5;
1506
1507       while(remain--)
1508         putbits(~0, 32);
1509     }
1510   }
1511 }
1512
1513 /* returns sum_j=0^31 a[j]*cos(PI*j*(k+1/2)/32), 0<=k<32 */
1514 static void window_subband1(short *wk, int sb0[SBLIMIT], int sb1[SBLIMIT])
1515 {
1516   int   k, i, u, v;
1517   short *wp, *x1, *x2;
1518
1519 #ifdef CPU_COLDFIRE
1520   int s0, s1, t0, t1;
1521
1522   for(k=0; k<18; k++, wk+=64, sb0+=SBLIMIT, sb1+=SBLIMIT)
1523   {
1524     wp = enwindow;
1525     x1 = wk;
1526     x2 = x1 - 124;
1527
1528     for(i=-15; i<0; i++)
1529     {
1530       asm volatile(
1531       "move.l (-224*4,%[x2]), %%d4\n"   /* d4 = x2[-224] */
1532       "movem.l (%[wp]), %%d0-%%d3\n"    /* load 8 values */
1533       "mac.w %%d0u, %%d4u,                       %%acc0\n"
1534       "mac.w %%d0u, %%d4l, (-160*4,%[x2]), %%d4, %%acc1\n"
1535       "mac.w %%d0l, %%d4u,                       %%acc0\n"
1536       "mac.w %%d0l, %%d4l, ( -96*4,%[x2]), %%d4, %%acc1\n"
1537       "mac.w %%d1u, %%d4u,                       %%acc0\n"
1538       "mac.w %%d1u, %%d4l, ( -32*4,%[x2]), %%d4, %%acc1\n"
1539       "mac.w %%d1l, %%d4u,                       %%acc0\n"
1540       "mac.w %%d1l, %%d4l, (  32*4,%[x2]), %%d4, %%acc1\n"
1541       "mac.w %%d2u, %%d4u,                       %%acc0\n"
1542       "mac.w %%d2u, %%d4l, (  96*4,%[x2]), %%d4, %%acc1\n"
1543       "mac.w %%d2l, %%d4u,                       %%acc0\n"
1544       "mac.w %%d2l, %%d4l, ( 160*4,%[x2]), %%d4, %%acc1\n"
1545       "mac.w %%d3u, %%d4u,                       %%acc0\n"
1546       "mac.w %%d3u, %%d4l, ( 224*4,%[x2]), %%d4, %%acc1\n"
1547       "mac.w %%d3l, %%d4u,                       %%acc0\n"
1548       "mac.w %%d3l, %%d4l, (-256*4,%[x1]), %%d4, %%acc1\n"
1549       "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */
1550       "mac.w %%d0u, %%d4u,                       %%acc0\n"
1551       "mac.w %%d0u, %%d4l, (-192*4,%[x1]), %%d4, %%acc1\n"
1552       "mac.w %%d0l, %%d4u,                       %%acc0\n"
1553       "mac.w %%d0l, %%d4l, (-128*4,%[x1]), %%d4, %%acc1\n"
1554       "mac.w %%d1u, %%d4u,                       %%acc0\n"
1555       "mac.w %%d1u, %%d4l, ( -64*4,%[x1]), %%d4, %%acc1\n"
1556       "mac.w %%d1l, %%d4u,                       %%acc0\n"
1557       "mac.w %%d1l, %%d4l, (   0*4,%[x1]), %%d4, %%acc1\n"
1558       "mac.w %%d2u, %%d4u,                       %%acc0\n"
1559       "mac.w %%d2u, %%d4l, (  64*4,%[x1]), %%d4, %%acc1\n"
1560       "mac.w %%d2l, %%d4u,                       %%acc0\n"
1561       "mac.w %%d2l, %%d4l, ( 128*4,%[x1]), %%d4, %%acc1\n"
1562       "mac.w %%d3u, %%d4u,                       %%acc0\n"
1563       "mac.w %%d3u, %%d4l, ( 192*4,%[x1]), %%d4, %%acc1\n"
1564       "mac.w %%d3l, %%d4u,                       %%acc0\n"
1565       "mac.w %%d3l, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n"
1566       "movclr.l %%acc0, %%d0\n"
1567       "move.l %%d0, %[s0]\n"
1568       "movclr.l %%acc1, %%d0\n"
1569       "move.l %%d0, %[s1]\n"
1570
1571       "movem.l (%[wp]), %%d0-%%d3\n"    /* load 8 values */
1572       "mac.w %%d0u, %%d4u,                       %%acc0\n"
1573       "mac.w %%d0u, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n"
1574       "mac.w %%d0l, %%d4u,                       %%acc0\n"
1575       "mac.w %%d0l, %%d4l, (  96*4,%[x1]), %%d4, %%acc1\n"
1576       "mac.w %%d1u, %%d4u,                       %%acc0\n"
1577       "mac.w %%d1u, %%d4l, (  32*4,%[x1]), %%d4, %%acc1\n"
1578       "mac.w %%d1l, %%d4u,                       %%acc0\n"
1579       "mac.w %%d1l, %%d4l, ( -32*4,%[x1]), %%d4, %%acc1\n"
1580       "mac.w %%d2u, %%d4u,                       %%acc0\n"
1581       "mac.w %%d2u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n"
1582       "mac.w %%d2l, %%d4u,                       %%acc0\n"
1583       "mac.w %%d2l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n"
1584       "mac.w %%d3u, %%d4u,                       %%acc0\n"
1585       "mac.w %%d3u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n"
1586       "mac.w %%d3l, %%d4u,                       %%acc0\n"
1587       "mac.w %%d3l, %%d4l, ( 256*4,%[x2]), %%d4, %%acc1\n"
1588       "movem.l (32,%[wp]), %%d0-%%d3\n"  /* load 8 values */
1589       "mac.w %%d0u, %%d4u,                       %%acc0\n"
1590       "mac.w %%d0u, %%d4l, ( 192*4,%[x2]), %%d4, %%acc1\n"
1591       "mac.w %%d0l, %%d4u,                       %%acc0\n"
1592       "mac.w %%d0l, %%d4l, ( 128*4,%[x2]), %%d4, %%acc1\n"
1593       "mac.w %%d1u, %%d4u,                       %%acc0\n"
1594       "mac.w %%d1u, %%d4l, (  64*4,%[x2]), %%d4, %%acc1\n"
1595       "mac.w %%d1l, %%d4u,                       %%acc0\n"
1596       "mac.w %%d1l, %%d4l, (   0*4,%[x2]), %%d4, %%acc1\n"
1597       "mac.w %%d2u, %%d4u,                       %%acc0\n"
1598       "mac.w %%d2u, %%d4l, ( -64*4,%[x2]), %%d4, %%acc1\n"
1599       "mac.w %%d2l, %%d4u,                       %%acc0\n"
1600       "mac.w %%d2l, %%d4l, (-128*4,%[x2]), %%d4, %%acc1\n"
1601       "mac.w %%d3u, %%d4u,                       %%acc0\n"
1602       "mac.w %%d3u, %%d4l, (-192*4,%[x2]), %%d4, %%acc1\n"
1603       "mac.w %%d3l, %%d4u,                       %%acc0\n"
1604       "mac.w %%d3l, %%d4l,                       %%acc1\n"
1605       "movclr.l %%acc0, %%d0\n"
1606       "move.l %%d0, %[t0]\n"
1607       "movclr.l %%acc1, %%d0\n"
1608       "move.l %%d0, %[t1]\n"
1609
1610       : [x1] "+a" (x1), [x2] "+a" (x2), [s0] "+m" (s0), [t0] "+m" (t0),
1611                                         [s1] "+m" (s1), [t1] "+m" (t1)
1612       : [wp] "a" (wp) : "d0", "d1", "d2", "d3", "d4");
1613
1614       sb0[30+i*2] =  shft4(t0)          + shft13(s0) * wp[24];
1615       sb0[31+i*2] = shft13(t0) * wp[25] - shft13(s0) * wp[26];
1616       sb1[30+i*2] =  shft4(t1)          + shft13(s1) * wp[24];
1617       sb1[31+i*2] = shft13(t1) * wp[25] - shft13(s1) * wp[26];
1618       wp += 27;
1619       x1 -=  2;
1620       x2 +=  2;
1621     }
1622
1623     asm volatile(
1624     "move.l ( -32*4,%[x1]), %%d4\n"   /* d4 = x1[-32] */
1625     "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1626
1627     "mac.w %%d0u, %%d4u,                       %%acc0\n"
1628     "mac.w %%d0u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n"
1629     "mac.w %%d0l, %%d4u,                       %%acc0\n"
1630     "mac.w %%d0l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n"
1631     "mac.w %%d1u, %%d4u,                       %%acc0\n"
1632     "mac.w %%d1u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n"
1633     "mac.w %%d1l, %%d4u,                       %%acc0\n"
1634     "mac.w %%d1l, %%d4l, (  32*4,%[x1]), %%d4, %%acc1\n"
1635     "mac.w %%d2u, %%d4u,                       %%acc0\n"
1636     "mac.w %%d2u, %%d4l, (  96*4,%[x1]), %%d4, %%acc1\n"
1637     "mac.w %%d2l, %%d4u,                       %%acc0\n"
1638     "mac.w %%d2l, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n"
1639     "mac.w %%d3u, %%d4u,                       %%acc0\n"
1640     "mac.w %%d3u, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n"
1641     "mac.w %%d3l, %%d4u,                       %%acc0\n"
1642     "mac.w %%d3l, %%d4l, ( -16*4,%[x1]), %%d4, %%acc1\n"
1643     "movclr.l %%acc0, %%d0\n"
1644     "move.l %%d0, %[s0]\n"
1645     "movclr.l %%acc1, %%d0\n"
1646     "move.l %%d0, %[s1]\n"
1647
1648     "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */
1649     "mac.w %%d0u, %%d4u,                       %%acc0\n"
1650     "mac.w %%d0u, %%d4l, ( -48*4,%[x1]), %%d4, %%acc1\n"
1651     "mac.w %%d1u, %%d4u,                       %%acc0\n"
1652     "mac.w %%d1u, %%d4l, (  16*4,%[x1]), %%d4, %%acc1\n"
1653     "mac.w %%d1l, %%d4u,                       %%acc0\n"
1654     "mac.w %%d1l, %%d4l, ( -80*4,%[x1]), %%d4, %%acc1\n"
1655     "mac.w %%d2u, %%d4u,                       %%acc0\n"
1656     "mac.w %%d2u, %%d4l, (  48*4,%[x1]), %%d4, %%acc1\n"
1657     "mac.w %%d2u, %%d4u,                       %%acc0\n"
1658     "mac.w %%d2u, %%d4l, (-112*4,%[x1]), %%d4, %%acc1\n"
1659     "mac.w %%d3u, %%d4u,                       %%acc0\n"
1660     "mac.w %%d3u, %%d4l, (  80*4,%[x1]), %%d4, %%acc1\n"
1661     "mac.w %%d3l, %%d4u,                       %%acc0\n"
1662     "mac.w %%d3l, %%d4l, (-144*4,%[x1]), %%d4, %%acc1\n"
1663     "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */
1664     "mac.w %%d0u, %%d4u,                       %%acc0\n"
1665     "mac.w %%d0u, %%d4l, ( 112*4,%[x1]), %%d4, %%acc1\n"
1666     "mac.w %%d0u, %%d4u,                       %%acc0\n"
1667     "mac.w %%d0u, %%d4l, (-176*4,%[x1]), %%d4, %%acc1\n"
1668     "mac.w %%d1u, %%d4u,                       %%acc0\n"
1669     "mac.w %%d1u, %%d4l, ( 144*4,%[x1]), %%d4, %%acc1\n"
1670     "mac.w %%d1l, %%d4u,                       %%acc0\n"
1671     "mac.w %%d1l, %%d4l, (-208*4,%[x1]), %%d4, %%acc1\n"
1672     "mac.w %%d2u, %%d4u,                       %%acc0\n"
1673     "mac.w %%d2u, %%d4l, ( 176*4,%[x1]), %%d4, %%acc1\n"
1674     "mac.w %%d2u, %%d4u,                       %%acc0\n"
1675     "mac.w %%d2u, %%d4l, (-240*4,%[x1]), %%d4, %%acc1\n"
1676     "mac.w %%d3u, %%d4u,                       %%acc0\n"
1677     "mac.w %%d3u, %%d4l, ( 208*4,%[x1]), %%d4, %%acc1\n"
1678     "mac.w %%d3l, %%d4u,                       %%acc0\n"
1679     "mac.w %%d3l, %%d4l,                       %%acc1\n"
1680     "movclr.l %%acc0, %%d0\n"
1681     "move.l %%d0, %[t0]\n"
1682     "movclr.l %%acc1, %%d0\n"
1683     "move.l %%d0, %[t1]\n"
1684
1685     : [x1] "+a" (x1), [s0] "+m" (s0), [t0] "+m" (t0),
1686                       [s1] "+m" (s1), [t1] "+m" (t1)
1687     : [wp] "a" (wp) : "d0", "d1", "d2", "d3", "d4");
1688
1689     u  = shft4(s0 - t0);
1690     v  = shft4(s0 + t0);
1691     t0 = sb0[14];
1692     s0 = sb0[15] - t0;
1693
1694     sb0[31] = v + t0;   /* A0 */
1695     sb0[30] = u + s0;   /* A1 */
1696     sb0[15] = u - s0;   /* A2 */
1697     sb0[14] = v - t0;   /* A3 */
1698
1699     u  = shft4(s1 - t1);
1700     v  = shft4(s1 + t1);
1701     t1 = sb1[14];
1702     s1 = sb1[15] - t1;
1703
1704     sb1[31] = v + t1;   /* A0 */
1705     sb1[30] = u + s1;   /* A1 */
1706     sb1[15] = u - s1;   /* A2 */
1707     sb1[14] = v - t1;   /* A3 */
1708   }
1709 #else
1710   int ch, s, t, *a;
1711
1712   for(ch=0; ch<cfg.channels; ch++)
1713   {
1714     a = ch ? sb1 : sb0;
1715     for(k=0; k<18; k++, wk+=64, a+=SBLIMIT)
1716     {
1717       wp = enwindow;
1718       x1 = wk;
1719       x2 = x1 - 124;
1720
1721       /* x1[-572] .... x1[448] = 1022 */
1722       /* 18*4*16*32 */
1723       for(i=-15; i<0; i++)
1724       {
1725         s  = (int)x2[-224*2] * wp[ 0];  t  = (int)x1[ 224*2] * wp[ 0];
1726         s += (int)x2[-160*2] * wp[ 1];  t += (int)x1[ 160*2] * wp[ 1];
1727         s += (int)x2[- 96*2] * wp[ 2];  t += (int)x1[  96*2] * wp[ 2];
1728         s += (int)x2[- 32*2] * wp[ 3];  t += (int)x1[  32*2] * wp[ 3];
1729         s += (int)x2[  32*2] * wp[ 4];  t += (int)x1[- 32*2] * wp[ 4];
1730         s += (int)x2[  96*2] * wp[ 5];  t += (int)x1[- 96*2] * wp[ 5];
1731         s += (int)x2[ 160*2] * wp[ 6];  t += (int)x1[-160*2] * wp[ 6];
1732         s += (int)x2[ 224*2] * wp[ 7];  t += (int)x1[-224*2] * wp[ 7];
1733         s += (int)x1[-256*2] * wp[ 8];  t += (int)x2[ 256*2] * wp[16];
1734         s += (int)x1[-192*2] * wp[ 9];  t += (int)x2[ 192*2] * wp[17];
1735         s += (int)x1[-128*2] * wp[10];  t += (int)x2[ 128*2] * wp[18];
1736         s += (int)x1[- 64*2] * wp[11];  t += (int)x2[  64*2] * wp[19];
1737         s += (int)x1[   0*2] * wp[12];  t += (int)x2[   0*2] * wp[20];
1738         s += (int)x1[  64*2] * wp[13];  t += (int)x2[- 64*2] * wp[21];
1739         s += (int)x1[ 128*2] * wp[14];  t += (int)x2[-128*2] * wp[22];
1740         s += (int)x1[ 192*2] * wp[15];  t += (int)x2[-192*2] * wp[23];
1741
1742         a[30+i*2] =  shft4(t)          + shft13(s) * wp[24];
1743         a[31+i*2] = shft13(t) * wp[25] - shft13(s) * wp[26];
1744         wp += 27;
1745         x1 -=  2;
1746         x2 +=  2;
1747       }
1748
1749       t  =  (int)x1[- 16*2]            * wp[ 8];  s  = (int)x1[ -32*2] * wp[0];
1750       t += ((int)x1[- 48*2]-x1[ 16*2]) * wp[10];  s += (int)x1[ -96*2] * wp[1];
1751       t += ((int)x1[- 80*2]+x1[ 48*2]) * wp[12];  s += (int)x1[-160*2] * wp[2];
1752       t += ((int)x1[-112*2]-x1[ 80*2]) * wp[14];  s += (int)x1[-224*2] * wp[3];
1753       t += ((int)x1[-144*2]+x1[112*2]) * wp[16];  s += (int)x1[  32*2] * wp[4];
1754       t += ((int)x1[-176*2]-x1[144*2]) * wp[18];  s += (int)x1[  96*2] * wp[5];
1755       t += ((int)x1[-208*2]+x1[176*2]) * wp[20];  s += (int)x1[ 160*2] * wp[6];
1756       t += ((int)x1[-240*2]-x1[208*2]) * wp[22];  s += (int)x1[ 224*2] * wp[7];
1757
1758       u = shft4(s - t);
1759       v = shft4(s + t);
1760       t = a[14];
1761       s = a[15] - t;
1762
1763       a[31] = v + t;   /* A0 */
1764       a[30] = u + s;   /* A1 */
1765       a[15] = u - s;   /* A2 */
1766       a[14] = v - t;   /* A3 */
1767     }
1768     wk -= 18 * 64 - 1; /* rewind wk (to next channel start) */
1769   }
1770 #endif
1771 }
1772
1773 static void window_subband2(short *x1, int a[SBLIMIT])
1774 {
1775   int   xr;
1776   short *wp = enwindow;
1777   short *x2 = x1 - 124;
1778
1779   wp += 27 * 15;
1780   x1 -=  2 * 15;
1781   x2 +=  2 * 15;
1782
1783   xr = a[28] - a[0];  a[0] += a[28];  a[28] = shft9(xr) * wp[-2*27+25];
1784   xr = a[29] - a[1];  a[1] += a[29];  a[29] = shft9(xr) * wp[-2*27+25];
1785   xr = a[26] - a[2];  a[2] += a[26];  a[26] = shft9(xr) * wp[-4*27+25];
1786   xr = a[27] - a[3];  a[3] += a[27];  a[27] = shft9(xr) * wp[-4*27+25];
1787   xr = a[24] - a[4];  a[4] += a[24];  a[24] = shft9(xr) * wp[-6*27+25];
1788   xr = a[25] - a[5];  a[5] += a[25];  a[25] = shft9(xr) * wp[-6*27+25];
1789   xr = a[22] - a[6];  a[6] += a[22];  a[22] = shft9(xr) * SQRT        ;
1790   xr = a[23] - a[7];  a[7] += a[23];  a[23] = shft9(xr) * SQRT  - a[7];
1791   a[ 7] -= a[ 6];
1792   a[22] -= a[ 7];
1793   a[23] -= a[22];
1794
1795   xr = a[ 6];  a[ 6] = a[31] - xr;  a[31] = a[31] + xr;
1796   xr = a[ 7];  a[ 7] = a[30] - xr;  a[30] = a[30] + xr;
1797   xr = a[22];  a[22] = a[15] - xr;  a[15] = a[15] + xr;
1798   xr = a[23];  a[23] = a[14] - xr;  a[14] = a[14] + xr;
1799
1800   xr = a[20] - a[ 8];  a[ 8] += a[20];  a[20] = shft9(xr) * wp[-10*27+25];
1801   xr = a[21] - a[ 9];  a[ 9] += a[21];  a[21] = shft9(xr) * wp[-10*27+25];
1802   xr = a[18] - a[10];  a[10] += a[18];  a[18] = shft9(xr) * wp[-12*27+25];
1803   xr = a[19] - a[11];  a[11] += a[19];  a[19] = shft9(xr) * wp[-12*27+25];
1804   xr = a[16] - a[12];  a[12] += a[16];  a[16] = shft9(xr) * wp[-14*27+25];
1805   xr = a[17] - a[13];  a[13] += a[17];  a[17] = shft9(xr) * wp[-14*27+25];
1806   xr =-a[20] + a[24];  a[20] += a[24];  a[24] = shft9(xr) * wp[-12*27+25];
1807   xr =-a[21] + a[25];  a[21] += a[25];  a[25] = shft9(xr) * wp[-12*27+25];
1808   xr = a[ 4] - a[ 8];  a[ 4] += a[ 8];  a[ 8] = shft9(xr) * wp[-12*27+25];
1809   xr = a[ 5] - a[ 9];  a[ 5] += a[ 9];  a[ 9] = shft9(xr) * wp[-12*27+25];
1810   xr = a[ 0] - a[12];  a[ 0] += a[12];  a[12] = shft9(xr) * wp[ -4*27+25];
1811   xr = a[ 1] - a[13];  a[ 1] += a[13];  a[13] = shft9(xr) * wp[ -4*27+25];
1812   xr = a[16] - a[28];  a[16] += a[28];  a[28] = shft9(xr) * wp[ -4*27+25];
1813   xr =-a[17] + a[29];  a[17] += a[29];  a[29] = shft9(xr) * wp[ -4*27+25];
1814
1815   xr = SQRT * shft9(a[ 2] - a[10]);  a[ 2] += a[10];  a[10] = xr;
1816   xr = SQRT * shft9(a[ 3] - a[11]);  a[ 3] += a[11];  a[11] = xr;
1817   xr = SQRT * shft9(a[26] - a[18]);  a[18] += a[26];  a[26] = xr - a[18];
1818   xr = SQRT * shft9(a[27] - a[19]);  a[19] += a[27];  a[27] = xr - a[19];
1819
1820   xr = a[ 2];  a[19] -= a[ 3];  a[ 3] -= xr;  a[ 2] = a[31] - xr;  a[31] += xr;
1821   xr = a[ 3];  a[11] -= a[19];  a[18] -= xr;  a[ 3] = a[30] - xr;  a[30] += xr;
1822   xr = a[18];  a[27] -= a[11];  a[19] -= xr;  a[18] = a[15] - xr;  a[15] += xr;
1823
1824   xr = a[19];  a[10] -= xr;  a[19] = a[14] - xr;  a[14] += xr;
1825   xr = a[10];  a[11] -= xr;  a[10] = a[23] - xr;  a[23] += xr;
1826   xr = a[11];  a[26] -= xr;  a[11] = a[22] - xr;  a[22] += xr;
1827   xr = a[26];  a[27] -= xr;  a[26] = a[ 7] - xr;  a[ 7] += xr;
1828
1829   xr = a[27];  a[27] = a[6] - xr;  a[6] += xr;
1830
1831   xr = SQRT * shft9(a[ 0] - a[ 4]);  a[ 0] += a[ 4];  a[ 4] = xr;
1832   xr = SQRT * shft9(a[ 1] - a[ 5]);  a[ 1] += a[ 5];  a[ 5] = xr;
1833   xr = SQRT * shft9(a[16] - a[20]);  a[16] += a[20];  a[20] = xr;
1834   xr = SQRT * shft9(a[17] - a[21]);  a[17] += a[21];  a[21] = xr;
1835   xr =-SQRT * shft9(a[ 8] - a[12]);  a[ 8] += a[12];  a[12] = xr - a[ 8];
1836   xr =-SQRT * shft9(a[ 9] - a[13]);  a[ 9] += a[13];  a[13] = xr - a[ 9];
1837   xr =-SQRT * shft9(a[25] - a[29]);  a[25] += a[29];  a[29] = xr - a[25];
1838   xr =-SQRT * shft9(a[24] + a[28]);  a[24] -= a[28];  a[28] = xr - a[24];
1839
1840   xr = a[24] - a[16]; a[24] = xr;
1841   xr = a[20] - xr;    a[20] = xr;
1842   xr = a[28] - xr;    a[28] = xr;
1843
1844   xr = a[25] - a[17]; a[25] = xr;
1845   xr = a[21] - xr;    a[21] = xr;
1846   xr = a[29] - xr;    a[29] = xr;
1847
1848   xr = a[17] - a[1];  a[17] = xr;
1849   xr = a[ 9] - xr;    a[ 9] = xr;
1850   xr = a[25] - xr;    a[25] = xr;
1851   xr = a[ 5] - xr;    a[ 5] = xr;
1852   xr = a[21] - xr;    a[21] = xr;
1853   xr = a[13] - xr;    a[13] = xr;
1854   xr = a[29] - xr;    a[29] = xr;
1855
1856   xr = a[ 1] - a[0];  a[ 1] = xr;
1857   xr = a[16] - xr;    a[16] = xr;
1858   xr = a[17] - xr;    a[17] = xr;
1859   xr = a[ 8] - xr;    a[ 8] = xr;
1860   xr = a[ 9] - xr;    a[ 9] = xr;
1861   xr = a[24] - xr;    a[24] = xr;
1862   xr = a[25] - xr;    a[25] = xr;
1863   xr = a[ 4] - xr;    a[ 4] = xr;
1864   xr = a[ 5] - xr;    a[ 5] = xr;
1865   xr = a[20] - xr;    a[20] = xr;
1866   xr = a[21] - xr;    a[21] = xr;
1867   xr = a[12] - xr;    a[12] = xr;
1868   xr = a[13] - xr;    a[13] = xr;
1869   xr = a[28] - xr;    a[28] = xr;
1870   xr = a[29] - xr;    a[29] = xr;
1871
1872   xr = a[ 0];  a[ 0] += a[31];  a[31] -= xr;
1873   xr = a[ 1];  a[ 1] += a[30];  a[30] -= xr;
1874   xr = a[16];  a[16] += a[15];  a[15] -= xr;
1875   xr = a[17];  a[17] += a[14];  a[14] -= xr;
1876   xr = a[ 8];  a[ 8] += a[23];  a[23] -= xr;
1877   xr = a[ 9];  a[ 9] += a[22];  a[22] -= xr;
1878   xr = a[24];  a[24] += a[ 7];  a[ 7] -= xr;
1879   xr = a[25];  a[25] += a[ 6];  a[ 6] -= xr;
1880   xr = a[ 4];  a[ 4] += a[27];  a[27] -= xr;
1881   xr = a[ 5];  a[ 5] += a[26];  a[26] -= xr;
1882   xr = a[20];  a[20] += a[11];  a[11] -= xr;
1883   xr = a[21];  a[21] += a[10];  a[10] -= xr;
1884   xr = a[12];  a[12] += a[19];  a[19] -= xr;
1885   xr = a[13];  a[13] += a[18];  a[18] -= xr;
1886   xr = a[28];  a[28] += a[ 3];  a[ 3] -= xr;
1887   xr = a[29];  a[29] += a[ 2];  a[ 2] -= xr;
1888 }
1889
1890 static void mdct_long(int *out, int *in)
1891 {
1892   int ct,st;
1893   int tc1, tc2, tc3, tc4, ts5, ts6, ts7, ts8;
1894   int ts1, ts2, ts3, ts4, tc5, tc6, tc7, tc8;
1895
1896   /* 1,2, 5,6, 9,10, 13,14, 17 */
1897   tc1 = in[17] - in[ 9];
1898   tc3 = in[15] - in[11];
1899   tc4 = in[14] - in[12];
1900   ts5 = in[ 0] + in[ 8];
1901   ts6 = in[ 1] + in[ 7];
1902   ts7 = in[ 2] + in[ 6];
1903   ts8 = in[ 3] + in[ 5];
1904
1905   out[17] = (ts5 + ts7 - ts8) * cx[8] - (ts6 - in[4]) * cx[8];
1906   st      = (ts5 + ts7 - ts8) * cx[7] + (ts6 - in[4]) * cx[8];
1907   ct      = (tc1 - tc3 - tc4) * cx[6];
1908   out[5]  = ct + st;
1909   out[6]  = ct - st;
1910
1911   tc2     = (in[16] - in[10]) * cx[6];
1912   ts6     =  ts6 * cx[7] + in[4] * cx[8];
1913
1914   ct      =  tc1 * cx[0] + tc2 + tc3 * cx[1] + tc4 * cx[2];
1915   st      = -ts5 * cx[4] + ts6 - ts7 * cx[5] + ts8 * cx[3];
1916   out[1]  = ct + st;
1917   out[2]  = ct - st;
1918
1919   ct      =  tc1 * cx[1] - tc2 - tc3 * cx[2] + tc4 * cx[0];
1920   st      = -ts5 * cx[5] + ts6 - ts7 * cx[3] + ts8 * cx[4];
1921   out[ 9] = ct + st;
1922   out[10] = ct - st;
1923
1924   ct      = tc1 * cx[2] - tc2 + tc3 * cx[0] - tc4 * cx[1];
1925   st      = ts5 * cx[3] - ts6 + ts7 * cx[4] - ts8 * cx[5];
1926   out[13] = ct + st;
1927   out[14] = ct - st;
1928
1929   ts1 = in[ 8] - in[ 0];
1930   ts3 = in[ 6] - in[ 2];
1931   ts4 = in[ 5] - in[ 3];
1932   tc5 = in[17] + in[ 9];
1933   tc6 = in[16] + in[10];
1934   tc7 = in[15] + in[11];
1935   tc8 = in[14] + in[12];
1936
1937   out[0]  = (tc5 + tc7 + tc8) * cx[8] + (tc6 + in[13]) * cx[8];
1938   ct      = (tc5 + tc7 + tc8) * cx[7] - (tc6 + in[13]) * cx[8];
1939   st      = (ts1 - ts3 + ts4) * cx[6];
1940   out[11] = ct + st;
1941   out[12] = ct - st;
1942
1943   ts2     = (in[7] - in[1]) * cx[6];
1944   tc6     = in[13] * cx[8] - tc6 * cx[7];
1945
1946   ct      = tc5 * cx[3] - tc6 + tc7 * cx[4] + tc8 * cx[5];
1947   st      = ts1 * cx[2] + ts2 + ts3 * cx[0] + ts4 * cx[1];
1948   out[3]  = ct + st;
1949   out[4]  = ct - st;
1950
1951   ct      =-tc5 * cx[5] + tc6 - tc7 * cx[3] - tc8 * cx[4];
1952   st      = ts1 * cx[1] + ts2 - ts3 * cx[2] - ts4 * cx[0];
1953   out[7]  = ct + st;
1954   out[8]  = ct - st;
1955
1956   ct      =-tc5 * cx[4] + tc6 - tc7 * cx[5] - tc8 * cx[3];
1957   st      = ts1 * cx[0] - ts2 + ts3 * cx[1] - ts4 * cx[2];
1958   out[15] = ct + st;
1959   out[16] = ct - st;
1960 }
1961
1962 static int find_bitrate_index(int type, int bitrate /*, bool stereo */)
1963 {
1964     int i;
1965
1966     for(i=0;i<14;i++)
1967         if(bitrate == bitr_index[type][i])
1968             break;
1969     return i;
1970 }
1971
1972 static int find_samplerate_index(unsigned long freq, int *mp3_type)
1973 {
1974     int mpeg = freq >= (32000+24000)/2 ? 1 : 0;
1975
1976     unsigned long dmin = ULONG_MAX;
1977     int idmin = -1, i;
1978
1979     for (i = 0; i < 3; i++)
1980     {
1981         unsigned long diff;
1982
1983         if (sampr_index[mpeg][i] == freq)
1984         {
1985             idmin = i;
1986             break;
1987         }
1988
1989         if ((long)sampr_index[mpeg][i] < (long)freq)
1990             diff = freq - sampr_index[mpeg][i];
1991         else
1992             diff = sampr_index[mpeg][i] - freq;
1993
1994         if (diff < dmin)
1995         {
1996             dmin = diff;
1997             idmin = i;
1998         }
1999     }
2000
2001     *mp3_type = mpeg;
2002     return idmin;
2003 }
2004
2005 static bool init_mp3_encoder_engine(int sample_rate, int num_channels, int bitrate)
2006 {
2007     const bool stereo = num_channels > 1;
2008     uint32_t avg_byte_per_frame;
2009
2010     cfg.channels      = stereo ? 2 : 1;
2011     cfg.mpg.mode      = stereo ? 0 : 3; /* 0=stereo, 3=mono */
2012     cfg.mpg.smpl_id   = find_samplerate_index(sample_rate, &cfg.mpg.type);
2013     cfg.samplerate    = sampr_index[cfg.mpg.type][cfg.mpg.smpl_id];
2014     cfg.mpg.bitr_id   = find_bitrate_index(cfg.mpg.type, bitrate /*, stereo */);
2015     cfg.mpg.bitrate   = bitr_index[cfg.mpg.type][cfg.mpg.bitr_id];
2016     cfg.mpg.num_bands = num_bands[stereo ? cfg.mpg.type : 2][cfg.mpg.bitr_id];
2017
2018     if (cfg.mpg.type == 1)
2019     {
2020         cfg.granules = 2;
2021         pcm_chunk_size = PCM_CHUNK_SIZE1;
2022         samp_per_frame = SAMP_PER_FRAME1;
2023     }
2024     else
2025     {
2026         cfg.granules = 1;
2027         pcm_chunk_size = PCM_CHUNK_SIZE2;
2028         samp_per_frame = SAMP_PER_FRAME2;
2029     }
2030
2031     memcpy(scalefac, sfBand[cfg.mpg.smpl_id + 3*cfg.mpg.type], sizeof(scalefac));
2032     memset(mfbuf     , 0              , sizeof(mfbuf     ));
2033     memset(mdct_freq , 0              , sizeof(mdct_freq ));
2034     memset(enc_data  , 0              , sizeof(enc_data  ));
2035     memset(sb_data   , 0              , sizeof(sb_data   ));
2036     memset(&CodedData, 0              , sizeof(CodedData ));
2037     memcpy(ca        , ca_const       , sizeof(ca        ));
2038     memcpy(cs        , cs_const       , sizeof(cs        ));
2039     memcpy(cx        , cx_const       , sizeof(cx        ));
2040     memcpy(win       , win_const      , sizeof(win       ));
2041     memcpy(enwindow  , enwindow_const , sizeof(enwindow  ));
2042     memcpy(int2idx   , int2idx_const  , sizeof(int2idx   ));
2043     memcpy(ht_count  , ht_count_const , sizeof(ht_count  ));
2044     memcpy( tab01    , tab01_const    , sizeof(tab01     ));
2045     memcpy( tab23    , tab23_const    , sizeof(tab23     ));
2046     memcpy( tab56    , tab56_const    , sizeof(tab56     ));
2047     memcpy( tab1315  , tab1315_const  , sizeof(tab1315   ));
2048     memcpy( tab1624  , tab1624_const  , sizeof(tab1624   ));
2049     memcpy( tab789   , tab789_const   , sizeof(tab789    ));
2050     memcpy( tabABC   , tabABC_const   , sizeof(tabABC    ));
2051     memcpy( t1HB     , t1HB_const     , sizeof(t1HB      ));
2052     memcpy( t2HB     , t2HB_const     , sizeof(t2HB      ));
2053     memcpy( t3HB     , t3HB_const     , sizeof(t3HB      ));
2054     memcpy( t5HB     , t5HB_const     , sizeof(t5HB      ));
2055     memcpy( t6HB     , t6HB_const     , sizeof(t6HB      ));
2056     memcpy( t7HB     , t7HB_const     , sizeof(t7HB      ));
2057     memcpy( t8HB     , t8HB_const     , sizeof(t8HB      ));
2058     memcpy( t9HB     , t9HB_const     , sizeof(t9HB      ));
2059     memcpy(t10HB     , t10HB_const    , sizeof(t10HB     ));
2060     memcpy(t11HB     , t11HB_const    , sizeof(t11HB     ));
2061     memcpy(t12HB     , t12HB_const    , sizeof(t12HB     ));
2062     memcpy(t13HB     , t13HB_const    , sizeof(t13HB     ));
2063     memcpy(t15HB     , t15HB_const    , sizeof(t15HB     ));
2064     memcpy(t16HB     , t16HB_const    , sizeof(t16HB     ));
2065     memcpy(t24HB     , t24HB_const    , sizeof(t24HB     ));
2066     memcpy( t1l      , t1l_const      , sizeof(t1l       ));
2067     memcpy( t2l      , t2l_const      , sizeof(t2l       ));
2068     memcpy( t3l      , t3l_const      , sizeof(t3l       ));
2069     memcpy( t5l      , t5l_const      , sizeof(t5l       ));
2070     memcpy( t6l      , t6l_const      , sizeof(t6l       ));
2071     memcpy( t7l      , t7l_const      , sizeof(t7l       ));
2072     memcpy( t8l      , t8l_const      , sizeof(t8l       ));
2073     memcpy( t9l      , t9l_const      , sizeof(t9l       ));
2074     memcpy(t10l      , t10l_const     , sizeof(t10l      ));
2075     memcpy(t11l      , t11l_const     , sizeof(t11l      ));
2076     memcpy(t12l      , t12l_const     , sizeof(t12l      ));
2077     memcpy(t13l      , t13l_const     , sizeof(t13l      ));
2078     memcpy(t15l      , t15l_const     , sizeof(t15l      ));
2079     memcpy(t16l      , t16l_const     , sizeof(t16l      ));
2080     memcpy(t24l      , t24l_const     , sizeof(t24l      ));
2081     memcpy(ht        , ht_const       , sizeof(ht        ));
2082
2083     ht[ 0].table =  NULL;  ht[ 0].hlen = NULL; /* Apparently not used */
2084     ht[ 1].table =  t1HB;  ht[ 1].hlen =  t1l;
2085     ht[ 2].table =  t2HB;  ht[ 2].hlen =  t2l;
2086     ht[ 3].table =  t3HB;  ht[ 3].hlen =  t3l;
2087     ht[ 4].table =  NULL;  ht[ 4].hlen = NULL; /* Apparently not used */
2088     ht[ 5].table =  t5HB;  ht[ 5].hlen =  t5l;
2089     ht[ 6].table =  t6HB;  ht[ 6].hlen =  t6l;
2090     ht[ 7].table =  t7HB;  ht[ 7].hlen =  t7l;
2091     ht[ 8].table =  t8HB;  ht[ 8].hlen =  t8l;
2092     ht[ 9].table =  t9HB;  ht[ 9].hlen =  t9l;
2093     ht[10].table = t10HB;  ht[10].hlen = t10l;
2094     ht[11].table = t11HB;  ht[11].hlen = t11l;
2095     ht[12].table = t12HB;  ht[12].hlen = t12l;
2096     ht[13].table = t13HB;  ht[13].hlen = t13l;
2097     ht[14].table =  NULL;  ht[14].hlen = NULL; /* Apparently not used */
2098     ht[15].table = t15HB;  ht[15].hlen = t15l;
2099
2100     /* Figure average number of 'bytes' per frame */
2101     avg_byte_per_frame = SAMPL2 * 16000 * cfg.mpg.bitrate / (2 - cfg.mpg.type);
2102     avg_byte_per_frame = avg_byte_per_frame / cfg.samplerate;
2103     cfg.byte_per_frame = avg_byte_per_frame / 64;
2104     cfg.frac_per_frame = avg_byte_per_frame & 63;
2105     cfg.slot_lag       = 0;
2106     cfg.sideinfo_len   = 32 + (cfg.mpg.type ? (cfg.channels == 1 ? 136 : 256)
2107                                             : (cfg.channels == 1 ?  72 : 136));
2108
2109     return true;
2110 }
2111
2112 static inline void to_mono(uint32_t **samp)
2113 {
2114     int32_t lr = **samp;
2115     int32_t m  = (int16_t)lr + (lr >> 16) + err;
2116     err = m & 1;
2117     m >>= 1;
2118     *(*samp)++ = (m << 16) | (uint16_t)m;
2119 } /* to_mono */
2120
2121 static void to_mono_mm(void)
2122 {
2123     /* |llllllllllllllll|rrrrrrrrrrrrrrrr| =>
2124      * |mmmmmmmmmmmmmmmm|mmmmmmmmmmmmmmmm|
2125      */
2126     uint32_t *samp = (uint32_t *)&mfbuf[2*512];
2127     uint32_t *samp_end = samp + samp_per_frame;
2128
2129     do
2130     {
2131         to_mono(&samp);
2132         to_mono(&samp);
2133         to_mono(&samp);
2134         to_mono(&samp);
2135         to_mono(&samp);
2136         to_mono(&samp);
2137         to_mono(&samp);
2138         to_mono(&samp);
2139     }
2140     while (samp < samp_end);
2141 } /* to_mono_mm */
2142
2143 #ifdef ROCKBOX_LITTLE_ENDIAN
2144
2145 /* Swaps a frame to big endian */
2146 static inline void byte_swap_frame32(uint32_t *dst, uint32_t *src,
2147                                      size_t size)
2148 {
2149     assert(dst); assert(src);
2150     uint32_t *src_end = SKIPBYTES(src, size);
2151
2152     do
2153     {
2154 #define swap32 bswap_32
2155         *dst++ = swap32(*src); src++;
2156         *dst++ = swap32(*src); src++;
2157         *dst++ = swap32(*src); src++;
2158         *dst++ = swap32(*src); src++;
2159         *dst++ = swap32(*src); src++;
2160         *dst++ = swap32(*src); src++;
2161         *dst++ = swap32(*src); src++;
2162         *dst++ = swap32(*src); src++;
2163     }
2164     while(src < src_end);
2165 } /* byte_swap_frame32 */
2166 #endif /* ROCKBOX_LITTLE_ENDIAN */
2167
2168 static void set_scale_facs(int *mdct_freq)
2169 {
2170   unsigned int i, is, ie, k, s;
2171   int max_freq_val, avrg_freq_val;
2172
2173   /* calc average of first 256 frequency values */
2174   for(avrg_freq_val=i=0; i<256; i++)
2175     avrg_freq_val += mdct_freq[i];
2176   avrg_freq_val >>= 8;
2177
2178   /* if max of current band is smaller than average, increase precision */
2179   /* last band keeps untouched (not scaled) */
2180   for(is=k=0; is<scalefac[21]; k++)
2181   {
2182     max_freq_val = 0;
2183
2184     for(i=is, ie=scalefac[k+1]; i<ie; i++)
2185       if(max_freq_val < mdct_freq[i])
2186         max_freq_val = mdct_freq[i];
2187
2188     for(s=0; s<3; s++)
2189       if((max_freq_val<<s) > avrg_freq_val)
2190         break;
2191
2192     band_scale_f[k] = (unsigned char)s;
2193
2194     for(i=is; s && i<ie; i++)
2195       mdct_freq[i] <<= s;
2196
2197     is = ie;
2198   }
2199 }
2200
2201 static void encode_frame(char *buffer, struct enc_chunk_hdr *chunk)
2202 {
2203    int      gr, gr_cnt;
2204    uint32_t max;
2205     /* encode one mp3 frame in this loop */
2206     CodedData.bitpos = 0;
2207     memset(CodedData.bbuf, 0, sizeof(CodedData.bbuf));
2208
2209     if((cfg.slot_lag += cfg.frac_per_frame) >= 64)
2210     {   /* Padding for this frame */
2211         cfg.slot_lag   -= 64;
2212         cfg.mpg.padding = 1;
2213     }
2214     else
2215         cfg.mpg.padding = 0;
2216
2217     cfg.mean_bits = (8 * cfg.byte_per_frame + 8 * cfg.mpg.padding
2218                        - cfg.sideinfo_len) / cfg.granules / cfg.channels
2219                        - 42; // reserved for scale_facs
2220
2221     /* shift out old samples */
2222     memcpy(mfbuf, mfbuf + 2*cfg.granules*576, 4*512);
2223
2224     if (chunk->flags & CHUNKF_START_FILE)
2225     {
2226         /* prefix silent samples for encoder delay */
2227         memset(mfbuf + 2*512, 0, ENC_DELAY_SIZE);
2228         /* read new samples to iram for further processing */
2229         memcpy(mfbuf + 2*512 + ENC_DELAY_SIZE/2,
2230                buffer, pcm_chunk_size - ENC_DELAY_SIZE);
2231         chunk->num_pcm = samp_per_frame - ENC_DELAY_SAMP;
2232     }
2233     else
2234     {
2235         /* read new samples to iram for further processing */
2236         memcpy(mfbuf + 2*512, buffer, pcm_chunk_size);
2237         chunk->num_pcm = samp_per_frame;
2238     }
2239
2240     if (cfg.channels == 1)
2241         to_mono_mm();
2242
2243     cfg.ResvSize = 0;
2244     gr_cnt = cfg.granules * cfg.channels;
2245     CodedData.bitpos = cfg.sideinfo_len; /* leave space for mp3 header */
2246
2247     for(gr=0; gr<cfg.granules; gr++)
2248     {
2249         short *wk = mfbuf + 2*286 + gr*1152;
2250         int ch;
2251
2252         /* 16bit packed wav data can be windowed efficiently on coldfire */
2253         window_subband1(wk, sb_data[0][1-gr][0], sb_data[1][1-gr][0]);
2254
2255         for(ch=0; ch<cfg.channels; ch++)
2256         {
2257             int   ii, k, shift;
2258
2259             wk = mfbuf + 2*286 + gr*1152 + ch;
2260
2261             /* 36864=4*18*16*32 */
2262             for(k=0; k<18; k++, wk+=64)
2263             {
2264                 window_subband2(wk, sb_data[ch][1-gr][k]);
2265                 /* Compensate for inversion in the analysis filter */
2266                 if(k & 1)
2267                 {
2268                     int band;
2269                     for(band=1; band<32; band+=2)
2270                         sb_data[ch][1-gr][k][band] *= -1;
2271                 }
2272             }
2273
2274             /* Perform imdct of 18 previous + 18 current subband samples */
2275             /* for integer precision do this loop again (if neccessary)  */
2276             shift = 14 - (cfg.cod_info[gr][ch].additStep >> 2);
2277             for(k=1,ii=0; ii<3 && k; ii++)
2278             {
2279                 int *mdct = mdct_freq;
2280                 int band;
2281
2282                 cfg.cod_info[gr][ch].additStep = 4 * (14 - shift);
2283
2284                 for(band=0; band<cfg.mpg.num_bands; band++, mdct+=18)
2285                 {
2286                     int *band0 = sb_data[ch][  gr][0] + order[band];
2287                     int *band1 = sb_data[ch][1-gr][0] + order[band];
2288                     int work[18];
2289
2290                     /* 9216=4*32*9*8 */
2291                     for(k=-9; k<0; k++)
2292                     {
2293                         int a = shft_n(band1[(k+9)*32], shift);
2294                         int b = shft_n(band1[(8-k)*32], shift);
2295                         int c = shft_n(band0[(k+9)*32], shift);
2296                         int d = shft_n(band0[(8-k)*32], shift);
2297
2298                         work[k+ 9] = shft16(a * win[k+ 9][0] +
2299                                             b * win[k+ 9][1] +
2300                                             c * win[k+ 9][2] +
2301                                             d * win[k+ 9][3]);
2302
2303                         work[k+18] = shft16(c * win[k+18][0] +
2304                                             d * win[k+18][1] +
2305                                             a * win[k+18][2] +
2306                                             b * win[k+18][3]);
2307                     }
2308
2309                     /* 7200=4*18*100 */
2310                     mdct_long(mdct, work);
2311
2312                     /* Perform aliasing reduction butterfly */
2313                     if(band != 0)
2314                     {
2315                         for(k=7; k>=0; --k)
2316                         {
2317                             int bu, bd;
2318                             bu = shft15(mdct[k]) * ca[k] +
2319                                  shft15(mdct[-1-k]) * cs[k];
2320                             bd = shft15(mdct[k]) * cs[k] -
2321                                  shft15(mdct[-1-k]) * ca[k];
2322                             mdct[-1-k] = bu;
2323                             mdct[ k  ] = bd;
2324                         }
2325                     }
2326                 }
2327
2328                 max = 0;
2329                 for(k=0; k<576; k++)
2330                 {
2331                     if(mdct_freq[k] < 0)
2332                     {
2333                         mdct_sign[k] = 1; /* negative */
2334                         mdct_freq[k] = shft13(-mdct_freq[k]);
2335                     }
2336                     else
2337                     {
2338                         mdct_sign[k] = 0; /* positive */
2339                         mdct_freq[k] = shft13(mdct_freq[k]);
2340                     }
2341
2342                     if(max < (uint32_t)mdct_freq[k])
2343                         max = (uint32_t)mdct_freq[k];
2344                 }
2345                 cfg.cod_info[gr][ch].max_val = max;
2346
2347                 /* calc new shift for higher integer precision */
2348                 for(k=0; max<(uint32_t)(0x7800>>k); k++) shift--;
2349                 for( ; (max>>k)>=(uint32_t)0x10000; k++) shift++;
2350                 if(shift < 0)  shift = 0;
2351             }
2352
2353             cfg.cod_info[gr][ch].quantStep +=
2354                                 cfg.cod_info[gr][ch].additStep;
2355
2356             set_scale_facs(mdct_freq);
2357
2358             /* bit and noise allocation */
2359             iteration_loop(mdct_freq, &cfg.cod_info[gr][ch],
2360                            gr_cnt--);
2361
2362             /* write the frame to the bitstream */
2363             Huffmancodebits(enc_data, mdct_sign,
2364                             &cfg.cod_info[gr][ch]);
2365
2366             cfg.cod_info[gr][ch].quantStep -=
2367                                 cfg.cod_info[gr][ch].additStep;
2368
2369             if(cfg.granules == 1)
2370             {
2371                 memcpy(sb_data[ch][0], sb_data[ch][1],
2372                        sizeof(sb_data[ch][0]));
2373             }
2374         }
2375     }
2376     chunk->enc_size = cfg.byte_per_frame + cfg.mpg.padding;
2377
2378     /* finish this chunk by adding sideinfo header data */
2379     CodedData.bitpos = 0;
2380     encodeSideInfo( cfg.cod_info );
2381
2382 #ifdef ROCKBOX_BIG_ENDIAN
2383     /* copy chunk to enc_buffer */
2384     memcpy(chunk->enc_data, CodedData.bbuf, chunk->enc_size);
2385 #else
2386     /* swap frame to big endian */
2387     byte_swap_frame32((uint32_t *)chunk->enc_data, CodedData.bbuf, chunk->enc_size);
2388 #endif
2389 } /* encode_frame */