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