1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2006 Antonius Hellmann
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.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
22 // Shine is an MP3 encoder
23 // Copyright (C) 1999-2000 Gabriel Bouvigne
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.
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.
37 #ifdef WORDS_BIGENDIAN
38 #define ROCKBOX_BIG_ENDIAN
40 #define ROCKBOX_LITTLE_ENDIAN
48 #include "../wmafixed/bswap.h"
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)
63 #define putlong(c, s) if(s+sz <= 32) { cc = (cc << s) | c; sz+= s; } \
64 else { putbits(cc, sz); cc = c; sz = s; }
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 */
76 /* Side information */
78 uint32_t part2_3_length;
79 int count1; /* number of 0-1-quadruples */
81 uint32_t table_select[4];
92 side_info_t cod_info[2][2];
106 int bitpos; /* current bitpos for writing */
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] */
117 int len; /* max. index */
118 int linbits; /* number of linbits */
119 int linmax; /* max number stored in linbits */
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 */
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;
183 static unsigned pcm_chunk_size IBSS_ATTR;
184 static unsigned samp_per_frame IBSS_ATTR;
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];
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 */
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};
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 };
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 };
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 };
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 };
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 };
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 };
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 };
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};
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,
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};
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 };
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 };
322 static const uint32_t tab23_const[ 9] =
323 { 0x10002,0x40003,0x70007,0x40004,0x50004,0x70007,0x60006,0x70007,0x80008 };
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 };
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,
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,
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};
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};
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};
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};
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};
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};
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};
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};
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};
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};
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};
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};
461 static const struct huffcodetab ht_const[HTN] =
462 { { 0, NULL, NULL}, /* Apparently not used */
466 { 0, NULL, NULL}, /* Apparently not used */
476 { 0, NULL, NULL}, /* Apparently not used */
479 static const struct huffcodebig ht_big[HTN] =
499 uint32_t region0_cnt;
500 uint32_t region1_cnt;
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 */
527 static const uint32_t sfBand[6][23] =
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} };
543 static const short int2idx_const[4096] = /* int2idx[i] = sqrt(i*sqrt(i)); */
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 };
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 };
755 static const unsigned long sampr_index[2][3] =
756 { { 22050, 24000, 16000 }, /* MPEG 2 */
757 { 44100, 48000, 32000 } }; /* MPEG 1 */
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 */
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} };
768 static const int cx_const[9] =
769 { 16135, 10531, 5604, 15396, -2845,-12551, 14189, 8192, 16384 };
771 static const int ca_const[8] =
772 {-16859,-15458,-10269, -5961, -3099, -1342, -465, -121 };
774 static const int cs_const[8] =
775 { 28098, 28893, 31117, 32221, 32621, 32740, 32765, 32768 };
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,
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
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 } };
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,
860 /* implementations */
861 static void encodeSideInfo( side_info_t si[2][2] )
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
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 );
897 if(cfg.mpg.type == 1)
899 if(cfg.channels == 2) { putlong( 0, 20); }
900 else { putlong( 0, 18); }
902 for(gr=0; gr<cfg.granules; gr++)
903 for(ch=0; ch<cfg.channels; ch++)
905 side_info_t *gi = &si[gr][ch];
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 );
921 if(cfg.channels == 2) { putlong( 0, 10); }
922 else { putlong( 0, 9); }
924 for(ch=0; ch<cfg.channels; ch++)
926 side_info_t *gi = &si[0][ch];
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 );
940 /* flush remaining bits */
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 )
948 int region1 = gi->address1;
949 int region2 = gi->address2;
950 int bigvals = gi->address3;
951 int count1 = bigvals + (gi->count1 << 2);
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)
961 v |= band_scale_f[i>>1] << (40-i);
962 putbits(v, 10); // store scale_facs (part2)
965 bits += HuffmanCode(ix, xr_sign, 0 , region1, gi->table_select[0]);
967 if(region2 > region1)
968 bits += HuffmanCode(ix, xr_sign, region1, region2, gi->table_select[1]);
970 if(bigvals > region2)
971 bits += HuffmanCode(ix, xr_sign, region2, bigvals, gi->table_select[2]);
974 bits += HuffmanCod1(ix, xr_sign, bigvals, count1, gi->table_select[3]);
976 if((stuffBits = gi->part2_3_length - bits) > 0)
978 int stuffWords = stuffBits >> 5;
979 int remainBits = stuffBits & 31;
982 putbits( ~0, remainBits );
984 while( stuffWords-- )
985 putbits( ~0, 32 ); /* Huffman code tables leed to padding ones */
989 int HuffmanCod1( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int tbl)
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]
999 for(i=begin; i<end; i+=4)
1005 p = (v << 3) + (w << 2) + (x << 1) + y;
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;
1027 d = (ht_count[tbl][0][p] << l) + s;
1028 l = ht_count[tbl][1][p];
1033 /* flush remaining bits */
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)
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]
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;
1057 for(i=begin; i<end; i+=2)
1062 if(x > 14) { xl = x - 15; x = 15; }
1063 if(y > 14) { yl = y - 15; y = 15; }
1066 code = hffcode[idx];
1073 code = (code << linbits) | xl;
1077 code = (code << 1) | sign_x;
1085 if(bit + linbits + 1 > 32)
1087 putlong( code, bit );
1092 code = (code << linbits) | yl;
1096 code = (code << 1) | sign_y;
1100 putlong( code, bit );
1105 { /* No ESC-words */
1106 const struct huffcodetab *h = &ht[table];
1108 for(i=begin; i<end; i+=2)
1113 idx = x * h->len + y;
1114 code = h->table[idx];
1115 bit = h->hlen [idx];
1119 code = (code << 1) | sign_x;
1125 code = (code << 1) | sign_y;
1129 putlong( code, bit );
1134 /* flush remaining bits */
1140 void putbits(uint32_t val, uint32_t nbit)
1142 int new_bitpos = CodedData.bitpos + nbit;
1143 int ptrpos = CodedData.bitpos >> 5;
1145 val = val & (0xffffffff >> (32 - nbit));
1147 /* data fit in one uint32_t */
1148 if(((new_bitpos - 1) >> 5) == ptrpos)
1149 CodedData.bbuf[ptrpos] |= val << ((32 - new_bitpos) & 31);
1152 CodedData.bbuf[ptrpos ] |= val >> ((new_bitpos - 32) & 31);
1153 CodedData.bbuf[ptrpos+1] |= val << ((32 - new_bitpos) & 31);
1156 CodedData.bitpos = new_bitpos;
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 )
1169 int max, table0, table1;
1171 for(i=begin,max=0; i<end; i++)
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 */
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);
1187 case 5: return 7 + find_best_3(ix, begin, end, tab789, 6, bits);
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;
1195 /* tables with linbits */
1198 for(table0=0; table0<8; table0++)
1199 if(ht_big[table0].linmax >= max)
1202 for(table1=8; table1<16; table1++)
1203 if(ht_big[table1].linmax >= max)
1206 return 16 + count_bigv(ix, begin, end, table0, table1, bits);
1210 int find_best_2(short *ix, uint32_t start, uint32_t end, const uint32_t *table,
1211 uint32_t len, int *bits)
1213 uint32_t i, sum = 0;
1215 for(i=start; i<end; i+=2)
1216 sum += table[ix[i] * len + ix[i+1]];
1218 if((sum & 0xffff) <= (sum >> 16))
1220 *bits = (sum & 0xffff);
1230 int find_best_3(short *ix, uint32_t start, uint32_t end, const uint32_t *table,
1231 uint32_t len, int *bits)
1233 uint32_t i, j, sum = 0;
1238 /* avoid overflow in packed additions: 78*13 < 1024 */
1239 for(i=start; i<end; )
1241 j = i + 2*78 > end ? end : i + 2*78;
1243 for(sum=0; i<j; i+=2)
1244 sum += table[ix[i] * len + ix[i+1]];
1246 sum1 += (sum >> 20);
1247 sum2 += (sum >> 10) & 0x3ff;
1248 sum3 += (sum >> 0) & 0x3ff;
1252 if(sum1 > sum2) { sum1 = sum2; i = 1; }
1253 if(sum1 > sum3) { sum1 = sum3; i = 2; }
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 )
1265 uint32_t i, sum = 0;
1267 for(i=start; i<end; i+=2)
1268 sum += t1l[4 + ix[i] * 2 + ix[i+1]];
1272 return 1; /* this is table1 */
1275 int count_bigv(short *ix, uint32_t start, uint32_t end, int table0,
1276 int table1, int *bits )
1278 uint32_t i, sum0, sum1, sum=0, bigv=0, x, y;
1280 /* ESC-table is used */
1281 for(i=start; i<end; i+=2)
1286 if(x > 14) { x = 15; bigv++; }
1287 if(y > 14) { y = 15; bigv++; }
1289 sum += tab1624[x * 16 + y];
1292 sum0 = (sum >> 16) + bigv * ht_big[table0].linbits;
1293 sum1 = (sum & 0xffff) + bigv * ht_big[table1].linbits;
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 )
1315 for(i=SAMPL2; i-=2; )
1316 if(*(uint32_t*)&ix[i-2]) /* !!!! short *ix; !!!!! */
1328 if((v | w | x | y) <= 1)
1330 p = (y<<3) + (x<<2) + (w<<1) + (v);
1341 if((sum >> 16) < (sum & 0xffff))
1343 si->table_select[3] = 0;
1348 si->table_select[3] = 1;
1349 return sum & 0xffff;
1354 /*************************************************************************/
1355 /* Function: Quantization of the vector xr ( -> ix) */
1356 /*************************************************************************/
1357 static int quantize_int(int *xr, short *ix, side_info_t *si)
1359 unsigned int i, idx, s, frac_pow[] = { 0x10000, 0xd745, 0xb505, 0x9838 };
1361 s = frac_pow[si->quantStep & 3] >> si->quantStep / 4;
1363 /* check for possible 'out of range' values */
1364 if(((si->max_val + 256) >> 8) * s >= (65536 << 8))
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];
1373 { /* check each index wether it fits the table */
1374 for(i=SAMPL2; i--; )
1376 idx = (xr[i] * s + 0x08000) >> 16;
1378 if(idx > 4095) ix[i] = int2idx[(idx + 8) >> 4] << 3;
1379 else ix[i] = int2idx[idx];
1386 /*************************************************************************/
1387 /* subdivides the bigvalue region which will use separate Huffman tables */
1388 /*************************************************************************/
1389 static void subdivide(side_info_t *si)
1391 int scfb, count0, count1;
1394 { /* no bigvalue region */
1401 /* Calculate scale factor band index */
1402 for(scfb=0; scalefac[scfb] < si->address3; )
1405 count0 = subdv_table[scfb].region0_cnt;
1406 count1 = subdv_table[scfb].region1_cnt;
1408 si->region_0_1 = (count0 << 3) | count1;
1409 si->address1 = scalefac[count0 + 1];
1410 si->address2 = scalefac[count0 + 1 + count1 + 1];
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)
1419 int b1=0, b2=0, b3=0;
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;
1426 if( gi->address1 > 0 ) /* region0 */
1427 gi->table_select[0] = choose_table(ix, 0 , gi->address1, &b1);
1429 if( gi->address2 > gi->address1 ) /* region1 */
1430 gi->table_select[1] = choose_table(ix, gi->address1, gi->address2, &b2);
1432 if( gi->address3 > gi->address2 ) /* region2 */
1433 gi->table_select[2] = choose_table(ix, gi->address2, gi->address3, &b3);
1438 static int quantize_and_count_bits(int *xr, short *ix, side_info_t *si)
1442 if(quantize_int(xr, ix, si))
1444 bits = calc_runlen(ix, si); /* rzero,count1,address3 */
1445 subdivide(si); /* bigvalues sfb division */
1446 bits += bigv_bitcount(ix,si); /* bit count */
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)
1459 while((bits=quantize_and_count_bits(xr, enc_data, si)) < max_bits-64)
1461 if(si->quantStep == 0)
1464 if(si->quantStep <= 2)
1470 while(bits > max_bits)
1473 bits = quantize_and_count_bits(xr, enc_data, si);
1479 static void iteration_loop(int *xr, side_info_t *si, int gr_cnt)
1481 int remain, tar_bits, max_bits = cfg.mean_bits;
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;
1488 si->part2_3_length = inner_loop(xr, tar_bits, si);
1489 si->global_gain = si->quantStep + 142 - si->additStep;
1491 /* unused bits of the reservoir can be used for remaining granules */
1492 cfg.ResvSize += max_bits - si->part2_3_length;
1494 /* end: distribute the reserved bits to one or two granules */
1497 si->part2_3_length += cfg.ResvSize;
1498 /* mp3 format allows max 12bits for granule length */
1499 if(si->part2_3_length > 4092)
1501 remain = (si->part2_3_length - 4092 + 31) >> 5;
1502 si->part2_3_length -= remain << 5;
1503 si[-1].part2_3_length += remain << 5;
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])
1515 short *wp, *x1, *x2;
1520 for(k=0; k<18; k++, wk+=64, sb0+=SBLIMIT, sb1+=SBLIMIT)
1526 for(i=-15; i<0; i++)
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"
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"
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");
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];
1622 "move.l ( -32*4,%[x1]), %%d4\n" /* d4 = x1[-32] */
1623 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
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"
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"
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");
1692 sb0[31] = v + t0; /* A0 */
1693 sb0[30] = u + s0; /* A1 */
1694 sb0[15] = u - s0; /* A2 */
1695 sb0[14] = v - t0; /* A3 */
1702 sb1[31] = v + t1; /* A0 */
1703 sb1[30] = u + s1; /* A1 */
1704 sb1[15] = u - s1; /* A2 */
1705 sb1[14] = v - t1; /* A3 */
1710 for(ch=0; ch<cfg.channels; ch++)
1713 for(k=0; k<18; k++, wk+=64, a+=SBLIMIT)
1719 /* x1[-572] .... x1[448] = 1022 */
1721 for(i=-15; i<0; i++)
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];
1740 a[30+i*2] = shft4(t) + shft13(s) * wp[24];
1741 a[31+i*2] = shft13(t) * wp[25] - shft13(s) * wp[26];
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];
1761 a[31] = v + t; /* A0 */
1762 a[30] = u + s; /* A1 */
1763 a[15] = u - s; /* A2 */
1764 a[14] = v - t; /* A3 */
1766 wk -= 18 * 64 - 1; /* rewind wk (to next channel start) */
1771 static void window_subband2(short *x1, int a[SBLIMIT])
1774 short *wp = enwindow;
1775 short *x2 = x1 - 124;
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];
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;
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];
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];
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;
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;
1827 xr = a[27]; a[27] = a[6] - xr; a[6] += xr;
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];
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;
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;
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;
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;
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;
1888 static void mdct_long(int *out, int *in)
1891 int tc1, tc2, tc3, tc4, ts5, ts6, ts7, ts8;
1892 int ts1, ts2, ts3, ts4, tc5, tc6, tc7, tc8;
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];
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];
1909 tc2 = (in[16] - in[10]) * cx[6];
1910 ts6 = ts6 * cx[7] + in[4] * cx[8];
1912 ct = tc1 * cx[0] + tc2 + tc3 * cx[1] + tc4 * cx[2];
1913 st = -ts5 * cx[4] + ts6 - ts7 * cx[5] + ts8 * cx[3];
1917 ct = tc1 * cx[1] - tc2 - tc3 * cx[2] + tc4 * cx[0];
1918 st = -ts5 * cx[5] + ts6 - ts7 * cx[3] + ts8 * cx[4];
1922 ct = tc1 * cx[2] - tc2 + tc3 * cx[0] - tc4 * cx[1];
1923 st = ts5 * cx[3] - ts6 + ts7 * cx[4] - ts8 * cx[5];
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];
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];
1941 ts2 = (in[7] - in[1]) * cx[6];
1942 tc6 = in[13] * cx[8] - tc6 * cx[7];
1944 ct = tc5 * cx[3] - tc6 + tc7 * cx[4] + tc8 * cx[5];
1945 st = ts1 * cx[2] + ts2 + ts3 * cx[0] + ts4 * cx[1];
1949 ct =-tc5 * cx[5] + tc6 - tc7 * cx[3] - tc8 * cx[4];
1950 st = ts1 * cx[1] + ts2 - ts3 * cx[2] - ts4 * cx[0];
1954 ct =-tc5 * cx[4] + tc6 - tc7 * cx[5] - tc8 * cx[3];
1955 st = ts1 * cx[0] - ts2 + ts3 * cx[1] - ts4 * cx[2];
1960 static int find_bitrate_index(int type, int bitrate /*, bool stereo */)
1965 if(bitrate == bitr_index[type][i])
1970 static int find_samplerate_index(unsigned long freq, int *mp3_type)
1972 int mpeg = freq >= (32000+24000)/2 ? 1 : 0;
1974 unsigned long dmin = ULONG_MAX;
1977 for (i = 0; i < 3; i++)
1981 if (sampr_index[mpeg][i] == freq)
1987 if ((long)sampr_index[mpeg][i] < (long)freq)
1988 diff = freq - sampr_index[mpeg][i];
1990 diff = sampr_index[mpeg][i] - freq;
2003 static bool init_mp3_encoder_engine(int sample_rate, int num_channels, int bitrate)
2005 const bool stereo = num_channels > 1;
2006 uint32_t avg_byte_per_frame;
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];
2016 if (cfg.mpg.type == 1)
2019 pcm_chunk_size = PCM_CHUNK_SIZE1;
2020 samp_per_frame = SAMP_PER_FRAME1;
2025 pcm_chunk_size = PCM_CHUNK_SIZE2;
2026 samp_per_frame = SAMP_PER_FRAME2;
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 ));
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;
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;
2104 cfg.sideinfo_len = 32 + (cfg.mpg.type ? (cfg.channels == 1 ? 136 : 256)
2105 : (cfg.channels == 1 ? 72 : 136));
2110 static inline void to_mono(uint32_t **samp)
2112 int32_t lr = **samp;
2113 int32_t m = (int16_t)lr + (lr >> 16) + err;
2116 *(*samp)++ = (m << 16) | (uint16_t)m;
2119 static void to_mono_mm(void)
2121 /* |llllllllllllllll|rrrrrrrrrrrrrrrr| =>
2122 * |mmmmmmmmmmmmmmmm|mmmmmmmmmmmmmmmm|
2124 uint32_t *samp = (uint32_t *)&mfbuf[2*512];
2125 uint32_t *samp_end = samp + samp_per_frame;
2138 while (samp < samp_end);
2141 #ifdef ROCKBOX_LITTLE_ENDIAN
2143 /* Swaps a frame to big endian */
2144 static inline void byte_swap_frame32(uint32_t *dst, uint32_t *src,
2147 assert(dst); assert(src);
2148 uint32_t *src_end = SKIPBYTES(src, size);
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++;
2162 while(src < src_end);
2163 } /* byte_swap_frame32 */
2164 #endif /* ROCKBOX_LITTLE_ENDIAN */
2166 static void set_scale_facs(int *mdct_freq)
2168 unsigned int i, is, ie, k, s;
2169 int max_freq_val, avrg_freq_val;
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;
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++)
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];
2187 if((max_freq_val<<s) > avrg_freq_val)
2190 band_scale_f[k] = (unsigned char)s;
2192 for(i=is; s && i<ie; i++)
2199 static void encode_frame(char *buffer, struct enc_chunk_hdr *chunk)
2203 /* encode one mp3 frame in this loop */
2204 CodedData.bitpos = 0;
2205 memset(CodedData.bbuf, 0, sizeof(CodedData.bbuf));
2207 if((cfg.slot_lag += cfg.frac_per_frame) >= 64)
2208 { /* Padding for this frame */
2210 cfg.mpg.padding = 1;
2213 cfg.mpg.padding = 0;
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
2219 /* shift out old samples */
2220 memcpy(mfbuf, mfbuf + 2*cfg.granules*576, 4*512);
2222 if (chunk->flags & CHUNKF_START_FILE)
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;
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;
2238 if (cfg.channels == 1)
2242 gr_cnt = cfg.granules * cfg.channels;
2243 CodedData.bitpos = cfg.sideinfo_len; /* leave space for mp3 header */
2245 for(gr=0; gr<cfg.granules; gr++)
2247 short *wk = mfbuf + 2*286 + gr*1152;
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]);
2253 for(ch=0; ch<cfg.channels; ch++)
2257 wk = mfbuf + 2*286 + gr*1152 + ch;
2259 /* 36864=4*18*16*32 */
2260 for(k=0; k<18; k++, wk+=64)
2262 window_subband2(wk, sb_data[ch][1-gr][k]);
2263 /* Compensate for inversion in the analysis filter */
2267 for(band=1; band<32; band+=2)
2268 sb_data[ch][1-gr][k][band] *= -1;
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++)
2277 int *mdct = mdct_freq;
2280 cfg.cod_info[gr][ch].additStep = 4 * (14 - shift);
2282 for(band=0; band<cfg.mpg.num_bands; band++, mdct+=18)
2284 int *band0 = sb_data[ch][ gr][0] + order[band];
2285 int *band1 = sb_data[ch][1-gr][0] + order[band];
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);
2296 work[k+ 9] = shft16(a * win[k+ 9][0] +
2301 work[k+18] = shft16(c * win[k+18][0] +
2308 mdct_long(mdct, work);
2310 /* Perform aliasing reduction butterfly */
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];
2327 for(k=0; k<576; k++)
2329 if(mdct_freq[k] < 0)
2331 mdct_sign[k] = 1; /* negative */
2332 mdct_freq[k] = shft13(-mdct_freq[k]);
2336 mdct_sign[k] = 0; /* positive */
2337 mdct_freq[k] = shft13(mdct_freq[k]);
2340 if(max < (uint32_t)mdct_freq[k])
2341 max = (uint32_t)mdct_freq[k];
2343 cfg.cod_info[gr][ch].max_val = max;
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;
2351 cfg.cod_info[gr][ch].quantStep +=
2352 cfg.cod_info[gr][ch].additStep;
2354 set_scale_facs(mdct_freq);
2356 /* bit and noise allocation */
2357 iteration_loop(mdct_freq, &cfg.cod_info[gr][ch],
2360 /* write the frame to the bitstream */
2361 Huffmancodebits(enc_data, mdct_sign,
2362 &cfg.cod_info[gr][ch]);
2364 cfg.cod_info[gr][ch].quantStep -=
2365 cfg.cod_info[gr][ch].additStep;
2367 if(cfg.granules == 1)
2369 memcpy(sb_data[ch][0], sb_data[ch][1],
2370 sizeof(sb_data[ch][0]));
2374 chunk->enc_size = cfg.byte_per_frame + cfg.mpg.padding;
2376 /* finish this chunk by adding sideinfo header data */
2377 CodedData.bitpos = 0;
2378 encodeSideInfo( cfg.cod_info );
2380 #ifdef ROCKBOX_BIG_ENDIAN
2381 /* copy chunk to enc_buffer */
2382 memcpy(chunk->enc_data, CodedData.bbuf, chunk->enc_size);
2384 /* swap frame to big endian */
2385 byte_swap_frame32((uint32_t *)chunk->enc_data, CodedData.bbuf, chunk->enc_size);
2387 } /* encode_frame */