New makefile solution: A single invocation of 'make' to build the entire tree. Fully...
[kugel-rb.git] / apps / plugins / mp3_encoder.c
blobe04d3d0357ea5566c7fdcea0aba81122e954fd79
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 <inttypes.h>
15 #include "plugin.h"
17 PLUGIN_HEADER
18 PLUGIN_IRAM_DECLARE
20 static const struct plugin_api* rb;
22 MEM_FUNCTION_WRAPPERS(rb);
24 #define SAMP_PER_FRAME 1152
25 #define SAMPL2 576
26 #define SBLIMIT 32
27 #define HTN 16
28 #define putlong(c, s) if(s+sz <= 32) { cc = (cc << s) | c; sz+= s; } \
29 else { putbits(cc, sz); cc = c; sz = s; }
31 enum e_byte_order { order_unknown, order_bigEndian, order_littleEndian };
33 typedef struct {
34 int type; /* 0=(MPEG2 - 22.05,24,16kHz) 1=(MPEG1 - 44.1,48,32kHz) */
35 int mode; /* 0=stereo, 1=jstereo, 2=dual, 3=mono */
36 int bitrate;
37 int padding;
38 int num_bands;
39 long bitr_id;
40 int smpl_id;
41 } mpeg_t;
43 /* Side information */
44 typedef struct {
45 uint32_t part2_3_length;
46 int count1; /* number of 0-1-quadruples */
47 uint32_t global_gain;
48 uint32_t table_select[4];
49 uint32_t region_0_1;
50 uint32_t address1;
51 uint32_t address2;
52 uint32_t address3;
53 long quantStep;
54 long additStep;
55 uint32_t max_val;
56 } side_info_t;
58 typedef struct {
59 enum e_byte_order byte_order;
60 side_info_t cod_info[2][2];
61 mpeg_t mpg;
62 long frac_per_frame;
63 long byte_per_frame;
64 long slot_lag;
65 int sideinfo_len;
66 int mean_bits;
67 int ResvSize;
68 int channels;
69 int granules;
70 int resample;
71 long samplerate;
72 } config_t;
74 typedef struct {
75 int bitpos; /* current bitpos for writing */
76 uint32_t bbuf[263];
77 } BF_Data;
79 struct huffcodetab {
80 int len; /* max. index */
81 const uint8_t *table; /* pointer to array[len][len] */
82 const uint8_t *hlen; /* pointer to array[len][len] */
85 struct huffcodebig {
86 int len; /* max. index */
87 int linbits; /* number of linbits */
88 int linmax; /* max number stored in linbits */
91 #define shft4(x) ((x + 8) >> 4)
92 #define shft9(x) ((x + 256) >> 9)
93 #define shft13(x) ((x + 4096) >> 13)
94 #define shft15(x) ((x + 16384) >> 15)
95 #define shft16(x) ((x + 32768) >> 16)
96 #define shft_n(x,n) ((x) >> n)
97 #define SQRT 724 /* sqrt(2) * 512 */
99 static short mfbuf [2*(1152+512)] IBSS_ATTR; /* 3328 Bytes */
100 static int sb_data [2][2][18][SBLIMIT] IBSS_ATTR; /* 13824 Bytes */
101 static int mdct_freq [SAMPL2] IBSS_ATTR; /* 2304 Bytes */
102 static char mdct_sign [SAMPL2] IBSS_ATTR; /* 576 Bytes */
103 static short enc_data [SAMPL2] IBSS_ATTR; /* 1152 Bytes */
104 static uint32_t scalefac [23] IBSS_ATTR; /* 92 Bytes */
105 static BF_Data CodedData IBSS_ATTR; /* 1056 Bytes */
106 static int ca [8] IBSS_ATTR; /* 32 Bytes */
107 static int cs [8] IBSS_ATTR; /* 32 Bytes */
108 static int cx [9] IBSS_ATTR; /* 36 Bytes */
109 static int win [18][4] IBSS_ATTR; /* 288 Bytes */
110 static short enwindow [15*27+24] IBSS_ATTR; /* 862 Bytes */
111 static short int2idx [4096] IBSS_ATTR; /* 8192 Bytes */
112 static uint8_t ht_count [2][2][16] IBSS_ATTR; /* 64 Bytes */
113 static uint32_t tab01 [ 16] IBSS_ATTR; /* 64 Bytes */
114 static uint32_t tab23 [ 9] IBSS_ATTR; /* 36 Bytes */
115 static uint32_t tab56 [ 16] IBSS_ATTR; /* 64 Bytes */
116 static uint32_t tab1315 [256] IBSS_ATTR; /* 1024 Bytes */
117 static uint32_t tab1624 [256] IBSS_ATTR; /* 1024 Bytes */
118 static uint32_t tab789 [ 36] IBSS_ATTR; /* 144 Bytes */
119 static uint32_t tabABC [ 64] IBSS_ATTR; /* 256 Bytes */
120 static uint8_t t1HB [ 4] IBSS_ATTR;
121 static uint8_t t2HB [ 9] IBSS_ATTR;
122 static uint8_t t3HB [ 9] IBSS_ATTR;
123 static uint8_t t5HB [ 16] IBSS_ATTR;
124 static uint8_t t6HB [ 16] IBSS_ATTR;
125 static uint8_t t7HB [ 36] IBSS_ATTR;
126 static uint8_t t8HB [ 36] IBSS_ATTR;
127 static uint8_t t9HB [ 36] IBSS_ATTR;
128 static uint8_t t10HB [ 64] IBSS_ATTR;
129 static uint8_t t11HB [ 64] IBSS_ATTR;
130 static uint8_t t12HB [ 64] IBSS_ATTR;
131 static uint8_t t13HB [256] IBSS_ATTR;
132 static uint8_t t15HB [256] IBSS_ATTR;
133 static uint16_t t16HB [256] IBSS_ATTR;
134 static uint16_t t24HB [256] IBSS_ATTR;
135 static uint8_t t1l [ 8] IBSS_ATTR;
136 static uint8_t t2l [ 9] IBSS_ATTR;
137 static uint8_t t3l [ 9] IBSS_ATTR;
138 static uint8_t t5l [ 16] IBSS_ATTR;
139 static uint8_t t6l [ 16] IBSS_ATTR;
140 static uint8_t t7l [ 36] IBSS_ATTR;
141 static uint8_t t8l [ 36] IBSS_ATTR;
142 static uint8_t t9l [ 36] IBSS_ATTR;
143 static uint8_t t10l [ 64] IBSS_ATTR;
144 static uint8_t t11l [ 64] IBSS_ATTR;
145 static uint8_t t12l [ 64] IBSS_ATTR;
146 static uint8_t t13l [256] IBSS_ATTR;
147 static uint8_t t15l [256] IBSS_ATTR;
148 static uint8_t t16l [256] IBSS_ATTR;
149 static uint8_t t24l [256] IBSS_ATTR;
150 static struct huffcodetab ht [HTN] IBSS_ATTR;
152 static const uint8_t ht_count_const[2][2][16] =
153 { { { 1, 5, 4, 5, 6, 5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1 }, /* table0 */
154 { 1, 5, 5, 7, 5, 8, 7, 9, 5, 7, 7, 9, 7, 9, 9,10 } }, /* hleng0 */
155 { {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, /* table1 */
156 { 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 } } }; /* hleng1 */
158 static const uint8_t t1HB_const[4] = {1,1,1,0};
159 static const uint8_t t2HB_const[9] = {1,2,1,3,1,1,3,2,0};
160 static const uint8_t t3HB_const[9] = {3,2,1,1,1,1,3,2,0};
161 static const uint8_t t5HB_const[16] = {1,2,6,5,3,1,4,4,7,5,7,1,6,1,1,0};
162 static const uint8_t t6HB_const[16] = {7,3,5,1,6,2,3,2,5,4,4,1,3,3,2,0};
164 static const uint8_t t7HB_const[36] =
165 { 1, 2,10,19,16,10, 3, 3, 7,10, 5, 3,11, 4,13,17, 8, 4,
166 12,11,18,15,11, 2, 7, 6, 9,14, 3, 1, 6, 4, 5, 3, 2, 0 };
168 static const uint8_t t8HB_const[36] =
169 { 3, 4, 6,18,12, 5, 5, 1, 2,16, 9, 3, 7, 3, 5,14, 7, 3,
170 19,17,15,13,10, 4,13, 5, 8,11, 5, 1,12, 4, 4, 1, 1, 0 };
172 static const uint8_t t9HB_const[36] =
173 { 7, 5, 9,14,15, 7, 6, 4, 5, 5, 6, 7, 7, 6, 8, 8, 8, 5,
174 15, 6, 9,10, 5, 1,11, 7, 9, 6, 4, 1,14, 4, 6, 2, 6, 0 };
176 static const uint8_t t10HB_const[64] =
177 {1,2,10,23,35,30,12,17,3,3,8,12,18,21,12,7,11,9,15,21,32,
178 40,19,6,14,13,22,34,46,23,18,7,20,19,33,47,27,22,9,3,31,22,
179 41,26,21,20,5,3,14,13,10,11,16,6,5,1,9,8,7,8,4,4,2,0 };
181 static const uint8_t t11HB_const[64] =
182 {3,4,10,24,34,33,21,15,5,3,4,10,32,17,11,10,11,7,13,18,30,
183 31,20,5,25,11,19,59,27,18,12,5,35,33,31,58,30,16,7,5,28,26,
184 32,19,17,15,8,14,14,12,9,13,14,9,4,1,11,4,6,6,6,3,2,0 };
186 static const uint8_t t12HB_const[64] =
187 {9,6,16,33,41,39,38,26,7,5,6,9,23,16,26,11,17,7,11,14,21,
188 30,10,7,17,10,15,12,18,28,14,5,32,13,22,19,18,16,9,5,40,17,
189 31,29,17,13,4,2,27,12,11,15,10,7,4,1,27,12,8,12,6,3,1,0 };
191 static const uint8_t t13HB_const[256] =
192 {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,
193 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,
194 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,
195 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,
196 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,
197 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,
198 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,
199 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,
200 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,
201 10,6,1,4,2,16,15,17,27,25,20,29,11,17,12,16,8,1,1,0,1 };
203 static const uint8_t t15HB_const[256] =
204 {7,12,18,53,47,76,124,108,89,123,108,119,107,81,122,63,13,5,16,27,46,36,61,51,
205 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,
206 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,
207 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,
208 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,
209 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,
210 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,
211 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,
212 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,
213 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};
215 static const uint16_t t16HB_const[256] =
216 {1,5,14,44,74,63,110,93,172,149,138,242,225,195,376,17,3,4,12,20,35,62,53,47,
217 83,75,68,119,201,107,207,9,15,13,23,38,67,58,103,90,161,72,127,117,110,209,
218 206,16,45,21,39,69,64,114,99,87,158,140,252,212,199,387,365,26,75,36,68,65,
219 115,101,179,164,155,264,246,226,395,382,362,9,66,30,59,56,102,185,173,265,142,
220 253,232,400,388,378,445,16,111,54,52,100,184,178,160,133,257,244,228,217,385,
221 366,715,10,98,48,91,88,165,157,148,261,248,407,397,372,380,889,884,8,85,84,81,
222 159,156,143,260,249,427,401,392,383,727,713,708,7,154,76,73,141,131,256,245,
223 426,406,394,384,735,359,710,352,11,139,129,67,125,247,233,229,219,393,743,737,
224 720,885,882,439,4,243,120,118,115,227,223,396,746,742,736,721,712,706,223,436,
225 6,202,224,222,218,216,389,386,381,364,888,443,707,440,437,1728,4,747,211,210,
226 208,370,379,734,723,714,1735,883,877,876,3459,865,2,377,369,102,187,726,722,
227 358,711,709,866,1734,871,3458,870,434,0,12,10,7,11,10,17,11,9,13,12,10,7,5,3,
228 1,3};
230 static const uint16_t t24HB_const[256] =
231 {15,13,46,80,146,262,248,434,426,669,653,649,621,517,1032,88,14,12,21,38,71,
232 130,122,216,209,198,327,345,319,297,279,42,47,22,41,74,68,128,120,221,207,194,
233 182,340,315,295,541,18,81,39,75,70,134,125,116,220,204,190,178,325,311,293,
234 271,16,147,72,69,135,127,118,112,210,200,188,352,323,306,285,540,14,263,66,
235 129,126,119,114,214,202,192,180,341,317,301,281,262,12,249,123,121,117,113,
236 215,206,195,185,347,330,308,291,272,520,10,435,115,111,109,211,203,196,187,
237 353,332,313,298,283,531,381,17,427,212,208,205,201,193,186,177,169,320,303,
238 286,268,514,377,16,335,199,197,191,189,181,174,333,321,305,289,275,521,379,
239 371,11,668,184,183,179,175,344,331,314,304,290,277,530,383,373,366,10,652,346,
240 171,168,164,318,309,299,287,276,263,513,375,368,362,6,648,322,316,312,307,302,
241 292,284,269,261,512,376,370,364,359,4,620,300,296,294,288,282,273,266,515,380,
242 374,369,365,361,357,2,1033,280,278,274,267,264,259,382,378,372,367,363,360,
243 358,356,0,43,20,19,17,15,13,11,9,7,6,4,7,5,3,1,3};
245 static const uint32_t tab1315_const[256] =
246 { 0x010003,0x050005,0x070006,0x080008,0x090008,0x0a0009,0x0a000a,0x0b000a,
247 0x0a000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0d000c,0x0e000d,0x0e000e,
248 0x040005,0x060005,0x080007,0x090008,0x0a0009,0x0a0009,0x0b000a,0x0b000a,
249 0x0b000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0e000c,0x0e000d,0x0e000d,
250 0x070006,0x080007,0x090007,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,
251 0x0b000a,0x0c000b,0x0c000b,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d,
252 0x080007,0x090008,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0c000b,
253 0x0c000b,0x0d000b,0x0d000c,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d,
254 0x090008,0x090008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0d000b,0x0d000b,
255 0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000d,
256 0x0a0009,0x0a0009,0x0b0009,0x0c000a,0x0c000a,0x0c000a,0x0d000b,0x0d000b,
257 0x0d000b,0x0d000b,0x0e000c,0x0d000c,0x0f000d,0x0f000d,0x10000d,0x10000e,
258 0x0a000a,0x0b0009,0x0c000a,0x0c000a,0x0d000a,0x0d000b,0x0d000b,0x0d000b,
259 0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x10000e,
260 0x0b000a,0x0b000a,0x0c000a,0x0d000b,0x0d000b,0x0d000b,0x0e000b,0x0e000c,
261 0x0e000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x12000d,0x12000e,
262 0x0a000a,0x0a000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0e000c,
263 0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x11000e,0x11000e,
264 0x0b000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0d000c,0x0f000c,
265 0x0e000c,0x0f000d,0x0f000d,0x10000d,0x10000d,0x10000e,0x12000e,0x11000e,
266 0x0b000b,0x0c000b,0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000c,
267 0x0e000c,0x0f000d,0x10000d,0x0f000d,0x10000d,0x11000e,0x12000f,0x13000e,
268 0x0c000b,0x0c000b,0x0c000b,0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0e000c,
269 0x0f000d,0x0f000d,0x0f000d,0x10000d,0x11000e,0x11000e,0x11000e,0x12000f,
270 0x0c000c,0x0d000c,0x0d000b,0x0e000c,0x0e000c,0x0f000c,0x0e000d,0x0f000d,
271 0x10000d,0x10000d,0x11000d,0x11000d,0x11000e,0x12000e,0x12000f,0x12000f,
272 0x0d000c,0x0d000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x10000d,
273 0x10000d,0x10000e,0x10000e,0x11000e,0x12000e,0x11000e,0x12000f,0x12000f,
274 0x0e000d,0x0e000d,0x0e000d,0x0f000d,0x0f000d,0x0f000d,0x11000d,0x10000d,
275 0x10000e,0x13000e,0x11000e,0x11000e,0x11000f,0x13000f,0x12000e,0x12000f,
276 0x0d000d,0x0e000d,0x0f000d,0x10000d,0x10000d,0x10000d,0x11000d,0x10000e,
277 0x11000e,0x11000e,0x12000e,0x12000e,0x15000f,0x14000f,0x15000f,0x12000f };
279 static const uint32_t tab01_const[16] =
280 { 0x10004,0x50005,0x50005,0x70006,0x50005,0x80006,0x70006,0x90007,
281 0x50005,0x70006,0x70006,0x90007,0x70006,0x90007,0x90007,0xa0008 };
283 static const uint32_t tab23_const[ 9] =
284 { 0x10002,0x40003,0x70007,0x40004,0x50004,0x70007,0x60006,0x70007,0x80008 };
286 static const uint32_t tab56_const[16] =
287 { 0x10003,0x40004,0x70006,0x80008,0x40004,0x50004,0x80006,0x90007,
288 0x70005,0x80006,0x90007,0xa0008,0x80007,0x80007,0x90008,0xa0009 };
290 static const uint32_t tab789_const[36] =
291 {0x00100803,0x00401004,0x00701c06,0x00902407,0x00902409,0x00a0280a,0x00401004,
292 0x00601005,0x00801806,0x00902807,0x00902808,0x00a0280a,0x00701c05,0x00701806,
293 0x00902007,0x00a02808,0x00a02809,0x00b02c0a,0x00802407,0x00902807,0x00a02808,
294 0x00b02c09,0x00b02c09,0x00b0300a,0x00802408,0x00902408,0x00a02809,0x00b02c09,
295 0x00b0300a,0x00c0300b,0x00902809,0x00a02809,0x00b02c0a,0x00c02c0a,0x00c0340b,
296 0x00c0340b};
298 static const uint32_t tabABC_const[64] =
299 {0x00100804,0x00401004,0x00701806,0x00902008,0x00a02409,0x00a0280a,0x00a0240a,
300 0x00b0280a,0x00401004,0x00601405,0x00801806,0x00902007,0x00a02809,0x00b02809,
301 0x00a0240a,0x00a0280a,0x00701806,0x00801c06,0x00902007,0x00a02408,0x00b02809,
302 0x00c02c0a,0x00b02809,0x00b0280a,0x00802007,0x00902007,0x00a02408,0x00b02c08,
303 0x00c02809,0x00c0300a,0x00b0280a,0x00c02c0a,0x00902408,0x00a02808,0x00b02809,
304 0x00c02c09,0x00c02c0a,0x00c0300a,0x00c02c0a,0x00c0300b,0x00a02409,0x00b02809,
305 0x00c02c0a,0x00c0300a,0x00d0300a,0x00d0340b,0x00c0300a,0x00d0340b,0x00902409,
306 0x00a02409,0x00b02409,0x00c0280a,0x00c02c0a,0x00c0300b,0x00d0300b,0x00d0300c,
307 0x00a0240a,0x00a0240a,0x00b0280a,0x00c02c0b,0x00c0300b,0x00d0300b,0x00d0300b,
308 0x00d0300c};
310 static const uint32_t tab1624_const[256] =
311 {0x00010004,0x00050005,0x00070007,0x00090008,0x000a0009,0x000a000a,0x000b000a,
312 0x000b000b,0x000c000b,0x000c000c,0x000c000c,0x000d000c,0x000d000c,0x000d000c,
313 0x000e000d,0x000a000a,0x00040005,0x00060006,0x00080007,0x00090008,0x000a0009,
314 0x000b000a,0x000b000a,0x000b000b,0x000c000b,0x000c000b,0x000c000c,0x000d000c,
315 0x000e000c,0x000d000c,0x000e000c,0x000a000a,0x00070007,0x00080007,0x00090008,
316 0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000b,0x000d000b,0x000c000b,
317 0x000d000b,0x000d000c,0x000d000c,0x000e000c,0x000e000d,0x000b0009,0x00090008,
318 0x00090008,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a,0x000c000b,
319 0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c,0x000f000c,
320 0x000c0009,0x000a0009,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a,
321 0x000d000a,0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c,
322 0x000f000c,0x000f000d,0x000b0009,0x000a000a,0x000a0009,0x000b000a,0x000b000a,
323 0x000c000a,0x000d000a,0x000d000b,0x000e000b,0x000d000b,0x000e000b,0x000e000c,
324 0x000f000c,0x000f000c,0x000f000c,0x0010000c,0x000c0009,0x000b000a,0x000b000a,
325 0x000b000a,0x000c000a,0x000d000a,0x000d000b,0x000d000b,0x000d000b,0x000e000b,
326 0x000e000c,0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000d,0x000c0009,
327 0x000b000b,0x000b000a,0x000c000a,0x000c000a,0x000d000b,0x000d000b,0x000d000b,
328 0x000e000b,0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000d,
329 0x0011000d,0x000c000a,0x000b000b,0x000c000b,0x000c000b,0x000d000b,0x000d000b,
330 0x000d000b,0x000e000b,0x000e000b,0x000f000b,0x000f000c,0x000f000c,0x000f000c,
331 0x0010000c,0x0010000d,0x0010000d,0x000c000a,0x000c000b,0x000c000b,0x000c000b,
332 0x000d000b,0x000d000b,0x000e000b,0x000e000b,0x000f000c,0x000f000c,0x000f000c,
333 0x000f000c,0x0010000c,0x000f000d,0x0010000d,0x000f000d,0x000d000a,0x000c000c,
334 0x000d000b,0x000c000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000e000c,
335 0x000f000c,0x0010000c,0x0010000c,0x0010000d,0x0011000d,0x0011000d,0x0010000d,
336 0x000c000a,0x000d000c,0x000d000c,0x000d000b,0x000d000b,0x000e000b,0x000e000c,
337 0x000f000c,0x0010000c,0x0010000c,0x0010000c,0x0010000c,0x0010000d,0x0010000d,
338 0x000f000d,0x0010000d,0x000d000a,0x000d000c,0x000e000c,0x000e000c,0x000e000c,
339 0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000c,0x0010000d,
340 0x0010000d,0x0010000d,0x0010000d,0x0012000d,0x000d000a,0x000f000c,0x000e000c,
341 0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000c,0x0010000c,0x0010000d,
342 0x0012000d,0x0011000d,0x0011000d,0x0011000d,0x0013000d,0x0011000d,0x000d000a,
343 0x000e000d,0x000f000c,0x000d000c,0x000e000c,0x0010000c,0x0010000c,0x000f000c,
344 0x0010000d,0x0010000d,0x0011000d,0x0012000d,0x0011000d,0x0013000d,0x0011000d,
345 0x0010000d,0x000d000a,0x000a0009,0x000a0009,0x000a0009,0x000b0009,0x000b0009,
346 0x000c0009,0x000c0009,0x000c0009,0x000d0009,0x000d0009,0x000d0009,0x000d000a,
347 0x000d000a,0x000d000a,0x000d000a,0x000a0006};
349 static const uint8_t t1l_const[8] = {1,3,2,3,1,4,3,5};
350 static const uint8_t t2l_const[9] = {1,3,6,3,3,5,5,5,6};
351 static const uint8_t t3l_const[9] = {2,2,6,3,2,5,5,5,6};
352 static const uint8_t t5l_const[16] = {1,3,6,7,3,3,6,7,6,6,7,8,7,6,7,8};
353 static const uint8_t t6l_const[16] = {3,3,5,7,3,2,4,5,4,4,5,6,6,5,6,7};
355 static const uint8_t t7l_const[36] =
356 {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};
358 static const uint8_t t8l_const[36] =
359 {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};
361 static const uint8_t t9l_const[36] =
362 {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};
364 static const uint8_t t10l_const[64] =
365 {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,
366 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};
368 static const uint8_t t11l_const[64] =
369 {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,
370 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};
372 static const uint8_t t12l_const[64] =
373 {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,
374 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};
376 static const uint8_t t13l_const[256] =
377 {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,
378 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,
379 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,
380 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,
381 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,
382 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,
383 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,
384 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,
385 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,
386 15,15,16,16,19,18,19,16};
388 static const uint8_t t15l_const[256] =
389 {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,
390 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,
391 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,
392 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,
393 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,
394 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,
395 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,
396 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,
397 13,12,11,11,11,11,11,11,12,12,12,12,12,13,13,13,13};
399 static const uint8_t t16l_const[256] =
400 {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,
401 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,
402 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,
403 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,
404 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,
405 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,
406 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,
407 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,
408 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,
409 11,11,11,11,11,11,11,8};
411 static const uint8_t t24l_const[256] =
412 {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,
413 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,
414 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,
415 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,
416 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,
417 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,
418 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,
419 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,
420 7,7,7,7,7,7,8,8,8,8,4};
422 static const struct huffcodetab ht_const[HTN] =
423 { { 0, NULL, NULL}, /* Apparently not used */
424 { 2, t1HB, t1l},
425 { 3, t2HB, t2l},
426 { 3, t3HB, t3l},
427 { 0, NULL, NULL}, /* Apparently not used */
428 { 4, t5HB, t5l},
429 { 4, t6HB, t6l},
430 { 6, t7HB, t7l},
431 { 6, t8HB, t8l},
432 { 6, t9HB, t9l},
433 { 8, t10HB, t10l},
434 { 8, t11HB, t11l},
435 { 8, t12HB, t12l},
436 {16, t13HB, t13l},
437 { 0, NULL, NULL}, /* Apparently not used */
438 {16, t15HB, t15l} };
440 static const struct huffcodebig ht_big[HTN] =
441 { { 16, 1, 1 },
442 { 16, 2, 3 },
443 { 16, 3, 7 },
444 { 16, 4, 15 },
445 { 16, 6, 63 },
446 { 16, 8, 255 },
447 { 16, 10, 1023 },
448 { 16, 13, 8191 },
449 { 16, 4, 15 },
450 { 16, 5, 31 },
451 { 16, 6, 63 },
452 { 16, 7, 127 },
453 { 16, 8, 255 },
454 { 16, 9, 511 },
455 { 16, 11, 2047 },
456 { 16, 13, 8191 } };
458 static const struct
460 uint32_t region0_cnt;
461 uint32_t region1_cnt;
462 } subdv_table[23] =
463 { {0, 0}, /* 0 bands */
464 {0, 0}, /* 1 bands */
465 {0, 0}, /* 2 bands */
466 {0, 0}, /* 3 bands */
467 {0, 0}, /* 4 bands */
468 {0, 1}, /* 5 bands */
469 {1, 1}, /* 6 bands */
470 {1, 1}, /* 7 bands */
471 {1, 2}, /* 8 bands */
472 {2, 2}, /* 9 bands */
473 {2, 3}, /* 10 bands */
474 {2, 3}, /* 11 bands */
475 {3, 4}, /* 12 bands */
476 {3, 4}, /* 13 bands */
477 {3, 4}, /* 14 bands */
478 {4, 5}, /* 15 bands */
479 {4, 5}, /* 16 bands */
480 {4, 6}, /* 17 bands */
481 {5, 6}, /* 18 bands */
482 {5, 6}, /* 19 bands */
483 {5, 7}, /* 20 bands */
484 {6, 7}, /* 21 bands */
485 {6, 7}, /* 22 bands */
488 static const uint32_t sfBand[6][23] =
490 /* Table B.2.b: 22.05 kHz */
491 {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
492 /* Table B.2.c: 24 kHz */
493 {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576},
494 /* Table B.2.a: 16 kHz */
495 {0,6,12,18,24,30,36,44,45,66,80,96,116,140,168,200,238,248,336,396,464,522,576},
496 /* Table B.8.b: 44.1 kHz */
497 {0,4, 8,12,16,20,24,30,36,44,52,62, 74, 90,110,134,162,196,238,288,342,418,576},
498 /* Table B.8.c: 48 kHz */
499 {0,4, 8,12,16,20,24,30,36,42,50,60, 72, 88,106,128,156,190,230,276,330,384,576},
500 /* Table B.8.a: 32 kHz */
501 {0,4, 8,12,16,20,24,30,36,44,54,66, 82,102,126,156,194,240,296,364,448,550,576} };
504 static const short int2idx_const[4096] = /* int2idx[i] = sqrt(i*sqrt(i)); */
506 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9,
507 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16,
508 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21,
509 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26,
510 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
511 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36,
512 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40,
513 41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45,
514 45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49,
515 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53,
516 53, 53, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 57, 57, 57,
517 57, 57, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 61, 61,
518 61, 61, 61, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 65,
519 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68,
520 68, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 72, 72, 72,
521 72, 72, 72, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75,
522 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 79, 79, 79,
523 79, 79, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82,
524 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 86, 86, 86,
525 86, 86, 86, 87, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89,
526 89, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 93,
527 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 96, 96, 96,
528 96, 96, 96, 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99,
529 99, 99,100,100,100,100,100,100,101,101,101,101,101,101,102,102,102,102,102,102,
530 103,103,103,103,103,103,104,104,104,104,104,104,104,105,105,105,105,105,105,106,
531 106,106,106,106,106,107,107,107,107,107,107,107,108,108,108,108,108,108,109,109,
532 109,109,109,109,110,110,110,110,110,110,110,111,111,111,111,111,111,112,112,112,
533 112,112,112,112,113,113,113,113,113,113,114,114,114,114,114,114,115,115,115,115,
534 115,115,115,116,116,116,116,116,116,117,117,117,117,117,117,117,118,118,118,118,
535 118,118,118,119,119,119,119,119,119,120,120,120,120,120,120,120,121,121,121,121,
536 121,121,122,122,122,122,122,122,122,123,123,123,123,123,123,123,124,124,124,124,
537 124,124,125,125,125,125,125,125,125,126,126,126,126,126,126,126,127,127,127,127,
538 127,127,128,128,128,128,128,128,128,129,129,129,129,129,129,129,130,130,130,130,
539 130,130,131,131,131,131,131,131,131,132,132,132,132,132,132,132,133,133,133,133,
540 133,133,133,134,134,134,134,134,134,134,135,135,135,135,135,135,136,136,136,136,
541 136,136,136,137,137,137,137,137,137,137,138,138,138,138,138,138,138,139,139,139,
542 139,139,139,139,140,140,140,140,140,140,140,141,141,141,141,141,141,141,142,142,
543 142,142,142,142,142,143,143,143,143,143,143,143,144,144,144,144,144,144,144,145,
544 145,145,145,145,145,145,146,146,146,146,146,146,146,147,147,147,147,147,147,147,
545 148,148,148,148,148,148,148,149,149,149,149,149,149,149,150,150,150,150,150,150,
546 150,151,151,151,151,151,151,151,152,152,152,152,152,152,152,153,153,153,153,153,
547 153,153,154,154,154,154,154,154,154,154,155,155,155,155,155,155,155,156,156,156,
548 156,156,156,156,157,157,157,157,157,157,157,158,158,158,158,158,158,158,159,159,
549 159,159,159,159,159,160,160,160,160,160,160,160,160,161,161,161,161,161,161,161,
550 162,162,162,162,162,162,162,163,163,163,163,163,163,163,163,164,164,164,164,164,
551 164,164,165,165,165,165,165,165,165,166,166,166,166,166,166,166,167,167,167,167,
552 167,167,167,167,168,168,168,168,168,168,168,169,169,169,169,169,169,169,169,170,
553 170,170,170,170,170,170,171,171,171,171,171,171,171,172,172,172,172,172,172,172,
554 172,173,173,173,173,173,173,173,174,174,174,174,174,174,174,174,175,175,175,175,
555 175,175,175,176,176,176,176,176,176,176,176,177,177,177,177,177,177,177,178,178,
556 178,178,178,178,178,178,179,179,179,179,179,179,179,180,180,180,180,180,180,180,
557 180,181,181,181,181,181,181,181,182,182,182,182,182,182,182,182,183,183,183,183,
558 183,183,183,184,184,184,184,184,184,184,184,185,185,185,185,185,185,185,186,186,
559 186,186,186,186,186,186,187,187,187,187,187,187,187,187,188,188,188,188,188,188,
560 188,189,189,189,189,189,189,189,189,190,190,190,190,190,190,190,190,191,191,191,
561 191,191,191,191,192,192,192,192,192,192,192,192,193,193,193,193,193,193,193,193,
562 194,194,194,194,194,194,194,195,195,195,195,195,195,195,195,196,196,196,196,196,
563 196,196,196,197,197,197,197,197,197,197,197,198,198,198,198,198,198,198,199,199,
564 199,199,199,199,199,199,200,200,200,200,200,200,200,200,201,201,201,201,201,201,
565 201,201,202,202,202,202,202,202,202,202,203,203,203,203,203,203,203,204,204,204,
566 204,204,204,204,204,205,205,205,205,205,205,205,205,206,206,206,206,206,206,206,
567 206,207,207,207,207,207,207,207,207,208,208,208,208,208,208,208,208,209,209,209,
568 209,209,209,209,209,210,210,210,210,210,210,210,210,211,211,211,211,211,211,211,
569 211,212,212,212,212,212,212,212,212,213,213,213,213,213,213,213,213,214,214,214,
570 214,214,214,214,214,215,215,215,215,215,215,215,215,216,216,216,216,216,216,216,
571 216,217,217,217,217,217,217,217,217,218,218,218,218,218,218,218,218,219,219,219,
572 219,219,219,219,219,220,220,220,220,220,220,220,220,221,221,221,221,221,221,221,
573 221,222,222,222,222,222,222,222,222,223,223,223,223,223,223,223,223,224,224,224,
574 224,224,224,224,224,225,225,225,225,225,225,225,225,226,226,226,226,226,226,226,
575 226,227,227,227,227,227,227,227,227,228,228,228,228,228,228,228,228,229,229,229,
576 229,229,229,229,229,229,230,230,230,230,230,230,230,230,231,231,231,231,231,231,
577 231,231,232,232,232,232,232,232,232,232,233,233,233,233,233,233,233,233,234,234,
578 234,234,234,234,234,234,234,235,235,235,235,235,235,235,235,236,236,236,236,236,
579 236,236,236,237,237,237,237,237,237,237,237,238,238,238,238,238,238,238,238,238,
580 239,239,239,239,239,239,239,239,240,240,240,240,240,240,240,240,241,241,241,241,
581 241,241,241,241,242,242,242,242,242,242,242,242,242,243,243,243,243,243,243,243,
582 243,244,244,244,244,244,244,244,244,245,245,245,245,245,245,245,245,245,246,246,
583 246,246,246,246,246,246,247,247,247,247,247,247,247,247,248,248,248,248,248,248,
584 248,248,248,249,249,249,249,249,249,249,249,250,250,250,250,250,250,250,250,250,
585 251,251,251,251,251,251,251,251,252,252,252,252,252,252,252,252,253,253,253,253,
586 253,253,253,253,253,254,254,254,254,254,254,254,254,255,255,255,255,255,255,255,
587 255,255,256,256,256,256,256,256,256,256,257,257,257,257,257,257,257,257,257,258,
588 258,258,258,258,258,258,258,259,259,259,259,259,259,259,259,259,260,260,260,260,
589 260,260,260,260,261,261,261,261,261,261,261,261,261,262,262,262,262,262,262,262,
590 262,263,263,263,263,263,263,263,263,263,264,264,264,264,264,264,264,264,265,265,
591 265,265,265,265,265,265,265,266,266,266,266,266,266,266,266,267,267,267,267,267,
592 267,267,267,267,268,268,268,268,268,268,268,268,268,269,269,269,269,269,269,269,
593 269,270,270,270,270,270,270,270,270,270,271,271,271,271,271,271,271,271,271,272,
594 272,272,272,272,272,272,272,273,273,273,273,273,273,273,273,273,274,274,274,274,
595 274,274,274,274,275,275,275,275,275,275,275,275,275,276,276,276,276,276,276,276,
596 276,276,277,277,277,277,277,277,277,277,277,278,278,278,278,278,278,278,278,279,
597 279,279,279,279,279,279,279,279,280,280,280,280,280,280,280,280,280,281,281,281,
598 281,281,281,281,281,282,282,282,282,282,282,282,282,282,283,283,283,283,283,283,
599 283,283,283,284,284,284,284,284,284,284,284,284,285,285,285,285,285,285,285,285,
600 286,286,286,286,286,286,286,286,286,287,287,287,287,287,287,287,287,287,288,288,
601 288,288,288,288,288,288,288,289,289,289,289,289,289,289,289,289,290,290,290,290,
602 290,290,290,290,291,291,291,291,291,291,291,291,291,292,292,292,292,292,292,292,
603 292,292,293,293,293,293,293,293,293,293,293,294,294,294,294,294,294,294,294,294,
604 295,295,295,295,295,295,295,295,295,296,296,296,296,296,296,296,296,296,297,297,
605 297,297,297,297,297,297,297,298,298,298,298,298,298,298,298,299,299,299,299,299,
606 299,299,299,299,300,300,300,300,300,300,300,300,300,301,301,301,301,301,301,301,
607 301,301,302,302,302,302,302,302,302,302,302,303,303,303,303,303,303,303,303,303,
608 304,304,304,304,304,304,304,304,304,305,305,305,305,305,305,305,305,305,306,306,
609 306,306,306,306,306,306,306,307,307,307,307,307,307,307,307,307,308,308,308,308,
610 308,308,308,308,308,309,309,309,309,309,309,309,309,309,310,310,310,310,310,310,
611 310,310,310,311,311,311,311,311,311,311,311,311,312,312,312,312,312,312,312,312,
612 312,313,313,313,313,313,313,313,313,313,314,314,314,314,314,314,314,314,314,315,
613 315,315,315,315,315,315,315,315,316,316,316,316,316,316,316,316,316,317,317,317,
614 317,317,317,317,317,317,318,318,318,318,318,318,318,318,318,318,319,319,319,319,
615 319,319,319,319,319,320,320,320,320,320,320,320,320,320,321,321,321,321,321,321,
616 321,321,321,322,322,322,322,322,322,322,322,322,323,323,323,323,323,323,323,323,
617 323,324,324,324,324,324,324,324,324,324,325,325,325,325,325,325,325,325,325,325,
618 326,326,326,326,326,326,326,326,326,327,327,327,327,327,327,327,327,327,328,328,
619 328,328,328,328,328,328,328,329,329,329,329,329,329,329,329,329,330,330,330,330,
620 330,330,330,330,330,330,331,331,331,331,331,331,331,331,331,332,332,332,332,332,
621 332,332,332,332,333,333,333,333,333,333,333,333,333,334,334,334,334,334,334,334,
622 334,334,335,335,335,335,335,335,335,335,335,335,336,336,336,336,336,336,336,336,
623 336,337,337,337,337,337,337,337,337,337,338,338,338,338,338,338,338,338,338,338,
624 339,339,339,339,339,339,339,339,339,340,340,340,340,340,340,340,340,340,341,341,
625 341,341,341,341,341,341,341,341,342,342,342,342,342,342,342,342,342,343,343,343,
626 343,343,343,343,343,343,344,344,344,344,344,344,344,344,344,344,345,345,345,345,
627 345,345,345,345,345,346,346,346,346,346,346,346,346,346,347,347,347,347,347,347,
628 347,347,347,347,348,348,348,348,348,348,348,348,348,349,349,349,349,349,349,349,
629 349,349,350,350,350,350,350,350,350,350,350,350,351,351,351,351,351,351,351,351,
630 351,352,352,352,352,352,352,352,352,352,352,353,353,353,353,353,353,353,353,353,
631 354,354,354,354,354,354,354,354,354,355,355,355,355,355,355,355,355,355,355,356,
632 356,356,356,356,356,356,356,356,357,357,357,357,357,357,357,357,357,357,358,358,
633 358,358,358,358,358,358,358,359,359,359,359,359,359,359,359,359,359,360,360,360,
634 360,360,360,360,360,360,361,361,361,361,361,361,361,361,361,361,362,362,362,362,
635 362,362,362,362,362,363,363,363,363,363,363,363,363,363,363,364,364,364,364,364,
636 364,364,364,364,365,365,365,365,365,365,365,365,365,365,366,366,366,366,366,366,
637 366,366,366,367,367,367,367,367,367,367,367,367,367,368,368,368,368,368,368,368,
638 368,368,369,369,369,369,369,369,369,369,369,369,370,370,370,370,370,370,370,370,
639 370,370,371,371,371,371,371,371,371,371,371,372,372,372,372,372,372,372,372,372,
640 372,373,373,373,373,373,373,373,373,373,374,374,374,374,374,374,374,374,374,374,
641 375,375,375,375,375,375,375,375,375,375,376,376,376,376,376,376,376,376,376,377,
642 377,377,377,377,377,377,377,377,377,378,378,378,378,378,378,378,378,378,379,379,
643 379,379,379,379,379,379,379,379,380,380,380,380,380,380,380,380,380,380,381,381,
644 381,381,381,381,381,381,381,382,382,382,382,382,382,382,382,382,382,383,383,383,
645 383,383,383,383,383,383,383,384,384,384,384,384,384,384,384,384,385,385,385,385,
646 385,385,385,385,385,385,386,386,386,386,386,386,386,386,386,386,387,387,387,387,
647 387,387,387,387,387,387,388,388,388,388,388,388,388,388,388,389,389,389,389,389,
648 389,389,389,389,389,390,390,390,390,390,390,390,390,390,390,391,391,391,391,391,
649 391,391,391,391,391,392,392,392,392,392,392,392,392,392,393,393,393,393,393,393,
650 393,393,393,393,394,394,394,394,394,394,394,394,394,394,395,395,395,395,395,395,
651 395,395,395,395,396,396,396,396,396,396,396,396,396,397,397,397,397,397,397,397,
652 397,397,397,398,398,398,398,398,398,398,398,398,398,399,399,399,399,399,399,399,
653 399,399,399,400,400,400,400,400,400,400,400,400,400,401,401,401,401,401,401,401,
654 401,401,402,402,402,402,402,402,402,402,402,402,403,403,403,403,403,403,403,403,
655 403,403,404,404,404,404,404,404,404,404,404,404,405,405,405,405,405,405,405,405,
656 405,405,406,406,406,406,406,406,406,406,406,406,407,407,407,407,407,407,407,407,
657 407,407,408,408,408,408,408,408,408,408,408,408,409,409,409,409,409,409,409,409,
658 409,410,410,410,410,410,410,410,410,410,410,411,411,411,411,411,411,411,411,411,
659 411,412,412,412,412,412,412,412,412,412,412,413,413,413,413,413,413,413,413,413,
660 413,414,414,414,414,414,414,414,414,414,414,415,415,415,415,415,415,415,415,415,
661 415,416,416,416,416,416,416,416,416,416,416,417,417,417,417,417,417,417,417,417,
662 417,418,418,418,418,418,418,418,418,418,418,419,419,419,419,419,419,419,419,419,
663 419,420,420,420,420,420,420,420,420,420,420,421,421,421,421,421,421,421,421,421,
664 421,422,422,422,422,422,422,422,422,422,422,423,423,423,423,423,423,423,423,423,
665 423,424,424,424,424,424,424,424,424,424,424,425,425,425,425,425,425,425,425,425,
666 425,426,426,426,426,426,426,426,426,426,426,427,427,427,427,427,427,427,427,427,
667 427,428,428,428,428,428,428,428,428,428,428,429,429,429,429,429,429,429,429,429,
668 429,430,430,430,430,430,430,430,430,430,430,431,431,431,431,431,431,431,431,431,
669 431,432,432,432,432,432,432,432,432,432,432,433,433,433,433,433,433,433,433,433,
670 433,434,434,434,434,434,434,434,434,434,434,435,435,435,435,435,435,435,435,435,
671 435,435,436,436,436,436,436,436,436,436,436,436,437,437,437,437,437,437,437,437,
672 437,437,438,438,438,438,438,438,438,438,438,438,439,439,439,439,439,439,439,439,
673 439,439,440,440,440,440,440,440,440,440,440,440,441,441,441,441,441,441,441,441,
674 441,441,442,442,442,442,442,442,442,442,442,442,443,443,443,443,443,443,443,443,
675 443,443,443,444,444,444,444,444,444,444,444,444,444,445,445,445,445,445,445,445,
676 445,445,445,446,446,446,446,446,446,446,446,446,446,447,447,447,447,447,447,447,
677 447,447,447,448,448,448,448,448,448,448,448,448,448,448,449,449,449,449,449,449,
678 449,449,449,449,450,450,450,450,450,450,450,450,450,450,451,451,451,451,451,451,
679 451,451,451,451,452,452,452,452,452,452,452,452,452,452,453,453,453,453,453,453,
680 453,453,453,453,453,454,454,454,454,454,454,454,454,454,454,455,455,455,455,455,
681 455,455,455,455,455,456,456,456,456,456,456,456,456,456,456,457,457,457,457,457,
682 457,457,457,457,457,457,458,458,458,458,458,458,458,458,458,458,459,459,459,459,
683 459,459,459,459,459,459,460,460,460,460,460,460,460,460,460,460,460,461,461,461,
684 461,461,461,461,461,461,461,462,462,462,462,462,462,462,462,462,462,463,463,463,
685 463,463,463,463,463,463,463,463,464,464,464,464,464,464,464,464,464,464,465,465,
686 465,465,465,465,465,465,465,465,466,466,466,466,466,466,466,466,466,466,466,467,
687 467,467,467,467,467,467,467,467,467,468,468,468,468,468,468,468,468,468,468,469,
688 469,469,469,469,469,469,469,469,469,469,470,470,470,470,470,470,470,470,470,470,
689 471,471,471,471,471,471,471,471,471,471,472,472,472,472,472,472,472,472,472,472,
690 472,473,473,473,473,473,473,473,473,473,473,474,474,474,474,474,474,474,474,474,
691 474,475,475,475,475,475,475,475,475,475,475,475,476,476,476,476,476,476,476,476,
692 476,476,477,477,477,477,477,477,477,477,477,477,477,478,478,478,478,478,478,478,
693 478,478,478,479,479,479,479,479,479,479,479,479,479,479,480,480,480,480,480,480,
694 480,480,480,480,481,481,481,481,481,481,481,481,481,481,482,482,482,482,482,482,
695 482,482,482,482,482,483,483,483,483,483,483,483,483,483,483,484,484,484,484,484,
696 484,484,484,484,484,484,485,485,485,485,485,485,485,485,485,485,486,486,486,486,
697 486,486,486,486,486,486,486,487,487,487,487,487,487,487,487,487,487,488,488,488,
698 488,488,488,488,488,488,488,488,489,489,489,489,489,489,489,489,489,489,490,490,
699 490,490,490,490,490,490,490,490,490,491,491,491,491,491,491,491,491,491,491,492,
700 492,492,492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493,493,493,
701 494,494,494,494,494,494,494,494,494,494,494,495,495,495,495,495,495,495,495,495,
702 495,496,496,496,496,496,496,496,496,496,496,496,497,497,497,497,497,497,497,497,
703 497,497,497,498,498,498,498,498,498,498,498,498,498,499,499,499,499,499,499,499,
704 499,499,499,499,500,500,500,500,500,500,500,500,500,500,501,501,501,501,501,501,
705 501,501,501,501,501,502,502,502,502,502,502,502,502,502,502,503,503,503,503,503,
706 503,503,503,503,503,503,504,504,504,504,504,504,504,504,504,504,504,505,505,505,
707 505,505,505,505,505,505,505,506,506,506,506,506,506,506,506,506,506,506,507,507,
708 507,507,507,507,507,507,507,507,507,508,508,508,508,508,508,508,508,508,508,509,
709 509,509,509,509,509,509,509,509,509,509,510,510,510,510,510,510,510,510,510,510,
710 510,511,511,511,511,511,511,511,511,511,511,512,512,512,512,512 };
712 static const int order[32] =
713 { 0, 1, 16, 17, 8, 9, 24, 25, 4, 5, 20, 21, 12, 13, 28, 29,
714 2, 3, 18, 19,10,11, 26, 27, 6, 7, 22, 23, 14, 15, 30, 31 };
716 static const long sampr_index[2][3] =
717 { { 22050, 24000, 16000 }, /* MPEG 2 */
718 { 44100, 48000, 32000 } }; /* MPEG 1 */
720 static const long bitr_index[2][15] =
721 { {0, 8,16,24,32,40,48,56, 64, 80, 96,112,128,144,160}, /* MPEG 2 */
722 {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320} }; /* MPEG 1 */
724 static const int num_bands[3][15] =
725 { {0,10,10,10,10,12,14,16, 20, 22, 24, 26, 28, 30, 32},
726 {0,10,10,10,10,10,12,14, 18, 24, 26, 28, 30, 32, 32},
727 {0,10,12,14,18,24,26,28, 30, 32, 32, 32, 32, 32, 32} };
729 static const int cx_const[9] =
730 { 16135, 10531, 5604, 15396, -2845,-12551, 14189, 8192, 16384 };
732 static const int ca_const[8] =
733 {-16859,-15458,-10269, -5961, -3099, -1342, -465, -121 };
735 static const int cs_const[8] =
736 { 28098, 28893, 31117, 32221, 32621, 32740, 32765, 32768 };
738 static const short enwindow_const[15*27+24] =
739 { 0, 65, 593, 1766, 22228, 2115, 611, 62,
740 8, 119, 1419, 10564,-11659,-1635,-154, -9,
741 -8, -119,-1419,-10564, 11659, 1635, 154, 9, 464, 100, 91,
742 0, 69, 604, 1635, 23148, 2363, 643, 62,
743 7, 107, 1368, 10449,-12733,-1818,-180,-11,
744 -7, -107,-1368,-10449, 12733, 1818, 180, 11, 420, 200, 164,
745 0, 72, 608, 1465, 23979, 2600, 671, 63,
746 7, 94, 1305, 10265,-13818,-2004,-207,-12,
747 -7, -94,-1305,-10265, 13818, 2004, 207, 12, 380, 297, 220,
748 0, 76, 606, 1256, 24718, 2825, 693, 63,
749 6, 81, 1232, 10016,-14908,-2192,-236,-14,
750 -6, -81,-1232,-10016, 14908, 2192, 236, 14, 342, 392, 262,
751 0, 78, 597, 1007, 25359, 3033, 712, 63,
752 6, 68, 1150, 9706,-15995,-2380,-267,-15,
753 -6, -68,-1150, -9706, 15995, 2380, 267, 15, 307, 483, 289,
754 0, 80, 580, 719, 25901, 3224, 726, 62,
755 6, 54, 1060, 9343,-17072,-2565,-299,-17,
756 -6, -54,-1060, -9343, 17072, 2565, 299, 17, 274, 569, 304,
757 -1, 82, 555, 391, 26339, 3395, 735, 61,
758 5, 40, 963, 8930,-18131,-2747,-332,-19,
759 -5, -40, -963, -8930, 18131, 2747, 332, 19, 242, 650, 307,
760 -1, 83, 523, 26, 26672, 3545, 740, 60,
761 5, 27, 861, 8474,-19164,-2923,-366,-21,
762 -5, -27, -861, -8474, 19164, 2923, 366, 21, 212, 724, 300,
763 -1, 83, 482, -376, 26900, 3672, 739, 58,
764 4, 14, 756, 7981,-20163,-3092,-401,-24,
765 -4, -14, -756, -7981, 20163, 3092, 401, 24, 183, 792, 283,
766 -1, 82, 433, -812, 27022, 3776, 735, 56,
767 4, 1, 648, 7456,-21122,-3250,-435,-26,
768 -4, -1, -648, -7456, 21122, 3250, 435, 26, 155, 851, 258,
769 -1, 81, 376, -1281, 27038, 3855, 726, 54,
770 3, -11, 539, 6907,-22032,-3397,-470,-28,
771 -3, 11, -539, -6907, 22032, 3397, 470, 28, 128, 903, 226,
772 -1, 78, 312, -1778, 26951, 3910, 713, 52,
773 3, -22, 430, 6338,-22887,-3530,-503,-31,
774 -3, 22, -430, -6338, 22887, 3530, 503, 31, 102, 946, 188,
775 -2, 75, 239, -2302, 26761, 3941, 696, 49,
776 3, -33, 322, 5757,-23678,-3648,-537,-34,
777 -3, 33, -322, -5757, 23678, 3648, 537, 34, 76, 980, 145,
778 -2, 70, 160, -2848, 26472, 3948, 676, 47,
779 3, -42, 217, 5167,-24399,-3749,-568,-36,
780 -3, 42, -217, -5167, 24399, 3749, 568, 36, 50, 1004, 99,
781 -2, 65, 74, -3412, 26087, 3931, 653, 44,
782 2, -51, 115, 4577,-25045,-3830,-599,-39,
783 -2, 51, -115, -4577, 25045, 3830, 599, 39, 25, 1019, 50,
785 25610,3891,627,42,-3990,-18,58,-2,
786 21226,-21226,10604,-10604,1860,-1860,1458,-1458,576,-576,130,-130,60,-60,8,-8
789 static const int win_const[18][4] = {
790 { -3072, -134, -146, 3352 },
791 { -2747, -362, -471, 3579 },
792 { -2387, -529, -831, 3747 },
793 { -2004, -632,-1214, 3850 },
794 { -1609, -666,-1609, 3884 },
795 { -1214, -632,-2004, 3850 },
796 { -831, -529,-2387, 3747 },
797 { -471, -362,-2747, 3579 },
798 { -146, -134,-3072, 3352 },
799 { 134,-3072,-3352, -146 },
800 { 362,-2747,-3579, -471 },
801 { 529,-2387,-3747, -831 },
802 { 632,-2004,-3850,-1214 },
803 { 666,-1609,-3884,-1609 },
804 { 632,-1214,-3850,-2004 },
805 { 529, -831,-3747,-2387 },
806 { 362, -471,-3579,-2747 },
807 { 134, -146,-3352,-3072 } };
810 static const char* wav_filename;
811 static int mp3file, wavfile, wav_size, frames;
812 static uint32_t enc_buffer[16384]; /* storage for 65536 Bytes */
813 static int enc_chunk = 0; /* encode chunk counter */
814 static int enc_size;
815 static config_t cfg;
816 static uint8_t band_scale_f[22];
819 /* forward declarations */
820 static int HuffmanCode( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table);
821 static int HuffmanCod1( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table);
822 static void putbits(uint32_t val, uint32_t nbit);
823 static int find_best_2( short *ix, uint32_t start, uint32_t end, const uint32_t *table,
824 uint32_t len, int *bits);
825 static int find_best_3( short *ix, uint32_t start, uint32_t end, const uint32_t *table,
826 uint32_t len, int *bits);
827 static int count_bit1 ( short *ix, uint32_t start, uint32_t end, int *bits );
828 static int count_bigv ( short *ix, uint32_t start, uint32_t end, int table0, int table1,
829 int *bits);
832 bool checkString(int fd, char *string)
834 char temp[4];
836 rb->read(fd, temp, 4);
838 /* return 1 on match, 0 on no match */
839 return !rb->memcmp(temp, string, 4);
842 int Read16BitsLowHigh(int fd)
844 char first, second;
846 rb->read(fd, &first, 1);
847 rb->read(fd, &second, 1);
849 return ((int)second << 8) | (first & 0xff);
853 int Read32BitsLowHigh(int fd)
855 int first = 0xffff & Read16BitsLowHigh(fd);
856 int second = 0xffff & Read16BitsLowHigh(fd);
858 return (second << 16) + first;
861 int wave_open(void)
863 unsigned short wFormatTag;
864 unsigned long dAvgBytesPerSec;
865 unsigned short wBlockAlign;
866 unsigned short bits_per_samp;
867 long header_size;
869 if((wavfile = rb->open(wav_filename, O_RDONLY)) < 0)
870 return -1;
872 if(!checkString(wavfile,"RIFF")) return -2;
873 Read32BitsLowHigh(wavfile); /* complete wave chunk size */
874 if(!checkString(wavfile,"WAVE")) return -3;
875 if(!checkString(wavfile,"fmt ")) return -4;
877 header_size = Read32BitsLowHigh(wavfile); /* chunk size */
878 wFormatTag = Read16BitsLowHigh(wavfile);
880 cfg.channels = Read16BitsLowHigh(wavfile);
881 cfg.samplerate = Read32BitsLowHigh(wavfile);
882 dAvgBytesPerSec = Read32BitsLowHigh(wavfile);
883 wBlockAlign = Read16BitsLowHigh(wavfile);
884 bits_per_samp = Read16BitsLowHigh(wavfile);
886 if(wFormatTag != 0x0001) return -5;
887 if(bits_per_samp != 16) return -6;
888 if(cfg.channels > 2) return -7;
889 if(!checkString(wavfile,"data")) return -8;
891 header_size = 0x28;
892 wav_size = rb->filesize(wavfile);
893 rb->lseek(wavfile, header_size, SEEK_SET);
895 return 0;
898 int read_samples(uint32_t *buffer, int num_samples)
900 int s, samples = rb->read(wavfile, buffer, 4 * num_samples) / 4;
901 /* Pad last sample with zeros */
902 for(s=samples; s<num_samples; s++)
903 buffer[s] = 0;
905 return samples;
908 inline uint32_t myswap32(uint32_t val)
910 const uint8_t* v = (const uint8_t*)&val;
912 return ((uint32_t)v[0]<<24) | ((uint32_t)v[1]<<16) | ((uint32_t)v[2]<<8) | v[3];
915 static void encodeSideInfo( side_info_t si[2][2] )
917 int gr, ch, header;
918 uint32_t cc=0, sz=0;
921 * MPEG header layout:
922 * AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM
923 * A (31-21) = frame sync
924 * B (20-19) = MPEG type
925 * C (18-17) = MPEG layer
926 * D (16) = protection bit
927 * E (15-12) = bitrate index
928 * F (11-10) = samplerate index
929 * G (9) = padding bit
930 * H (8) = private bit
931 * I (7-6) = channel mode
932 * J (5-4) = mode extension (jstereo only)
933 * K (3) = copyright bit
934 * L (2) = original
935 * M (1-0) = emphasis
938 header = (0xfff00000) | /* frame sync (AAAAAAAAA AAA)
939 mp3 type (upper): 1 (B) */
940 (0x01 << 17) | /* mp3 layer: 01 (CC) */
941 ( 0x1 << 16) | /* mp3 crc: 1 (D) */
942 ( 0x1 << 2); /* mp3 org: 1 (L) */
943 header |= cfg.mpg.type << 19;
944 header |= cfg.mpg.bitr_id << 12;
945 header |= cfg.mpg.smpl_id << 10;
946 header |= cfg.mpg.padding << 9;
947 header |= cfg.mpg.mode << 6;
948 /* no emphasis (bits 0-1) */
949 putbits( header, 32 );
951 if(cfg.mpg.type == 1)
952 { /* MPEG1 */
953 if(cfg.channels == 2) { putlong( 0, 20); }
954 else { putlong( 0, 18); }
956 for(gr=0; gr<cfg.granules; gr++)
957 for(ch=0; ch<cfg.channels; ch++)
959 side_info_t *gi = &si[gr][ch];
961 putlong((gi->part2_3_length+42),12 ); /* add scale_facs array size */
962 putlong( gi->address3>>1, 9 );
963 putlong( gi->global_gain, 8 );
964 putlong( 9, 4 ); /* set scale_facs compr type */
965 putlong( gi->table_select[0], 6 );
966 putlong( gi->table_select[1], 5 );
967 putlong( gi->table_select[2], 5 );
968 putlong( gi->region_0_1, 7 );
969 putlong( 1 , 2 ); /* set scale_facs to 1bit */
970 putlong( gi->table_select[3], 1 );
973 else
974 { /* MPEG2 */
975 if(cfg.channels == 2) { putlong( 0, 10); }
976 else { putlong( 0, 9); }
978 for(ch=0; ch<cfg.channels; ch++)
980 side_info_t *gi = &si[0][ch];
982 putlong((gi->part2_3_length+42),12 ); /* add scale_facs array size */
983 putlong( gi->address3>>1, 9 );
984 putlong( gi->global_gain, 8 );
985 putlong( 0xCA, 9 ); /* set scale_facs compr type */
986 putlong( gi->table_select[0], 6 );
987 putlong( gi->table_select[1], 5 );
988 putlong( gi->table_select[2], 5 );
989 putlong( gi->region_0_1 , 7 );
990 putlong( 1 , 1 ); /* set scale_facs to 1bit */
991 putlong( gi->table_select[3], 1 );
994 /* flush remaining bits */
995 putbits(cc, sz);
998 /* Note the discussion of huffmancodebits() on pages 28 and 29 of the IS,
999 as well as the definitions of the side information on pages 26 and 27. */
1000 static void Huffmancodebits( short *ix, char *xr_sign, side_info_t *gi )
1002 int region1 = gi->address1;
1003 int region2 = gi->address2;
1004 int bigvals = gi->address3;
1005 int count1 = bigvals + (gi->count1 << 2);
1006 int stuffBits = 0;
1007 int bits = 0;
1008 int i, v;
1010 for(i=v=0; i<32; i+=2)
1011 v |= band_scale_f[i>>1] << (30-i);
1012 putbits(v, 32); // store scale_facs (part1)
1014 for(v=0; i<42; i+=2)
1015 v |= band_scale_f[i>>1] << (40-i);
1016 putbits(v, 10); // store scale_facs (part2)
1018 if(region1 > 0)
1019 bits += HuffmanCode(ix, xr_sign, 0 , region1, gi->table_select[0]);
1021 if(region2 > region1)
1022 bits += HuffmanCode(ix, xr_sign, region1, region2, gi->table_select[1]);
1024 if(bigvals > region2)
1025 bits += HuffmanCode(ix, xr_sign, region2, bigvals, gi->table_select[2]);
1027 if(count1 > bigvals)
1028 bits += HuffmanCod1(ix, xr_sign, bigvals, count1, gi->table_select[3]);
1030 if((stuffBits = gi->part2_3_length - bits) > 0)
1032 int stuffWords = stuffBits >> 5;
1033 int remainBits = stuffBits & 31;
1035 if( remainBits )
1036 putbits( ~0, remainBits );
1038 while( stuffWords-- )
1039 putbits( ~0, 32 ); /* Huffman code tables leed to padding ones */
1043 int HuffmanCod1( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int tbl)
1045 uint32_t cc=0, sz=0;
1046 uint32_t i, d, p;
1047 int sumbit=0, s=0, l=0, v, w, x, y;
1048 #define sgnv xr_sign[i+0]
1049 #define sgnw xr_sign[i+1]
1050 #define sgnx xr_sign[i+2]
1051 #define sgny xr_sign[i+3]
1053 for(i=begin; i<end; i+=4)
1055 v = ix[i+0];
1056 w = ix[i+1];
1057 x = ix[i+2];
1058 y = ix[i+3];
1059 p = (v << 3) + (w << 2) + (x << 1) + y;
1061 switch(p)
1063 case 0: l=0; s = 0; break;
1064 case 1: l=1; s = sgny; break;
1065 case 2: l=1; s = sgnx; break;
1066 case 3: l=2; s = (sgnx << 1) + sgny; break;
1067 case 4: l=1; s = sgnw; break;
1068 case 5: l=2; s = (sgnw << 1) + sgny; break;
1069 case 6: l=2; s = (sgnw << 1) + sgnx; break;
1070 case 7: l=3; s = (sgnw << 2) + (sgnx << 1) + sgny; break;
1071 case 8: l=1; s = sgnv; break;
1072 case 9: l=2; s = (sgnv << 1) + sgny; break;
1073 case 10: l=2; s = (sgnv << 1) + sgnx; break;
1074 case 11: l=3; s = (sgnv << 2) + (sgnx << 1) + sgny; break;
1075 case 12: l=2; s = (sgnv << 1) + sgnw; break;
1076 case 13: l=3; s = (sgnv << 2) + (sgnw << 1) + sgny; break;
1077 case 14: l=3; s = (sgnv << 2) + (sgnw << 1) + sgnx; break;
1078 case 15: l=4; s = (sgnv << 3) + (sgnw << 2) + (sgnx << 1) + sgny; break;
1081 d = (ht_count[tbl][0][p] << l) + s;
1082 l = ht_count[tbl][1][p];
1083 putlong( d, l );
1084 sumbit += l;
1087 /* flush remaining bits */
1088 putbits(cc, sz);
1090 return sumbit;
1093 /* Implements the pseudocode of page 98 of the IS */
1094 int HuffmanCode(short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table)
1096 uint32_t cc=0, sz=0, code;
1097 uint32_t i, xl=0, yl=0, idx;
1098 int x, y, bit, sumbit=0;
1099 #define sign_x xr_sign[i+0]
1100 #define sign_y xr_sign[i+1]
1102 if(table == 0)
1103 return 0;
1105 if( table > 15 )
1106 { /* ESC-table is used */
1107 uint32_t linbits = ht_big[table-16].linbits;
1108 uint16_t *hffcode = table < 24 ? t16HB : t24HB;
1109 uint8_t *hlen = table < 24 ? t16l : t24l;
1111 for(i=begin; i<end; i+=2)
1113 x = ix[ i ];
1114 y = ix[i+1];
1116 if(x > 14) { xl = x - 15; x = 15; }
1117 if(y > 14) { yl = y - 15; y = 15; }
1119 idx = x * 16 + y;
1120 code = hffcode[idx];
1121 bit = hlen [idx];
1123 if(x)
1125 if(x > 14)
1127 code = (code << linbits) | xl;
1128 bit += linbits;
1131 code = (code << 1) | sign_x;
1132 bit += 1;
1135 if(y)
1137 if(y > 14)
1139 if(bit + linbits + 1 > 32)
1141 putlong( code, bit );
1142 sumbit += bit;
1143 code = bit = 0;
1146 code = (code << linbits) | yl;
1147 bit += linbits;
1150 code = (code << 1) | sign_y;
1151 bit += 1;
1154 putlong( code, bit );
1155 sumbit += bit;
1158 else
1159 { /* No ESC-words */
1160 const struct huffcodetab *h = &ht[table];
1162 for(i=begin; i<end; i+=2)
1164 x = ix[i];
1165 y = ix[i+1];
1167 idx = x * h->len + y;
1168 code = h->table[idx];
1169 bit = h->hlen [idx];
1171 if(x)
1173 code = (code << 1) | sign_x;
1174 bit += 1;
1177 if(y)
1179 code = (code << 1) | sign_y;
1180 bit += 1;
1183 putlong( code, bit );
1184 sumbit += bit;
1188 /* flush remaining bits */
1189 putbits(cc, sz);
1191 return sumbit;
1194 void putbits(uint32_t val, uint32_t nbit)
1196 int new_bitpos = CodedData.bitpos + nbit;
1197 int ptrpos = CodedData.bitpos >> 5;
1199 val = val & (0xffffffff >> (32 - nbit));
1201 /* data fit in one uint32_t */
1202 if(((new_bitpos - 1) >> 5) == ptrpos)
1203 CodedData.bbuf[ptrpos] |= val << ((32 - new_bitpos) & 31);
1204 else
1206 CodedData.bbuf[ptrpos ] |= val >> ((new_bitpos - 32) & 31);
1207 CodedData.bbuf[ptrpos+1] |= val << ((32 - new_bitpos) & 31);
1210 CodedData.bitpos = new_bitpos;
1213 /***************************************************************************/
1214 /* Choose the Huffman table that will encode ix[begin..end] with */
1215 /* the fewest bits. */
1216 /* Note: This code contains knowledge about the sizes and characteristic */
1217 /* of the Huffman tables as defined in the IS (Table B.7), and will not */
1218 /* work with any arbitrary tables. */
1219 /***************************************************************************/
1220 int choose_table( short *ix, uint32_t begin, uint32_t end, int *bits )
1222 uint32_t i;
1223 int max, table0, table1;
1225 for(i=begin,max=0; i<end; i++)
1226 if(ix[i] > max)
1227 max = ix[i];
1229 if(max < 16)
1231 /* tables without linbits */
1232 /* indx: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
1233 /* len: 0, 2, 3, 3, 0, 4, 4, 6, 6, 6, 8, 8, 8, 16, 0, 16 */
1234 switch(max)
1236 case 0: return 0;
1237 case 1: return count_bit1(ix, begin, end, bits);
1238 case 2: return 2 + find_best_2(ix, begin, end, tab23, 3, bits);
1239 case 3: return 5 + find_best_2(ix, begin, end, tab56, 4, bits);
1240 case 4:
1241 case 5: return 7 + find_best_3(ix, begin, end, tab789, 6, bits);
1242 case 6:
1243 case 7: return 10 + find_best_3(ix, begin, end, tabABC, 8, bits);
1244 default: return 13 + find_best_2(ix, begin, end, tab1315, 16, bits) * 2;
1247 else
1249 /* tables with linbits */
1250 max -= 15;
1252 for(table0=0; table0<8; table0++)
1253 if(ht_big[table0].linmax >= max)
1254 break;
1256 for(table1=8; table1<16; table1++)
1257 if(ht_big[table1].linmax >= max)
1258 break;
1260 return 16 + count_bigv(ix, begin, end, table0, table1, bits);
1264 int find_best_2(short *ix, uint32_t start, uint32_t end, const uint32_t *table,
1265 uint32_t len, int *bits)
1267 uint32_t i, sum = 0;
1269 for(i=start; i<end; i+=2)
1270 sum += table[ix[i] * len + ix[i+1]];
1272 if((sum & 0xffff) <= (sum >> 16))
1274 *bits = (sum & 0xffff);
1275 return 1;
1277 else
1279 *bits = sum >> 16;
1280 return 0;
1284 int find_best_3(short *ix, uint32_t start, uint32_t end, const uint32_t *table,
1285 uint32_t len, int *bits)
1287 uint32_t i, j, sum = 0;
1288 int sum1 = 0;
1289 int sum2 = 0;
1290 int sum3 = 0;
1292 /* avoid overflow in packed additions: 78*13 < 1024 */
1293 for(i=start; i<end; )
1295 j = i + 2*78 > end ? end : i + 2*78;
1297 for(sum=0; i<j; i+=2)
1298 sum += table[ix[i] * len + ix[i+1]];
1300 sum1 += (sum >> 20);
1301 sum2 += (sum >> 10) & 0x3ff;
1302 sum3 += (sum >> 0) & 0x3ff;
1305 i = 0;
1306 if(sum1 > sum2) { sum1 = sum2; i = 1; }
1307 if(sum1 > sum3) { sum1 = sum3; i = 2; }
1309 *bits = sum1;
1311 return i;
1314 /*************************************************************************/
1315 /* Function: Count the number of bits necessary to code the subregion. */
1316 /*************************************************************************/
1317 int count_bit1(short *ix, uint32_t start, uint32_t end, int *bits )
1319 uint32_t i, sum = 0;
1321 for(i=start; i<end; i+=2)
1322 sum += t1l[4 + ix[i] * 2 + ix[i+1]];
1324 *bits = sum;
1326 return 1; /* this is table1 */
1329 int count_bigv(short *ix, uint32_t start, uint32_t end, int table0,
1330 int table1, int *bits )
1332 uint32_t i, sum0, sum1, sum=0, bigv=0, x, y;
1334 /* ESC-table is used */
1335 for(i=start; i<end; i+=2)
1337 x = ix[i];
1338 y = ix[i+1];
1340 if(x > 14) { x = 15; bigv++; }
1341 if(y > 14) { y = 15; bigv++; }
1343 sum += tab1624[x * 16 + y];
1346 sum0 = (sum >> 16) + bigv * ht_big[table0].linbits;
1347 sum1 = (sum & 0xffff) + bigv * ht_big[table1].linbits;
1349 if(sum0 <= sum1)
1351 *bits = sum0;
1352 return table0;
1354 else
1356 *bits = sum1;
1357 return table1;
1361 /*************************************************************************/
1362 /* Function: Calculation of rzero, count1, address3 */
1363 /* (Partitions ix into big values, quadruples and zeros). */
1364 /*************************************************************************/
1365 int calc_runlen( short *ix, side_info_t *si )
1367 int p, i, sum = 0;
1369 for(i=SAMPL2; i-=2; )
1370 if(*(uint32_t*)&ix[i-2]) /* !!!! short *ix; !!!!! */
1371 break;
1373 si->count1 = 0;
1375 for( ; i>3; i-=4)
1377 int v = ix[i-1];
1378 int w = ix[i-2];
1379 int x = ix[i-3];
1380 int y = ix[i-4];
1382 if((v | w | x | y) <= 1)
1384 p = (y<<3) + (x<<2) + (w<<1) + (v);
1386 sum += tab01[p];
1388 si->count1++;
1390 else break;
1393 si->address3 = i;
1395 if((sum >> 16) < (sum & 0xffff))
1397 si->table_select[3] = 0;
1398 return sum >> 16;
1400 else
1402 si->table_select[3] = 1;
1403 return sum & 0xffff;
1408 /*************************************************************************/
1409 /* Function: Quantization of the vector xr ( -> ix) */
1410 /*************************************************************************/
1411 int quantize_int(int *xr, short *ix, side_info_t *si)
1413 unsigned int i, idx, s, frac_pow[] = { 0x10000, 0xd745, 0xb505, 0x9838 };
1415 s = frac_pow[si->quantStep & 3] >> si->quantStep / 4;
1417 /* check for possible 'out of range' values */
1418 if(((si->max_val + 256) >> 8) * s >= (65536 << 8))
1419 return 0;
1421 if(((si->max_val + 256) >> 8) * s < (4096 << 8))
1422 { /* all values fit the table size */
1423 for(i=SAMPL2; i--; )
1424 ix[i] = int2idx[(xr[i] * s + 0x8000) >> 16];
1426 else
1427 { /* check each index wether it fits the table */
1428 for(i=SAMPL2; i--; )
1430 idx = (xr[i] * s + 0x08000) >> 16;
1432 if(idx > 4095) ix[i] = int2idx[(idx + 8) >> 4] << 3;
1433 else ix[i] = int2idx[idx];
1437 return 1;
1440 /*************************************************************************/
1441 /* subdivides the bigvalue region which will use separate Huffman tables */
1442 /*************************************************************************/
1443 void subdivide(side_info_t *si)
1445 int scfb, count0, count1;
1447 if( !si->address3 )
1448 { /* no bigvalue region */
1449 si->region_0_1 = 0;
1450 si->address1 = 0;
1451 si->address2 = 0;
1453 else
1455 /* Calculate scale factor band index */
1456 for(scfb=0; scalefac[scfb] < si->address3; )
1457 scfb++;
1459 count0 = subdv_table[scfb].region0_cnt;
1460 count1 = subdv_table[scfb].region1_cnt;
1462 si->region_0_1 = (count0 << 3) | count1;
1463 si->address1 = scalefac[count0 + 1];
1464 si->address2 = scalefac[count0 + 1 + count1 + 1];
1468 /*******************************************************************/
1469 /* Count the number of bits necessary to code the bigvalues region */
1470 /*******************************************************************/
1471 int bigv_bitcount(short *ix, side_info_t *gi)
1473 int b1=0, b2=0, b3=0;
1475 /* Select huffman code tables for bigvalues regions */
1476 gi->table_select[0] = 0;
1477 gi->table_select[1] = 0;
1478 gi->table_select[2] = 0;
1480 if( gi->address1 > 0 ) /* region0 */
1481 gi->table_select[0] = choose_table(ix, 0 , gi->address1, &b1);
1483 if( gi->address2 > gi->address1 ) /* region1 */
1484 gi->table_select[1] = choose_table(ix, gi->address1, gi->address2, &b2);
1486 if( gi->address3 > gi->address2 ) /* region2 */
1487 gi->table_select[2] = choose_table(ix, gi->address2, gi->address3, &b3);
1489 return b1+b2+b3;
1492 int quantize_and_count_bits(int *xr, short *ix, side_info_t *si)
1494 int bits = 10000;
1496 if(quantize_int(xr, ix, si))
1498 bits = calc_runlen(ix, si); /* rzero,count1,address3 */
1499 subdivide(si); /* bigvalues sfb division */
1500 bits += bigv_bitcount(ix,si); /* bit count */
1503 return bits;
1506 /************************************************************************/
1507 /* The code selects the best quantStep for a particular set of scalefacs*/
1508 /************************************************************************/
1509 int inner_loop(int *xr, int max_bits, side_info_t *si)
1511 int bits;
1513 while((bits=quantize_and_count_bits(xr, enc_data, si)) < max_bits-64)
1515 if(si->quantStep == 0)
1516 break;
1518 if(si->quantStep <= 2)
1519 si->quantStep = 0;
1520 else
1521 si->quantStep -= 2;
1524 while(bits > max_bits)
1526 si->quantStep++;
1527 bits = quantize_and_count_bits(xr, enc_data, si);
1530 return bits;
1533 void iteration_loop(int *xr, side_info_t *si, int gr_cnt)
1535 int remain, tar_bits, max_bits = cfg.mean_bits;
1537 /* distribute reserved bits to remaining granules */
1538 tar_bits = max_bits + (cfg.ResvSize / gr_cnt & ~7);
1539 if(tar_bits > max_bits + max_bits/2)
1540 tar_bits = max_bits + max_bits/2;
1542 si->part2_3_length = inner_loop(xr, tar_bits, si);
1543 si->global_gain = si->quantStep + 142 - si->additStep;
1545 /* unused bits of the reservoir can be used for remaining granules */
1546 cfg.ResvSize += max_bits - si->part2_3_length;
1548 /* end: distribute the reserved bits to one or two granules */
1549 if(gr_cnt == 1)
1551 si->part2_3_length += cfg.ResvSize;
1552 /* mp3 format allows max 12bits for granule length */
1553 if(si->part2_3_length > 4092)
1555 remain = (si->part2_3_length - 4092 + 31) >> 5;
1556 si->part2_3_length -= remain << 5;
1557 si[-1].part2_3_length += remain << 5;
1559 while(remain--)
1560 putbits(~0, 32);
1566 /* returns sum_j=0^31 a[j]*cos(PI*j*(k+1/2)/32), 0<=k<32 */
1567 void window_subband1(short *wk, int sb0[SBLIMIT], int sb1[SBLIMIT]) ICODE_ATTR;
1568 void window_subband1(short *wk, int sb0[SBLIMIT], int sb1[SBLIMIT])
1570 int k, i, u, v;
1571 short *wp, *x1, *x2;
1573 #ifdef CPU_COLDFIRE
1574 int s0, s1, t0, t1;
1576 for(k=0; k<18; k++, wk+=64, sb0+=SBLIMIT, sb1+=SBLIMIT)
1578 wp = enwindow;
1579 x1 = wk;
1580 x2 = x1 - 124;
1582 for(i=-15; i<0; i++)
1584 asm volatile(
1585 "move.l (-224*4,%[x2]), %%d4\n" /* d4 = x2[-224] */
1586 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1587 "mac.w %%d0u, %%d4u, %%acc0\n"
1588 "mac.w %%d0u, %%d4l, (-160*4,%[x2]), %%d4, %%acc1\n"
1589 "mac.w %%d0l, %%d4u, %%acc0\n"
1590 "mac.w %%d0l, %%d4l, ( -96*4,%[x2]), %%d4, %%acc1\n"
1591 "mac.w %%d1u, %%d4u, %%acc0\n"
1592 "mac.w %%d1u, %%d4l, ( -32*4,%[x2]), %%d4, %%acc1\n"
1593 "mac.w %%d1l, %%d4u, %%acc0\n"
1594 "mac.w %%d1l, %%d4l, ( 32*4,%[x2]), %%d4, %%acc1\n"
1595 "mac.w %%d2u, %%d4u, %%acc0\n"
1596 "mac.w %%d2u, %%d4l, ( 96*4,%[x2]), %%d4, %%acc1\n"
1597 "mac.w %%d2l, %%d4u, %%acc0\n"
1598 "mac.w %%d2l, %%d4l, ( 160*4,%[x2]), %%d4, %%acc1\n"
1599 "mac.w %%d3u, %%d4u, %%acc0\n"
1600 "mac.w %%d3u, %%d4l, ( 224*4,%[x2]), %%d4, %%acc1\n"
1601 "mac.w %%d3l, %%d4u, %%acc0\n"
1602 "mac.w %%d3l, %%d4l, (-256*4,%[x1]), %%d4, %%acc1\n"
1603 "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */
1604 "mac.w %%d0u, %%d4u, %%acc0\n"
1605 "mac.w %%d0u, %%d4l, (-192*4,%[x1]), %%d4, %%acc1\n"
1606 "mac.w %%d0l, %%d4u, %%acc0\n"
1607 "mac.w %%d0l, %%d4l, (-128*4,%[x1]), %%d4, %%acc1\n"
1608 "mac.w %%d1u, %%d4u, %%acc0\n"
1609 "mac.w %%d1u, %%d4l, ( -64*4,%[x1]), %%d4, %%acc1\n"
1610 "mac.w %%d1l, %%d4u, %%acc0\n"
1611 "mac.w %%d1l, %%d4l, ( 0*4,%[x1]), %%d4, %%acc1\n"
1612 "mac.w %%d2u, %%d4u, %%acc0\n"
1613 "mac.w %%d2u, %%d4l, ( 64*4,%[x1]), %%d4, %%acc1\n"
1614 "mac.w %%d2l, %%d4u, %%acc0\n"
1615 "mac.w %%d2l, %%d4l, ( 128*4,%[x1]), %%d4, %%acc1\n"
1616 "mac.w %%d3u, %%d4u, %%acc0\n"
1617 "mac.w %%d3u, %%d4l, ( 192*4,%[x1]), %%d4, %%acc1\n"
1618 "mac.w %%d3l, %%d4u, %%acc0\n"
1619 "mac.w %%d3l, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n"
1620 "movclr.l %%acc0, %%d0\n"
1621 "move.l %%d0, %[s0]\n"
1622 "movclr.l %%acc1, %%d0\n"
1623 "move.l %%d0, %[s1]\n"
1625 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1626 "mac.w %%d0u, %%d4u, %%acc0\n"
1627 "mac.w %%d0u, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n"
1628 "mac.w %%d0l, %%d4u, %%acc0\n"
1629 "mac.w %%d0l, %%d4l, ( 96*4,%[x1]), %%d4, %%acc1\n"
1630 "mac.w %%d1u, %%d4u, %%acc0\n"
1631 "mac.w %%d1u, %%d4l, ( 32*4,%[x1]), %%d4, %%acc1\n"
1632 "mac.w %%d1l, %%d4u, %%acc0\n"
1633 "mac.w %%d1l, %%d4l, ( -32*4,%[x1]), %%d4, %%acc1\n"
1634 "mac.w %%d2u, %%d4u, %%acc0\n"
1635 "mac.w %%d2u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n"
1636 "mac.w %%d2l, %%d4u, %%acc0\n"
1637 "mac.w %%d2l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n"
1638 "mac.w %%d3u, %%d4u, %%acc0\n"
1639 "mac.w %%d3u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n"
1640 "mac.w %%d3l, %%d4u, %%acc0\n"
1641 "mac.w %%d3l, %%d4l, ( 256*4,%[x2]), %%d4, %%acc1\n"
1642 "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */
1643 "mac.w %%d0u, %%d4u, %%acc0\n"
1644 "mac.w %%d0u, %%d4l, ( 192*4,%[x2]), %%d4, %%acc1\n"
1645 "mac.w %%d0l, %%d4u, %%acc0\n"
1646 "mac.w %%d0l, %%d4l, ( 128*4,%[x2]), %%d4, %%acc1\n"
1647 "mac.w %%d1u, %%d4u, %%acc0\n"
1648 "mac.w %%d1u, %%d4l, ( 64*4,%[x2]), %%d4, %%acc1\n"
1649 "mac.w %%d1l, %%d4u, %%acc0\n"
1650 "mac.w %%d1l, %%d4l, ( 0*4,%[x2]), %%d4, %%acc1\n"
1651 "mac.w %%d2u, %%d4u, %%acc0\n"
1652 "mac.w %%d2u, %%d4l, ( -64*4,%[x2]), %%d4, %%acc1\n"
1653 "mac.w %%d2l, %%d4u, %%acc0\n"
1654 "mac.w %%d2l, %%d4l, (-128*4,%[x2]), %%d4, %%acc1\n"
1655 "mac.w %%d3u, %%d4u, %%acc0\n"
1656 "mac.w %%d3u, %%d4l, (-192*4,%[x2]), %%d4, %%acc1\n"
1657 "mac.w %%d3l, %%d4u, %%acc0\n"
1658 "mac.w %%d3l, %%d4l, %%acc1\n"
1659 "movclr.l %%acc0, %%d0\n"
1660 "move.l %%d0, %[t0]\n"
1661 "movclr.l %%acc1, %%d0\n"
1662 "move.l %%d0, %[t1]\n"
1664 : [x1] "+a" (x1), [x2] "+a" (x2), [s0] "+m" (s0), [t0] "+m" (t0),
1665 [s1] "+m" (s1), [t1] "+m" (t1)
1666 : [wp] "a" (wp) : "d0", "d1", "d2", "d3", "d4");
1668 sb0[30+i*2] = shft4(t0) + shft13(s0) * wp[24];
1669 sb0[31+i*2] = shft13(t0) * wp[25] - shft13(s0) * wp[26];
1670 sb1[30+i*2] = shft4(t1) + shft13(s1) * wp[24];
1671 sb1[31+i*2] = shft13(t1) * wp[25] - shft13(s1) * wp[26];
1672 wp += 27;
1673 x1 -= 2;
1674 x2 += 2;
1677 asm volatile(
1678 "move.l ( -32*4,%[x1]), %%d4\n" /* d4 = x1[-32] */
1679 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1681 "mac.w %%d0u, %%d4u, %%acc0\n"
1682 "mac.w %%d0u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n"
1683 "mac.w %%d0l, %%d4u, %%acc0\n"
1684 "mac.w %%d0l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n"
1685 "mac.w %%d1u, %%d4u, %%acc0\n"
1686 "mac.w %%d1u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n"
1687 "mac.w %%d1l, %%d4u, %%acc0\n"
1688 "mac.w %%d1l, %%d4l, ( 32*4,%[x1]), %%d4, %%acc1\n"
1689 "mac.w %%d2u, %%d4u, %%acc0\n"
1690 "mac.w %%d2u, %%d4l, ( 96*4,%[x1]), %%d4, %%acc1\n"
1691 "mac.w %%d2l, %%d4u, %%acc0\n"
1692 "mac.w %%d2l, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n"
1693 "mac.w %%d3u, %%d4u, %%acc0\n"
1694 "mac.w %%d3u, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n"
1695 "mac.w %%d3l, %%d4u, %%acc0\n"
1696 "mac.w %%d3l, %%d4l, ( -16*4,%[x1]), %%d4, %%acc1\n"
1697 "movclr.l %%acc0, %%d0\n"
1698 "move.l %%d0, %[s0]\n"
1699 "movclr.l %%acc1, %%d0\n"
1700 "move.l %%d0, %[s1]\n"
1702 "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */
1703 "mac.w %%d0u, %%d4u, %%acc0\n"
1704 "mac.w %%d0u, %%d4l, ( -48*4,%[x1]), %%d4, %%acc1\n"
1705 "mac.w %%d1u, %%d4u, %%acc0\n"
1706 "mac.w %%d1u, %%d4l, ( 16*4,%[x1]), %%d4, %%acc1\n"
1707 "mac.w %%d1l, %%d4u, %%acc0\n"
1708 "mac.w %%d1l, %%d4l, ( -80*4,%[x1]), %%d4, %%acc1\n"
1709 "mac.w %%d2u, %%d4u, %%acc0\n"
1710 "mac.w %%d2u, %%d4l, ( 48*4,%[x1]), %%d4, %%acc1\n"
1711 "mac.w %%d2u, %%d4u, %%acc0\n"
1712 "mac.w %%d2u, %%d4l, (-112*4,%[x1]), %%d4, %%acc1\n"
1713 "mac.w %%d3u, %%d4u, %%acc0\n"
1714 "mac.w %%d3u, %%d4l, ( 80*4,%[x1]), %%d4, %%acc1\n"
1715 "mac.w %%d3l, %%d4u, %%acc0\n"
1716 "mac.w %%d3l, %%d4l, (-144*4,%[x1]), %%d4, %%acc1\n"
1717 "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */
1718 "mac.w %%d0u, %%d4u, %%acc0\n"
1719 "mac.w %%d0u, %%d4l, ( 112*4,%[x1]), %%d4, %%acc1\n"
1720 "mac.w %%d0u, %%d4u, %%acc0\n"
1721 "mac.w %%d0u, %%d4l, (-176*4,%[x1]), %%d4, %%acc1\n"
1722 "mac.w %%d1u, %%d4u, %%acc0\n"
1723 "mac.w %%d1u, %%d4l, ( 144*4,%[x1]), %%d4, %%acc1\n"
1724 "mac.w %%d1l, %%d4u, %%acc0\n"
1725 "mac.w %%d1l, %%d4l, (-208*4,%[x1]), %%d4, %%acc1\n"
1726 "mac.w %%d2u, %%d4u, %%acc0\n"
1727 "mac.w %%d2u, %%d4l, ( 176*4,%[x1]), %%d4, %%acc1\n"
1728 "mac.w %%d2u, %%d4u, %%acc0\n"
1729 "mac.w %%d2u, %%d4l, (-240*4,%[x1]), %%d4, %%acc1\n"
1730 "mac.w %%d3u, %%d4u, %%acc0\n"
1731 "mac.w %%d3u, %%d4l, ( 208*4,%[x1]), %%d4, %%acc1\n"
1732 "mac.w %%d3l, %%d4u, %%acc0\n"
1733 "mac.w %%d3l, %%d4l, %%acc1\n"
1734 "movclr.l %%acc0, %%d0\n"
1735 "move.l %%d0, %[t0]\n"
1736 "movclr.l %%acc1, %%d0\n"
1737 "move.l %%d0, %[t1]\n"
1739 : [x1] "+a" (x1), [s0] "+m" (s0), [t0] "+m" (t0),
1740 [s1] "+m" (s1), [t1] "+m" (t1)
1741 : [wp] "a" (wp) : "d0", "d1", "d2", "d3", "d4");
1743 u = shft4(s0 - t0);
1744 v = shft4(s0 + t0);
1745 t0 = sb0[14];
1746 s0 = sb0[15] - t0;
1748 sb0[31] = v + t0; /* A0 */
1749 sb0[30] = u + s0; /* A1 */
1750 sb0[15] = u - s0; /* A2 */
1751 sb0[14] = v - t0; /* A3 */
1753 u = shft4(s1 - t1);
1754 v = shft4(s1 + t1);
1755 t1 = sb1[14];
1756 s1 = sb1[15] - t1;
1758 sb1[31] = v + t1; /* A0 */
1759 sb1[30] = u + s1; /* A1 */
1760 sb1[15] = u - s1; /* A2 */
1761 sb1[14] = v - t1; /* A3 */
1763 #else
1764 int ch, s, t, *a;
1766 for(ch=0; ch<cfg.channels; ch++)
1768 a = ch ? sb1 : sb0;
1769 for(k=0; k<18; k++, wk+=64, a+=SBLIMIT)
1771 wp = enwindow;
1772 x1 = wk;
1773 x2 = x1 - 124;
1775 /* x1[-572] .... x1[448] = 1022 */
1776 /* 18*4*16*32 */
1777 for(i=-15; i<0; i++)
1779 s = (int)x2[-224*2] * wp[ 0]; t = (int)x1[ 224*2] * wp[ 0];
1780 s += (int)x2[-160*2] * wp[ 1]; t += (int)x1[ 160*2] * wp[ 1];
1781 s += (int)x2[- 96*2] * wp[ 2]; t += (int)x1[ 96*2] * wp[ 2];
1782 s += (int)x2[- 32*2] * wp[ 3]; t += (int)x1[ 32*2] * wp[ 3];
1783 s += (int)x2[ 32*2] * wp[ 4]; t += (int)x1[- 32*2] * wp[ 4];
1784 s += (int)x2[ 96*2] * wp[ 5]; t += (int)x1[- 96*2] * wp[ 5];
1785 s += (int)x2[ 160*2] * wp[ 6]; t += (int)x1[-160*2] * wp[ 6];
1786 s += (int)x2[ 224*2] * wp[ 7]; t += (int)x1[-224*2] * wp[ 7];
1787 s += (int)x1[-256*2] * wp[ 8]; t += (int)x2[ 256*2] * wp[16];
1788 s += (int)x1[-192*2] * wp[ 9]; t += (int)x2[ 192*2] * wp[17];
1789 s += (int)x1[-128*2] * wp[10]; t += (int)x2[ 128*2] * wp[18];
1790 s += (int)x1[- 64*2] * wp[11]; t += (int)x2[ 64*2] * wp[19];
1791 s += (int)x1[ 0*2] * wp[12]; t += (int)x2[ 0*2] * wp[20];
1792 s += (int)x1[ 64*2] * wp[13]; t += (int)x2[- 64*2] * wp[21];
1793 s += (int)x1[ 128*2] * wp[14]; t += (int)x2[-128*2] * wp[22];
1794 s += (int)x1[ 192*2] * wp[15]; t += (int)x2[-192*2] * wp[23];
1796 a[30+i*2] = shft4(t) + shft13(s) * wp[24];
1797 a[31+i*2] = shft13(t) * wp[25] - shft13(s) * wp[26];
1798 wp += 27;
1799 x1 -= 2;
1800 x2 += 2;
1803 t = (int)x1[- 16*2] * wp[ 8]; s = (int)x1[ -32*2] * wp[0];
1804 t += ((int)x1[- 48*2]-x1[ 16*2]) * wp[10]; s += (int)x1[ -96*2] * wp[1];
1805 t += ((int)x1[- 80*2]+x1[ 48*2]) * wp[12]; s += (int)x1[-160*2] * wp[2];
1806 t += ((int)x1[-112*2]-x1[ 80*2]) * wp[14]; s += (int)x1[-224*2] * wp[3];
1807 t += ((int)x1[-144*2]+x1[112*2]) * wp[16]; s += (int)x1[ 32*2] * wp[4];
1808 t += ((int)x1[-176*2]-x1[144*2]) * wp[18]; s += (int)x1[ 96*2] * wp[5];
1809 t += ((int)x1[-208*2]+x1[176*2]) * wp[20]; s += (int)x1[ 160*2] * wp[6];
1810 t += ((int)x1[-240*2]-x1[208*2]) * wp[22]; s += (int)x1[ 224*2] * wp[7];
1812 u = shft4(s - t);
1813 v = shft4(s + t);
1814 t = a[14];
1815 s = a[15] - t;
1817 a[31] = v + t; /* A0 */
1818 a[30] = u + s; /* A1 */
1819 a[15] = u - s; /* A2 */
1820 a[14] = v - t; /* A3 */
1822 wk -= 18 * 64 - 1; /* rewind wk (to next channel start) */
1824 #endif
1827 void window_subband2(short *x1, int a[SBLIMIT]) ICODE_ATTR;
1828 void window_subband2(short *x1, int a[SBLIMIT])
1830 int xr;
1831 short *wp = enwindow;
1832 short *x2 = x1 - 124;
1834 wp += 27 * 15;
1835 x1 -= 2 * 15;
1836 x2 += 2 * 15;
1838 xr = a[28] - a[0]; a[0] += a[28]; a[28] = shft9(xr) * wp[-2*27+25];
1839 xr = a[29] - a[1]; a[1] += a[29]; a[29] = shft9(xr) * wp[-2*27+25];
1840 xr = a[26] - a[2]; a[2] += a[26]; a[26] = shft9(xr) * wp[-4*27+25];
1841 xr = a[27] - a[3]; a[3] += a[27]; a[27] = shft9(xr) * wp[-4*27+25];
1842 xr = a[24] - a[4]; a[4] += a[24]; a[24] = shft9(xr) * wp[-6*27+25];
1843 xr = a[25] - a[5]; a[5] += a[25]; a[25] = shft9(xr) * wp[-6*27+25];
1844 xr = a[22] - a[6]; a[6] += a[22]; a[22] = shft9(xr) * SQRT ;
1845 xr = a[23] - a[7]; a[7] += a[23]; a[23] = shft9(xr) * SQRT - a[7];
1846 a[ 7] -= a[ 6];
1847 a[22] -= a[ 7];
1848 a[23] -= a[22];
1850 xr = a[ 6]; a[ 6] = a[31] - xr; a[31] = a[31] + xr;
1851 xr = a[ 7]; a[ 7] = a[30] - xr; a[30] = a[30] + xr;
1852 xr = a[22]; a[22] = a[15] - xr; a[15] = a[15] + xr;
1853 xr = a[23]; a[23] = a[14] - xr; a[14] = a[14] + xr;
1855 xr = a[20] - a[ 8]; a[ 8] += a[20]; a[20] = shft9(xr) * wp[-10*27+25];
1856 xr = a[21] - a[ 9]; a[ 9] += a[21]; a[21] = shft9(xr) * wp[-10*27+25];
1857 xr = a[18] - a[10]; a[10] += a[18]; a[18] = shft9(xr) * wp[-12*27+25];
1858 xr = a[19] - a[11]; a[11] += a[19]; a[19] = shft9(xr) * wp[-12*27+25];
1859 xr = a[16] - a[12]; a[12] += a[16]; a[16] = shft9(xr) * wp[-14*27+25];
1860 xr = a[17] - a[13]; a[13] += a[17]; a[17] = shft9(xr) * wp[-14*27+25];
1861 xr =-a[20] + a[24]; a[20] += a[24]; a[24] = shft9(xr) * wp[-12*27+25];
1862 xr =-a[21] + a[25]; a[21] += a[25]; a[25] = shft9(xr) * wp[-12*27+25];
1863 xr = a[ 4] - a[ 8]; a[ 4] += a[ 8]; a[ 8] = shft9(xr) * wp[-12*27+25];
1864 xr = a[ 5] - a[ 9]; a[ 5] += a[ 9]; a[ 9] = shft9(xr) * wp[-12*27+25];
1865 xr = a[ 0] - a[12]; a[ 0] += a[12]; a[12] = shft9(xr) * wp[ -4*27+25];
1866 xr = a[ 1] - a[13]; a[ 1] += a[13]; a[13] = shft9(xr) * wp[ -4*27+25];
1867 xr = a[16] - a[28]; a[16] += a[28]; a[28] = shft9(xr) * wp[ -4*27+25];
1868 xr =-a[17] + a[29]; a[17] += a[29]; a[29] = shft9(xr) * wp[ -4*27+25];
1870 xr = SQRT * shft9(a[ 2] - a[10]); a[ 2] += a[10]; a[10] = xr;
1871 xr = SQRT * shft9(a[ 3] - a[11]); a[ 3] += a[11]; a[11] = xr;
1872 xr = SQRT * shft9(a[26] - a[18]); a[18] += a[26]; a[26] = xr - a[18];
1873 xr = SQRT * shft9(a[27] - a[19]); a[19] += a[27]; a[27] = xr - a[19];
1875 xr = a[ 2]; a[19] -= a[ 3]; a[ 3] -= xr; a[ 2] = a[31] - xr; a[31] += xr;
1876 xr = a[ 3]; a[11] -= a[19]; a[18] -= xr; a[ 3] = a[30] - xr; a[30] += xr;
1877 xr = a[18]; a[27] -= a[11]; a[19] -= xr; a[18] = a[15] - xr; a[15] += xr;
1879 xr = a[19]; a[10] -= xr; a[19] = a[14] - xr; a[14] += xr;
1880 xr = a[10]; a[11] -= xr; a[10] = a[23] - xr; a[23] += xr;
1881 xr = a[11]; a[26] -= xr; a[11] = a[22] - xr; a[22] += xr;
1882 xr = a[26]; a[27] -= xr; a[26] = a[ 7] - xr; a[ 7] += xr;
1884 xr = a[27]; a[27] = a[6] - xr; a[6] += xr;
1886 xr = SQRT * shft9(a[ 0] - a[ 4]); a[ 0] += a[ 4]; a[ 4] = xr;
1887 xr = SQRT * shft9(a[ 1] - a[ 5]); a[ 1] += a[ 5]; a[ 5] = xr;
1888 xr = SQRT * shft9(a[16] - a[20]); a[16] += a[20]; a[20] = xr;
1889 xr = SQRT * shft9(a[17] - a[21]); a[17] += a[21]; a[21] = xr;
1890 xr =-SQRT * shft9(a[ 8] - a[12]); a[ 8] += a[12]; a[12] = xr - a[ 8];
1891 xr =-SQRT * shft9(a[ 9] - a[13]); a[ 9] += a[13]; a[13] = xr - a[ 9];
1892 xr =-SQRT * shft9(a[25] - a[29]); a[25] += a[29]; a[29] = xr - a[25];
1893 xr =-SQRT * shft9(a[24] + a[28]); a[24] -= a[28]; a[28] = xr - a[24];
1895 xr = a[24] - a[16]; a[24] = xr;
1896 xr = a[20] - xr; a[20] = xr;
1897 xr = a[28] - xr; a[28] = xr;
1899 xr = a[25] - a[17]; a[25] = xr;
1900 xr = a[21] - xr; a[21] = xr;
1901 xr = a[29] - xr; a[29] = xr;
1903 xr = a[17] - a[1]; a[17] = xr;
1904 xr = a[ 9] - xr; a[ 9] = xr;
1905 xr = a[25] - xr; a[25] = xr;
1906 xr = a[ 5] - xr; a[ 5] = xr;
1907 xr = a[21] - xr; a[21] = xr;
1908 xr = a[13] - xr; a[13] = xr;
1909 xr = a[29] - xr; a[29] = xr;
1911 xr = a[ 1] - a[0]; a[ 1] = xr;
1912 xr = a[16] - xr; a[16] = xr;
1913 xr = a[17] - xr; a[17] = xr;
1914 xr = a[ 8] - xr; a[ 8] = xr;
1915 xr = a[ 9] - xr; a[ 9] = xr;
1916 xr = a[24] - xr; a[24] = xr;
1917 xr = a[25] - xr; a[25] = xr;
1918 xr = a[ 4] - xr; a[ 4] = xr;
1919 xr = a[ 5] - xr; a[ 5] = xr;
1920 xr = a[20] - xr; a[20] = xr;
1921 xr = a[21] - xr; a[21] = xr;
1922 xr = a[12] - xr; a[12] = xr;
1923 xr = a[13] - xr; a[13] = xr;
1924 xr = a[28] - xr; a[28] = xr;
1925 xr = a[29] - xr; a[29] = xr;
1927 xr = a[ 0]; a[ 0] += a[31]; a[31] -= xr;
1928 xr = a[ 1]; a[ 1] += a[30]; a[30] -= xr;
1929 xr = a[16]; a[16] += a[15]; a[15] -= xr;
1930 xr = a[17]; a[17] += a[14]; a[14] -= xr;
1931 xr = a[ 8]; a[ 8] += a[23]; a[23] -= xr;
1932 xr = a[ 9]; a[ 9] += a[22]; a[22] -= xr;
1933 xr = a[24]; a[24] += a[ 7]; a[ 7] -= xr;
1934 xr = a[25]; a[25] += a[ 6]; a[ 6] -= xr;
1935 xr = a[ 4]; a[ 4] += a[27]; a[27] -= xr;
1936 xr = a[ 5]; a[ 5] += a[26]; a[26] -= xr;
1937 xr = a[20]; a[20] += a[11]; a[11] -= xr;
1938 xr = a[21]; a[21] += a[10]; a[10] -= xr;
1939 xr = a[12]; a[12] += a[19]; a[19] -= xr;
1940 xr = a[13]; a[13] += a[18]; a[18] -= xr;
1941 xr = a[28]; a[28] += a[ 3]; a[ 3] -= xr;
1942 xr = a[29]; a[29] += a[ 2]; a[ 2] -= xr;
1945 void mdct_long(int *out, int *in) ICODE_ATTR;
1946 void mdct_long(int *out, int *in)
1948 int ct,st;
1949 int tc1, tc2, tc3, tc4, ts5, ts6, ts7, ts8;
1950 int ts1, ts2, ts3, ts4, tc5, tc6, tc7, tc8;
1952 /* 1,2, 5,6, 9,10, 13,14, 17 */
1953 tc1 = in[17] - in[ 9];
1954 tc3 = in[15] - in[11];
1955 tc4 = in[14] - in[12];
1956 ts5 = in[ 0] + in[ 8];
1957 ts6 = in[ 1] + in[ 7];
1958 ts7 = in[ 2] + in[ 6];
1959 ts8 = in[ 3] + in[ 5];
1961 out[17] = (ts5 + ts7 - ts8) * cx[8] - (ts6 - in[4]) * cx[8];
1962 st = (ts5 + ts7 - ts8) * cx[7] + (ts6 - in[4]) * cx[8];
1963 ct = (tc1 - tc3 - tc4) * cx[6];
1964 out[5] = ct + st;
1965 out[6] = ct - st;
1967 tc2 = (in[16] - in[10]) * cx[6];
1968 ts6 = ts6 * cx[7] + in[4] * cx[8];
1970 ct = tc1 * cx[0] + tc2 + tc3 * cx[1] + tc4 * cx[2];
1971 st = -ts5 * cx[4] + ts6 - ts7 * cx[5] + ts8 * cx[3];
1972 out[1] = ct + st;
1973 out[2] = ct - st;
1975 ct = tc1 * cx[1] - tc2 - tc3 * cx[2] + tc4 * cx[0];
1976 st = -ts5 * cx[5] + ts6 - ts7 * cx[3] + ts8 * cx[4];
1977 out[ 9] = ct + st;
1978 out[10] = ct - st;
1980 ct = tc1 * cx[2] - tc2 + tc3 * cx[0] - tc4 * cx[1];
1981 st = ts5 * cx[3] - ts6 + ts7 * cx[4] - ts8 * cx[5];
1982 out[13] = ct + st;
1983 out[14] = ct - st;
1985 ts1 = in[ 8] - in[ 0];
1986 ts3 = in[ 6] - in[ 2];
1987 ts4 = in[ 5] - in[ 3];
1988 tc5 = in[17] + in[ 9];
1989 tc6 = in[16] + in[10];
1990 tc7 = in[15] + in[11];
1991 tc8 = in[14] + in[12];
1993 out[0] = (tc5 + tc7 + tc8) * cx[8] + (tc6 + in[13]) * cx[8];
1994 ct = (tc5 + tc7 + tc8) * cx[7] - (tc6 + in[13]) * cx[8];
1995 st = (ts1 - ts3 + ts4) * cx[6];
1996 out[11] = ct + st;
1997 out[12] = ct - st;
1999 ts2 = (in[7] - in[1]) * cx[6];
2000 tc6 = in[13] * cx[8] - tc6 * cx[7];
2002 ct = tc5 * cx[3] - tc6 + tc7 * cx[4] + tc8 * cx[5];
2003 st = ts1 * cx[2] + ts2 + ts3 * cx[0] + ts4 * cx[1];
2004 out[3] = ct + st;
2005 out[4] = ct - st;
2007 ct =-tc5 * cx[5] + tc6 - tc7 * cx[3] - tc8 * cx[4];
2008 st = ts1 * cx[1] + ts2 - ts3 * cx[2] - ts4 * cx[0];
2009 out[7] = ct + st;
2010 out[8] = ct - st;
2012 ct =-tc5 * cx[4] + tc6 - tc7 * cx[5] - tc8 * cx[3];
2013 st = ts1 * cx[0] - ts2 + ts3 * cx[1] - ts4 * cx[2];
2014 out[15] = ct + st;
2015 out[16] = ct - st;
2018 static int find_bitrate_index(int type, int bitrate)
2020 int i;
2022 for(i=0;i<14;i++)
2023 if(bitrate == bitr_index[type][i])
2024 break;
2026 return i;
2029 static int find_samplerate_index(long freq, int *mp3_type)
2031 int mpg, rate;
2033 /* set default values: MPEG1 at 44100/s */
2034 *mp3_type = 1;
2036 for(mpg=0; mpg<2; mpg++)
2037 for(rate=0; rate<3; rate++)
2038 if(freq == sampr_index[mpg][rate])
2039 { *mp3_type = mpg; return rate; }
2041 return 0;
2044 void init_mp3_encoder_engine(bool stereo, int bitrate, int sample_rate)
2046 uint32_t avg_byte_per_frame;
2048 #ifdef ROCKBOX_LITTLE_ENDIAN
2049 cfg.byte_order = order_littleEndian;
2050 #else
2051 cfg.byte_order = order_bigEndian;
2052 #endif
2054 if(bitrate < 96 && stereo && sample_rate >= 32000)
2055 { /* use MPEG2 format */
2056 sample_rate >>= 1;
2057 cfg.resample = 1;
2058 cfg.granules = 1;
2060 else
2061 { /* use MPEG1 format */
2062 cfg.resample = 0;
2063 cfg.granules = 2;
2066 cfg.samplerate = sample_rate;
2067 cfg.channels = stereo ? 2 : 1;
2068 cfg.mpg.mode = stereo ? 0 : 3; /* 0=stereo, 3=mono */
2069 cfg.mpg.bitrate = stereo ? bitrate : bitrate > 160 ? 160 : bitrate;
2070 cfg.mpg.smpl_id = find_samplerate_index(cfg.samplerate, &cfg.mpg.type);
2071 cfg.mpg.bitr_id = find_bitrate_index(cfg.mpg.type, cfg.mpg.bitrate);
2072 cfg.mpg.num_bands = num_bands[stereo ? cfg.mpg.type : 2][cfg.mpg.bitr_id];
2074 memcpy(scalefac, sfBand[cfg.mpg.smpl_id + 3*cfg.mpg.type], sizeof(scalefac));
2075 memset(mfbuf , 0 , sizeof(mfbuf ));
2076 memset(mdct_freq , 0 , sizeof(mdct_freq ));
2077 memset(enc_data , 0 , sizeof(enc_data ));
2078 memset(sb_data , 0 , sizeof(sb_data ));
2079 memset(&CodedData, 0 , sizeof(CodedData ));
2080 memcpy(ca , ca_const , sizeof(ca ));
2081 memcpy(cs , cs_const , sizeof(cs ));
2082 memcpy(cx , cx_const , sizeof(cx ));
2083 memcpy(win , win_const , sizeof(win ));
2084 memcpy(enwindow , enwindow_const , sizeof(enwindow ));
2085 memcpy(int2idx , int2idx_const , sizeof(int2idx ));
2086 memcpy(ht_count , ht_count_const , sizeof(ht_count ));
2087 memcpy( tab01 , tab01_const , sizeof(tab01 ));
2088 memcpy( tab23 , tab23_const , sizeof(tab23 ));
2089 memcpy( tab56 , tab56_const , sizeof(tab56 ));
2090 memcpy( tab1315 , tab1315_const , sizeof(tab1315 ));
2091 memcpy( tab1624 , tab1624_const , sizeof(tab1624 ));
2092 memcpy( tab789 , tab789_const , sizeof(tab789 ));
2093 memcpy( tabABC , tabABC_const , sizeof(tabABC ));
2094 memcpy( t1HB , t1HB_const , sizeof(t1HB ));
2095 memcpy( t2HB , t2HB_const , sizeof(t2HB ));
2096 memcpy( t3HB , t3HB_const , sizeof(t3HB ));
2097 memcpy( t5HB , t5HB_const , sizeof(t5HB ));
2098 memcpy( t6HB , t6HB_const , sizeof(t6HB ));
2099 memcpy( t7HB , t7HB_const , sizeof(t7HB ));
2100 memcpy( t8HB , t8HB_const , sizeof(t8HB ));
2101 memcpy( t9HB , t9HB_const , sizeof(t9HB ));
2102 memcpy(t10HB , t10HB_const , sizeof(t10HB ));
2103 memcpy(t11HB , t11HB_const , sizeof(t11HB ));
2104 memcpy(t12HB , t12HB_const , sizeof(t12HB ));
2105 memcpy(t13HB , t13HB_const , sizeof(t13HB ));
2106 memcpy(t15HB , t15HB_const , sizeof(t15HB ));
2107 memcpy(t16HB , t16HB_const , sizeof(t16HB ));
2108 memcpy(t24HB , t24HB_const , sizeof(t24HB ));
2109 memcpy( t1l , t1l_const , sizeof(t1l ));
2110 memcpy( t2l , t2l_const , sizeof(t2l ));
2111 memcpy( t3l , t3l_const , sizeof(t3l ));
2112 memcpy( t5l , t5l_const , sizeof(t5l ));
2113 memcpy( t6l , t6l_const , sizeof(t6l ));
2114 memcpy( t7l , t7l_const , sizeof(t7l ));
2115 memcpy( t8l , t8l_const , sizeof(t8l ));
2116 memcpy( t9l , t9l_const , sizeof(t9l ));
2117 memcpy(t10l , t10l_const , sizeof(t10l ));
2118 memcpy(t11l , t11l_const , sizeof(t11l ));
2119 memcpy(t12l , t12l_const , sizeof(t12l ));
2120 memcpy(t13l , t13l_const , sizeof(t13l ));
2121 memcpy(t15l , t15l_const , sizeof(t15l ));
2122 memcpy(t16l , t16l_const , sizeof(t16l ));
2123 memcpy(t24l , t24l_const , sizeof(t24l ));
2124 memcpy(ht , ht_const , sizeof(ht ));
2126 ht[ 0].table = NULL; ht[ 0].hlen = NULL; /* Apparently not used */
2127 ht[ 1].table = t1HB; ht[ 1].hlen = t1l;
2128 ht[ 2].table = t2HB; ht[ 2].hlen = t2l;
2129 ht[ 3].table = t3HB; ht[ 3].hlen = t3l;
2130 ht[ 4].table = NULL; ht[ 4].hlen = NULL; /* Apparently not used */
2131 ht[ 5].table = t5HB; ht[ 5].hlen = t5l;
2132 ht[ 6].table = t6HB; ht[ 6].hlen = t6l;
2133 ht[ 7].table = t7HB; ht[ 7].hlen = t7l;
2134 ht[ 8].table = t8HB; ht[ 8].hlen = t8l;
2135 ht[ 9].table = t9HB; ht[ 9].hlen = t9l;
2136 ht[10].table = t10HB; ht[10].hlen = t10l;
2137 ht[11].table = t11HB; ht[11].hlen = t11l;
2138 ht[12].table = t12HB; ht[12].hlen = t12l;
2139 ht[13].table = t13HB; ht[13].hlen = t13l;
2140 ht[14].table = NULL; ht[14].hlen = NULL; /* Apparently not used */
2141 ht[15].table = t15HB; ht[15].hlen = t15l;
2143 /* Figure average number of 'bytes' per frame */
2144 avg_byte_per_frame = SAMPL2 * 16000 * cfg.mpg.bitrate / (2 - cfg.mpg.type);
2145 avg_byte_per_frame = avg_byte_per_frame / cfg.samplerate;
2146 cfg.byte_per_frame = avg_byte_per_frame / 64;
2147 cfg.frac_per_frame = avg_byte_per_frame & 63;
2148 cfg.slot_lag = 0;
2149 cfg.sideinfo_len = 32 + (cfg.mpg.type ? (cfg.channels == 1 ? 136 : 256)
2150 : (cfg.channels == 1 ? 72 : 136));
2153 void set_scale_facs(int *mdct_freq)
2155 unsigned int i, is, ie, k, s;
2156 int max_freq_val, avrg_freq_val;
2158 /* calc average of first 256 frequency values */
2159 for(avrg_freq_val=i=0; i<256; i++)
2160 avrg_freq_val += mdct_freq[i];
2161 avrg_freq_val >>= 8;
2163 /* if max of current band is smaller than average, increase precision */
2164 /* last band keeps untouched (not scaled) */
2165 for(is=k=0; is<scalefac[21]; k++)
2167 max_freq_val = 0;
2169 for(i=is, ie=scalefac[k+1]; i<ie; i++)
2170 if(max_freq_val < mdct_freq[i])
2171 max_freq_val = mdct_freq[i];
2173 for(s=0; s<3; s++)
2174 if((max_freq_val<<s) > avrg_freq_val)
2175 break;
2177 band_scale_f[k] = (unsigned char)s;
2179 for(i=is; s && i<ie; i++)
2180 mdct_freq[i] <<= s;
2182 is = ie;
2186 void compress(void)
2188 int i, gr, gr_cnt;
2189 char stg[20];
2190 uint32_t max;
2192 while(1)
2194 if((frames & 7) == 0)
2195 { rb->lcd_clear_display();
2196 rb->snprintf(stg, 20, "Frame %d / %d", frames, wav_size/SAMPL2/8);
2197 rb->lcd_putsxy(4, 20, stg);
2198 rb->lcd_update();
2200 /* encode one mp3 frame in this loop */
2201 memset(CodedData.bbuf, 0, sizeof(CodedData.bbuf));
2203 if((cfg.slot_lag += cfg.frac_per_frame) >= 64)
2204 { /* Padding for this frame */
2205 cfg.slot_lag -= 64;
2206 cfg.mpg.padding = 1;
2208 else
2209 cfg.mpg.padding = 0;
2211 cfg.mean_bits = (8 * cfg.byte_per_frame + 8 * cfg.mpg.padding
2212 - cfg.sideinfo_len) / cfg.granules / cfg.channels
2213 - 42; // reserved for scale_facs
2215 /* shift out old samples */
2216 memcpy(mfbuf, mfbuf + 2*cfg.granules*576, 4*512);
2218 /* read new samples to iram for further processing */
2219 if(read_samples((uint32_t*)(mfbuf + 2*512), SAMP_PER_FRAME) == 0)
2220 break;
2222 /* swap bytes if neccessary */
2223 if(cfg.byte_order == order_bigEndian)
2224 for(i=0; i<SAMP_PER_FRAME; i++)
2226 uint32_t t = ((uint32_t*)mfbuf)[512 + i];
2227 t = ((t >> 8) & 0xff00ff) | ((t << 8) & 0xff00ff00);
2228 ((uint32_t*)mfbuf)[512 + i] = t;
2231 if(cfg.resample) /* downsample to half of original */
2232 for(i=2*512; i<2*512+2*SAMP_PER_FRAME; i+=4)
2234 mfbuf[i/2+512] = (short)(((int)mfbuf[i+0] + mfbuf[i+2]) >> 1);
2235 mfbuf[i/2+513] = (short)(((int)mfbuf[i+1] + mfbuf[i+3]) >> 1);
2238 if(cfg.channels == 1) /* mix left and right channels to mono */
2239 for(i=2*512; i<2*512+2*SAMP_PER_FRAME; i+=2)
2240 mfbuf[i] = mfbuf[i+1] = (short)(((int)mfbuf[i] + mfbuf[i+1]) >> 1);
2242 cfg.ResvSize = 0;
2243 gr_cnt = cfg.granules * cfg.channels;
2244 CodedData.bitpos = cfg.sideinfo_len; /* leave space for mp3 header */
2246 for(gr=0; gr<cfg.granules; gr++)
2248 short *wk = mfbuf + 2*286 + gr*1152;
2249 int ch;
2251 /* 16bit packed wav data can be windowed efficiently on coldfire */
2252 window_subband1(wk, sb_data[0][1-gr][0], sb_data[1][1-gr][0]);
2254 for(ch=0; ch<cfg.channels; ch++)
2256 int ii, k, shift;
2258 wk = mfbuf + 2*286 + gr*1152 + ch;
2260 /* 36864=4*18*16*32 */
2261 for(k=0; k<18; k++, wk+=64)
2263 window_subband2(wk, sb_data[ch][1-gr][k]);
2264 /* Compensate for inversion in the analysis filter */
2265 if(k & 1)
2267 int band;
2268 for(band=1; band<32; band+=2)
2269 sb_data[ch][1-gr][k][band] *= -1;
2273 /* Perform imdct of 18 previous + 18 current subband samples */
2274 /* for integer precision do this loop again (if neccessary) */
2275 shift = 14 - (cfg.cod_info[gr][ch].additStep >> 2);
2276 for(k=1,ii=0; ii<3 && k; ii++)
2278 int *mdct = mdct_freq;
2279 int band;
2281 cfg.cod_info[gr][ch].additStep = 4 * (14 - shift);
2282 for(band=0; band<cfg.mpg.num_bands; band++, mdct+=18)
2284 int *band0 = sb_data[ch][ gr][0] + order[band];
2285 int *band1 = sb_data[ch][1-gr][0] + order[band];
2286 int work[18];
2288 /* 9216=4*32*9*8 */
2289 for(k=-9; k<0; k++)
2291 int a = shft_n(band1[(k+9)*32], shift);
2292 int b = shft_n(band1[(8-k)*32], shift);
2293 int c = shft_n(band0[(k+9)*32], shift);
2294 int d = shft_n(band0[(8-k)*32], shift);
2296 work[k+ 9] = shft16(a * win[k+ 9][0] +
2297 b * win[k+ 9][1] +
2298 c * win[k+ 9][2] +
2299 d * win[k+ 9][3]);
2301 work[k+18] = shft16(c * win[k+18][0] +
2302 d * win[k+18][1] +
2303 a * win[k+18][2] +
2304 b * win[k+18][3]);
2307 /* 7200=4*18*100 */
2308 mdct_long(mdct, work);
2310 /* Perform aliasing reduction butterfly */
2311 if(band != 0)
2313 for(k=7; k>=0; --k)
2315 int bu, bd;
2316 bu = shft15(mdct[k]) * ca[k] +
2317 shft15(mdct[-1-k]) * cs[k];
2318 bd = shft15(mdct[k]) * cs[k] -
2319 shft15(mdct[-1-k]) * ca[k];
2320 mdct[-1-k] = bu;
2321 mdct[ k ] = bd;
2326 max = 0;
2327 for(k=0; k<576; k++)
2329 if(mdct_freq[k] < 0)
2331 mdct_sign[k] = 1; /* negative */
2332 mdct_freq[k] = shft13(-mdct_freq[k]);
2334 else
2336 mdct_sign[k] = 0; /* positive */
2337 mdct_freq[k] = shft13(mdct_freq[k]);
2340 if(max < (uint32_t)mdct_freq[k])
2341 max = (uint32_t)mdct_freq[k];
2344 cfg.cod_info[gr][ch].max_val = max;
2346 /* calc new shift for higher integer precision */
2347 for(k=0; max<(uint32_t)(0x7800>>k); k++) shift--;
2348 for( ; (max>>k)>=(uint32_t)0x10000; k++) shift++;
2349 if(shift < 0) shift = 0;
2352 cfg.cod_info[gr][ch].quantStep +=
2353 cfg.cod_info[gr][ch].additStep;
2355 set_scale_facs(mdct_freq);
2357 /* bit and noise allocation */
2358 iteration_loop(mdct_freq, &cfg.cod_info[gr][ch],
2359 gr_cnt--);
2360 /* write the frame to the bitstream */
2361 Huffmancodebits(enc_data, mdct_sign,
2362 &cfg.cod_info[gr][ch]);
2364 cfg.cod_info[gr][ch].quantStep -=
2365 cfg.cod_info[gr][ch].additStep;
2367 if(cfg.granules == 1)
2369 memcpy(sb_data[ch][0], sb_data[ch][1],
2370 sizeof(sb_data[ch][0]));
2375 enc_size = (CodedData.bitpos + 7) >> 3;
2376 /* finish this chunk by adding sideinfo header data */
2377 CodedData.bitpos = 0;
2378 encodeSideInfo( cfg.cod_info );
2380 if(cfg.byte_order != order_bigEndian)
2381 for(i=0; i<(enc_size+3)/4; i++)
2382 CodedData.bbuf[i] = myswap32(CodedData.bbuf[i]);
2384 if(enc_chunk + enc_size > 65536)
2386 /* copy iram mp3 buffer to sdram/file */
2387 rb->write(mp3file, enc_buffer, enc_chunk & ~3);
2388 memcpy(enc_buffer, enc_buffer + (enc_chunk >> 2), enc_chunk & 3);
2389 enc_chunk &= 3;
2392 memcpy((char*)enc_buffer + enc_chunk, CodedData.bbuf, enc_size);
2393 enc_chunk += enc_size;
2394 frames++;
2396 /* write last chunks to disk */
2397 rb->write(mp3file, enc_buffer, enc_chunk);
2401 int num_file;
2402 char mp3_name[80];
2404 void get_mp3_filename(const char *wav_name)
2406 int slen = rb->strlen(wav_name);
2407 rb->strncpy(mp3_name, wav_name, 79);
2408 rb->strncpy(mp3_name + slen - 4, ".mp3", 5);
2411 #if CONFIG_KEYPAD == IRIVER_H100_PAD || CONFIG_KEYPAD == IRIVER_H300_PAD
2412 #define MP3ENC_PREV BUTTON_UP
2413 #define MP3ENC_NEXT BUTTON_DOWN
2414 #define MP3ENC_DONE BUTTON_OFF
2415 #define MP3ENC_SELECT BUTTON_SELECT
2416 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \
2417 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
2418 #define MP3ENC_PREV BUTTON_SCROLL_BACK
2419 #define MP3ENC_NEXT BUTTON_SCROLL_FWD
2420 #define MP3ENC_DONE BUTTON_MENU
2421 #define MP3ENC_SELECT BUTTON_SELECT
2422 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
2423 #define MP3ENC_PREV BUTTON_UP
2424 #define MP3ENC_NEXT BUTTON_DOWN
2425 #define MP3ENC_DONE BUTTON_POWER
2426 #define MP3ENC_SELECT BUTTON_SELECT
2427 #elif CONFIG_KEYPAD == GIGABEAT_PAD
2428 #define MP3ENC_PREV BUTTON_UP
2429 #define MP3ENC_NEXT BUTTON_DOWN
2430 #define MP3ENC_DONE BUTTON_POWER
2431 #define MP3ENC_SELECT BUTTON_SELECT
2432 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
2433 (CONFIG_KEYPAD == SANSA_C200_PAD)
2434 #define MP3ENC_PREV BUTTON_UP
2435 #define MP3ENC_NEXT BUTTON_DOWN
2436 #define MP3ENC_DONE BUTTON_POWER
2437 #define MP3ENC_SELECT BUTTON_SELECT
2438 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
2439 #define MP3ENC_PREV BUTTON_SCROLL_UP
2440 #define MP3ENC_NEXT BUTTON_SCROLL_DOWN
2441 #define MP3ENC_DONE BUTTON_POWER
2442 #define MP3ENC_SELECT BUTTON_PLAY
2443 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
2444 #define MP3ENC_PREV BUTTON_UP
2445 #define MP3ENC_NEXT BUTTON_DOWN
2446 #define MP3ENC_DONE BUTTON_BACK
2447 #define MP3ENC_SELECT BUTTON_SELECT
2448 #elif CONFIG_KEYPAD == MROBE100_PAD
2449 #define MP3ENC_PREV BUTTON_UP
2450 #define MP3ENC_NEXT BUTTON_DOWN
2451 #define MP3ENC_DONE BUTTON_POWER
2452 #define MP3ENC_SELECT BUTTON_SELECT
2453 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
2454 #define MP3ENC_PREV BUTTON_RC_VOL_UP
2455 #define MP3ENC_NEXT BUTTON_RC_VOL_DOWN
2456 #define MP3ENC_DONE BUTTON_RC_REC
2457 #define MP3ENC_SELECT BUTTON_RC_FF
2458 #elif CONFIG_KEYPAD == COWOND2_PAD
2459 #define MP3ENC_DONE BUTTON_POWER
2460 #elif CONFIG_KEYPAD == IAUDIO67_PAD
2461 #define MP3ENC_PREV BUTTON_LEFT
2462 #define MP3ENC_NEXT BUTTON_RIGHT
2463 #define MP3ENC_DONE BUTTON_POWER
2464 #define MP3ENC_SELECT BUTTON_PLAY
2465 #else
2466 #error No keymap defined!
2467 #endif
2469 #ifdef HAVE_TOUCHSCREEN
2470 #ifndef MP3ENC_PREV
2471 #define MP3ENC_PREV BUTTON_MIDLEFT
2472 #endif
2473 #ifndef MP3ENC_NEXT
2474 #define MP3ENC_NEXT BUTTON_MIDRIGHT
2475 #endif
2476 #ifndef MP3ENC_DONE
2477 #define MP3ENC_DONE BUTTON_TOPLEFT
2478 #endif
2479 #ifndef MP3ENC_SELECT
2480 #define MP3ENC_SELECT BUTTON_CENTER
2481 #endif
2482 #endif
2484 enum plugin_status plugin_start(const struct plugin_api* api, const void* parameter)
2486 int rat, srat, nrat; /* for rate selection */
2487 int cont = 1, butt;
2488 long tim = 0;
2489 char stg[40];
2490 static const char* bstrg[] = {
2491 "64", "80", "96", "112", "128", "160", "192", "224", "256", "320"
2493 static const int brate[] = {
2494 64, 80, 96, 112, 128, 160, 192, 224, 256, 320
2497 if (parameter == NULL)
2498 return PLUGIN_ERROR;
2500 PLUGIN_IRAM_INIT(api)
2502 #ifdef CPU_COLDFIRE
2503 coldfire_set_macsr(0); /* integer mode */
2504 #endif
2506 rb = api;
2507 rb->lcd_setfont(FONT_SYSFIXED);
2509 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
2510 rb->cpu_boost(true);
2511 #endif
2512 rb->button_clear_queue();
2514 nrat = 9;
2515 srat = 4; /* set 128kBit as default */
2517 while(cont && (butt = rb->button_get_w_tmo(HZ/10)) != MP3ENC_SELECT)
2519 switch(butt)
2521 case MP3ENC_DONE: cont = 0; break;
2522 case MP3ENC_PREV|BUTTON_REPEAT:
2523 case MP3ENC_PREV: if(srat > 0 ) srat--; break;
2524 case MP3ENC_NEXT|BUTTON_REPEAT:
2525 case MP3ENC_NEXT: if(srat < nrat) srat++; break;
2528 rb->lcd_clear_display();
2529 rb->lcd_putsxy(2, 2, "-- Select Bitrate --");
2531 for(rat=0; rat<=nrat; rat++)
2532 rb->lcd_putsxy(2, 12 + rat*8, bstrg[rat]);
2533 rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
2534 rb->lcd_fillrect(0, 12 + srat*8, 127, 8);
2535 rb->lcd_set_drawmode(DRMODE_SOLID);
2536 rb->lcd_update();
2539 wav_filename = parameter;
2541 if(cont)
2543 if(wave_open() == 0)
2545 init_mp3_encoder_engine(true, brate[srat], cfg.samplerate);
2546 get_mp3_filename(wav_filename);
2547 mp3file = rb->open(mp3_name , O_WRONLY|O_CREAT|O_TRUNC);
2548 frames = 0;
2550 tim = *rb->current_tick;
2551 compress();
2552 tim = *rb->current_tick - tim;
2554 rb->close(wavfile);
2555 rb->close(mp3file);
2557 else
2559 rb->close(wavfile);
2560 rb->snprintf(stg, 20, "WaveOpen failed %d", wave_open());
2561 rb->lcd_putsxy(0, 20, stg);
2562 rb->lcd_update();
2563 rb->sleep(5*HZ);
2566 rb->lcd_clear_display();
2567 rb->snprintf(stg, 30, " Conversion: %ld.%02lds ", tim/100, tim%100);
2568 rb->lcd_putsxy(0, 30, stg);
2569 tim = frames * SAMP_PER_FRAME * 100 / 44100; /* unit=.01s */
2570 rb->snprintf(stg, 30, " WAV-Length: %ld.%02lds ", tim/100, tim%100);
2571 rb->lcd_putsxy(0, 20, stg);
2572 rb->lcd_update();
2573 rb->sleep(5*HZ);
2576 rb->lcd_setfont(FONT_UI);
2577 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
2578 rb->cpu_boost(false);
2579 #endif
2580 return PLUGIN_OK;