fix FS#7619 - hopefully... - have to stop/start scrolling to change bitrate
[Rockbox.git] / apps / plugins / mp3_encoder.c
blob85ef5c1805a479c6fe74d0ff48e80cb1133e9359
1 /* Shine is an MP3 encoder
2 * Copyright (C) 1999-2000 Gabriel Bouvigne
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details. */
14 #include "plugin.h"
16 PLUGIN_HEADER
17 PLUGIN_IRAM_DECLARE
19 static struct plugin_api* rb;
21 MEM_FUNCTION_WRAPPERS(rb);
23 #define SAMP_PER_FRAME 1152
24 #define SAMPL2 576
25 #define SBLIMIT 32
26 #define HTN 16
27 #define putlong(c, s) if(s+sz <= 32) { cc = (cc << s) | c; sz+= s; } \
28 else { putbits(cc, sz); cc = c; sz = s; }
30 enum e_byte_order { order_unknown, order_bigEndian, order_littleEndian };
32 typedef unsigned long uint32;
33 typedef unsigned short uint16;
34 typedef unsigned char uint8;
37 typedef struct {
38 int type; /* 0=(22.05,24,16kHz) 1=(44.1,48,32kHz) */
39 int mode; /* 0=stereo, 1=jstereo, 2=dual, 3=mono */
40 int bitrate;
41 int padding;
42 int num_bands;
43 long bitr_id;
44 int smpl_id;
45 } mpeg_t;
47 /* Side information */
48 typedef struct {
49 uint32 part2_3_length;
50 int count1; /* number of 0-1-quadruples */
51 uint32 global_gain;
52 uint32 table_select[4];
53 uint32 region_0_1;
54 uint32 address1;
55 uint32 address2;
56 uint32 address3;
57 long quantStep;
58 long additStep;
59 long max_val;
60 } side_info_t;
62 typedef struct {
63 enum e_byte_order byte_order;
64 side_info_t cod_info[2][2];
65 mpeg_t mpg;
66 long frac_per_frame;
67 long byte_per_frame;
68 long slot_lag;
69 int sideinfo_len;
70 int mean_bits;
71 int ResvSize;
72 int channels;
73 int granules;
74 int resample;
75 long samplerate;
76 } config_t;
78 typedef struct {
79 int bitpos; /* current bitpos for writing */
80 uint32 bbuf[263];
81 } BF_Data;
83 struct huffcodetab {
84 int len; /* max. index */
85 const uint8 *table; /* pointer to array[len][len] */
86 const uint8 *hlen; /* pointer to array[len][len] */
89 struct huffcodebig {
90 int len; /* max. index */
91 int linbits; /* number of linbits */
92 int linmax; /* max number stored in linbits */
95 #define shft4(x) ((x + 8) >> 4)
96 #define shft9(x) ((x + 256) >> 9)
97 #define shft13(x) ((x + 4096) >> 13)
98 #define shft15(x) ((x + 16384) >> 15)
99 #define shft16(x) ((x + 32768) >> 16)
100 #define shft_n(x,n) ((x) >> n)
101 #define SQRT 724 /* sqrt(2) * 512 */
103 short mfbuf [2*(1152+512)] IBSS_ATTR; /* 3328 Bytes */
104 int sb_data [2][2][18][SBLIMIT] IBSS_ATTR; /* 13824 Bytes */
105 int mdct_freq [SAMPL2] IBSS_ATTR; /* 9216 Bytes */
106 short enc_data [SAMPL2] IBSS_ATTR; /* 4608 Bytes */
107 uint32 scalefac [23] IBSS_ATTR; /* 92 Bytes */
108 BF_Data CodedData IBSS_ATTR; /* 1056 Bytes */
109 int ca [8] IBSS_ATTR; /* 32 Bytes */
110 int cs [8] IBSS_ATTR; /* 32 Bytes */
111 int cx [9] IBSS_ATTR; /* 36 Bytes */
112 int win [18][4] IBSS_ATTR; /* 288 Bytes */
113 short enwindow [15*27+24] IBSS_ATTR; /* 862 Bytes */
114 short int2idx [4096] IBSS_ATTR; /* 8192 Bytes */
115 uint8 ht_count [2][2][16] IBSS_ATTR; /* 64 Bytes */
116 uint32 tab01 [ 16] IBSS_ATTR; /* 64 Bytes */
117 uint32 tab23 [ 9] IBSS_ATTR; /* 36 Bytes */
118 uint32 tab56 [ 16] IBSS_ATTR; /* 64 Bytes */
119 uint32 tab1315 [256] IBSS_ATTR; /* 1024 Bytes */
120 uint32 tab1624 [256] IBSS_ATTR; /* 1024 Bytes */
121 uint32 tab789 [ 36] IBSS_ATTR; /* 144 Bytes */
122 uint32 tabABC [ 64] IBSS_ATTR; /* 256 Bytes */
123 uint8 t1HB [ 4] IBSS_ATTR;
124 uint8 t2HB [ 9] IBSS_ATTR;
125 uint8 t3HB [ 9] IBSS_ATTR;
126 uint8 t5HB [ 16] IBSS_ATTR;
127 uint8 t6HB [ 16] IBSS_ATTR;
128 uint8 t7HB [ 36] IBSS_ATTR;
129 uint8 t8HB [ 36] IBSS_ATTR;
130 uint8 t9HB [ 36] IBSS_ATTR;
131 uint8 t10HB [ 64] IBSS_ATTR;
132 uint8 t11HB [ 64] IBSS_ATTR;
133 uint8 t12HB [ 64] IBSS_ATTR;
134 uint8 t13HB [256] IBSS_ATTR;
135 uint8 t15HB [256] IBSS_ATTR;
136 uint16 t16HB [256] IBSS_ATTR;
137 uint16 t24HB [256] IBSS_ATTR;
138 uint8 t1l [ 8] IBSS_ATTR;
139 uint8 t2l [ 9] IBSS_ATTR;
140 uint8 t3l [ 9] IBSS_ATTR;
141 uint8 t5l [ 16] IBSS_ATTR;
142 uint8 t6l [ 16] IBSS_ATTR;
143 uint8 t7l [ 36] IBSS_ATTR;
144 uint8 t8l [ 36] IBSS_ATTR;
145 uint8 t9l [ 36] IBSS_ATTR;
146 uint8 t10l [ 64] IBSS_ATTR;
147 uint8 t11l [ 64] IBSS_ATTR;
148 uint8 t12l [ 64] IBSS_ATTR;
149 uint8 t13l [256] IBSS_ATTR;
150 uint8 t15l [256] IBSS_ATTR;
151 uint8 t16l [256] IBSS_ATTR;
152 uint8 t24l [256] IBSS_ATTR;
153 struct huffcodetab ht [HTN] IBSS_ATTR;
155 static const uint8 ht_count_const[2][2][16] =
156 { { { 1, 5, 4, 5, 6, 5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1 }, /* table0 */
157 { 1, 5, 5, 7, 5, 8, 7, 9, 5, 7, 7, 9, 7, 9, 9,10 } }, /* hleng0 */
158 { {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, /* table1 */
159 { 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 } } }; /* hleng1 */
161 static const uint8 t1HB_const[4] = {1,1,1,0};
162 static const uint8 t2HB_const[9] = {1,2,1,3,1,1,3,2,0};
163 static const uint8 t3HB_const[9] = {3,2,1,1,1,1,3,2,0};
164 static const uint8 t5HB_const[16] = {1,2,6,5,3,1,4,4,7,5,7,1,6,1,1,0};
165 static const uint8 t6HB_const[16] = {7,3,5,1,6,2,3,2,5,4,4,1,3,3,2,0};
167 static const uint8 t7HB_const[36] =
168 { 1, 2,10,19,16,10, 3, 3, 7,10, 5, 3,11, 4,13,17, 8, 4,
169 12,11,18,15,11, 2, 7, 6, 9,14, 3, 1, 6, 4, 5, 3, 2, 0 };
171 static const uint8 t8HB_const[36] =
172 { 3, 4, 6,18,12, 5, 5, 1, 2,16, 9, 3, 7, 3, 5,14, 7, 3,
173 19,17,15,13,10, 4,13, 5, 8,11, 5, 1,12, 4, 4, 1, 1, 0 };
175 static const uint8 t9HB_const[36] =
176 { 7, 5, 9,14,15, 7, 6, 4, 5, 5, 6, 7, 7, 6, 8, 8, 8, 5,
177 15, 6, 9,10, 5, 1,11, 7, 9, 6, 4, 1,14, 4, 6, 2, 6, 0 };
179 static const uint8 t10HB_const[64] =
180 {1,2,10,23,35,30,12,17,3,3,8,12,18,21,12,7,11,9,15,21,32,
181 40,19,6,14,13,22,34,46,23,18,7,20,19,33,47,27,22,9,3,31,22,
182 41,26,21,20,5,3,14,13,10,11,16,6,5,1,9,8,7,8,4,4,2,0 };
184 static const uint8 t11HB_const[64] =
185 {3,4,10,24,34,33,21,15,5,3,4,10,32,17,11,10,11,7,13,18,30,
186 31,20,5,25,11,19,59,27,18,12,5,35,33,31,58,30,16,7,5,28,26,
187 32,19,17,15,8,14,14,12,9,13,14,9,4,1,11,4,6,6,6,3,2,0 };
189 static const uint8 t12HB_const[64] =
190 {9,6,16,33,41,39,38,26,7,5,6,9,23,16,26,11,17,7,11,14,21,
191 30,10,7,17,10,15,12,18,28,14,5,32,13,22,19,18,16,9,5,40,17,
192 31,29,17,13,4,2,27,12,11,15,10,7,4,1,27,12,8,12,6,3,1,0 };
194 static const uint8 t13HB_const[256] =
195 {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,
196 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,
197 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,
198 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,
199 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,
200 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,
201 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,
202 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,
203 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,
204 10,6,1,4,2,16,15,17,27,25,20,29,11,17,12,16,8,1,1,0,1 };
206 static const uint8 t15HB_const[256] =
207 {7,12,18,53,47,76,124,108,89,123,108,119,107,81,122,63,13,5,16,27,46,36,61,51,
208 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,
209 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,
210 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,
211 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,
212 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,
213 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,
214 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,
215 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,
216 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};
218 static const uint16 t16HB_const[256] =
219 {1,5,14,44,74,63,110,93,172,149,138,242,225,195,376,17,3,4,12,20,35,62,53,47,
220 83,75,68,119,201,107,207,9,15,13,23,38,67,58,103,90,161,72,127,117,110,209,
221 206,16,45,21,39,69,64,114,99,87,158,140,252,212,199,387,365,26,75,36,68,65,
222 115,101,179,164,155,264,246,226,395,382,362,9,66,30,59,56,102,185,173,265,142,
223 253,232,400,388,378,445,16,111,54,52,100,184,178,160,133,257,244,228,217,385,
224 366,715,10,98,48,91,88,165,157,148,261,248,407,397,372,380,889,884,8,85,84,81,
225 159,156,143,260,249,427,401,392,383,727,713,708,7,154,76,73,141,131,256,245,
226 426,406,394,384,735,359,710,352,11,139,129,67,125,247,233,229,219,393,743,737,
227 720,885,882,439,4,243,120,118,115,227,223,396,746,742,736,721,712,706,223,436,
228 6,202,224,222,218,216,389,386,381,364,888,443,707,440,437,1728,4,747,211,210,
229 208,370,379,734,723,714,1735,883,877,876,3459,865,2,377,369,102,187,726,722,
230 358,711,709,866,1734,871,3458,870,434,0,12,10,7,11,10,17,11,9,13,12,10,7,5,3,
231 1,3};
233 static const uint16 t24HB_const[256] =
234 {15,13,46,80,146,262,248,434,426,669,653,649,621,517,1032,88,14,12,21,38,71,
235 130,122,216,209,198,327,345,319,297,279,42,47,22,41,74,68,128,120,221,207,194,
236 182,340,315,295,541,18,81,39,75,70,134,125,116,220,204,190,178,325,311,293,
237 271,16,147,72,69,135,127,118,112,210,200,188,352,323,306,285,540,14,263,66,
238 129,126,119,114,214,202,192,180,341,317,301,281,262,12,249,123,121,117,113,
239 215,206,195,185,347,330,308,291,272,520,10,435,115,111,109,211,203,196,187,
240 353,332,313,298,283,531,381,17,427,212,208,205,201,193,186,177,169,320,303,
241 286,268,514,377,16,335,199,197,191,189,181,174,333,321,305,289,275,521,379,
242 371,11,668,184,183,179,175,344,331,314,304,290,277,530,383,373,366,10,652,346,
243 171,168,164,318,309,299,287,276,263,513,375,368,362,6,648,322,316,312,307,302,
244 292,284,269,261,512,376,370,364,359,4,620,300,296,294,288,282,273,266,515,380,
245 374,369,365,361,357,2,1033,280,278,274,267,264,259,382,378,372,367,363,360,
246 358,356,0,43,20,19,17,15,13,11,9,7,6,4,7,5,3,1,3};
248 static const uint32 tab1315_const[256] =
249 { 0x010003,0x050005,0x070006,0x080008,0x090008,0x0a0009,0x0a000a,0x0b000a,
250 0x0a000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0d000c,0x0e000d,0x0e000e,
251 0x040005,0x060005,0x080007,0x090008,0x0a0009,0x0a0009,0x0b000a,0x0b000a,
252 0x0b000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0e000c,0x0e000d,0x0e000d,
253 0x070006,0x080007,0x090007,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,
254 0x0b000a,0x0c000b,0x0c000b,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d,
255 0x080007,0x090008,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0c000b,
256 0x0c000b,0x0d000b,0x0d000c,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d,
257 0x090008,0x090008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0d000b,0x0d000b,
258 0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000d,
259 0x0a0009,0x0a0009,0x0b0009,0x0c000a,0x0c000a,0x0c000a,0x0d000b,0x0d000b,
260 0x0d000b,0x0d000b,0x0e000c,0x0d000c,0x0f000d,0x0f000d,0x10000d,0x10000e,
261 0x0a000a,0x0b0009,0x0c000a,0x0c000a,0x0d000a,0x0d000b,0x0d000b,0x0d000b,
262 0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x10000e,
263 0x0b000a,0x0b000a,0x0c000a,0x0d000b,0x0d000b,0x0d000b,0x0e000b,0x0e000c,
264 0x0e000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x12000d,0x12000e,
265 0x0a000a,0x0a000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0e000c,
266 0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x11000e,0x11000e,
267 0x0b000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0d000c,0x0f000c,
268 0x0e000c,0x0f000d,0x0f000d,0x10000d,0x10000d,0x10000e,0x12000e,0x11000e,
269 0x0b000b,0x0c000b,0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000c,
270 0x0e000c,0x0f000d,0x10000d,0x0f000d,0x10000d,0x11000e,0x12000f,0x13000e,
271 0x0c000b,0x0c000b,0x0c000b,0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0e000c,
272 0x0f000d,0x0f000d,0x0f000d,0x10000d,0x11000e,0x11000e,0x11000e,0x12000f,
273 0x0c000c,0x0d000c,0x0d000b,0x0e000c,0x0e000c,0x0f000c,0x0e000d,0x0f000d,
274 0x10000d,0x10000d,0x11000d,0x11000d,0x11000e,0x12000e,0x12000f,0x12000f,
275 0x0d000c,0x0d000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x10000d,
276 0x10000d,0x10000e,0x10000e,0x11000e,0x12000e,0x11000e,0x12000f,0x12000f,
277 0x0e000d,0x0e000d,0x0e000d,0x0f000d,0x0f000d,0x0f000d,0x11000d,0x10000d,
278 0x10000e,0x13000e,0x11000e,0x11000e,0x11000f,0x13000f,0x12000e,0x12000f,
279 0x0d000d,0x0e000d,0x0f000d,0x10000d,0x10000d,0x10000d,0x11000d,0x10000e,
280 0x11000e,0x11000e,0x12000e,0x12000e,0x15000f,0x14000f,0x15000f,0x12000f };
282 static const uint32 tab01_const[16] =
283 { 0x10004,0x50005,0x50005,0x70006,0x50005,0x80006,0x70006,0x90007,
284 0x50005,0x70006,0x70006,0x90007,0x70006,0x90007,0x90007,0xa0008 };
286 static const uint32 tab23_const[ 9] =
287 { 0x10002,0x40003,0x70007,0x40004,0x50004,0x70007,0x60006,0x70007,0x80008 };
289 static const uint32 tab56_const[16] =
290 { 0x10003,0x40004,0x70006,0x80008,0x40004,0x50004,0x80006,0x90007,
291 0x70005,0x80006,0x90007,0xa0008,0x80007,0x80007,0x90008,0xa0009 };
293 static const uint32 tab789_const[36] =
294 {0x00100803,0x00401004,0x00701c06,0x00902407,0x00902409,0x00a0280a,0x00401004,
295 0x00601005,0x00801806,0x00902807,0x00902808,0x00a0280a,0x00701c05,0x00701806,
296 0x00902007,0x00a02808,0x00a02809,0x00b02c0a,0x00802407,0x00902807,0x00a02808,
297 0x00b02c09,0x00b02c09,0x00b0300a,0x00802408,0x00902408,0x00a02809,0x00b02c09,
298 0x00b0300a,0x00c0300b,0x00902809,0x00a02809,0x00b02c0a,0x00c02c0a,0x00c0340b,
299 0x00c0340b};
301 static const uint32 tabABC_const[64] =
302 {0x00100804,0x00401004,0x00701806,0x00902008,0x00a02409,0x00a0280a,0x00a0240a,
303 0x00b0280a,0x00401004,0x00601405,0x00801806,0x00902007,0x00a02809,0x00b02809,
304 0x00a0240a,0x00a0280a,0x00701806,0x00801c06,0x00902007,0x00a02408,0x00b02809,
305 0x00c02c0a,0x00b02809,0x00b0280a,0x00802007,0x00902007,0x00a02408,0x00b02c08,
306 0x00c02809,0x00c0300a,0x00b0280a,0x00c02c0a,0x00902408,0x00a02808,0x00b02809,
307 0x00c02c09,0x00c02c0a,0x00c0300a,0x00c02c0a,0x00c0300b,0x00a02409,0x00b02809,
308 0x00c02c0a,0x00c0300a,0x00d0300a,0x00d0340b,0x00c0300a,0x00d0340b,0x00902409,
309 0x00a02409,0x00b02409,0x00c0280a,0x00c02c0a,0x00c0300b,0x00d0300b,0x00d0300c,
310 0x00a0240a,0x00a0240a,0x00b0280a,0x00c02c0b,0x00c0300b,0x00d0300b,0x00d0300b,
311 0x00d0300c};
313 static const uint32 tab1624_const[256] =
314 {0x00010004,0x00050005,0x00070007,0x00090008,0x000a0009,0x000a000a,0x000b000a,
315 0x000b000b,0x000c000b,0x000c000c,0x000c000c,0x000d000c,0x000d000c,0x000d000c,
316 0x000e000d,0x000a000a,0x00040005,0x00060006,0x00080007,0x00090008,0x000a0009,
317 0x000b000a,0x000b000a,0x000b000b,0x000c000b,0x000c000b,0x000c000c,0x000d000c,
318 0x000e000c,0x000d000c,0x000e000c,0x000a000a,0x00070007,0x00080007,0x00090008,
319 0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000b,0x000d000b,0x000c000b,
320 0x000d000b,0x000d000c,0x000d000c,0x000e000c,0x000e000d,0x000b0009,0x00090008,
321 0x00090008,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a,0x000c000b,
322 0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c,0x000f000c,
323 0x000c0009,0x000a0009,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a,
324 0x000d000a,0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c,
325 0x000f000c,0x000f000d,0x000b0009,0x000a000a,0x000a0009,0x000b000a,0x000b000a,
326 0x000c000a,0x000d000a,0x000d000b,0x000e000b,0x000d000b,0x000e000b,0x000e000c,
327 0x000f000c,0x000f000c,0x000f000c,0x0010000c,0x000c0009,0x000b000a,0x000b000a,
328 0x000b000a,0x000c000a,0x000d000a,0x000d000b,0x000d000b,0x000d000b,0x000e000b,
329 0x000e000c,0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000d,0x000c0009,
330 0x000b000b,0x000b000a,0x000c000a,0x000c000a,0x000d000b,0x000d000b,0x000d000b,
331 0x000e000b,0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000d,
332 0x0011000d,0x000c000a,0x000b000b,0x000c000b,0x000c000b,0x000d000b,0x000d000b,
333 0x000d000b,0x000e000b,0x000e000b,0x000f000b,0x000f000c,0x000f000c,0x000f000c,
334 0x0010000c,0x0010000d,0x0010000d,0x000c000a,0x000c000b,0x000c000b,0x000c000b,
335 0x000d000b,0x000d000b,0x000e000b,0x000e000b,0x000f000c,0x000f000c,0x000f000c,
336 0x000f000c,0x0010000c,0x000f000d,0x0010000d,0x000f000d,0x000d000a,0x000c000c,
337 0x000d000b,0x000c000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000e000c,
338 0x000f000c,0x0010000c,0x0010000c,0x0010000d,0x0011000d,0x0011000d,0x0010000d,
339 0x000c000a,0x000d000c,0x000d000c,0x000d000b,0x000d000b,0x000e000b,0x000e000c,
340 0x000f000c,0x0010000c,0x0010000c,0x0010000c,0x0010000c,0x0010000d,0x0010000d,
341 0x000f000d,0x0010000d,0x000d000a,0x000d000c,0x000e000c,0x000e000c,0x000e000c,
342 0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000c,0x0010000d,
343 0x0010000d,0x0010000d,0x0010000d,0x0012000d,0x000d000a,0x000f000c,0x000e000c,
344 0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000c,0x0010000c,0x0010000d,
345 0x0012000d,0x0011000d,0x0011000d,0x0011000d,0x0013000d,0x0011000d,0x000d000a,
346 0x000e000d,0x000f000c,0x000d000c,0x000e000c,0x0010000c,0x0010000c,0x000f000c,
347 0x0010000d,0x0010000d,0x0011000d,0x0012000d,0x0011000d,0x0013000d,0x0011000d,
348 0x0010000d,0x000d000a,0x000a0009,0x000a0009,0x000a0009,0x000b0009,0x000b0009,
349 0x000c0009,0x000c0009,0x000c0009,0x000d0009,0x000d0009,0x000d0009,0x000d000a,
350 0x000d000a,0x000d000a,0x000d000a,0x000a0006};
352 static const uint8 t1l_const[8] = {1,3,2,3,1,4,3,5};
353 static const uint8 t2l_const[9] = {1,3,6,3,3,5,5,5,6};
354 static const uint8 t3l_const[9] = {2,2,6,3,2,5,5,5,6};
355 static const uint8 t5l_const[16] = {1,3,6,7,3,3,6,7,6,6,7,8,7,6,7,8};
356 static const uint8 t6l_const[16] = {3,3,5,7,3,2,4,5,4,4,5,6,6,5,6,7};
358 static const uint8 t7l_const[36] =
359 {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};
361 static const uint8 t8l_const[36] =
362 {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};
364 static const uint8 t9l_const[36] =
365 {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};
367 static const uint8 t10l_const[64] =
368 {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,
369 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};
371 static const uint8 t11l_const[64] =
372 {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,
373 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};
375 static const uint8 t12l_const[64] =
376 {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,
377 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};
379 static const uint8 t13l_const[256] =
380 {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,
381 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,
382 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,
383 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,
384 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,
385 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,
386 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,
387 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,
388 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,
389 15,15,16,16,19,18,19,16};
391 static const uint8 t15l_const[256] =
392 {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,
393 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,
394 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,
395 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,
396 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,
397 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,
398 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,
399 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,
400 13,12,11,11,11,11,11,11,12,12,12,12,12,13,13,13,13};
402 static const uint8 t16l_const[256] =
403 {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,
404 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,
405 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,
406 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,
407 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,
408 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,
409 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,
410 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,
411 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,
412 11,11,11,11,11,11,11,8};
414 static const uint8 t24l_const[256] =
415 {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,
416 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,
417 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,
418 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,
419 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,
420 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,
421 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,
422 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,
423 7,7,7,7,7,7,8,8,8,8,4};
425 static const struct huffcodetab ht_const[HTN] =
426 { { 0, NULL, NULL}, /* Apparently not used */
427 { 2, t1HB, t1l},
428 { 3, t2HB, t2l},
429 { 3, t3HB, t3l},
430 { 0, NULL, NULL}, /* Apparently not used */
431 { 4, t5HB, t5l},
432 { 4, t6HB, t6l},
433 { 6, t7HB, t7l},
434 { 6, t8HB, t8l},
435 { 6, t9HB, t9l},
436 { 8, t10HB, t10l},
437 { 8, t11HB, t11l},
438 { 8, t12HB, t12l},
439 {16, t13HB, t13l},
440 { 0, NULL, NULL}, /* Apparently not used */
441 {16, t15HB, t15l} };
443 static const struct huffcodebig ht_big[HTN] =
444 { { 16, 1, 1 },
445 { 16, 2, 3 },
446 { 16, 3, 7 },
447 { 16, 4, 15 },
448 { 16, 6, 63 },
449 { 16, 8, 255 },
450 { 16, 10, 1023 },
451 { 16, 13, 8191 },
452 { 16, 4, 15 },
453 { 16, 5, 31 },
454 { 16, 6, 63 },
455 { 16, 7, 127 },
456 { 16, 8, 255 },
457 { 16, 9, 511 },
458 { 16, 11, 2047 },
459 { 16, 13, 8191 } };
461 static const struct
463 uint32 region0_cnt;
464 uint32 region1_cnt;
465 } subdv_table[23] =
466 { {0, 0}, /* 0 bands */
467 {0, 0}, /* 1 bands */
468 {0, 0}, /* 2 bands */
469 {0, 0}, /* 3 bands */
470 {0, 0}, /* 4 bands */
471 {0, 1}, /* 5 bands */
472 {1, 1}, /* 6 bands */
473 {1, 1}, /* 7 bands */
474 {1, 2}, /* 8 bands */
475 {2, 2}, /* 9 bands */
476 {2, 3}, /* 10 bands */
477 {2, 3}, /* 11 bands */
478 {3, 4}, /* 12 bands */
479 {3, 4}, /* 13 bands */
480 {3, 4}, /* 14 bands */
481 {4, 5}, /* 15 bands */
482 {4, 5}, /* 16 bands */
483 {4, 6}, /* 17 bands */
484 {5, 6}, /* 18 bands */
485 {5, 6}, /* 19 bands */
486 {5, 7}, /* 20 bands */
487 {6, 7}, /* 21 bands */
488 {6, 7}, /* 22 bands */
491 static const uint32 sfBand[6][23] =
493 /* Table B.2.b: 22.05 kHz */
494 {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
495 /* Table B.2.c: 24 kHz */
496 {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576},
497 /* Table B.2.a: 16 kHz */
498 {0,6,12,18,24,30,36,44,45,66,80,96,116,140,168,200,238,248,336,396,464,522,576},
499 /* Table B.8.b: 44.1 kHz */
500 {0,4, 8,12,16,20,24,30,36,44,52,62, 74, 90,110,134,162,196,238,288,342,418,576},
501 /* Table B.8.c: 48 kHz */
502 {0,4, 8,12,16,20,24,30,36,42,50,60, 72, 88,106,128,156,190,230,276,330,384,576},
503 /* Table B.8.a: 32 kHz */
504 {0,4, 8,12,16,20,24,30,36,44,54,66, 82,102,126,156,194,240,296,364,448,550,576} };
507 static const short int2idx_const[4096] = /* int2idx[i] = sqrt(i*sqrt(i)); */
509 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9,
510 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16,
511 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21,
512 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26,
513 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
514 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36,
515 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40,
516 41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45,
517 45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49,
518 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53,
519 53, 53, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 57, 57, 57,
520 57, 57, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 61, 61,
521 61, 61, 61, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 65,
522 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68,
523 68, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 72, 72, 72,
524 72, 72, 72, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75,
525 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 79, 79, 79,
526 79, 79, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82,
527 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 86, 86, 86,
528 86, 86, 86, 87, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89,
529 89, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 93,
530 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 96, 96, 96,
531 96, 96, 96, 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99,
532 99, 99,100,100,100,100,100,100,101,101,101,101,101,101,102,102,102,102,102,102,
533 103,103,103,103,103,103,104,104,104,104,104,104,104,105,105,105,105,105,105,106,
534 106,106,106,106,106,107,107,107,107,107,107,107,108,108,108,108,108,108,109,109,
535 109,109,109,109,110,110,110,110,110,110,110,111,111,111,111,111,111,112,112,112,
536 112,112,112,112,113,113,113,113,113,113,114,114,114,114,114,114,115,115,115,115,
537 115,115,115,116,116,116,116,116,116,117,117,117,117,117,117,117,118,118,118,118,
538 118,118,118,119,119,119,119,119,119,120,120,120,120,120,120,120,121,121,121,121,
539 121,121,122,122,122,122,122,122,122,123,123,123,123,123,123,123,124,124,124,124,
540 124,124,125,125,125,125,125,125,125,126,126,126,126,126,126,126,127,127,127,127,
541 127,127,128,128,128,128,128,128,128,129,129,129,129,129,129,129,130,130,130,130,
542 130,130,131,131,131,131,131,131,131,132,132,132,132,132,132,132,133,133,133,133,
543 133,133,133,134,134,134,134,134,134,134,135,135,135,135,135,135,136,136,136,136,
544 136,136,136,137,137,137,137,137,137,137,138,138,138,138,138,138,138,139,139,139,
545 139,139,139,139,140,140,140,140,140,140,140,141,141,141,141,141,141,141,142,142,
546 142,142,142,142,142,143,143,143,143,143,143,143,144,144,144,144,144,144,144,145,
547 145,145,145,145,145,145,146,146,146,146,146,146,146,147,147,147,147,147,147,147,
548 148,148,148,148,148,148,148,149,149,149,149,149,149,149,150,150,150,150,150,150,
549 150,151,151,151,151,151,151,151,152,152,152,152,152,152,152,153,153,153,153,153,
550 153,153,154,154,154,154,154,154,154,154,155,155,155,155,155,155,155,156,156,156,
551 156,156,156,156,157,157,157,157,157,157,157,158,158,158,158,158,158,158,159,159,
552 159,159,159,159,159,160,160,160,160,160,160,160,160,161,161,161,161,161,161,161,
553 162,162,162,162,162,162,162,163,163,163,163,163,163,163,163,164,164,164,164,164,
554 164,164,165,165,165,165,165,165,165,166,166,166,166,166,166,166,167,167,167,167,
555 167,167,167,167,168,168,168,168,168,168,168,169,169,169,169,169,169,169,169,170,
556 170,170,170,170,170,170,171,171,171,171,171,171,171,172,172,172,172,172,172,172,
557 172,173,173,173,173,173,173,173,174,174,174,174,174,174,174,174,175,175,175,175,
558 175,175,175,176,176,176,176,176,176,176,176,177,177,177,177,177,177,177,178,178,
559 178,178,178,178,178,178,179,179,179,179,179,179,179,180,180,180,180,180,180,180,
560 180,181,181,181,181,181,181,181,182,182,182,182,182,182,182,182,183,183,183,183,
561 183,183,183,184,184,184,184,184,184,184,184,185,185,185,185,185,185,185,186,186,
562 186,186,186,186,186,186,187,187,187,187,187,187,187,187,188,188,188,188,188,188,
563 188,189,189,189,189,189,189,189,189,190,190,190,190,190,190,190,190,191,191,191,
564 191,191,191,191,192,192,192,192,192,192,192,192,193,193,193,193,193,193,193,193,
565 194,194,194,194,194,194,194,195,195,195,195,195,195,195,195,196,196,196,196,196,
566 196,196,196,197,197,197,197,197,197,197,197,198,198,198,198,198,198,198,199,199,
567 199,199,199,199,199,199,200,200,200,200,200,200,200,200,201,201,201,201,201,201,
568 201,201,202,202,202,202,202,202,202,202,203,203,203,203,203,203,203,204,204,204,
569 204,204,204,204,204,205,205,205,205,205,205,205,205,206,206,206,206,206,206,206,
570 206,207,207,207,207,207,207,207,207,208,208,208,208,208,208,208,208,209,209,209,
571 209,209,209,209,209,210,210,210,210,210,210,210,210,211,211,211,211,211,211,211,
572 211,212,212,212,212,212,212,212,212,213,213,213,213,213,213,213,213,214,214,214,
573 214,214,214,214,214,215,215,215,215,215,215,215,215,216,216,216,216,216,216,216,
574 216,217,217,217,217,217,217,217,217,218,218,218,218,218,218,218,218,219,219,219,
575 219,219,219,219,219,220,220,220,220,220,220,220,220,221,221,221,221,221,221,221,
576 221,222,222,222,222,222,222,222,222,223,223,223,223,223,223,223,223,224,224,224,
577 224,224,224,224,224,225,225,225,225,225,225,225,225,226,226,226,226,226,226,226,
578 226,227,227,227,227,227,227,227,227,228,228,228,228,228,228,228,228,229,229,229,
579 229,229,229,229,229,229,230,230,230,230,230,230,230,230,231,231,231,231,231,231,
580 231,231,232,232,232,232,232,232,232,232,233,233,233,233,233,233,233,233,234,234,
581 234,234,234,234,234,234,234,235,235,235,235,235,235,235,235,236,236,236,236,236,
582 236,236,236,237,237,237,237,237,237,237,237,238,238,238,238,238,238,238,238,238,
583 239,239,239,239,239,239,239,239,240,240,240,240,240,240,240,240,241,241,241,241,
584 241,241,241,241,242,242,242,242,242,242,242,242,242,243,243,243,243,243,243,243,
585 243,244,244,244,244,244,244,244,244,245,245,245,245,245,245,245,245,245,246,246,
586 246,246,246,246,246,246,247,247,247,247,247,247,247,247,248,248,248,248,248,248,
587 248,248,248,249,249,249,249,249,249,249,249,250,250,250,250,250,250,250,250,250,
588 251,251,251,251,251,251,251,251,252,252,252,252,252,252,252,252,253,253,253,253,
589 253,253,253,253,253,254,254,254,254,254,254,254,254,255,255,255,255,255,255,255,
590 255,255,256,256,256,256,256,256,256,256,257,257,257,257,257,257,257,257,257,258,
591 258,258,258,258,258,258,258,259,259,259,259,259,259,259,259,259,260,260,260,260,
592 260,260,260,260,261,261,261,261,261,261,261,261,261,262,262,262,262,262,262,262,
593 262,263,263,263,263,263,263,263,263,263,264,264,264,264,264,264,264,264,265,265,
594 265,265,265,265,265,265,265,266,266,266,266,266,266,266,266,267,267,267,267,267,
595 267,267,267,267,268,268,268,268,268,268,268,268,268,269,269,269,269,269,269,269,
596 269,270,270,270,270,270,270,270,270,270,271,271,271,271,271,271,271,271,271,272,
597 272,272,272,272,272,272,272,273,273,273,273,273,273,273,273,273,274,274,274,274,
598 274,274,274,274,275,275,275,275,275,275,275,275,275,276,276,276,276,276,276,276,
599 276,276,277,277,277,277,277,277,277,277,277,278,278,278,278,278,278,278,278,279,
600 279,279,279,279,279,279,279,279,280,280,280,280,280,280,280,280,280,281,281,281,
601 281,281,281,281,281,282,282,282,282,282,282,282,282,282,283,283,283,283,283,283,
602 283,283,283,284,284,284,284,284,284,284,284,284,285,285,285,285,285,285,285,285,
603 286,286,286,286,286,286,286,286,286,287,287,287,287,287,287,287,287,287,288,288,
604 288,288,288,288,288,288,288,289,289,289,289,289,289,289,289,289,290,290,290,290,
605 290,290,290,290,291,291,291,291,291,291,291,291,291,292,292,292,292,292,292,292,
606 292,292,293,293,293,293,293,293,293,293,293,294,294,294,294,294,294,294,294,294,
607 295,295,295,295,295,295,295,295,295,296,296,296,296,296,296,296,296,296,297,297,
608 297,297,297,297,297,297,297,298,298,298,298,298,298,298,298,299,299,299,299,299,
609 299,299,299,299,300,300,300,300,300,300,300,300,300,301,301,301,301,301,301,301,
610 301,301,302,302,302,302,302,302,302,302,302,303,303,303,303,303,303,303,303,303,
611 304,304,304,304,304,304,304,304,304,305,305,305,305,305,305,305,305,305,306,306,
612 306,306,306,306,306,306,306,307,307,307,307,307,307,307,307,307,308,308,308,308,
613 308,308,308,308,308,309,309,309,309,309,309,309,309,309,310,310,310,310,310,310,
614 310,310,310,311,311,311,311,311,311,311,311,311,312,312,312,312,312,312,312,312,
615 312,313,313,313,313,313,313,313,313,313,314,314,314,314,314,314,314,314,314,315,
616 315,315,315,315,315,315,315,315,316,316,316,316,316,316,316,316,316,317,317,317,
617 317,317,317,317,317,317,318,318,318,318,318,318,318,318,318,318,319,319,319,319,
618 319,319,319,319,319,320,320,320,320,320,320,320,320,320,321,321,321,321,321,321,
619 321,321,321,322,322,322,322,322,322,322,322,322,323,323,323,323,323,323,323,323,
620 323,324,324,324,324,324,324,324,324,324,325,325,325,325,325,325,325,325,325,325,
621 326,326,326,326,326,326,326,326,326,327,327,327,327,327,327,327,327,327,328,328,
622 328,328,328,328,328,328,328,329,329,329,329,329,329,329,329,329,330,330,330,330,
623 330,330,330,330,330,330,331,331,331,331,331,331,331,331,331,332,332,332,332,332,
624 332,332,332,332,333,333,333,333,333,333,333,333,333,334,334,334,334,334,334,334,
625 334,334,335,335,335,335,335,335,335,335,335,335,336,336,336,336,336,336,336,336,
626 336,337,337,337,337,337,337,337,337,337,338,338,338,338,338,338,338,338,338,338,
627 339,339,339,339,339,339,339,339,339,340,340,340,340,340,340,340,340,340,341,341,
628 341,341,341,341,341,341,341,341,342,342,342,342,342,342,342,342,342,343,343,343,
629 343,343,343,343,343,343,344,344,344,344,344,344,344,344,344,344,345,345,345,345,
630 345,345,345,345,345,346,346,346,346,346,346,346,346,346,347,347,347,347,347,347,
631 347,347,347,347,348,348,348,348,348,348,348,348,348,349,349,349,349,349,349,349,
632 349,349,350,350,350,350,350,350,350,350,350,350,351,351,351,351,351,351,351,351,
633 351,352,352,352,352,352,352,352,352,352,352,353,353,353,353,353,353,353,353,353,
634 354,354,354,354,354,354,354,354,354,355,355,355,355,355,355,355,355,355,355,356,
635 356,356,356,356,356,356,356,356,357,357,357,357,357,357,357,357,357,357,358,358,
636 358,358,358,358,358,358,358,359,359,359,359,359,359,359,359,359,359,360,360,360,
637 360,360,360,360,360,360,361,361,361,361,361,361,361,361,361,361,362,362,362,362,
638 362,362,362,362,362,363,363,363,363,363,363,363,363,363,363,364,364,364,364,364,
639 364,364,364,364,365,365,365,365,365,365,365,365,365,365,366,366,366,366,366,366,
640 366,366,366,367,367,367,367,367,367,367,367,367,367,368,368,368,368,368,368,368,
641 368,368,369,369,369,369,369,369,369,369,369,369,370,370,370,370,370,370,370,370,
642 370,370,371,371,371,371,371,371,371,371,371,372,372,372,372,372,372,372,372,372,
643 372,373,373,373,373,373,373,373,373,373,374,374,374,374,374,374,374,374,374,374,
644 375,375,375,375,375,375,375,375,375,375,376,376,376,376,376,376,376,376,376,377,
645 377,377,377,377,377,377,377,377,377,378,378,378,378,378,378,378,378,378,379,379,
646 379,379,379,379,379,379,379,379,380,380,380,380,380,380,380,380,380,380,381,381,
647 381,381,381,381,381,381,381,382,382,382,382,382,382,382,382,382,382,383,383,383,
648 383,383,383,383,383,383,383,384,384,384,384,384,384,384,384,384,385,385,385,385,
649 385,385,385,385,385,385,386,386,386,386,386,386,386,386,386,386,387,387,387,387,
650 387,387,387,387,387,387,388,388,388,388,388,388,388,388,388,389,389,389,389,389,
651 389,389,389,389,389,390,390,390,390,390,390,390,390,390,390,391,391,391,391,391,
652 391,391,391,391,391,392,392,392,392,392,392,392,392,392,393,393,393,393,393,393,
653 393,393,393,393,394,394,394,394,394,394,394,394,394,394,395,395,395,395,395,395,
654 395,395,395,395,396,396,396,396,396,396,396,396,396,397,397,397,397,397,397,397,
655 397,397,397,398,398,398,398,398,398,398,398,398,398,399,399,399,399,399,399,399,
656 399,399,399,400,400,400,400,400,400,400,400,400,400,401,401,401,401,401,401,401,
657 401,401,402,402,402,402,402,402,402,402,402,402,403,403,403,403,403,403,403,403,
658 403,403,404,404,404,404,404,404,404,404,404,404,405,405,405,405,405,405,405,405,
659 405,405,406,406,406,406,406,406,406,406,406,406,407,407,407,407,407,407,407,407,
660 407,407,408,408,408,408,408,408,408,408,408,408,409,409,409,409,409,409,409,409,
661 409,410,410,410,410,410,410,410,410,410,410,411,411,411,411,411,411,411,411,411,
662 411,412,412,412,412,412,412,412,412,412,412,413,413,413,413,413,413,413,413,413,
663 413,414,414,414,414,414,414,414,414,414,414,415,415,415,415,415,415,415,415,415,
664 415,416,416,416,416,416,416,416,416,416,416,417,417,417,417,417,417,417,417,417,
665 417,418,418,418,418,418,418,418,418,418,418,419,419,419,419,419,419,419,419,419,
666 419,420,420,420,420,420,420,420,420,420,420,421,421,421,421,421,421,421,421,421,
667 421,422,422,422,422,422,422,422,422,422,422,423,423,423,423,423,423,423,423,423,
668 423,424,424,424,424,424,424,424,424,424,424,425,425,425,425,425,425,425,425,425,
669 425,426,426,426,426,426,426,426,426,426,426,427,427,427,427,427,427,427,427,427,
670 427,428,428,428,428,428,428,428,428,428,428,429,429,429,429,429,429,429,429,429,
671 429,430,430,430,430,430,430,430,430,430,430,431,431,431,431,431,431,431,431,431,
672 431,432,432,432,432,432,432,432,432,432,432,433,433,433,433,433,433,433,433,433,
673 433,434,434,434,434,434,434,434,434,434,434,435,435,435,435,435,435,435,435,435,
674 435,435,436,436,436,436,436,436,436,436,436,436,437,437,437,437,437,437,437,437,
675 437,437,438,438,438,438,438,438,438,438,438,438,439,439,439,439,439,439,439,439,
676 439,439,440,440,440,440,440,440,440,440,440,440,441,441,441,441,441,441,441,441,
677 441,441,442,442,442,442,442,442,442,442,442,442,443,443,443,443,443,443,443,443,
678 443,443,443,444,444,444,444,444,444,444,444,444,444,445,445,445,445,445,445,445,
679 445,445,445,446,446,446,446,446,446,446,446,446,446,447,447,447,447,447,447,447,
680 447,447,447,448,448,448,448,448,448,448,448,448,448,448,449,449,449,449,449,449,
681 449,449,449,449,450,450,450,450,450,450,450,450,450,450,451,451,451,451,451,451,
682 451,451,451,451,452,452,452,452,452,452,452,452,452,452,453,453,453,453,453,453,
683 453,453,453,453,453,454,454,454,454,454,454,454,454,454,454,455,455,455,455,455,
684 455,455,455,455,455,456,456,456,456,456,456,456,456,456,456,457,457,457,457,457,
685 457,457,457,457,457,457,458,458,458,458,458,458,458,458,458,458,459,459,459,459,
686 459,459,459,459,459,459,460,460,460,460,460,460,460,460,460,460,460,461,461,461,
687 461,461,461,461,461,461,461,462,462,462,462,462,462,462,462,462,462,463,463,463,
688 463,463,463,463,463,463,463,463,464,464,464,464,464,464,464,464,464,464,465,465,
689 465,465,465,465,465,465,465,465,466,466,466,466,466,466,466,466,466,466,466,467,
690 467,467,467,467,467,467,467,467,467,468,468,468,468,468,468,468,468,468,468,469,
691 469,469,469,469,469,469,469,469,469,469,470,470,470,470,470,470,470,470,470,470,
692 471,471,471,471,471,471,471,471,471,471,472,472,472,472,472,472,472,472,472,472,
693 472,473,473,473,473,473,473,473,473,473,473,474,474,474,474,474,474,474,474,474,
694 474,475,475,475,475,475,475,475,475,475,475,475,476,476,476,476,476,476,476,476,
695 476,476,477,477,477,477,477,477,477,477,477,477,477,478,478,478,478,478,478,478,
696 478,478,478,479,479,479,479,479,479,479,479,479,479,479,480,480,480,480,480,480,
697 480,480,480,480,481,481,481,481,481,481,481,481,481,481,482,482,482,482,482,482,
698 482,482,482,482,482,483,483,483,483,483,483,483,483,483,483,484,484,484,484,484,
699 484,484,484,484,484,484,485,485,485,485,485,485,485,485,485,485,486,486,486,486,
700 486,486,486,486,486,486,486,487,487,487,487,487,487,487,487,487,487,488,488,488,
701 488,488,488,488,488,488,488,488,489,489,489,489,489,489,489,489,489,489,490,490,
702 490,490,490,490,490,490,490,490,490,491,491,491,491,491,491,491,491,491,491,492,
703 492,492,492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493,493,493,
704 494,494,494,494,494,494,494,494,494,494,494,495,495,495,495,495,495,495,495,495,
705 495,496,496,496,496,496,496,496,496,496,496,496,497,497,497,497,497,497,497,497,
706 497,497,497,498,498,498,498,498,498,498,498,498,498,499,499,499,499,499,499,499,
707 499,499,499,499,500,500,500,500,500,500,500,500,500,500,501,501,501,501,501,501,
708 501,501,501,501,501,502,502,502,502,502,502,502,502,502,502,503,503,503,503,503,
709 503,503,503,503,503,503,504,504,504,504,504,504,504,504,504,504,504,505,505,505,
710 505,505,505,505,505,505,505,506,506,506,506,506,506,506,506,506,506,506,507,507,
711 507,507,507,507,507,507,507,507,507,508,508,508,508,508,508,508,508,508,508,509,
712 509,509,509,509,509,509,509,509,509,509,510,510,510,510,510,510,510,510,510,510,
713 510,511,511,511,511,511,511,511,511,511,511,512,512,512,512,512 };
715 static const int order[32] =
716 { 0, 1, 16, 17, 8, 9, 24, 25, 4, 5, 20, 21, 12, 13, 28, 29,
717 2, 3, 18, 19,10,11, 26, 27, 6, 7, 22, 23, 14, 15, 30, 31 };
719 static const int bitr_index[2][15] =
720 { {0, 8,16,24,32,40,48,56, 64, 80, 96,112,128,144,160},
721 {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320} };
723 static const int num_bands[3][15] =
724 { {0,10,10,10,10,12,14,16, 20, 22, 24, 26, 28, 30, 32},
725 {0,10,10,10,10,10,12,14, 18, 24, 26, 28, 30, 32, 32},
726 {0,10,12,14,18,24,26,28, 30, 32, 32, 32, 32, 32, 32} };
728 static const int cx_const[9] =
729 { 16135, 10531, 5604, 15396, -2845,-12551, 14189, 8192, 16384 };
731 static const int ca_const[8] =
732 {-16859,-15458,-10269, -5961, -3099, -1342, -465, -121 };
734 static const int cs_const[8] =
735 { 28098, 28893, 31117, 32221, 32621, 32740, 32765, 32768 };
737 static const short enwindow_const[15*27+24] =
738 { 0, 65, 593, 1766, 22228, 2115, 611, 62,
739 8, 119, 1419, 10564,-11659,-1635,-154, -9,
740 -8, -119,-1419,-10564, 11659, 1635, 154, 9, 464, 100, 91,
741 0, 69, 604, 1635, 23148, 2363, 643, 62,
742 7, 107, 1368, 10449,-12733,-1818,-180,-11,
743 -7, -107,-1368,-10449, 12733, 1818, 180, 11, 420, 200, 164,
744 0, 72, 608, 1465, 23979, 2600, 671, 63,
745 7, 94, 1305, 10265,-13818,-2004,-207,-12,
746 -7, -94,-1305,-10265, 13818, 2004, 207, 12, 380, 297, 220,
747 0, 76, 606, 1256, 24718, 2825, 693, 63,
748 6, 81, 1232, 10016,-14908,-2192,-236,-14,
749 -6, -81,-1232,-10016, 14908, 2192, 236, 14, 342, 392, 262,
750 0, 78, 597, 1007, 25359, 3033, 712, 63,
751 6, 68, 1150, 9706,-15995,-2380,-267,-15,
752 -6, -68,-1150, -9706, 15995, 2380, 267, 15, 307, 483, 289,
753 0, 80, 580, 719, 25901, 3224, 726, 62,
754 6, 54, 1060, 9343,-17072,-2565,-299,-17,
755 -6, -54,-1060, -9343, 17072, 2565, 299, 17, 274, 569, 304,
756 -1, 82, 555, 391, 26339, 3395, 735, 61,
757 5, 40, 963, 8930,-18131,-2747,-332,-19,
758 -5, -40, -963, -8930, 18131, 2747, 332, 19, 242, 650, 307,
759 -1, 83, 523, 26, 26672, 3545, 740, 60,
760 5, 27, 861, 8474,-19164,-2923,-366,-21,
761 -5, -27, -861, -8474, 19164, 2923, 366, 21, 212, 724, 300,
762 -1, 83, 482, -376, 26900, 3672, 739, 58,
763 4, 14, 756, 7981,-20163,-3092,-401,-24,
764 -4, -14, -756, -7981, 20163, 3092, 401, 24, 183, 792, 283,
765 -1, 82, 433, -812, 27022, 3776, 735, 56,
766 4, 1, 648, 7456,-21122,-3250,-435,-26,
767 -4, -1, -648, -7456, 21122, 3250, 435, 26, 155, 851, 258,
768 -1, 81, 376, -1281, 27038, 3855, 726, 54,
769 3, -11, 539, 6907,-22032,-3397,-470,-28,
770 -3, 11, -539, -6907, 22032, 3397, 470, 28, 128, 903, 226,
771 -1, 78, 312, -1778, 26951, 3910, 713, 52,
772 3, -22, 430, 6338,-22887,-3530,-503,-31,
773 -3, 22, -430, -6338, 22887, 3530, 503, 31, 102, 946, 188,
774 -2, 75, 239, -2302, 26761, 3941, 696, 49,
775 3, -33, 322, 5757,-23678,-3648,-537,-34,
776 -3, 33, -322, -5757, 23678, 3648, 537, 34, 76, 980, 145,
777 -2, 70, 160, -2848, 26472, 3948, 676, 47,
778 3, -42, 217, 5167,-24399,-3749,-568,-36,
779 -3, 42, -217, -5167, 24399, 3749, 568, 36, 50, 1004, 99,
780 -2, 65, 74, -3412, 26087, 3931, 653, 44,
781 2, -51, 115, 4577,-25045,-3830,-599,-39,
782 -2, 51, -115, -4577, 25045, 3830, 599, 39, 25, 1019, 50,
784 25610,3891,627,42,-3990,-18,58,-2,
785 21226,-21226,10604,-10604,1860,-1860,1458,-1458,576,-576,130,-130,60,-60,8,-8
788 static const int win_const[18][4] = {
789 { -3072, -134, -146, 3352 },
790 { -2747, -362, -471, 3579 },
791 { -2387, -529, -831, 3747 },
792 { -2004, -632,-1214, 3850 },
793 { -1609, -666,-1609, 3884 },
794 { -1214, -632,-2004, 3850 },
795 { -831, -529,-2387, 3747 },
796 { -471, -362,-2747, 3579 },
797 { -146, -134,-3072, 3352 },
798 { 134,-3072,-3352, -146 },
799 { 362,-2747,-3579, -471 },
800 { 529,-2387,-3747, -831 },
801 { 632,-2004,-3850,-1214 },
802 { 666,-1609,-3884,-1609 },
803 { 632,-1214,-3850,-2004 },
804 { 529, -831,-3747,-2387 },
805 { 362, -471,-3579,-2747 },
806 { 134, -146,-3352,-3072 } };
809 static char* wav_filename;
810 static int mp3file, wavfile, wav_size, frames;
811 static uint32 enc_buffer[16384]; /* storage for 65536 Bytes */
812 static int enc_chunk = 0; /* encode chunk counter */
813 static int enc_size;
814 static config_t cfg;
816 /* forward declarations */
817 int HuffmanCode( short *ix, int *xr, uint32 begin, uint32 end, int table);
818 int HuffmanCod1( short *ix, int *xr, uint32 begin, uint32 end, int table);
819 void putbits(uint32 val, uint32 nbit);
820 int find_best_2( short *ix, uint32 start, uint32 end, const uint32 *table,
821 uint32 len, int *bits);
822 int find_best_3( short *ix, uint32 start, uint32 end, const uint32 *table,
823 uint32 len, int *bits);
824 int count_bit1 ( short *ix, uint32 start, uint32 end, int *bits );
825 int count_bigv ( short *ix, uint32 start, uint32 end, int table0, int table1,
826 int *bits);
829 bool checkString(int fd, char *string)
831 char temp[4];
833 rb->read(fd, temp, 4);
835 return (*(long*)temp == *(long*)string) ? 1 : 0;
838 int Read16BitsLowHigh(int fd)
840 char first, second;
842 rb->read(fd, &first, 1);
843 rb->read(fd, &second, 1);
845 return ((int)second << 8) | (first & 0xff);
849 int Read32BitsLowHigh(int fd)
851 int first = 0xffff & Read16BitsLowHigh(fd);
852 int second = 0xffff & Read16BitsLowHigh(fd);
854 return (second << 16) + first;
857 int wave_open(void)
859 unsigned short wFormatTag;
860 unsigned long dAvgBytesPerSec;
861 unsigned short wBlockAlign;
862 unsigned short bits_per_samp;
863 long header_size;
865 if((wavfile = rb->open(wav_filename, O_RDONLY)) < 0)
866 return -1;
868 if(!checkString(wavfile,"RIFF")) return -2;
869 Read32BitsLowHigh(wavfile); /* complete wave chunk size */
870 if(!checkString(wavfile,"WAVE")) return -3;
871 if(!checkString(wavfile,"fmt ")) return -4;
873 header_size = Read32BitsLowHigh(wavfile); /* chunk size */
874 wFormatTag = Read16BitsLowHigh(wavfile);
876 cfg.channels = Read16BitsLowHigh(wavfile);
877 cfg.samplerate = Read32BitsLowHigh(wavfile);
878 dAvgBytesPerSec = Read32BitsLowHigh(wavfile);
879 wBlockAlign = Read16BitsLowHigh(wavfile);
880 bits_per_samp = Read16BitsLowHigh(wavfile);
882 if(wFormatTag != 0x0001) return -5;
883 if(bits_per_samp != 16) return -6;
884 if(cfg.channels > 2) return -7;
885 if(!checkString(wavfile,"data")) return -8;
887 header_size = 0x28;
888 wav_size = rb->filesize(wavfile);
889 rb->lseek(wavfile, header_size, SEEK_SET);
891 return 0;
894 int read_samples(uint32 *buffer, int num_samples)
896 int s, samples = rb->read(wavfile, buffer, 4 * num_samples) / 4;
897 /* Pad last sample with zeros */
898 for(s=samples; s<num_samples; s++)
899 buffer[s] = 0;
901 return samples;
904 inline uint32 myswap32(uint32 val)
906 const uint8* v = (const uint8*)&val;
908 return ((uint32)v[0]<<24) | ((uint32)v[1]<<16) | ((uint32)v[2]<<8) | v[3];
911 void encodeSideInfo( side_info_t si[2][2] )
913 int gr, ch, header;
914 uint32 cc=0, sz=0;
916 header = 0xfff00000;
917 header |= cfg.mpg.type << 19; /* mp3 type: 1 */
918 header |= 1 << 17; /* mp3 layer: 1 */
919 header |= 1 << 16; /* mp3 crc: 0 */
920 header |= cfg.mpg.bitr_id << 12;
921 header |= cfg.mpg.smpl_id << 10;
922 header |= cfg.mpg.padding << 9;
923 header |= cfg.mpg.mode << 6;
924 header |= 1 << 2; /* mp3 original: 1 */
925 putbits( header, 32 );
927 if(cfg.mpg.type)
928 { /* MPEG1 */
929 if(cfg.channels == 2) { putlong( 0, 20); }
930 else { putlong( 0, 18); }
932 for(gr=0; gr<cfg.granules; gr++)
933 for(ch=0; ch<cfg.channels; ch++)
935 side_info_t *gi = &si[gr][ch];
937 putlong( gi->part2_3_length, 12 );
938 putlong( gi->address3>>1, 9 );
939 putlong( gi->global_gain, 8 );
940 putlong( gi->table_select[0], 10 );
941 putlong( gi->table_select[1], 5 );
942 putlong( gi->table_select[2], 5 );
943 putlong( gi->region_0_1, 7 );
944 putlong( gi->table_select[3], 3 );
947 else
948 { /* MPEG2 */
949 if(cfg.channels == 2) { putlong( 0, 10); }
950 else { putlong( 0, 9); }
952 for(ch=0; ch<cfg.channels; ch++)
954 side_info_t *gi = &si[0][ch];
956 putlong( gi->part2_3_length, 12);
957 putlong( gi->address3>>1, 9);
958 putlong( gi->global_gain, 8);
959 putlong( gi->table_select[0], 15);
960 putlong( gi->table_select[1], 5);
961 putlong( gi->table_select[2], 5);
962 putlong( gi->region_0_1, 7);
963 putlong( gi->table_select[3], 2);
966 /* flush remaining bits */
967 putbits(cc, sz);
970 /* Note the discussion of huffmancodebits() on pages 28 and 29 of the IS,
971 as well as the definitions of the side information on pages 26 and 27. */
972 void Huffmancodebits( short *ix, int *xr, side_info_t *gi )
974 int region1 = gi->address1;
975 int region2 = gi->address2;
976 int bigvals = gi->address3;
977 int count1 = bigvals + (gi->count1 << 2);
978 int stuffBits = 0;
979 int bits = 0;
981 if(region1 > 0)
982 bits += HuffmanCode(ix, xr, 0 , region1, gi->table_select[0]);
984 if(region2 > region1)
985 bits += HuffmanCode(ix, xr, region1, region2, gi->table_select[1]);
987 if(bigvals > region2)
988 bits += HuffmanCode(ix, xr, region2, bigvals, gi->table_select[2]);
990 if(count1 > bigvals)
991 bits += HuffmanCod1(ix, xr, bigvals, count1, gi->table_select[3]);
993 if((stuffBits = gi->part2_3_length - bits) > 0)
995 int stuffWords = stuffBits >> 5;
996 int remainBits = stuffBits & 31;
998 if( remainBits )
999 putbits( ~0, remainBits );
1001 while( stuffWords-- )
1002 putbits( ~0, 32 ); /* Huffman code tables leed to padding ones */
1006 int HuffmanCod1( short *ix, int *xr, uint32 begin, uint32 end, int tbl)
1008 uint32 cc=0, sz=0;
1009 uint32 i, d, p;
1010 int sumbit=0, s=0, l=0, v, w, x, y;
1011 #define sgnv (xr[i+0] < 0 ? 1 : 0)
1012 #define sgnw (xr[i+1] < 0 ? 1 : 0)
1013 #define sgnx (xr[i+2] < 0 ? 1 : 0)
1014 #define sgny (xr[i+3] < 0 ? 1 : 0)
1016 for(i=begin; i<end; i+=4)
1018 v = ix[i+0];
1019 w = ix[i+1];
1020 x = ix[i+2];
1021 y = ix[i+3];
1022 p = (v << 3) + (w << 2) + (x << 1) + y;
1024 switch(p)
1026 case 0: l=0; s = 0; break;
1027 case 1: l=1; s = sgnv; break;
1028 case 2: l=1; s = sgnw; break;
1029 case 3: l=2; s = (sgnv << 1) + sgnw; break;
1030 case 4: l=1; s = sgnx; break;
1031 case 5: l=2; s = (sgnv << 1) + sgnx; break;
1032 case 6: l=2; s = (sgnw << 1) + sgnx; break;
1033 case 7: l=3; s = (sgnv << 2) + (sgnw << 1) + sgnx; break;
1034 case 8: l=1; s = sgny; break;
1035 case 9: l=2; s = (sgnv << 1) + sgny; break;
1036 case 10: l=2; s = (sgnw << 1) + sgny; break;
1037 case 11: l=3; s = (sgnv << 2) + (sgnw << 1) + sgny; break;
1038 case 12: l=2; s = (sgnx << 1) + sgny; break;
1039 case 13: l=3; s = (sgnv << 2) + (sgnx << 1) + sgny; break;
1040 case 14: l=3; s = (sgnw << 2) + (sgnx << 1) + sgny; break;
1041 case 15: l=4; s = (sgnv << 3) + (sgnw << 2) + (sgnx << 1) + sgny; break;
1044 d = (ht_count[tbl][0][p] << l) + s;
1045 l = ht_count[tbl][1][p];
1046 putlong( d, l );
1047 sumbit += l;
1050 /* flush remaining bits */
1051 putbits(cc, sz);
1053 return sumbit;
1056 /* Implements the pseudocode of page 98 of the IS */
1057 int HuffmanCode( short *ix, int *xr, uint32 begin, uint32 end, int table)
1059 uint32 cc=0, sz=0, code;
1060 uint32 i, xl=0, yl=0, idx;
1061 int x, y, bit, sumbit=0;
1062 #define sign_x (xr[i+0] < 0 ? 1 : 0)
1063 #define sign_y (xr[i+1] < 0 ? 1 : 0)
1065 if(table == 0)
1066 return 0;
1068 if( table > 15 )
1069 { /* ESC-table is used */
1070 uint32 linbits = ht_big[table-16].linbits;
1071 uint16 *hffcode = table < 24 ? t16HB : t24HB;
1072 uint8 *hlen = table < 24 ? t16l : t24l;
1074 for(i=begin; i<end; i+=2)
1076 x = ix[ i ];
1077 y = ix[i+1];
1079 if(x > 14) { xl = x - 15; x = 15; }
1080 if(y > 14) { yl = y - 15; y = 15; }
1082 idx = x * 16 + y;
1083 code = hffcode[idx];
1084 bit = hlen [idx];
1086 if(x)
1088 if(x > 14)
1090 code = (code << linbits) | xl;
1091 bit += linbits;
1094 code = (code << 1) | sign_x;
1095 bit += 1;
1098 if(y)
1100 if(y > 14)
1102 code = (code << linbits) | yl;
1103 bit += linbits;
1106 code = (code << 1) | sign_y;
1107 bit += 1;
1110 putlong( code, bit );
1111 sumbit += bit;
1114 else
1115 { /* No ESC-words */
1116 const struct huffcodetab *h = &ht[table];
1118 for(i=begin; i<end; i+=2)
1120 x = ix[i];
1121 y = ix[i+1];
1123 idx = x * h->len + y;
1124 code = h->table[idx];
1125 bit = h->hlen [idx];
1127 if(x)
1129 code = (code << 1) | sign_x;
1130 bit += 1;
1133 if(y)
1135 code = (code << 1) | sign_y;
1136 bit += 1;
1139 putlong( code, bit );
1140 sumbit += bit;
1144 /* flush remaining bits */
1145 putbits(cc, sz);
1147 return sumbit;
1150 void putbits(uint32 val, uint32 nbit)
1152 int new_bitpos = CodedData.bitpos + nbit;
1153 int ptrpos = CodedData.bitpos >> 5;
1155 val = val & (0xffffffff >> (32 - nbit));
1157 /* data fit in one uint32 */
1158 if(((new_bitpos - 1) >> 5) == ptrpos)
1159 CodedData.bbuf[ptrpos] |= val << ((32 - new_bitpos) & 31);
1160 else
1162 CodedData.bbuf[ptrpos ] |= val >> ((new_bitpos - 32) & 31);
1163 CodedData.bbuf[ptrpos+1] |= val << ((32 - new_bitpos) & 31);
1166 CodedData.bitpos = new_bitpos;
1169 /***************************************************************************/
1170 /* Choose the Huffman table that will encode ix[begin..end] with */
1171 /* the fewest bits. */
1172 /* Note: This code contains knowledge about the sizes and characteristic */
1173 /* of the Huffman tables as defined in the IS (Table B.7), and will not */
1174 /* work with any arbitrary tables. */
1175 /***************************************************************************/
1176 int choose_table( short *ix, uint32 begin, uint32 end, int *bits )
1178 uint32 i;
1179 int max, table0, table1;
1181 for(i=begin,max=0; i<end; i++)
1182 if(ix[i] > max)
1183 max = ix[i];
1185 if(max < 16)
1187 /* tables without linbits */
1188 /* indx: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
1189 /* len: 0, 2, 3, 3, 0, 4, 4, 6, 6, 6, 8, 8, 8, 16, 0, 16 */
1190 switch(max)
1192 case 0: return 0;
1193 case 1: return count_bit1(ix, begin, end, bits);
1194 case 2: return 2 + find_best_2(ix, begin, end, tab23, 3, bits);
1195 case 3: return 5 + find_best_2(ix, begin, end, tab56, 4, bits);
1196 case 4:
1197 case 5: return 7 + find_best_3(ix, begin, end, tab789, 6, bits);
1198 case 6:
1199 case 7: return 10 + find_best_3(ix, begin, end, tabABC, 8, bits);
1200 default: return 13 + find_best_2(ix, begin, end, tab1315, 16, bits) * 2;
1203 else
1205 /* tables with linbits */
1206 max -= 15;
1208 for(table0=0; table0<8; table0++)
1209 if(ht_big[table0].linmax >= max)
1210 break;
1212 for(table1=8; table1<16; table1++)
1213 if(ht_big[table1].linmax >= max)
1214 break;
1216 return 16 + count_bigv(ix, begin, end, table0, table1, bits);
1220 int find_best_2(short *ix, uint32 start, uint32 end, const uint32 *table,
1221 uint32 len, int *bits)
1223 uint32 i, sum = 0;
1225 for(i=start; i<end; i+=2)
1226 sum += table[ix[i] * len + ix[i+1]];
1228 if((sum & 0xffff) <= (sum >> 16))
1230 *bits = (sum & 0xffff);
1231 return 1;
1233 else
1235 *bits = sum >> 16;
1236 return 0;
1240 int find_best_3(short *ix, uint32 start, uint32 end, const uint32 *table,
1241 uint32 len, int *bits)
1243 uint32 i, j, sum = 0;
1244 int sum1 = 0;
1245 int sum2 = 0;
1246 int sum3 = 0;
1248 /* avoid overflow in packed additions: 78*13 < 1024 */
1249 for(i=start; i<end; )
1251 j = i + 2*78 > end ? end : i + 2*78;
1253 for(sum=0; i<j; i+=2)
1254 sum += table[ix[i] * len + ix[i+1]];
1256 sum1 += (sum >> 20);
1257 sum2 += (sum >> 10) & 0x3ff;
1258 sum3 += (sum >> 0) & 0x3ff;
1261 i = 0;
1262 if(sum1 > sum2) { sum1 = sum2; i = 1; }
1263 if(sum1 > sum3) { sum1 = sum3; i = 2; }
1265 *bits = sum1;
1267 return i;
1270 /*************************************************************************/
1271 /* Function: Count the number of bits necessary to code the subregion. */
1272 /*************************************************************************/
1273 int count_bit1(short *ix, uint32 start, uint32 end, int *bits )
1275 uint32 i, sum = 0;
1277 for(i=start; i<end; i+=2)
1278 sum += t1l[4 + ix[i] * 2 + ix[i+1]];
1280 *bits = sum;
1282 return 1; /* this is table1 */
1285 int count_bigv(short *ix, uint32 start, uint32 end, int table0,
1286 int table1, int *bits )
1288 uint32 i, sum0, sum1, sum=0, bigv=0, x, y;
1290 /* ESC-table is used */
1291 for(i=start; i<end; i+=2)
1293 x = ix[i];
1294 y = ix[i+1];
1296 if(x > 14) { x = 15; bigv++; }
1297 if(y > 14) { y = 15; bigv++; }
1299 sum += tab1624[x * 16 + y];
1302 sum0 = (sum >> 16) + bigv * ht_big[table0].linbits;
1303 sum1 = (sum & 0xffff) + bigv * ht_big[table1].linbits;
1305 if(sum0 <= sum1)
1307 *bits = sum0;
1308 return table0;
1310 else
1312 *bits = sum1;
1313 return table1;
1317 /*************************************************************************/
1318 /* Function: Calculation of rzero, count1, address3 */
1319 /* (Partitions ix into big values, quadruples and zeros). */
1320 /*************************************************************************/
1321 int calc_runlen( short *ix, side_info_t *si )
1323 int p, i, sum = 0;
1325 for(i=SAMPL2; i-=2; )
1326 if(*(uint32*)&ix[i-2]) /* !!!! short *ix; !!!!! */
1327 break;
1329 si->count1 = 0;
1331 for( ; i>3; i-=4)
1333 int v = ix[i-1];
1334 int w = ix[i-2];
1335 int x = ix[i-3];
1336 int y = ix[i-4];
1338 if((v | w | x | y) <= 1)
1340 p = (y<<3) + (x<<2) + (w<<1) + (v);
1342 sum += tab01[p];
1344 si->count1++;
1346 else break;
1349 si->address3 = i;
1351 if((sum >> 16) < (sum & 0xffff))
1353 si->table_select[3] = 0;
1354 return sum >> 16;
1356 else
1358 si->table_select[3] = 1;
1359 return sum & 0xffff;
1364 /*************************************************************************/
1365 /* Function: Quantization of the vector xr ( -> ix) */
1366 /*************************************************************************/
1367 int quantize_int(int *xr, short *ix, side_info_t *si)
1369 int i, s, frac_pow[] = { 0x10000, 0xd745, 0xb505, 0x9838 };
1371 s = frac_pow[si->quantStep & 3] >> si->quantStep / 4;
1373 /* check for integer overflow */
1374 if(((si->max_val + 256) >> 8) * s >= (1622 << 8))
1375 return 0;
1377 for(i=SAMPL2; i--; )
1378 ix[i] = int2idx[(abs(xr[i]) * s + 0x8000) >> 16];
1380 return 1;
1383 /*************************************************************************/
1384 /* subdivides the bigvalue region which will use separate Huffman tables */
1385 /*************************************************************************/
1386 void subdivide(side_info_t *si)
1388 int scfb, count0, count1;
1390 if( !si->address3 )
1391 { /* no bigvalue region */
1392 si->region_0_1 = 0;
1393 si->address1 = 0;
1394 si->address2 = 0;
1396 else
1398 /* Calculate scale factor band index */
1399 for(scfb=0; scalefac[scfb] < si->address3; )
1400 scfb++;
1402 count0 = subdv_table[scfb].region0_cnt;
1403 count1 = subdv_table[scfb].region1_cnt;
1405 si->region_0_1 = (count0 << 3) | count1;
1406 si->address1 = scalefac[count0 + 1];
1407 si->address2 = scalefac[count0 + 1 + count1 + 1];
1411 /*******************************************************************/
1412 /* Count the number of bits necessary to code the bigvalues region */
1413 /*******************************************************************/
1414 int bigv_bitcount(short *ix, side_info_t *gi)
1416 int b1=0, b2=0, b3=0;
1418 /* Select huffman code tables for bigvalues regions */
1419 gi->table_select[0] = 0;
1420 gi->table_select[1] = 0;
1421 gi->table_select[2] = 0;
1423 if( gi->address1 > 0 ) /* region0 */
1424 gi->table_select[0] = choose_table(ix, 0 , gi->address1, &b1);
1426 if( gi->address2 > gi->address1 ) /* region1 */
1427 gi->table_select[1] = choose_table(ix, gi->address1, gi->address2, &b2);
1429 if( gi->address3 > gi->address2 ) /* region2 */
1430 gi->table_select[2] = choose_table(ix, gi->address2, gi->address3, &b3);
1432 return b1+b2+b3;
1435 int quantize_and_count_bits(int *xr, short *ix, side_info_t *si)
1437 int bits = 10000;
1439 if(quantize_int(xr, ix, si))
1441 bits = calc_runlen(ix, si); /* rzero,count1,address3 */
1442 subdivide(si); /* bigvalues sfb division */
1443 bits += bigv_bitcount(ix,si); /* bit count */
1446 return bits;
1449 /***********************************************************************/
1450 /* The code selects the best quantStep for a particular set of scalefacs */
1451 /***********************************************************************/
1452 int inner_loop(int *xr, int max_bits, side_info_t *si)
1454 int bits;
1456 while((bits=quantize_and_count_bits(xr, enc_data, si)) < max_bits-64)
1458 if(si->quantStep == 0)
1459 break;
1461 if(si->quantStep <= 2)
1462 si->quantStep = 0;
1463 else
1464 si->quantStep -= 2;
1467 while(bits > max_bits)
1469 si->quantStep++;
1470 bits = quantize_and_count_bits(xr, enc_data, si);
1473 return bits;
1476 void iteration_loop(int *xr, side_info_t *si, int gr_cnt)
1478 int remain, tar_bits, max_bits = cfg.mean_bits;
1480 /* distribute reserved bits to remaining granules */
1481 tar_bits = max_bits + (cfg.ResvSize / gr_cnt & ~7);
1482 if(tar_bits > max_bits + max_bits/2)
1483 tar_bits = max_bits + max_bits/2;
1485 si->part2_3_length = inner_loop(xr, tar_bits, si);
1486 si->global_gain = si->quantStep + 142 - si->additStep;
1488 /* unused bits of the reservoir can be used for remaining granules */
1489 cfg.ResvSize += max_bits - si->part2_3_length;
1491 /* end: distribute the reserved bits to one or two granules */
1492 if(gr_cnt == 1)
1494 si->part2_3_length += cfg.ResvSize;
1495 /* mp3 format allows max 12bits for granule length */
1496 if(si->part2_3_length > 4092)
1498 remain = (si->part2_3_length - 4092 + 31) >> 5;
1499 si->part2_3_length -= remain << 5;
1500 si[-1].part2_3_length += remain << 5;
1502 while(remain--)
1503 putbits(~0, 32);
1509 /* returns sum_j=0^31 a[j]*cos(PI*j*(k+1/2)/32), 0<=k<32 */
1510 void window_subband1(short *wk, int sb0[SBLIMIT], int sb1[SBLIMIT]) ICODE_ATTR;
1511 void window_subband1(short *wk, int sb0[SBLIMIT], int sb1[SBLIMIT])
1513 int k, i, u, v;
1514 short *wp, *x1, *x2;
1516 #ifdef CPU_COLDFIRE
1517 int s0, s1, t0, t1;
1519 for(k=0; k<18; k++, wk+=64, sb0+=SBLIMIT, sb1+=SBLIMIT)
1521 wp = enwindow;
1522 x1 = wk;
1523 x2 = x1 - 124;
1525 for(i=-15; i<0; i++)
1527 asm volatile(
1528 "move.l (-224*4,%[x2]), %%d4\n" /* d4 = x2[-224] */
1529 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1530 "mac.w %%d0u, %%d4u, %%acc0\n"
1531 "mac.w %%d0u, %%d4l, (-160*4,%[x2]), %%d4, %%acc1\n"
1532 "mac.w %%d0l, %%d4u, %%acc0\n"
1533 "mac.w %%d0l, %%d4l, ( -96*4,%[x2]), %%d4, %%acc1\n"
1534 "mac.w %%d1u, %%d4u, %%acc0\n"
1535 "mac.w %%d1u, %%d4l, ( -32*4,%[x2]), %%d4, %%acc1\n"
1536 "mac.w %%d1l, %%d4u, %%acc0\n"
1537 "mac.w %%d1l, %%d4l, ( 32*4,%[x2]), %%d4, %%acc1\n"
1538 "mac.w %%d2u, %%d4u, %%acc0\n"
1539 "mac.w %%d2u, %%d4l, ( 96*4,%[x2]), %%d4, %%acc1\n"
1540 "mac.w %%d2l, %%d4u, %%acc0\n"
1541 "mac.w %%d2l, %%d4l, ( 160*4,%[x2]), %%d4, %%acc1\n"
1542 "mac.w %%d3u, %%d4u, %%acc0\n"
1543 "mac.w %%d3u, %%d4l, ( 224*4,%[x2]), %%d4, %%acc1\n"
1544 "mac.w %%d3l, %%d4u, %%acc0\n"
1545 "mac.w %%d3l, %%d4l, (-256*4,%[x1]), %%d4, %%acc1\n"
1546 "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */
1547 "mac.w %%d0u, %%d4u, %%acc0\n"
1548 "mac.w %%d0u, %%d4l, (-192*4,%[x1]), %%d4, %%acc1\n"
1549 "mac.w %%d0l, %%d4u, %%acc0\n"
1550 "mac.w %%d0l, %%d4l, (-128*4,%[x1]), %%d4, %%acc1\n"
1551 "mac.w %%d1u, %%d4u, %%acc0\n"
1552 "mac.w %%d1u, %%d4l, ( -64*4,%[x1]), %%d4, %%acc1\n"
1553 "mac.w %%d1l, %%d4u, %%acc0\n"
1554 "mac.w %%d1l, %%d4l, ( 0*4,%[x1]), %%d4, %%acc1\n"
1555 "mac.w %%d2u, %%d4u, %%acc0\n"
1556 "mac.w %%d2u, %%d4l, ( 64*4,%[x1]), %%d4, %%acc1\n"
1557 "mac.w %%d2l, %%d4u, %%acc0\n"
1558 "mac.w %%d2l, %%d4l, ( 128*4,%[x1]), %%d4, %%acc1\n"
1559 "mac.w %%d3u, %%d4u, %%acc0\n"
1560 "mac.w %%d3u, %%d4l, ( 192*4,%[x1]), %%d4, %%acc1\n"
1561 "mac.w %%d3l, %%d4u, %%acc0\n"
1562 "mac.w %%d3l, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n"
1563 "movclr.l %%acc0, %%d0\n"
1564 "move.l %%d0, %[s0]\n"
1565 "movclr.l %%acc1, %%d0\n"
1566 "move.l %%d0, %[s1]\n"
1568 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1569 "mac.w %%d0u, %%d4u, %%acc0\n"
1570 "mac.w %%d0u, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n"
1571 "mac.w %%d0l, %%d4u, %%acc0\n"
1572 "mac.w %%d0l, %%d4l, ( 96*4,%[x1]), %%d4, %%acc1\n"
1573 "mac.w %%d1u, %%d4u, %%acc0\n"
1574 "mac.w %%d1u, %%d4l, ( 32*4,%[x1]), %%d4, %%acc1\n"
1575 "mac.w %%d1l, %%d4u, %%acc0\n"
1576 "mac.w %%d1l, %%d4l, ( -32*4,%[x1]), %%d4, %%acc1\n"
1577 "mac.w %%d2u, %%d4u, %%acc0\n"
1578 "mac.w %%d2u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n"
1579 "mac.w %%d2l, %%d4u, %%acc0\n"
1580 "mac.w %%d2l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n"
1581 "mac.w %%d3u, %%d4u, %%acc0\n"
1582 "mac.w %%d3u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n"
1583 "mac.w %%d3l, %%d4u, %%acc0\n"
1584 "mac.w %%d3l, %%d4l, ( 256*4,%[x2]), %%d4, %%acc1\n"
1585 "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */
1586 "mac.w %%d0u, %%d4u, %%acc0\n"
1587 "mac.w %%d0u, %%d4l, ( 192*4,%[x2]), %%d4, %%acc1\n"
1588 "mac.w %%d0l, %%d4u, %%acc0\n"
1589 "mac.w %%d0l, %%d4l, ( 128*4,%[x2]), %%d4, %%acc1\n"
1590 "mac.w %%d1u, %%d4u, %%acc0\n"
1591 "mac.w %%d1u, %%d4l, ( 64*4,%[x2]), %%d4, %%acc1\n"
1592 "mac.w %%d1l, %%d4u, %%acc0\n"
1593 "mac.w %%d1l, %%d4l, ( 0*4,%[x2]), %%d4, %%acc1\n"
1594 "mac.w %%d2u, %%d4u, %%acc0\n"
1595 "mac.w %%d2u, %%d4l, ( -64*4,%[x2]), %%d4, %%acc1\n"
1596 "mac.w %%d2l, %%d4u, %%acc0\n"
1597 "mac.w %%d2l, %%d4l, (-128*4,%[x2]), %%d4, %%acc1\n"
1598 "mac.w %%d3u, %%d4u, %%acc0\n"
1599 "mac.w %%d3u, %%d4l, (-192*4,%[x2]), %%d4, %%acc1\n"
1600 "mac.w %%d3l, %%d4u, %%acc0\n"
1601 "mac.w %%d3l, %%d4l, %%acc1\n"
1602 "movclr.l %%acc0, %%d0\n"
1603 "move.l %%d0, %[t0]\n"
1604 "movclr.l %%acc1, %%d0\n"
1605 "move.l %%d0, %[t1]\n"
1607 : [x1] "+a" (x1), [x2] "+a" (x2), [s0] "+m" (s0), [t0] "+m" (t0),
1608 [s1] "+m" (s1), [t1] "+m" (t1)
1609 : [wp] "a" (wp) : "d0", "d1", "d2", "d3", "d4");
1611 sb0[30+i*2] = shft4(t0) + shft13(s0) * wp[24];
1612 sb0[31+i*2] = shft13(t0) * wp[25] - shft13(s0) * wp[26];
1613 sb1[30+i*2] = shft4(t1) + shft13(s1) * wp[24];
1614 sb1[31+i*2] = shft13(t1) * wp[25] - shft13(s1) * wp[26];
1615 wp += 27;
1616 x1 -= 2;
1617 x2 += 2;
1620 asm volatile(
1621 "move.l ( -32*4,%[x1]), %%d4\n" /* d4 = x1[-32] */
1622 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1624 "mac.w %%d0u, %%d4u, %%acc0\n"
1625 "mac.w %%d0u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n"
1626 "mac.w %%d0l, %%d4u, %%acc0\n"
1627 "mac.w %%d0l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n"
1628 "mac.w %%d1u, %%d4u, %%acc0\n"
1629 "mac.w %%d1u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n"
1630 "mac.w %%d1l, %%d4u, %%acc0\n"
1631 "mac.w %%d1l, %%d4l, ( 32*4,%[x1]), %%d4, %%acc1\n"
1632 "mac.w %%d2u, %%d4u, %%acc0\n"
1633 "mac.w %%d2u, %%d4l, ( 96*4,%[x1]), %%d4, %%acc1\n"
1634 "mac.w %%d2l, %%d4u, %%acc0\n"
1635 "mac.w %%d2l, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n"
1636 "mac.w %%d3u, %%d4u, %%acc0\n"
1637 "mac.w %%d3u, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n"
1638 "mac.w %%d3l, %%d4u, %%acc0\n"
1639 "mac.w %%d3l, %%d4l, ( -16*4,%[x1]), %%d4, %%acc1\n"
1640 "movclr.l %%acc0, %%d0\n"
1641 "move.l %%d0, %[s0]\n"
1642 "movclr.l %%acc1, %%d0\n"
1643 "move.l %%d0, %[s1]\n"
1645 "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */
1646 "mac.w %%d0u, %%d4u, %%acc0\n"
1647 "mac.w %%d0u, %%d4l, ( -48*4,%[x1]), %%d4, %%acc1\n"
1648 "mac.w %%d1u, %%d4u, %%acc0\n"
1649 "mac.w %%d1u, %%d4l, ( 16*4,%[x1]), %%d4, %%acc1\n"
1650 "mac.w %%d1l, %%d4u, %%acc0\n"
1651 "mac.w %%d1l, %%d4l, ( -80*4,%[x1]), %%d4, %%acc1\n"
1652 "mac.w %%d2u, %%d4u, %%acc0\n"
1653 "mac.w %%d2u, %%d4l, ( 48*4,%[x1]), %%d4, %%acc1\n"
1654 "mac.w %%d2u, %%d4u, %%acc0\n"
1655 "mac.w %%d2u, %%d4l, (-112*4,%[x1]), %%d4, %%acc1\n"
1656 "mac.w %%d3u, %%d4u, %%acc0\n"
1657 "mac.w %%d3u, %%d4l, ( 80*4,%[x1]), %%d4, %%acc1\n"
1658 "mac.w %%d3l, %%d4u, %%acc0\n"
1659 "mac.w %%d3l, %%d4l, (-144*4,%[x1]), %%d4, %%acc1\n"
1660 "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */
1661 "mac.w %%d0u, %%d4u, %%acc0\n"
1662 "mac.w %%d0u, %%d4l, ( 112*4,%[x1]), %%d4, %%acc1\n"
1663 "mac.w %%d0u, %%d4u, %%acc0\n"
1664 "mac.w %%d0u, %%d4l, (-176*4,%[x1]), %%d4, %%acc1\n"
1665 "mac.w %%d1u, %%d4u, %%acc0\n"
1666 "mac.w %%d1u, %%d4l, ( 144*4,%[x1]), %%d4, %%acc1\n"
1667 "mac.w %%d1l, %%d4u, %%acc0\n"
1668 "mac.w %%d1l, %%d4l, (-208*4,%[x1]), %%d4, %%acc1\n"
1669 "mac.w %%d2u, %%d4u, %%acc0\n"
1670 "mac.w %%d2u, %%d4l, ( 176*4,%[x1]), %%d4, %%acc1\n"
1671 "mac.w %%d2u, %%d4u, %%acc0\n"
1672 "mac.w %%d2u, %%d4l, (-240*4,%[x1]), %%d4, %%acc1\n"
1673 "mac.w %%d3u, %%d4u, %%acc0\n"
1674 "mac.w %%d3u, %%d4l, ( 208*4,%[x1]), %%d4, %%acc1\n"
1675 "mac.w %%d3l, %%d4u, %%acc0\n"
1676 "mac.w %%d3l, %%d4l, %%acc1\n"
1677 "movclr.l %%acc0, %%d0\n"
1678 "move.l %%d0, %[t0]\n"
1679 "movclr.l %%acc1, %%d0\n"
1680 "move.l %%d0, %[t1]\n"
1682 : [x1] "+a" (x1), [s0] "+m" (s0), [t0] "+m" (t0),
1683 [s1] "+m" (s1), [t1] "+m" (t1)
1684 : [wp] "a" (wp) : "d0", "d1", "d2", "d3", "d4");
1686 u = shft4(s0 - t0);
1687 v = shft4(s0 + t0);
1688 t0 = sb0[14];
1689 s0 = sb0[15] - t0;
1691 sb0[31] = v + t0; /* A0 */
1692 sb0[30] = u + s0; /* A1 */
1693 sb0[15] = u - s0; /* A2 */
1694 sb0[14] = v - t0; /* A3 */
1696 u = shft4(s1 - t1);
1697 v = shft4(s1 + t1);
1698 t1 = sb1[14];
1699 s1 = sb1[15] - t1;
1701 sb1[31] = v + t1; /* A0 */
1702 sb1[30] = u + s1; /* A1 */
1703 sb1[15] = u - s1; /* A2 */
1704 sb1[14] = v - t1; /* A3 */
1706 #else
1707 int ch, s, t, *a;
1709 for(ch=0; ch<cfg.channels; ch++)
1711 a = ch ? sb1 : sb0;
1712 for(k=0; k<18; k++, wk+=64, a+=SBLIMIT)
1714 wp = enwindow;
1715 x1 = wk;
1716 x2 = x1 - 124;
1718 /* x1[-572] .... x1[448] = 1022 */
1719 /* 18*4*16*32 */
1720 for(i=-15; i<0; i++)
1722 s = (int)x2[-224*2] * wp[ 0]; t = (int)x1[ 224*2] * wp[ 0];
1723 s += (int)x2[-160*2] * wp[ 1]; t += (int)x1[ 160*2] * wp[ 1];
1724 s += (int)x2[- 96*2] * wp[ 2]; t += (int)x1[ 96*2] * wp[ 2];
1725 s += (int)x2[- 32*2] * wp[ 3]; t += (int)x1[ 32*2] * wp[ 3];
1726 s += (int)x2[ 32*2] * wp[ 4]; t += (int)x1[- 32*2] * wp[ 4];
1727 s += (int)x2[ 96*2] * wp[ 5]; t += (int)x1[- 96*2] * wp[ 5];
1728 s += (int)x2[ 160*2] * wp[ 6]; t += (int)x1[-160*2] * wp[ 6];
1729 s += (int)x2[ 224*2] * wp[ 7]; t += (int)x1[-224*2] * wp[ 7];
1730 s += (int)x1[-256*2] * wp[ 8]; t += (int)x2[ 256*2] * wp[16];
1731 s += (int)x1[-192*2] * wp[ 9]; t += (int)x2[ 192*2] * wp[17];
1732 s += (int)x1[-128*2] * wp[10]; t += (int)x2[ 128*2] * wp[18];
1733 s += (int)x1[- 64*2] * wp[11]; t += (int)x2[ 64*2] * wp[19];
1734 s += (int)x1[ 0*2] * wp[12]; t += (int)x2[ 0*2] * wp[20];
1735 s += (int)x1[ 64*2] * wp[13]; t += (int)x2[- 64*2] * wp[21];
1736 s += (int)x1[ 128*2] * wp[14]; t += (int)x2[-128*2] * wp[22];
1737 s += (int)x1[ 192*2] * wp[15]; t += (int)x2[-192*2] * wp[23];
1739 a[30+i*2] = shft4(t) + shft13(s) * wp[24];
1740 a[31+i*2] = shft13(t) * wp[25] - shft13(s) * wp[26];
1741 wp += 27;
1742 x1 -= 2;
1743 x2 += 2;
1746 t = (int)x1[- 16*2] * wp[ 8]; s = (int)x1[ -32*2] * wp[0];
1747 t += ((int)x1[- 48*2]-x1[ 16*2]) * wp[10]; s += (int)x1[ -96*2] * wp[1];
1748 t += ((int)x1[- 80*2]+x1[ 48*2]) * wp[12]; s += (int)x1[-160*2] * wp[2];
1749 t += ((int)x1[-112*2]-x1[ 80*2]) * wp[14]; s += (int)x1[-224*2] * wp[3];
1750 t += ((int)x1[-144*2]+x1[112*2]) * wp[16]; s += (int)x1[ 32*2] * wp[4];
1751 t += ((int)x1[-176*2]-x1[144*2]) * wp[18]; s += (int)x1[ 96*2] * wp[5];
1752 t += ((int)x1[-208*2]+x1[176*2]) * wp[20]; s += (int)x1[ 160*2] * wp[6];
1753 t += ((int)x1[-240*2]-x1[208*2]) * wp[22]; s += (int)x1[ 224*2] * wp[7];
1755 u = shft4(s - t);
1756 v = shft4(s + t);
1757 t = a[14];
1758 s = a[15] - t;
1760 a[31] = v + t; /* A0 */
1761 a[30] = u + s; /* A1 */
1762 a[15] = u - s; /* A2 */
1763 a[14] = v - t; /* A3 */
1765 wk -= 18 * 64 - 1; /* rewind wk (to next channel start) */
1767 #endif
1770 void window_subband2(short *x1, int a[SBLIMIT]) ICODE_ATTR;
1771 void window_subband2(short *x1, int a[SBLIMIT])
1773 int xr;
1774 short *wp = enwindow;
1775 short *x2 = x1 - 124;
1777 wp += 27 * 15;
1778 x1 -= 2 * 15;
1779 x2 += 2 * 15;
1781 xr = a[28] - a[0]; a[0] += a[28]; a[28] = shft9(xr) * wp[-2*27+25];
1782 xr = a[29] - a[1]; a[1] += a[29]; a[29] = shft9(xr) * wp[-2*27+25];
1783 xr = a[26] - a[2]; a[2] += a[26]; a[26] = shft9(xr) * wp[-4*27+25];
1784 xr = a[27] - a[3]; a[3] += a[27]; a[27] = shft9(xr) * wp[-4*27+25];
1785 xr = a[24] - a[4]; a[4] += a[24]; a[24] = shft9(xr) * wp[-6*27+25];
1786 xr = a[25] - a[5]; a[5] += a[25]; a[25] = shft9(xr) * wp[-6*27+25];
1787 xr = a[22] - a[6]; a[6] += a[22]; a[22] = shft9(xr) * SQRT ;
1788 xr = a[23] - a[7]; a[7] += a[23]; a[23] = shft9(xr) * SQRT - a[7];
1789 a[ 7] -= a[ 6];
1790 a[22] -= a[ 7];
1791 a[23] -= a[22];
1793 xr = a[ 6]; a[ 6] = a[31] - xr; a[31] = a[31] + xr;
1794 xr = a[ 7]; a[ 7] = a[30] - xr; a[30] = a[30] + xr;
1795 xr = a[22]; a[22] = a[15] - xr; a[15] = a[15] + xr;
1796 xr = a[23]; a[23] = a[14] - xr; a[14] = a[14] + xr;
1798 xr = a[20] - a[ 8]; a[ 8] += a[20]; a[20] = shft9(xr) * wp[-10*27+25];
1799 xr = a[21] - a[ 9]; a[ 9] += a[21]; a[21] = shft9(xr) * wp[-10*27+25];
1800 xr = a[18] - a[10]; a[10] += a[18]; a[18] = shft9(xr) * wp[-12*27+25];
1801 xr = a[19] - a[11]; a[11] += a[19]; a[19] = shft9(xr) * wp[-12*27+25];
1802 xr = a[16] - a[12]; a[12] += a[16]; a[16] = shft9(xr) * wp[-14*27+25];
1803 xr = a[17] - a[13]; a[13] += a[17]; a[17] = shft9(xr) * wp[-14*27+25];
1804 xr =-a[20] + a[24]; a[20] += a[24]; a[24] = shft9(xr) * wp[-12*27+25];
1805 xr =-a[21] + a[25]; a[21] += a[25]; a[25] = shft9(xr) * wp[-12*27+25];
1806 xr = a[ 4] - a[ 8]; a[ 4] += a[ 8]; a[ 8] = shft9(xr) * wp[-12*27+25];
1807 xr = a[ 5] - a[ 9]; a[ 5] += a[ 9]; a[ 9] = shft9(xr) * wp[-12*27+25];
1808 xr = a[ 0] - a[12]; a[ 0] += a[12]; a[12] = shft9(xr) * wp[ -4*27+25];
1809 xr = a[ 1] - a[13]; a[ 1] += a[13]; a[13] = shft9(xr) * wp[ -4*27+25];
1810 xr = a[16] - a[28]; a[16] += a[28]; a[28] = shft9(xr) * wp[ -4*27+25];
1811 xr =-a[17] + a[29]; a[17] += a[29]; a[29] = shft9(xr) * wp[ -4*27+25];
1813 xr = SQRT * shft9(a[ 2] - a[10]); a[ 2] += a[10]; a[10] = xr;
1814 xr = SQRT * shft9(a[ 3] - a[11]); a[ 3] += a[11]; a[11] = xr;
1815 xr = SQRT * shft9(a[26] - a[18]); a[18] += a[26]; a[26] = xr - a[18];
1816 xr = SQRT * shft9(a[27] - a[19]); a[19] += a[27]; a[27] = xr - a[19];
1818 xr = a[ 2]; a[19] -= a[ 3]; a[ 3] -= xr; a[ 2] = a[31] - xr; a[31] += xr;
1819 xr = a[ 3]; a[11] -= a[19]; a[18] -= xr; a[ 3] = a[30] - xr; a[30] += xr;
1820 xr = a[18]; a[27] -= a[11]; a[19] -= xr; a[18] = a[15] - xr; a[15] += xr;
1822 xr = a[19]; a[10] -= xr; a[19] = a[14] - xr; a[14] += xr;
1823 xr = a[10]; a[11] -= xr; a[10] = a[23] - xr; a[23] += xr;
1824 xr = a[11]; a[26] -= xr; a[11] = a[22] - xr; a[22] += xr;
1825 xr = a[26]; a[27] -= xr; a[26] = a[ 7] - xr; a[ 7] += xr;
1827 xr = a[27]; a[27] = a[6] - xr; a[6] += xr;
1829 xr = SQRT * shft9(a[ 0] - a[ 4]); a[ 0] += a[ 4]; a[ 4] = xr;
1830 xr = SQRT * shft9(a[ 1] - a[ 5]); a[ 1] += a[ 5]; a[ 5] = xr;
1831 xr = SQRT * shft9(a[16] - a[20]); a[16] += a[20]; a[20] = xr;
1832 xr = SQRT * shft9(a[17] - a[21]); a[17] += a[21]; a[21] = xr;
1833 xr =-SQRT * shft9(a[ 8] - a[12]); a[ 8] += a[12]; a[12] = xr - a[ 8];
1834 xr =-SQRT * shft9(a[ 9] - a[13]); a[ 9] += a[13]; a[13] = xr - a[ 9];
1835 xr =-SQRT * shft9(a[25] - a[29]); a[25] += a[29]; a[29] = xr - a[25];
1836 xr =-SQRT * shft9(a[24] + a[28]); a[24] -= a[28]; a[28] = xr - a[24];
1838 xr = a[24] - a[16]; a[24] = xr;
1839 xr = a[20] - xr; a[20] = xr;
1840 xr = a[28] - xr; a[28] = xr;
1842 xr = a[25] - a[17]; a[25] = xr;
1843 xr = a[21] - xr; a[21] = xr;
1844 xr = a[29] - xr; a[29] = xr;
1846 xr = a[17] - a[1]; a[17] = xr;
1847 xr = a[ 9] - xr; a[ 9] = xr;
1848 xr = a[25] - xr; a[25] = xr;
1849 xr = a[ 5] - xr; a[ 5] = xr;
1850 xr = a[21] - xr; a[21] = xr;
1851 xr = a[13] - xr; a[13] = xr;
1852 xr = a[29] - xr; a[29] = xr;
1854 xr = a[ 1] - a[0]; a[ 1] = xr;
1855 xr = a[16] - xr; a[16] = xr;
1856 xr = a[17] - xr; a[17] = xr;
1857 xr = a[ 8] - xr; a[ 8] = xr;
1858 xr = a[ 9] - xr; a[ 9] = xr;
1859 xr = a[24] - xr; a[24] = xr;
1860 xr = a[25] - xr; a[25] = xr;
1861 xr = a[ 4] - xr; a[ 4] = xr;
1862 xr = a[ 5] - xr; a[ 5] = xr;
1863 xr = a[20] - xr; a[20] = xr;
1864 xr = a[21] - xr; a[21] = xr;
1865 xr = a[12] - xr; a[12] = xr;
1866 xr = a[13] - xr; a[13] = xr;
1867 xr = a[28] - xr; a[28] = xr;
1868 xr = a[29] - xr; a[29] = xr;
1870 xr = a[ 0]; a[ 0] += a[31]; a[31] -= xr;
1871 xr = a[ 1]; a[ 1] += a[30]; a[30] -= xr;
1872 xr = a[16]; a[16] += a[15]; a[15] -= xr;
1873 xr = a[17]; a[17] += a[14]; a[14] -= xr;
1874 xr = a[ 8]; a[ 8] += a[23]; a[23] -= xr;
1875 xr = a[ 9]; a[ 9] += a[22]; a[22] -= xr;
1876 xr = a[24]; a[24] += a[ 7]; a[ 7] -= xr;
1877 xr = a[25]; a[25] += a[ 6]; a[ 6] -= xr;
1878 xr = a[ 4]; a[ 4] += a[27]; a[27] -= xr;
1879 xr = a[ 5]; a[ 5] += a[26]; a[26] -= xr;
1880 xr = a[20]; a[20] += a[11]; a[11] -= xr;
1881 xr = a[21]; a[21] += a[10]; a[10] -= xr;
1882 xr = a[12]; a[12] += a[19]; a[19] -= xr;
1883 xr = a[13]; a[13] += a[18]; a[18] -= xr;
1884 xr = a[28]; a[28] += a[ 3]; a[ 3] -= xr;
1885 xr = a[29]; a[29] += a[ 2]; a[ 2] -= xr;
1888 void mdct_long(int *out, int *in) ICODE_ATTR;
1889 void mdct_long(int *out, int *in)
1891 int ct,st;
1892 int tc1, tc2, tc3, tc4, ts5, ts6, ts7, ts8;
1893 int ts1, ts2, ts3, ts4, tc5, tc6, tc7, tc8;
1895 /* 1,2, 5,6, 9,10, 13,14, 17 */
1896 tc1 = in[17] - in[ 9];
1897 tc3 = in[15] - in[11];
1898 tc4 = in[14] - in[12];
1899 ts5 = in[ 0] + in[ 8];
1900 ts6 = in[ 1] + in[ 7];
1901 ts7 = in[ 2] + in[ 6];
1902 ts8 = in[ 3] + in[ 5];
1904 out[17] = (ts5 + ts7 - ts8) * cx[8] - (ts6 - in[4]) * cx[8];
1905 st = (ts5 + ts7 - ts8) * cx[7] + (ts6 - in[4]) * cx[8];
1906 ct = (tc1 - tc3 - tc4) * cx[6];
1907 out[5] = ct + st;
1908 out[6] = ct - st;
1910 tc2 = (in[16] - in[10]) * cx[6];
1911 ts6 = ts6 * cx[7] + in[4] * cx[8];
1913 ct = tc1 * cx[0] + tc2 + tc3 * cx[1] + tc4 * cx[2];
1914 st = -ts5 * cx[4] + ts6 - ts7 * cx[5] + ts8 * cx[3];
1915 out[1] = ct + st;
1916 out[2] = ct - st;
1918 ct = tc1 * cx[1] - tc2 - tc3 * cx[2] + tc4 * cx[0];
1919 st = -ts5 * cx[5] + ts6 - ts7 * cx[3] + ts8 * cx[4];
1920 out[ 9] = ct + st;
1921 out[10] = ct - st;
1923 ct = tc1 * cx[2] - tc2 + tc3 * cx[0] - tc4 * cx[1];
1924 st = ts5 * cx[3] - ts6 + ts7 * cx[4] - ts8 * cx[5];
1925 out[13] = ct + st;
1926 out[14] = ct - st;
1928 ts1 = in[ 8] - in[ 0];
1929 ts3 = in[ 6] - in[ 2];
1930 ts4 = in[ 5] - in[ 3];
1931 tc5 = in[17] + in[ 9];
1932 tc6 = in[16] + in[10];
1933 tc7 = in[15] + in[11];
1934 tc8 = in[14] + in[12];
1936 out[0] = (tc5 + tc7 + tc8) * cx[8] + (tc6 + in[13]) * cx[8];
1937 ct = (tc5 + tc7 + tc8) * cx[7] - (tc6 + in[13]) * cx[8];
1938 st = (ts1 - ts3 + ts4) * cx[6];
1939 out[11] = ct + st;
1940 out[12] = ct - st;
1942 ts2 = (in[7] - in[1]) * cx[6];
1943 tc6 = in[13] * cx[8] - tc6 * cx[7];
1945 ct = tc5 * cx[3] - tc6 + tc7 * cx[4] + tc8 * cx[5];
1946 st = ts1 * cx[2] + ts2 + ts3 * cx[0] + ts4 * cx[1];
1947 out[3] = ct + st;
1948 out[4] = ct - st;
1950 ct =-tc5 * cx[5] + tc6 - tc7 * cx[3] - tc8 * cx[4];
1951 st = ts1 * cx[1] + ts2 - ts3 * cx[2] - ts4 * cx[0];
1952 out[7] = ct + st;
1953 out[8] = ct - st;
1955 ct =-tc5 * cx[4] + tc6 - tc7 * cx[5] - tc8 * cx[3];
1956 st = ts1 * cx[0] - ts2 + ts3 * cx[1] - ts4 * cx[2];
1957 out[15] = ct + st;
1958 out[16] = ct - st;
1961 static int find_bitrate_index(int type, int bitrate)
1963 int i;
1965 for(i=0;i<14;i++)
1966 if(bitrate == bitr_index[type][i])
1967 break;
1969 return i;
1972 static int find_samplerate_index(long freq, int *mp3_type)
1973 { /* MPEG 2 */ /* MPEG 1 */
1974 static long mpeg[2][3] = { {22050, 24000, 16000}, {44100, 48000, 32000} };
1975 int mpg, rate;
1977 /* set default values: MPEG1 at 44100/s */
1978 *mp3_type = 1;
1980 for(mpg=0; mpg<2; mpg++)
1981 for(rate=0; rate<3; rate++)
1982 if(freq == mpeg[mpg][rate])
1983 { *mp3_type = mpg; return rate; }
1985 return 0;
1988 void init_mp3_encoder_engine(bool stereo, int bitrate, int sample_rate)
1990 uint32 avg_byte_per_frame;
1992 #ifdef ROCKBOX_LITTLE_ENDIAN
1993 cfg.byte_order = order_littleEndian;
1994 #else
1995 cfg.byte_order = order_bigEndian;
1996 #endif
1998 if(bitrate < 96 && stereo && sample_rate >= 32000)
1999 { /* use MPEG2 format */
2000 sample_rate >>= 1;
2001 cfg.resample = 1;
2002 cfg.granules = 1;
2004 else
2005 { /* use MPEG1 format */
2006 cfg.resample = 0;
2007 cfg.granules = 2;
2010 cfg.samplerate = sample_rate;
2011 cfg.channels = stereo ? 2 : 1;
2012 cfg.mpg.mode = stereo ? 0 : 3; /* 0=stereo, 3=mono */
2013 cfg.mpg.bitrate = stereo ? bitrate : bitrate > 160 ? 160 : bitrate;
2014 cfg.mpg.smpl_id = find_samplerate_index(cfg.samplerate, &cfg.mpg.type);
2015 cfg.mpg.bitr_id = find_bitrate_index(cfg.mpg.type, cfg.mpg.bitrate);
2016 cfg.mpg.num_bands = num_bands[stereo ? cfg.mpg.type : 2][cfg.mpg.bitr_id];
2018 memcpy(scalefac, sfBand[cfg.mpg.smpl_id + 3*cfg.mpg.type], sizeof(scalefac));
2019 memset(mfbuf , 0 , sizeof(mfbuf ));
2020 memset(mdct_freq , 0 , sizeof(mdct_freq ));
2021 memset(enc_data , 0 , sizeof(enc_data ));
2022 memset(sb_data , 0 , sizeof(sb_data ));
2023 memset(&CodedData, 0 , sizeof(CodedData ));
2024 memcpy(ca , ca_const , sizeof(ca ));
2025 memcpy(cs , cs_const , sizeof(cs ));
2026 memcpy(cx , cx_const , sizeof(cx ));
2027 memcpy(win , win_const , sizeof(win ));
2028 memcpy(enwindow , enwindow_const , sizeof(enwindow ));
2029 memcpy(int2idx , int2idx_const , sizeof(int2idx ));
2030 memcpy(ht_count , ht_count_const , sizeof(ht_count ));
2031 memcpy( tab01 , tab01_const , sizeof(tab01 ));
2032 memcpy( tab23 , tab23_const , sizeof(tab23 ));
2033 memcpy( tab56 , tab56_const , sizeof(tab56 ));
2034 memcpy( tab1315 , tab1315_const , sizeof(tab1315 ));
2035 memcpy( tab1624 , tab1624_const , sizeof(tab1624 ));
2036 memcpy( tab789 , tab789_const , sizeof(tab789 ));
2037 memcpy( tabABC , tabABC_const , sizeof(tabABC ));
2038 memcpy( t1HB , t1HB_const , sizeof(t1HB ));
2039 memcpy( t2HB , t2HB_const , sizeof(t2HB ));
2040 memcpy( t3HB , t3HB_const , sizeof(t3HB ));
2041 memcpy( t5HB , t5HB_const , sizeof(t5HB ));
2042 memcpy( t6HB , t6HB_const , sizeof(t6HB ));
2043 memcpy( t7HB , t7HB_const , sizeof(t7HB ));
2044 memcpy( t8HB , t8HB_const , sizeof(t8HB ));
2045 memcpy( t9HB , t9HB_const , sizeof(t9HB ));
2046 memcpy(t10HB , t10HB_const , sizeof(t10HB ));
2047 memcpy(t11HB , t11HB_const , sizeof(t11HB ));
2048 memcpy(t12HB , t12HB_const , sizeof(t12HB ));
2049 memcpy(t13HB , t13HB_const , sizeof(t13HB ));
2050 memcpy(t15HB , t15HB_const , sizeof(t15HB ));
2051 memcpy(t16HB , t16HB_const , sizeof(t16HB ));
2052 memcpy(t24HB , t24HB_const , sizeof(t24HB ));
2053 memcpy( t1l , t1l_const , sizeof(t1l ));
2054 memcpy( t2l , t2l_const , sizeof(t2l ));
2055 memcpy( t3l , t3l_const , sizeof(t3l ));
2056 memcpy( t5l , t5l_const , sizeof(t5l ));
2057 memcpy( t6l , t6l_const , sizeof(t6l ));
2058 memcpy( t7l , t7l_const , sizeof(t7l ));
2059 memcpy( t8l , t8l_const , sizeof(t8l ));
2060 memcpy( t9l , t9l_const , sizeof(t9l ));
2061 memcpy(t10l , t10l_const , sizeof(t10l ));
2062 memcpy(t11l , t11l_const , sizeof(t11l ));
2063 memcpy(t12l , t12l_const , sizeof(t12l ));
2064 memcpy(t13l , t13l_const , sizeof(t13l ));
2065 memcpy(t15l , t15l_const , sizeof(t15l ));
2066 memcpy(t16l , t16l_const , sizeof(t16l ));
2067 memcpy(t24l , t24l_const , sizeof(t24l ));
2068 memcpy(ht , ht_const , sizeof(ht ));
2070 ht[ 0].table = NULL; ht[ 0].hlen = NULL; /* Apparently not used */
2071 ht[ 1].table = t1HB; ht[ 1].hlen = t1l;
2072 ht[ 2].table = t2HB; ht[ 2].hlen = t2l;
2073 ht[ 3].table = t3HB; ht[ 3].hlen = t3l;
2074 ht[ 4].table = NULL; ht[ 4].hlen = NULL; /* Apparently not used */
2075 ht[ 5].table = t5HB; ht[ 5].hlen = t5l;
2076 ht[ 6].table = t6HB; ht[ 6].hlen = t6l;
2077 ht[ 7].table = t7HB; ht[ 7].hlen = t7l;
2078 ht[ 8].table = t8HB; ht[ 8].hlen = t8l;
2079 ht[ 9].table = t9HB; ht[ 9].hlen = t9l;
2080 ht[10].table = t10HB; ht[10].hlen = t10l;
2081 ht[11].table = t11HB; ht[11].hlen = t11l;
2082 ht[12].table = t12HB; ht[12].hlen = t12l;
2083 ht[13].table = t13HB; ht[13].hlen = t13l;
2084 ht[14].table = NULL; ht[14].hlen = NULL; /* Apparently not used */
2085 ht[15].table = t15HB; ht[15].hlen = t15l;
2087 /* Figure average number of 'bytes' per frame */
2088 avg_byte_per_frame = SAMPL2 * 16000 * cfg.mpg.bitrate / (2 - cfg.mpg.type);
2089 avg_byte_per_frame = avg_byte_per_frame / cfg.samplerate;
2090 cfg.byte_per_frame = avg_byte_per_frame / 64;
2091 cfg.frac_per_frame = avg_byte_per_frame & 63;
2092 cfg.slot_lag = 0;
2093 cfg.sideinfo_len = 32 + (cfg.mpg.type ? (cfg.channels == 1 ? 136 : 256)
2094 : (cfg.channels == 1 ? 72 : 136));
2097 void compress(void)
2099 int i, ii, gr, k, ch, shift, gr_cnt;
2100 int max, min;
2101 char stg[20];
2103 while(1)
2105 if((frames & 7) == 0)
2106 { rb->lcd_clear_display();
2107 rb->snprintf(stg, 20, "Frame %d / %d", frames, wav_size/SAMPL2/8);
2108 rb->lcd_putsxy(4, 20, stg);
2109 rb->lcd_update();
2111 /* encode one mp3 frame in this loop */
2112 memset(CodedData.bbuf, 0, sizeof(CodedData.bbuf));
2114 if((cfg.slot_lag += cfg.frac_per_frame) >= 64)
2115 { /* Padding for this frame */
2116 cfg.slot_lag -= 64;
2117 cfg.mpg.padding = 1;
2119 else
2120 cfg.mpg.padding = 0;
2122 cfg.mean_bits = (8 * cfg.byte_per_frame + 8 * cfg.mpg.padding
2123 - cfg.sideinfo_len) / cfg.granules / cfg.channels;
2125 /* shift out old samples */
2126 memcpy(mfbuf, mfbuf + 2*cfg.granules*576, 4*512);
2128 /* read new samples to iram for further processing */
2129 if(read_samples((uint32*)(mfbuf + 2*512), SAMP_PER_FRAME) == 0)
2130 break;
2132 /* swap bytes if neccessary */
2133 if(cfg.byte_order == order_bigEndian)
2134 for(i=0; i<SAMP_PER_FRAME; i++)
2136 uint32 t = ((uint32*)mfbuf)[512 + i];
2137 t = ((t >> 8) & 0xff00ff) | ((t << 8) & 0xff00ff00);
2138 ((uint32*)mfbuf)[512 + i] = t;
2141 if(cfg.resample) /* downsample to half of original */
2142 for(i=2*512; i<2*512+2*SAMP_PER_FRAME; i+=4)
2144 mfbuf[i/2+512] = (short)(((int)mfbuf[i+0] + mfbuf[i+2]) >> 1);
2145 mfbuf[i/2+513] = (short)(((int)mfbuf[i+1] + mfbuf[i+3]) >> 1);
2148 if(cfg.channels == 1) /* mix left and right channels to mono */
2149 for(i=2*512; i<2*512+2*SAMP_PER_FRAME; i+=2)
2150 mfbuf[i] = mfbuf[i+1] = (short)(((int)mfbuf[i] + mfbuf[i+1]) >> 1);
2152 cfg.ResvSize = 0;
2153 gr_cnt = cfg.granules * cfg.channels;
2154 CodedData.bitpos = cfg.sideinfo_len; /* leave space for mp3 header */
2155 for(gr=0; gr<cfg.granules; gr++)
2157 short *wk = mfbuf + 2*286 + gr*1152;
2159 /* 16bit packed wav data can be windowed efficiently on coldfire */
2160 window_subband1(wk, sb_data[0][1-gr][0], sb_data[1][1-gr][0]);
2162 for(ch=0; ch<cfg.channels; ch++)
2164 int band;
2165 int *mdct;
2167 wk = mfbuf + 2*286 + gr*1152 + ch;
2169 /* 36864=4*18*16*32 */
2170 for(k=0; k<18; k++, wk+=64)
2172 window_subband2(wk, sb_data[ch][1-gr][k]);
2173 /* Compensate for inversion in the analysis filter */
2174 if(k & 1)
2175 for(band=1; band<32; band+=2)
2176 sb_data[ch][1-gr][k][band] *= -1;
2179 /* Perform imdct of 18 previous + 18 current subband samples */
2180 /* for integer precision do this loop twice (if neccessary) */
2181 shift = k = 14;
2182 for(ii=0; ii<2 && k; ii++)
2184 mdct = mdct_freq;
2185 cfg.cod_info[gr][ch].additStep = 4 * (14 - shift);
2186 for(band=0; band<cfg.mpg.num_bands; band++, mdct+=18)
2188 int *band0 = sb_data[ch][ gr][0] + order[band];
2189 int *band1 = sb_data[ch][1-gr][0] + order[band];
2190 int work[18];
2192 /* 9216=4*32*9*8 */
2193 for(k=-9; k<0; k++)
2195 int a = shft_n(band1[(k+9)*32], shift);
2196 int b = shft_n(band1[(8-k)*32], shift);
2197 int c = shft_n(band0[(k+9)*32], shift);
2198 int d = shft_n(band0[(8-k)*32], shift);
2200 work[k+ 9] = shft16(a * win[k+ 9][0] + b * win[k+ 9][1]
2201 + c * win[k+ 9][2] + d * win[k+ 9][3]);
2203 work[k+18] = shft16(c * win[k+18][0] + d * win[k+18][1]
2204 + a * win[k+18][2] + b * win[k+18][3]);
2207 /* 7200=4*18*100 */
2208 mdct_long(mdct, work);
2210 /* Perform aliasing reduction butterfly */
2211 if(band != 0)
2212 for(k=7; k>=0; --k)
2214 int bu, bd;
2215 bu = shft15(mdct[k]) * ca[k] + shft15(mdct[-1-k]) * cs[k];
2216 bd = shft15(mdct[k]) * cs[k] - shft15(mdct[-1-k]) * ca[k];
2217 mdct[-1-k] = bu;
2218 mdct[ k ] = bd;
2222 max = min = 0;
2223 for(k=0; k<576; k++)
2225 mdct_freq[k] = shft13(mdct_freq[k]);
2226 if(max < mdct_freq[k]) max = mdct_freq[k];
2227 if(min > mdct_freq[k]) min = mdct_freq[k];
2230 max = (max > -min) ? max : -min;
2231 cfg.cod_info[gr][ch].max_val = (long)max;
2233 /* calc new shift for higher integer precision */
2234 for(k=0; max<(0x3c00>>k); k++);
2235 shift = 12 - k;
2238 cfg.cod_info[gr][ch].quantStep += cfg.cod_info[gr][ch].additStep;
2240 /* bit and noise allocation */
2241 iteration_loop(mdct_freq, &cfg.cod_info[gr][ch], gr_cnt--);
2242 /* write the frame to the bitstream */
2243 Huffmancodebits(enc_data, mdct_freq, &cfg.cod_info[gr][ch]);
2245 cfg.cod_info[gr][ch].quantStep -= cfg.cod_info[gr][ch].additStep;
2247 if(cfg.granules == 1)
2248 memcpy(sb_data[ch][0], sb_data[ch][1], sizeof(sb_data[ch][0]));
2252 enc_size = (CodedData.bitpos + 7) >> 3;
2253 /* finish this chunk by adding sideinfo header data */
2254 CodedData.bitpos = 0;
2255 encodeSideInfo( cfg.cod_info );
2257 if(cfg.byte_order != order_bigEndian)
2258 for(i=0; i<(enc_size+3)/4; i++)
2259 CodedData.bbuf[i] = myswap32(CodedData.bbuf[i]);
2261 if(enc_chunk + enc_size > 65536)
2263 /* copy iram mp3 buffer to sdram/file */
2264 rb->write(mp3file, enc_buffer, enc_chunk & ~3);
2265 memcpy(enc_buffer, enc_buffer + (enc_chunk >> 2), enc_chunk & 3);
2266 enc_chunk &= 3;
2269 memcpy((char*)enc_buffer + enc_chunk, CodedData.bbuf, enc_size);
2270 enc_chunk += enc_size;
2271 frames++;
2273 /* write last chunks to disk */
2274 rb->write(mp3file, enc_buffer, enc_chunk);
2278 int num_file;
2279 char mp3_name[80];
2281 void get_mp3_filename(char *wav_name)
2283 int slen = rb->strlen(wav_name);
2284 rb->strncpy(mp3_name, wav_name, 79);
2285 rb->strncpy(mp3_name + slen - 4, ".mp3", 5);
2288 #if CONFIG_KEYPAD == IRIVER_H100_PAD || CONFIG_KEYPAD == IRIVER_H300_PAD
2289 #define MP3ENC_PREV BUTTON_UP
2290 #define MP3ENC_NEXT BUTTON_DOWN
2291 #define MP3ENC_DONE BUTTON_OFF
2292 #define MP3ENC_SELECT BUTTON_SELECT
2293 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \
2294 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
2295 #define MP3ENC_PREV BUTTON_SCROLL_BACK
2296 #define MP3ENC_NEXT BUTTON_SCROLL_FWD
2297 #define MP3ENC_DONE BUTTON_MENU
2298 #define MP3ENC_SELECT BUTTON_SELECT
2299 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
2300 #define MP3ENC_PREV BUTTON_UP
2301 #define MP3ENC_NEXT BUTTON_DOWN
2302 #define MP3ENC_DONE BUTTON_POWER
2303 #define MP3ENC_SELECT BUTTON_SELECT
2304 #elif CONFIG_KEYPAD == GIGABEAT_PAD
2305 #define MP3ENC_PREV BUTTON_UP
2306 #define MP3ENC_NEXT BUTTON_DOWN
2307 #define MP3ENC_DONE BUTTON_POWER
2308 #define MP3ENC_SELECT BUTTON_SELECT
2309 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
2310 (CONFIG_KEYPAD == SANSA_C200_PAD)
2311 #define MP3ENC_PREV BUTTON_UP
2312 #define MP3ENC_NEXT BUTTON_DOWN
2313 #define MP3ENC_DONE BUTTON_POWER
2314 #define MP3ENC_SELECT BUTTON_SELECT
2315 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
2316 #define MP3ENC_PREV BUTTON_SCROLL_UP
2317 #define MP3ENC_NEXT BUTTON_SCROLL_DOWN
2318 #define MP3ENC_DONE BUTTON_POWER
2319 #define MP3ENC_SELECT BUTTON_PLAY
2320 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
2321 #define MP3ENC_PREV BUTTON_UP
2322 #define MP3ENC_NEXT BUTTON_DOWN
2323 #define MP3ENC_DONE BUTTON_BACK
2324 #define MP3ENC_SELECT BUTTON_SELECT
2325 #elif CONFIG_KEYPAD == MROBE100_PAD
2326 #define MP3ENC_PREV BUTTON_UP
2327 #define MP3ENC_NEXT BUTTON_DOWN
2328 #define MP3ENC_DONE BUTTON_POWER
2329 #define MP3ENC_SELECT BUTTON_SELECT
2330 #else
2331 #error No keymap defined!
2332 #endif
2334 enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
2336 int rat, srat, nrat; /* for rate selection */
2337 int cont = 1, butt;
2338 long tim = 0;
2339 char stg[40];
2340 static const char* bstrg[] = {
2341 "64", "80", "96", "112", "128", "160", "192", "224", "256", "320"
2343 static const int brate[] = {
2344 64, 80, 96, 112, 128, 160, 192, 224, 256, 320
2347 if (parameter == NULL)
2348 return PLUGIN_ERROR;
2350 PLUGIN_IRAM_INIT(api)
2352 #ifdef CPU_COLDFIRE
2353 coldfire_set_macsr(0); /* integer mode */
2354 #endif
2356 rb = api;
2357 rb->lcd_setfont(FONT_SYSFIXED);
2359 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
2360 rb->cpu_boost(true);
2361 #endif
2362 rb->button_clear_queue();
2364 nrat = 9;
2365 srat = 4; /* set 128kBit as default */
2367 while(cont && (butt = rb->button_get_w_tmo(HZ/10)) != MP3ENC_SELECT)
2369 switch(butt)
2371 case MP3ENC_DONE: cont = 0; break;
2372 case MP3ENC_PREV|BUTTON_REPEAT:
2373 case MP3ENC_PREV: if(srat > 0 ) srat--; break;
2374 case MP3ENC_NEXT|BUTTON_REPEAT:
2375 case MP3ENC_NEXT: if(srat < nrat) srat++; break;
2378 rb->lcd_clear_display();
2379 rb->lcd_putsxy(2, 2, "-- Select Bitrate --");
2381 for(rat=0; rat<=nrat; rat++)
2382 rb->lcd_putsxy(2, 12 + rat*8, bstrg[rat]);
2383 rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
2384 rb->lcd_fillrect(0, 12 + srat*8, 127, 8);
2385 rb->lcd_set_drawmode(DRMODE_SOLID);
2386 rb->lcd_update();
2389 wav_filename = parameter;
2391 if(cont)
2393 if(wave_open() == 0)
2395 init_mp3_encoder_engine(true, brate[srat], cfg.samplerate);
2396 get_mp3_filename(wav_filename);
2397 mp3file = rb->open(mp3_name , O_WRONLY|O_CREAT|O_TRUNC);
2398 frames = 0;
2400 tim = *rb->current_tick;
2401 compress();
2402 tim = *rb->current_tick - tim;
2404 rb->close(wavfile);
2405 rb->close(mp3file);
2407 else
2409 rb->close(wavfile);
2410 rb->snprintf(stg, 20, "WaveOpen failed %d", wave_open());
2411 rb->lcd_putsxy(0, 20, stg);
2412 rb->lcd_update();
2413 rb->sleep(5*HZ);
2416 rb->lcd_clear_display();
2417 rb->snprintf(stg, 30, " Conversion: %ld.%02lds ", tim/100, tim%100);
2418 rb->lcd_putsxy(0, 30, stg);
2419 tim = frames * SAMP_PER_FRAME * 100 / 44100; /* unit=.01s */
2420 rb->snprintf(stg, 30, " WAV-Length: %ld.%02lds ", tim/100, tim%100);
2421 rb->lcd_putsxy(0, 20, stg);
2422 rb->lcd_update();
2423 rb->sleep(5*HZ);
2426 rb->lcd_setfont(FONT_UI);
2427 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
2428 rb->cpu_boost(false);
2429 #endif
2430 return PLUGIN_OK;