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