fix FS#11264 - frequency bar and presets not working in the sbs
[kugel-rb.git] / apps / plugins / mp3_encoder.c
blobfe417ce180bf1f603662c6a02bd94bf256b2cf9e
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 #define SAMP_PER_FRAME 1152
21 #define SAMPL2 576
22 #define SBLIMIT 32
23 #define HTN 16
24 #define putlong(c, s) if(s+sz <= 32) { cc = (cc << s) | c; sz+= s; } \
25 else { putbits(cc, sz); cc = c; sz = s; }
27 enum e_byte_order { order_unknown, order_bigEndian, order_littleEndian };
29 typedef struct {
30 int type; /* 0=(MPEG2 - 22.05,24,16kHz) 1=(MPEG1 - 44.1,48,32kHz) */
31 int mode; /* 0=stereo, 1=jstereo, 2=dual, 3=mono */
32 int bitrate;
33 int padding;
34 int num_bands;
35 long bitr_id;
36 int smpl_id;
37 } mpeg_t;
39 /* Side information */
40 typedef struct {
41 uint32_t part2_3_length;
42 int count1; /* number of 0-1-quadruples */
43 uint32_t global_gain;
44 uint32_t table_select[4];
45 uint32_t region_0_1;
46 uint32_t address1;
47 uint32_t address2;
48 uint32_t address3;
49 long quantStep;
50 long additStep;
51 uint32_t max_val;
52 } side_info_t;
54 typedef struct {
55 enum e_byte_order byte_order;
56 side_info_t cod_info[2][2];
57 mpeg_t mpg;
58 long frac_per_frame;
59 long byte_per_frame;
60 long slot_lag;
61 int sideinfo_len;
62 int mean_bits;
63 int ResvSize;
64 int channels;
65 int granules;
66 int resample;
67 long samplerate;
68 } config_t;
70 typedef struct {
71 int bitpos; /* current bitpos for writing */
72 uint32_t bbuf[263];
73 } BF_Data;
75 struct huffcodetab {
76 int len; /* max. index */
77 const uint8_t *table; /* pointer to array[len][len] */
78 const uint8_t *hlen; /* pointer to array[len][len] */
81 struct huffcodebig {
82 int len; /* max. index */
83 int linbits; /* number of linbits */
84 int linmax; /* max number stored in linbits */
87 #define shft4(x) ((x + 8) >> 4)
88 #define shft9(x) ((x + 256) >> 9)
89 #define shft13(x) ((x + 4096) >> 13)
90 #define shft15(x) ((x + 16384) >> 15)
91 #define shft16(x) ((x + 32768) >> 16)
92 #define shft_n(x,n) ((x) >> n)
93 #define SQRT 724 /* sqrt(2) * 512 */
95 static short mfbuf [2*(1152+512)] IBSS_ATTR; /* 3328 Bytes */
96 static int sb_data [2][2][18][SBLIMIT] IBSS_ATTR; /* 13824 Bytes */
97 static int mdct_freq [SAMPL2] IBSS_ATTR; /* 2304 Bytes */
98 static char mdct_sign [SAMPL2] IBSS_ATTR; /* 576 Bytes */
99 static short enc_data [SAMPL2] IBSS_ATTR; /* 1152 Bytes */
100 static uint32_t scalefac [23] IBSS_ATTR; /* 92 Bytes */
101 static BF_Data CodedData IBSS_ATTR; /* 1056 Bytes */
102 static int ca [8] IBSS_ATTR; /* 32 Bytes */
103 static int cs [8] IBSS_ATTR; /* 32 Bytes */
104 static int cx [9] IBSS_ATTR; /* 36 Bytes */
105 static int win [18][4] IBSS_ATTR; /* 288 Bytes */
106 static short enwindow [15*27+24] IBSS_ATTR; /* 862 Bytes */
107 static short int2idx [4096] IBSS_ATTR; /* 8192 Bytes */
108 static uint8_t ht_count [2][2][16] IBSS_ATTR; /* 64 Bytes */
109 static uint32_t tab01 [ 16] IBSS_ATTR; /* 64 Bytes */
110 static uint32_t tab23 [ 9] IBSS_ATTR; /* 36 Bytes */
111 static uint32_t tab56 [ 16] IBSS_ATTR; /* 64 Bytes */
112 static uint32_t tab1315 [256] IBSS_ATTR; /* 1024 Bytes */
113 static uint32_t tab1624 [256] IBSS_ATTR; /* 1024 Bytes */
114 static uint32_t tab789 [ 36] IBSS_ATTR; /* 144 Bytes */
115 static uint32_t tabABC [ 64] IBSS_ATTR; /* 256 Bytes */
116 static uint8_t t1HB [ 4] IBSS_ATTR;
117 static uint8_t t2HB [ 9] IBSS_ATTR;
118 static uint8_t t3HB [ 9] IBSS_ATTR;
119 static uint8_t t5HB [ 16] IBSS_ATTR;
120 static uint8_t t6HB [ 16] IBSS_ATTR;
121 static uint8_t t7HB [ 36] IBSS_ATTR;
122 static uint8_t t8HB [ 36] IBSS_ATTR;
123 static uint8_t t9HB [ 36] IBSS_ATTR;
124 static uint8_t t10HB [ 64] IBSS_ATTR;
125 static uint8_t t11HB [ 64] IBSS_ATTR;
126 static uint8_t t12HB [ 64] IBSS_ATTR;
127 static uint8_t t13HB [256] IBSS_ATTR;
128 static uint8_t t15HB [256] IBSS_ATTR;
129 static uint16_t t16HB [256] IBSS_ATTR;
130 static uint16_t t24HB [256] IBSS_ATTR;
131 static uint8_t t1l [ 8] IBSS_ATTR;
132 static uint8_t t2l [ 9] IBSS_ATTR;
133 static uint8_t t3l [ 9] IBSS_ATTR;
134 static uint8_t t5l [ 16] IBSS_ATTR;
135 static uint8_t t6l [ 16] IBSS_ATTR;
136 static uint8_t t7l [ 36] IBSS_ATTR;
137 static uint8_t t8l [ 36] IBSS_ATTR;
138 static uint8_t t9l [ 36] IBSS_ATTR;
139 static uint8_t t10l [ 64] IBSS_ATTR;
140 static uint8_t t11l [ 64] IBSS_ATTR;
141 static uint8_t t12l [ 64] IBSS_ATTR;
142 static uint8_t t13l [256] IBSS_ATTR;
143 static uint8_t t15l [256] IBSS_ATTR;
144 static uint8_t t16l [256] IBSS_ATTR;
145 static uint8_t t24l [256] IBSS_ATTR;
146 static struct huffcodetab ht [HTN] IBSS_ATTR;
148 static const uint8_t ht_count_const[2][2][16] =
149 { { { 1, 5, 4, 5, 6, 5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1 }, /* table0 */
150 { 1, 5, 5, 7, 5, 8, 7, 9, 5, 7, 7, 9, 7, 9, 9,10 } }, /* hleng0 */
151 { {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, /* table1 */
152 { 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 } } }; /* hleng1 */
154 static const uint8_t t1HB_const[4] = {1,1,1,0};
155 static const uint8_t t2HB_const[9] = {1,2,1,3,1,1,3,2,0};
156 static const uint8_t t3HB_const[9] = {3,2,1,1,1,1,3,2,0};
157 static const uint8_t t5HB_const[16] = {1,2,6,5,3,1,4,4,7,5,7,1,6,1,1,0};
158 static const uint8_t t6HB_const[16] = {7,3,5,1,6,2,3,2,5,4,4,1,3,3,2,0};
160 static const uint8_t t7HB_const[36] =
161 { 1, 2,10,19,16,10, 3, 3, 7,10, 5, 3,11, 4,13,17, 8, 4,
162 12,11,18,15,11, 2, 7, 6, 9,14, 3, 1, 6, 4, 5, 3, 2, 0 };
164 static const uint8_t t8HB_const[36] =
165 { 3, 4, 6,18,12, 5, 5, 1, 2,16, 9, 3, 7, 3, 5,14, 7, 3,
166 19,17,15,13,10, 4,13, 5, 8,11, 5, 1,12, 4, 4, 1, 1, 0 };
168 static const uint8_t t9HB_const[36] =
169 { 7, 5, 9,14,15, 7, 6, 4, 5, 5, 6, 7, 7, 6, 8, 8, 8, 5,
170 15, 6, 9,10, 5, 1,11, 7, 9, 6, 4, 1,14, 4, 6, 2, 6, 0 };
172 static const uint8_t t10HB_const[64] =
173 {1,2,10,23,35,30,12,17,3,3,8,12,18,21,12,7,11,9,15,21,32,
174 40,19,6,14,13,22,34,46,23,18,7,20,19,33,47,27,22,9,3,31,22,
175 41,26,21,20,5,3,14,13,10,11,16,6,5,1,9,8,7,8,4,4,2,0 };
177 static const uint8_t t11HB_const[64] =
178 {3,4,10,24,34,33,21,15,5,3,4,10,32,17,11,10,11,7,13,18,30,
179 31,20,5,25,11,19,59,27,18,12,5,35,33,31,58,30,16,7,5,28,26,
180 32,19,17,15,8,14,14,12,9,13,14,9,4,1,11,4,6,6,6,3,2,0 };
182 static const uint8_t t12HB_const[64] =
183 {9,6,16,33,41,39,38,26,7,5,6,9,23,16,26,11,17,7,11,14,21,
184 30,10,7,17,10,15,12,18,28,14,5,32,13,22,19,18,16,9,5,40,17,
185 31,29,17,13,4,2,27,12,11,15,10,7,4,1,27,12,8,12,6,3,1,0 };
187 static const uint8_t t13HB_const[256] =
188 {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,
189 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,
190 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,
191 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,
192 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,
193 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,
194 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,
195 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,
196 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,
197 10,6,1,4,2,16,15,17,27,25,20,29,11,17,12,16,8,1,1,0,1 };
199 static const uint8_t t15HB_const[256] =
200 {7,12,18,53,47,76,124,108,89,123,108,119,107,81,122,63,13,5,16,27,46,36,61,51,
201 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,
202 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,
203 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,
204 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,
205 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,
206 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,
207 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,
208 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,
209 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};
211 static const uint16_t t16HB_const[256] =
212 {1,5,14,44,74,63,110,93,172,149,138,242,225,195,376,17,3,4,12,20,35,62,53,47,
213 83,75,68,119,201,107,207,9,15,13,23,38,67,58,103,90,161,72,127,117,110,209,
214 206,16,45,21,39,69,64,114,99,87,158,140,252,212,199,387,365,26,75,36,68,65,
215 115,101,179,164,155,264,246,226,395,382,362,9,66,30,59,56,102,185,173,265,142,
216 253,232,400,388,378,445,16,111,54,52,100,184,178,160,133,257,244,228,217,385,
217 366,715,10,98,48,91,88,165,157,148,261,248,407,397,372,380,889,884,8,85,84,81,
218 159,156,143,260,249,427,401,392,383,727,713,708,7,154,76,73,141,131,256,245,
219 426,406,394,384,735,359,710,352,11,139,129,67,125,247,233,229,219,393,743,737,
220 720,885,882,439,4,243,120,118,115,227,223,396,746,742,736,721,712,706,223,436,
221 6,202,224,222,218,216,389,386,381,364,888,443,707,440,437,1728,4,747,211,210,
222 208,370,379,734,723,714,1735,883,877,876,3459,865,2,377,369,102,187,726,722,
223 358,711,709,866,1734,871,3458,870,434,0,12,10,7,11,10,17,11,9,13,12,10,7,5,3,
224 1,3};
226 static const uint16_t t24HB_const[256] =
227 {15,13,46,80,146,262,248,434,426,669,653,649,621,517,1032,88,14,12,21,38,71,
228 130,122,216,209,198,327,345,319,297,279,42,47,22,41,74,68,128,120,221,207,194,
229 182,340,315,295,541,18,81,39,75,70,134,125,116,220,204,190,178,325,311,293,
230 271,16,147,72,69,135,127,118,112,210,200,188,352,323,306,285,540,14,263,66,
231 129,126,119,114,214,202,192,180,341,317,301,281,262,12,249,123,121,117,113,
232 215,206,195,185,347,330,308,291,272,520,10,435,115,111,109,211,203,196,187,
233 353,332,313,298,283,531,381,17,427,212,208,205,201,193,186,177,169,320,303,
234 286,268,514,377,16,335,199,197,191,189,181,174,333,321,305,289,275,521,379,
235 371,11,668,184,183,179,175,344,331,314,304,290,277,530,383,373,366,10,652,346,
236 171,168,164,318,309,299,287,276,263,513,375,368,362,6,648,322,316,312,307,302,
237 292,284,269,261,512,376,370,364,359,4,620,300,296,294,288,282,273,266,515,380,
238 374,369,365,361,357,2,1033,280,278,274,267,264,259,382,378,372,367,363,360,
239 358,356,0,43,20,19,17,15,13,11,9,7,6,4,7,5,3,1,3};
241 static const uint32_t tab1315_const[256] =
242 { 0x010003,0x050005,0x070006,0x080008,0x090008,0x0a0009,0x0a000a,0x0b000a,
243 0x0a000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0d000c,0x0e000d,0x0e000e,
244 0x040005,0x060005,0x080007,0x090008,0x0a0009,0x0a0009,0x0b000a,0x0b000a,
245 0x0b000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0e000c,0x0e000d,0x0e000d,
246 0x070006,0x080007,0x090007,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,
247 0x0b000a,0x0c000b,0x0c000b,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d,
248 0x080007,0x090008,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0c000b,
249 0x0c000b,0x0d000b,0x0d000c,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d,
250 0x090008,0x090008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0d000b,0x0d000b,
251 0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000d,
252 0x0a0009,0x0a0009,0x0b0009,0x0c000a,0x0c000a,0x0c000a,0x0d000b,0x0d000b,
253 0x0d000b,0x0d000b,0x0e000c,0x0d000c,0x0f000d,0x0f000d,0x10000d,0x10000e,
254 0x0a000a,0x0b0009,0x0c000a,0x0c000a,0x0d000a,0x0d000b,0x0d000b,0x0d000b,
255 0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x10000e,
256 0x0b000a,0x0b000a,0x0c000a,0x0d000b,0x0d000b,0x0d000b,0x0e000b,0x0e000c,
257 0x0e000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x12000d,0x12000e,
258 0x0a000a,0x0a000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0e000c,
259 0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x11000e,0x11000e,
260 0x0b000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0d000c,0x0f000c,
261 0x0e000c,0x0f000d,0x0f000d,0x10000d,0x10000d,0x10000e,0x12000e,0x11000e,
262 0x0b000b,0x0c000b,0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000c,
263 0x0e000c,0x0f000d,0x10000d,0x0f000d,0x10000d,0x11000e,0x12000f,0x13000e,
264 0x0c000b,0x0c000b,0x0c000b,0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0e000c,
265 0x0f000d,0x0f000d,0x0f000d,0x10000d,0x11000e,0x11000e,0x11000e,0x12000f,
266 0x0c000c,0x0d000c,0x0d000b,0x0e000c,0x0e000c,0x0f000c,0x0e000d,0x0f000d,
267 0x10000d,0x10000d,0x11000d,0x11000d,0x11000e,0x12000e,0x12000f,0x12000f,
268 0x0d000c,0x0d000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x10000d,
269 0x10000d,0x10000e,0x10000e,0x11000e,0x12000e,0x11000e,0x12000f,0x12000f,
270 0x0e000d,0x0e000d,0x0e000d,0x0f000d,0x0f000d,0x0f000d,0x11000d,0x10000d,
271 0x10000e,0x13000e,0x11000e,0x11000e,0x11000f,0x13000f,0x12000e,0x12000f,
272 0x0d000d,0x0e000d,0x0f000d,0x10000d,0x10000d,0x10000d,0x11000d,0x10000e,
273 0x11000e,0x11000e,0x12000e,0x12000e,0x15000f,0x14000f,0x15000f,0x12000f };
275 static const uint32_t tab01_const[16] =
276 { 0x10004,0x50005,0x50005,0x70006,0x50005,0x80006,0x70006,0x90007,
277 0x50005,0x70006,0x70006,0x90007,0x70006,0x90007,0x90007,0xa0008 };
279 static const uint32_t tab23_const[ 9] =
280 { 0x10002,0x40003,0x70007,0x40004,0x50004,0x70007,0x60006,0x70007,0x80008 };
282 static const uint32_t tab56_const[16] =
283 { 0x10003,0x40004,0x70006,0x80008,0x40004,0x50004,0x80006,0x90007,
284 0x70005,0x80006,0x90007,0xa0008,0x80007,0x80007,0x90008,0xa0009 };
286 static const uint32_t tab789_const[36] =
287 {0x00100803,0x00401004,0x00701c06,0x00902407,0x00902409,0x00a0280a,0x00401004,
288 0x00601005,0x00801806,0x00902807,0x00902808,0x00a0280a,0x00701c05,0x00701806,
289 0x00902007,0x00a02808,0x00a02809,0x00b02c0a,0x00802407,0x00902807,0x00a02808,
290 0x00b02c09,0x00b02c09,0x00b0300a,0x00802408,0x00902408,0x00a02809,0x00b02c09,
291 0x00b0300a,0x00c0300b,0x00902809,0x00a02809,0x00b02c0a,0x00c02c0a,0x00c0340b,
292 0x00c0340b};
294 static const uint32_t tabABC_const[64] =
295 {0x00100804,0x00401004,0x00701806,0x00902008,0x00a02409,0x00a0280a,0x00a0240a,
296 0x00b0280a,0x00401004,0x00601405,0x00801806,0x00902007,0x00a02809,0x00b02809,
297 0x00a0240a,0x00a0280a,0x00701806,0x00801c06,0x00902007,0x00a02408,0x00b02809,
298 0x00c02c0a,0x00b02809,0x00b0280a,0x00802007,0x00902007,0x00a02408,0x00b02c08,
299 0x00c02809,0x00c0300a,0x00b0280a,0x00c02c0a,0x00902408,0x00a02808,0x00b02809,
300 0x00c02c09,0x00c02c0a,0x00c0300a,0x00c02c0a,0x00c0300b,0x00a02409,0x00b02809,
301 0x00c02c0a,0x00c0300a,0x00d0300a,0x00d0340b,0x00c0300a,0x00d0340b,0x00902409,
302 0x00a02409,0x00b02409,0x00c0280a,0x00c02c0a,0x00c0300b,0x00d0300b,0x00d0300c,
303 0x00a0240a,0x00a0240a,0x00b0280a,0x00c02c0b,0x00c0300b,0x00d0300b,0x00d0300b,
304 0x00d0300c};
306 static const uint32_t tab1624_const[256] =
307 {0x00010004,0x00050005,0x00070007,0x00090008,0x000a0009,0x000a000a,0x000b000a,
308 0x000b000b,0x000c000b,0x000c000c,0x000c000c,0x000d000c,0x000d000c,0x000d000c,
309 0x000e000d,0x000a000a,0x00040005,0x00060006,0x00080007,0x00090008,0x000a0009,
310 0x000b000a,0x000b000a,0x000b000b,0x000c000b,0x000c000b,0x000c000c,0x000d000c,
311 0x000e000c,0x000d000c,0x000e000c,0x000a000a,0x00070007,0x00080007,0x00090008,
312 0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000b,0x000d000b,0x000c000b,
313 0x000d000b,0x000d000c,0x000d000c,0x000e000c,0x000e000d,0x000b0009,0x00090008,
314 0x00090008,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a,0x000c000b,
315 0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c,0x000f000c,
316 0x000c0009,0x000a0009,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a,
317 0x000d000a,0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c,
318 0x000f000c,0x000f000d,0x000b0009,0x000a000a,0x000a0009,0x000b000a,0x000b000a,
319 0x000c000a,0x000d000a,0x000d000b,0x000e000b,0x000d000b,0x000e000b,0x000e000c,
320 0x000f000c,0x000f000c,0x000f000c,0x0010000c,0x000c0009,0x000b000a,0x000b000a,
321 0x000b000a,0x000c000a,0x000d000a,0x000d000b,0x000d000b,0x000d000b,0x000e000b,
322 0x000e000c,0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000d,0x000c0009,
323 0x000b000b,0x000b000a,0x000c000a,0x000c000a,0x000d000b,0x000d000b,0x000d000b,
324 0x000e000b,0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000d,
325 0x0011000d,0x000c000a,0x000b000b,0x000c000b,0x000c000b,0x000d000b,0x000d000b,
326 0x000d000b,0x000e000b,0x000e000b,0x000f000b,0x000f000c,0x000f000c,0x000f000c,
327 0x0010000c,0x0010000d,0x0010000d,0x000c000a,0x000c000b,0x000c000b,0x000c000b,
328 0x000d000b,0x000d000b,0x000e000b,0x000e000b,0x000f000c,0x000f000c,0x000f000c,
329 0x000f000c,0x0010000c,0x000f000d,0x0010000d,0x000f000d,0x000d000a,0x000c000c,
330 0x000d000b,0x000c000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000e000c,
331 0x000f000c,0x0010000c,0x0010000c,0x0010000d,0x0011000d,0x0011000d,0x0010000d,
332 0x000c000a,0x000d000c,0x000d000c,0x000d000b,0x000d000b,0x000e000b,0x000e000c,
333 0x000f000c,0x0010000c,0x0010000c,0x0010000c,0x0010000c,0x0010000d,0x0010000d,
334 0x000f000d,0x0010000d,0x000d000a,0x000d000c,0x000e000c,0x000e000c,0x000e000c,
335 0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000c,0x0010000d,
336 0x0010000d,0x0010000d,0x0010000d,0x0012000d,0x000d000a,0x000f000c,0x000e000c,
337 0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000c,0x0010000c,0x0010000d,
338 0x0012000d,0x0011000d,0x0011000d,0x0011000d,0x0013000d,0x0011000d,0x000d000a,
339 0x000e000d,0x000f000c,0x000d000c,0x000e000c,0x0010000c,0x0010000c,0x000f000c,
340 0x0010000d,0x0010000d,0x0011000d,0x0012000d,0x0011000d,0x0013000d,0x0011000d,
341 0x0010000d,0x000d000a,0x000a0009,0x000a0009,0x000a0009,0x000b0009,0x000b0009,
342 0x000c0009,0x000c0009,0x000c0009,0x000d0009,0x000d0009,0x000d0009,0x000d000a,
343 0x000d000a,0x000d000a,0x000d000a,0x000a0006};
345 static const uint8_t t1l_const[8] = {1,3,2,3,1,4,3,5};
346 static const uint8_t t2l_const[9] = {1,3,6,3,3,5,5,5,6};
347 static const uint8_t t3l_const[9] = {2,2,6,3,2,5,5,5,6};
348 static const uint8_t t5l_const[16] = {1,3,6,7,3,3,6,7,6,6,7,8,7,6,7,8};
349 static const uint8_t t6l_const[16] = {3,3,5,7,3,2,4,5,4,4,5,6,6,5,6,7};
351 static const uint8_t t7l_const[36] =
352 {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};
354 static const uint8_t t8l_const[36] =
355 {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};
357 static const uint8_t t9l_const[36] =
358 {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};
360 static const uint8_t t10l_const[64] =
361 {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,
362 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};
364 static const uint8_t t11l_const[64] =
365 {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,
366 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};
368 static const uint8_t t12l_const[64] =
369 {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,
370 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};
372 static const uint8_t t13l_const[256] =
373 {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,
374 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,
375 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,
376 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,
377 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,
378 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,
379 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,
380 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,
381 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,
382 15,15,16,16,19,18,19,16};
384 static const uint8_t t15l_const[256] =
385 {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,
386 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,
387 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,
388 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,
389 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,
390 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,
391 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,
392 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,
393 13,12,11,11,11,11,11,11,12,12,12,12,12,13,13,13,13};
395 static const uint8_t t16l_const[256] =
396 {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,
397 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,
398 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,
399 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,
400 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,
401 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,
402 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,
403 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,
404 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,
405 11,11,11,11,11,11,11,8};
407 static const uint8_t t24l_const[256] =
408 {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,
409 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,
410 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,
411 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,
412 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,
413 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,
414 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,
415 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,
416 7,7,7,7,7,7,8,8,8,8,4};
418 static const struct huffcodetab ht_const[HTN] =
419 { { 0, NULL, NULL}, /* Apparently not used */
420 { 2, t1HB, t1l},
421 { 3, t2HB, t2l},
422 { 3, t3HB, t3l},
423 { 0, NULL, NULL}, /* Apparently not used */
424 { 4, t5HB, t5l},
425 { 4, t6HB, t6l},
426 { 6, t7HB, t7l},
427 { 6, t8HB, t8l},
428 { 6, t9HB, t9l},
429 { 8, t10HB, t10l},
430 { 8, t11HB, t11l},
431 { 8, t12HB, t12l},
432 {16, t13HB, t13l},
433 { 0, NULL, NULL}, /* Apparently not used */
434 {16, t15HB, t15l} };
436 static const struct huffcodebig ht_big[HTN] =
437 { { 16, 1, 1 },
438 { 16, 2, 3 },
439 { 16, 3, 7 },
440 { 16, 4, 15 },
441 { 16, 6, 63 },
442 { 16, 8, 255 },
443 { 16, 10, 1023 },
444 { 16, 13, 8191 },
445 { 16, 4, 15 },
446 { 16, 5, 31 },
447 { 16, 6, 63 },
448 { 16, 7, 127 },
449 { 16, 8, 255 },
450 { 16, 9, 511 },
451 { 16, 11, 2047 },
452 { 16, 13, 8191 } };
454 static const struct
456 uint32_t region0_cnt;
457 uint32_t region1_cnt;
458 } subdv_table[23] =
459 { {0, 0}, /* 0 bands */
460 {0, 0}, /* 1 bands */
461 {0, 0}, /* 2 bands */
462 {0, 0}, /* 3 bands */
463 {0, 0}, /* 4 bands */
464 {0, 1}, /* 5 bands */
465 {1, 1}, /* 6 bands */
466 {1, 1}, /* 7 bands */
467 {1, 2}, /* 8 bands */
468 {2, 2}, /* 9 bands */
469 {2, 3}, /* 10 bands */
470 {2, 3}, /* 11 bands */
471 {3, 4}, /* 12 bands */
472 {3, 4}, /* 13 bands */
473 {3, 4}, /* 14 bands */
474 {4, 5}, /* 15 bands */
475 {4, 5}, /* 16 bands */
476 {4, 6}, /* 17 bands */
477 {5, 6}, /* 18 bands */
478 {5, 6}, /* 19 bands */
479 {5, 7}, /* 20 bands */
480 {6, 7}, /* 21 bands */
481 {6, 7}, /* 22 bands */
484 static const uint32_t sfBand[6][23] =
486 /* Table B.2.b: 22.05 kHz */
487 {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
488 /* Table B.2.c: 24 kHz */
489 {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576},
490 /* Table B.2.a: 16 kHz */
491 {0,6,12,18,24,30,36,44,45,66,80,96,116,140,168,200,238,248,336,396,464,522,576},
492 /* Table B.8.b: 44.1 kHz */
493 {0,4, 8,12,16,20,24,30,36,44,52,62, 74, 90,110,134,162,196,238,288,342,418,576},
494 /* Table B.8.c: 48 kHz */
495 {0,4, 8,12,16,20,24,30,36,42,50,60, 72, 88,106,128,156,190,230,276,330,384,576},
496 /* Table B.8.a: 32 kHz */
497 {0,4, 8,12,16,20,24,30,36,44,54,66, 82,102,126,156,194,240,296,364,448,550,576} };
500 static const short int2idx_const[4096] = /* int2idx[i] = sqrt(i*sqrt(i)); */
502 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9,
503 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16,
504 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21,
505 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26,
506 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
507 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36,
508 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40,
509 41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45,
510 45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49,
511 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53,
512 53, 53, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 57, 57, 57,
513 57, 57, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 61, 61,
514 61, 61, 61, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 65,
515 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68,
516 68, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 72, 72, 72,
517 72, 72, 72, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75,
518 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 79, 79, 79,
519 79, 79, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82,
520 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 86, 86, 86,
521 86, 86, 86, 87, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89,
522 89, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 93,
523 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 96, 96, 96,
524 96, 96, 96, 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99,
525 99, 99,100,100,100,100,100,100,101,101,101,101,101,101,102,102,102,102,102,102,
526 103,103,103,103,103,103,104,104,104,104,104,104,104,105,105,105,105,105,105,106,
527 106,106,106,106,106,107,107,107,107,107,107,107,108,108,108,108,108,108,109,109,
528 109,109,109,109,110,110,110,110,110,110,110,111,111,111,111,111,111,112,112,112,
529 112,112,112,112,113,113,113,113,113,113,114,114,114,114,114,114,115,115,115,115,
530 115,115,115,116,116,116,116,116,116,117,117,117,117,117,117,117,118,118,118,118,
531 118,118,118,119,119,119,119,119,119,120,120,120,120,120,120,120,121,121,121,121,
532 121,121,122,122,122,122,122,122,122,123,123,123,123,123,123,123,124,124,124,124,
533 124,124,125,125,125,125,125,125,125,126,126,126,126,126,126,126,127,127,127,127,
534 127,127,128,128,128,128,128,128,128,129,129,129,129,129,129,129,130,130,130,130,
535 130,130,131,131,131,131,131,131,131,132,132,132,132,132,132,132,133,133,133,133,
536 133,133,133,134,134,134,134,134,134,134,135,135,135,135,135,135,136,136,136,136,
537 136,136,136,137,137,137,137,137,137,137,138,138,138,138,138,138,138,139,139,139,
538 139,139,139,139,140,140,140,140,140,140,140,141,141,141,141,141,141,141,142,142,
539 142,142,142,142,142,143,143,143,143,143,143,143,144,144,144,144,144,144,144,145,
540 145,145,145,145,145,145,146,146,146,146,146,146,146,147,147,147,147,147,147,147,
541 148,148,148,148,148,148,148,149,149,149,149,149,149,149,150,150,150,150,150,150,
542 150,151,151,151,151,151,151,151,152,152,152,152,152,152,152,153,153,153,153,153,
543 153,153,154,154,154,154,154,154,154,154,155,155,155,155,155,155,155,156,156,156,
544 156,156,156,156,157,157,157,157,157,157,157,158,158,158,158,158,158,158,159,159,
545 159,159,159,159,159,160,160,160,160,160,160,160,160,161,161,161,161,161,161,161,
546 162,162,162,162,162,162,162,163,163,163,163,163,163,163,163,164,164,164,164,164,
547 164,164,165,165,165,165,165,165,165,166,166,166,166,166,166,166,167,167,167,167,
548 167,167,167,167,168,168,168,168,168,168,168,169,169,169,169,169,169,169,169,170,
549 170,170,170,170,170,170,171,171,171,171,171,171,171,172,172,172,172,172,172,172,
550 172,173,173,173,173,173,173,173,174,174,174,174,174,174,174,174,175,175,175,175,
551 175,175,175,176,176,176,176,176,176,176,176,177,177,177,177,177,177,177,178,178,
552 178,178,178,178,178,178,179,179,179,179,179,179,179,180,180,180,180,180,180,180,
553 180,181,181,181,181,181,181,181,182,182,182,182,182,182,182,182,183,183,183,183,
554 183,183,183,184,184,184,184,184,184,184,184,185,185,185,185,185,185,185,186,186,
555 186,186,186,186,186,186,187,187,187,187,187,187,187,187,188,188,188,188,188,188,
556 188,189,189,189,189,189,189,189,189,190,190,190,190,190,190,190,190,191,191,191,
557 191,191,191,191,192,192,192,192,192,192,192,192,193,193,193,193,193,193,193,193,
558 194,194,194,194,194,194,194,195,195,195,195,195,195,195,195,196,196,196,196,196,
559 196,196,196,197,197,197,197,197,197,197,197,198,198,198,198,198,198,198,199,199,
560 199,199,199,199,199,199,200,200,200,200,200,200,200,200,201,201,201,201,201,201,
561 201,201,202,202,202,202,202,202,202,202,203,203,203,203,203,203,203,204,204,204,
562 204,204,204,204,204,205,205,205,205,205,205,205,205,206,206,206,206,206,206,206,
563 206,207,207,207,207,207,207,207,207,208,208,208,208,208,208,208,208,209,209,209,
564 209,209,209,209,209,210,210,210,210,210,210,210,210,211,211,211,211,211,211,211,
565 211,212,212,212,212,212,212,212,212,213,213,213,213,213,213,213,213,214,214,214,
566 214,214,214,214,214,215,215,215,215,215,215,215,215,216,216,216,216,216,216,216,
567 216,217,217,217,217,217,217,217,217,218,218,218,218,218,218,218,218,219,219,219,
568 219,219,219,219,219,220,220,220,220,220,220,220,220,221,221,221,221,221,221,221,
569 221,222,222,222,222,222,222,222,222,223,223,223,223,223,223,223,223,224,224,224,
570 224,224,224,224,224,225,225,225,225,225,225,225,225,226,226,226,226,226,226,226,
571 226,227,227,227,227,227,227,227,227,228,228,228,228,228,228,228,228,229,229,229,
572 229,229,229,229,229,229,230,230,230,230,230,230,230,230,231,231,231,231,231,231,
573 231,231,232,232,232,232,232,232,232,232,233,233,233,233,233,233,233,233,234,234,
574 234,234,234,234,234,234,234,235,235,235,235,235,235,235,235,236,236,236,236,236,
575 236,236,236,237,237,237,237,237,237,237,237,238,238,238,238,238,238,238,238,238,
576 239,239,239,239,239,239,239,239,240,240,240,240,240,240,240,240,241,241,241,241,
577 241,241,241,241,242,242,242,242,242,242,242,242,242,243,243,243,243,243,243,243,
578 243,244,244,244,244,244,244,244,244,245,245,245,245,245,245,245,245,245,246,246,
579 246,246,246,246,246,246,247,247,247,247,247,247,247,247,248,248,248,248,248,248,
580 248,248,248,249,249,249,249,249,249,249,249,250,250,250,250,250,250,250,250,250,
581 251,251,251,251,251,251,251,251,252,252,252,252,252,252,252,252,253,253,253,253,
582 253,253,253,253,253,254,254,254,254,254,254,254,254,255,255,255,255,255,255,255,
583 255,255,256,256,256,256,256,256,256,256,257,257,257,257,257,257,257,257,257,258,
584 258,258,258,258,258,258,258,259,259,259,259,259,259,259,259,259,260,260,260,260,
585 260,260,260,260,261,261,261,261,261,261,261,261,261,262,262,262,262,262,262,262,
586 262,263,263,263,263,263,263,263,263,263,264,264,264,264,264,264,264,264,265,265,
587 265,265,265,265,265,265,265,266,266,266,266,266,266,266,266,267,267,267,267,267,
588 267,267,267,267,268,268,268,268,268,268,268,268,268,269,269,269,269,269,269,269,
589 269,270,270,270,270,270,270,270,270,270,271,271,271,271,271,271,271,271,271,272,
590 272,272,272,272,272,272,272,273,273,273,273,273,273,273,273,273,274,274,274,274,
591 274,274,274,274,275,275,275,275,275,275,275,275,275,276,276,276,276,276,276,276,
592 276,276,277,277,277,277,277,277,277,277,277,278,278,278,278,278,278,278,278,279,
593 279,279,279,279,279,279,279,279,280,280,280,280,280,280,280,280,280,281,281,281,
594 281,281,281,281,281,282,282,282,282,282,282,282,282,282,283,283,283,283,283,283,
595 283,283,283,284,284,284,284,284,284,284,284,284,285,285,285,285,285,285,285,285,
596 286,286,286,286,286,286,286,286,286,287,287,287,287,287,287,287,287,287,288,288,
597 288,288,288,288,288,288,288,289,289,289,289,289,289,289,289,289,290,290,290,290,
598 290,290,290,290,291,291,291,291,291,291,291,291,291,292,292,292,292,292,292,292,
599 292,292,293,293,293,293,293,293,293,293,293,294,294,294,294,294,294,294,294,294,
600 295,295,295,295,295,295,295,295,295,296,296,296,296,296,296,296,296,296,297,297,
601 297,297,297,297,297,297,297,298,298,298,298,298,298,298,298,299,299,299,299,299,
602 299,299,299,299,300,300,300,300,300,300,300,300,300,301,301,301,301,301,301,301,
603 301,301,302,302,302,302,302,302,302,302,302,303,303,303,303,303,303,303,303,303,
604 304,304,304,304,304,304,304,304,304,305,305,305,305,305,305,305,305,305,306,306,
605 306,306,306,306,306,306,306,307,307,307,307,307,307,307,307,307,308,308,308,308,
606 308,308,308,308,308,309,309,309,309,309,309,309,309,309,310,310,310,310,310,310,
607 310,310,310,311,311,311,311,311,311,311,311,311,312,312,312,312,312,312,312,312,
608 312,313,313,313,313,313,313,313,313,313,314,314,314,314,314,314,314,314,314,315,
609 315,315,315,315,315,315,315,315,316,316,316,316,316,316,316,316,316,317,317,317,
610 317,317,317,317,317,317,318,318,318,318,318,318,318,318,318,318,319,319,319,319,
611 319,319,319,319,319,320,320,320,320,320,320,320,320,320,321,321,321,321,321,321,
612 321,321,321,322,322,322,322,322,322,322,322,322,323,323,323,323,323,323,323,323,
613 323,324,324,324,324,324,324,324,324,324,325,325,325,325,325,325,325,325,325,325,
614 326,326,326,326,326,326,326,326,326,327,327,327,327,327,327,327,327,327,328,328,
615 328,328,328,328,328,328,328,329,329,329,329,329,329,329,329,329,330,330,330,330,
616 330,330,330,330,330,330,331,331,331,331,331,331,331,331,331,332,332,332,332,332,
617 332,332,332,332,333,333,333,333,333,333,333,333,333,334,334,334,334,334,334,334,
618 334,334,335,335,335,335,335,335,335,335,335,335,336,336,336,336,336,336,336,336,
619 336,337,337,337,337,337,337,337,337,337,338,338,338,338,338,338,338,338,338,338,
620 339,339,339,339,339,339,339,339,339,340,340,340,340,340,340,340,340,340,341,341,
621 341,341,341,341,341,341,341,341,342,342,342,342,342,342,342,342,342,343,343,343,
622 343,343,343,343,343,343,344,344,344,344,344,344,344,344,344,344,345,345,345,345,
623 345,345,345,345,345,346,346,346,346,346,346,346,346,346,347,347,347,347,347,347,
624 347,347,347,347,348,348,348,348,348,348,348,348,348,349,349,349,349,349,349,349,
625 349,349,350,350,350,350,350,350,350,350,350,350,351,351,351,351,351,351,351,351,
626 351,352,352,352,352,352,352,352,352,352,352,353,353,353,353,353,353,353,353,353,
627 354,354,354,354,354,354,354,354,354,355,355,355,355,355,355,355,355,355,355,356,
628 356,356,356,356,356,356,356,356,357,357,357,357,357,357,357,357,357,357,358,358,
629 358,358,358,358,358,358,358,359,359,359,359,359,359,359,359,359,359,360,360,360,
630 360,360,360,360,360,360,361,361,361,361,361,361,361,361,361,361,362,362,362,362,
631 362,362,362,362,362,363,363,363,363,363,363,363,363,363,363,364,364,364,364,364,
632 364,364,364,364,365,365,365,365,365,365,365,365,365,365,366,366,366,366,366,366,
633 366,366,366,367,367,367,367,367,367,367,367,367,367,368,368,368,368,368,368,368,
634 368,368,369,369,369,369,369,369,369,369,369,369,370,370,370,370,370,370,370,370,
635 370,370,371,371,371,371,371,371,371,371,371,372,372,372,372,372,372,372,372,372,
636 372,373,373,373,373,373,373,373,373,373,374,374,374,374,374,374,374,374,374,374,
637 375,375,375,375,375,375,375,375,375,375,376,376,376,376,376,376,376,376,376,377,
638 377,377,377,377,377,377,377,377,377,378,378,378,378,378,378,378,378,378,379,379,
639 379,379,379,379,379,379,379,379,380,380,380,380,380,380,380,380,380,380,381,381,
640 381,381,381,381,381,381,381,382,382,382,382,382,382,382,382,382,382,383,383,383,
641 383,383,383,383,383,383,383,384,384,384,384,384,384,384,384,384,385,385,385,385,
642 385,385,385,385,385,385,386,386,386,386,386,386,386,386,386,386,387,387,387,387,
643 387,387,387,387,387,387,388,388,388,388,388,388,388,388,388,389,389,389,389,389,
644 389,389,389,389,389,390,390,390,390,390,390,390,390,390,390,391,391,391,391,391,
645 391,391,391,391,391,392,392,392,392,392,392,392,392,392,393,393,393,393,393,393,
646 393,393,393,393,394,394,394,394,394,394,394,394,394,394,395,395,395,395,395,395,
647 395,395,395,395,396,396,396,396,396,396,396,396,396,397,397,397,397,397,397,397,
648 397,397,397,398,398,398,398,398,398,398,398,398,398,399,399,399,399,399,399,399,
649 399,399,399,400,400,400,400,400,400,400,400,400,400,401,401,401,401,401,401,401,
650 401,401,402,402,402,402,402,402,402,402,402,402,403,403,403,403,403,403,403,403,
651 403,403,404,404,404,404,404,404,404,404,404,404,405,405,405,405,405,405,405,405,
652 405,405,406,406,406,406,406,406,406,406,406,406,407,407,407,407,407,407,407,407,
653 407,407,408,408,408,408,408,408,408,408,408,408,409,409,409,409,409,409,409,409,
654 409,410,410,410,410,410,410,410,410,410,410,411,411,411,411,411,411,411,411,411,
655 411,412,412,412,412,412,412,412,412,412,412,413,413,413,413,413,413,413,413,413,
656 413,414,414,414,414,414,414,414,414,414,414,415,415,415,415,415,415,415,415,415,
657 415,416,416,416,416,416,416,416,416,416,416,417,417,417,417,417,417,417,417,417,
658 417,418,418,418,418,418,418,418,418,418,418,419,419,419,419,419,419,419,419,419,
659 419,420,420,420,420,420,420,420,420,420,420,421,421,421,421,421,421,421,421,421,
660 421,422,422,422,422,422,422,422,422,422,422,423,423,423,423,423,423,423,423,423,
661 423,424,424,424,424,424,424,424,424,424,424,425,425,425,425,425,425,425,425,425,
662 425,426,426,426,426,426,426,426,426,426,426,427,427,427,427,427,427,427,427,427,
663 427,428,428,428,428,428,428,428,428,428,428,429,429,429,429,429,429,429,429,429,
664 429,430,430,430,430,430,430,430,430,430,430,431,431,431,431,431,431,431,431,431,
665 431,432,432,432,432,432,432,432,432,432,432,433,433,433,433,433,433,433,433,433,
666 433,434,434,434,434,434,434,434,434,434,434,435,435,435,435,435,435,435,435,435,
667 435,435,436,436,436,436,436,436,436,436,436,436,437,437,437,437,437,437,437,437,
668 437,437,438,438,438,438,438,438,438,438,438,438,439,439,439,439,439,439,439,439,
669 439,439,440,440,440,440,440,440,440,440,440,440,441,441,441,441,441,441,441,441,
670 441,441,442,442,442,442,442,442,442,442,442,442,443,443,443,443,443,443,443,443,
671 443,443,443,444,444,444,444,444,444,444,444,444,444,445,445,445,445,445,445,445,
672 445,445,445,446,446,446,446,446,446,446,446,446,446,447,447,447,447,447,447,447,
673 447,447,447,448,448,448,448,448,448,448,448,448,448,448,449,449,449,449,449,449,
674 449,449,449,449,450,450,450,450,450,450,450,450,450,450,451,451,451,451,451,451,
675 451,451,451,451,452,452,452,452,452,452,452,452,452,452,453,453,453,453,453,453,
676 453,453,453,453,453,454,454,454,454,454,454,454,454,454,454,455,455,455,455,455,
677 455,455,455,455,455,456,456,456,456,456,456,456,456,456,456,457,457,457,457,457,
678 457,457,457,457,457,457,458,458,458,458,458,458,458,458,458,458,459,459,459,459,
679 459,459,459,459,459,459,460,460,460,460,460,460,460,460,460,460,460,461,461,461,
680 461,461,461,461,461,461,461,462,462,462,462,462,462,462,462,462,462,463,463,463,
681 463,463,463,463,463,463,463,463,464,464,464,464,464,464,464,464,464,464,465,465,
682 465,465,465,465,465,465,465,465,466,466,466,466,466,466,466,466,466,466,466,467,
683 467,467,467,467,467,467,467,467,467,468,468,468,468,468,468,468,468,468,468,469,
684 469,469,469,469,469,469,469,469,469,469,470,470,470,470,470,470,470,470,470,470,
685 471,471,471,471,471,471,471,471,471,471,472,472,472,472,472,472,472,472,472,472,
686 472,473,473,473,473,473,473,473,473,473,473,474,474,474,474,474,474,474,474,474,
687 474,475,475,475,475,475,475,475,475,475,475,475,476,476,476,476,476,476,476,476,
688 476,476,477,477,477,477,477,477,477,477,477,477,477,478,478,478,478,478,478,478,
689 478,478,478,479,479,479,479,479,479,479,479,479,479,479,480,480,480,480,480,480,
690 480,480,480,480,481,481,481,481,481,481,481,481,481,481,482,482,482,482,482,482,
691 482,482,482,482,482,483,483,483,483,483,483,483,483,483,483,484,484,484,484,484,
692 484,484,484,484,484,484,485,485,485,485,485,485,485,485,485,485,486,486,486,486,
693 486,486,486,486,486,486,486,487,487,487,487,487,487,487,487,487,487,488,488,488,
694 488,488,488,488,488,488,488,488,489,489,489,489,489,489,489,489,489,489,490,490,
695 490,490,490,490,490,490,490,490,490,491,491,491,491,491,491,491,491,491,491,492,
696 492,492,492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493,493,493,
697 494,494,494,494,494,494,494,494,494,494,494,495,495,495,495,495,495,495,495,495,
698 495,496,496,496,496,496,496,496,496,496,496,496,497,497,497,497,497,497,497,497,
699 497,497,497,498,498,498,498,498,498,498,498,498,498,499,499,499,499,499,499,499,
700 499,499,499,499,500,500,500,500,500,500,500,500,500,500,501,501,501,501,501,501,
701 501,501,501,501,501,502,502,502,502,502,502,502,502,502,502,503,503,503,503,503,
702 503,503,503,503,503,503,504,504,504,504,504,504,504,504,504,504,504,505,505,505,
703 505,505,505,505,505,505,505,506,506,506,506,506,506,506,506,506,506,506,507,507,
704 507,507,507,507,507,507,507,507,507,508,508,508,508,508,508,508,508,508,508,509,
705 509,509,509,509,509,509,509,509,509,509,510,510,510,510,510,510,510,510,510,510,
706 510,511,511,511,511,511,511,511,511,511,511,512,512,512,512,512 };
708 static const int order[32] =
709 { 0, 1, 16, 17, 8, 9, 24, 25, 4, 5, 20, 21, 12, 13, 28, 29,
710 2, 3, 18, 19,10,11, 26, 27, 6, 7, 22, 23, 14, 15, 30, 31 };
712 static const long sampr_index[2][3] =
713 { { 22050, 24000, 16000 }, /* MPEG 2 */
714 { 44100, 48000, 32000 } }; /* MPEG 1 */
716 static const long bitr_index[2][15] =
717 { {0, 8,16,24,32,40,48,56, 64, 80, 96,112,128,144,160}, /* MPEG 2 */
718 {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320} }; /* MPEG 1 */
720 static const int num_bands[3][15] =
721 { {0,10,10,10,10,12,14,16, 20, 22, 24, 26, 28, 30, 32},
722 {0,10,10,10,10,10,12,14, 18, 24, 26, 28, 30, 32, 32},
723 {0,10,12,14,18,24,26,28, 30, 32, 32, 32, 32, 32, 32} };
725 static const int cx_const[9] =
726 { 16135, 10531, 5604, 15396, -2845,-12551, 14189, 8192, 16384 };
728 static const int ca_const[8] =
729 {-16859,-15458,-10269, -5961, -3099, -1342, -465, -121 };
731 static const int cs_const[8] =
732 { 28098, 28893, 31117, 32221, 32621, 32740, 32765, 32768 };
734 static const short enwindow_const[15*27+24] =
735 { 0, 65, 593, 1766, 22228, 2115, 611, 62,
736 8, 119, 1419, 10564,-11659,-1635,-154, -9,
737 -8, -119,-1419,-10564, 11659, 1635, 154, 9, 464, 100, 91,
738 0, 69, 604, 1635, 23148, 2363, 643, 62,
739 7, 107, 1368, 10449,-12733,-1818,-180,-11,
740 -7, -107,-1368,-10449, 12733, 1818, 180, 11, 420, 200, 164,
741 0, 72, 608, 1465, 23979, 2600, 671, 63,
742 7, 94, 1305, 10265,-13818,-2004,-207,-12,
743 -7, -94,-1305,-10265, 13818, 2004, 207, 12, 380, 297, 220,
744 0, 76, 606, 1256, 24718, 2825, 693, 63,
745 6, 81, 1232, 10016,-14908,-2192,-236,-14,
746 -6, -81,-1232,-10016, 14908, 2192, 236, 14, 342, 392, 262,
747 0, 78, 597, 1007, 25359, 3033, 712, 63,
748 6, 68, 1150, 9706,-15995,-2380,-267,-15,
749 -6, -68,-1150, -9706, 15995, 2380, 267, 15, 307, 483, 289,
750 0, 80, 580, 719, 25901, 3224, 726, 62,
751 6, 54, 1060, 9343,-17072,-2565,-299,-17,
752 -6, -54,-1060, -9343, 17072, 2565, 299, 17, 274, 569, 304,
753 -1, 82, 555, 391, 26339, 3395, 735, 61,
754 5, 40, 963, 8930,-18131,-2747,-332,-19,
755 -5, -40, -963, -8930, 18131, 2747, 332, 19, 242, 650, 307,
756 -1, 83, 523, 26, 26672, 3545, 740, 60,
757 5, 27, 861, 8474,-19164,-2923,-366,-21,
758 -5, -27, -861, -8474, 19164, 2923, 366, 21, 212, 724, 300,
759 -1, 83, 482, -376, 26900, 3672, 739, 58,
760 4, 14, 756, 7981,-20163,-3092,-401,-24,
761 -4, -14, -756, -7981, 20163, 3092, 401, 24, 183, 792, 283,
762 -1, 82, 433, -812, 27022, 3776, 735, 56,
763 4, 1, 648, 7456,-21122,-3250,-435,-26,
764 -4, -1, -648, -7456, 21122, 3250, 435, 26, 155, 851, 258,
765 -1, 81, 376, -1281, 27038, 3855, 726, 54,
766 3, -11, 539, 6907,-22032,-3397,-470,-28,
767 -3, 11, -539, -6907, 22032, 3397, 470, 28, 128, 903, 226,
768 -1, 78, 312, -1778, 26951, 3910, 713, 52,
769 3, -22, 430, 6338,-22887,-3530,-503,-31,
770 -3, 22, -430, -6338, 22887, 3530, 503, 31, 102, 946, 188,
771 -2, 75, 239, -2302, 26761, 3941, 696, 49,
772 3, -33, 322, 5757,-23678,-3648,-537,-34,
773 -3, 33, -322, -5757, 23678, 3648, 537, 34, 76, 980, 145,
774 -2, 70, 160, -2848, 26472, 3948, 676, 47,
775 3, -42, 217, 5167,-24399,-3749,-568,-36,
776 -3, 42, -217, -5167, 24399, 3749, 568, 36, 50, 1004, 99,
777 -2, 65, 74, -3412, 26087, 3931, 653, 44,
778 2, -51, 115, 4577,-25045,-3830,-599,-39,
779 -2, 51, -115, -4577, 25045, 3830, 599, 39, 25, 1019, 50,
781 25610,3891,627,42,-3990,-18,58,-2,
782 21226,-21226,10604,-10604,1860,-1860,1458,-1458,576,-576,130,-130,60,-60,8,-8
785 static const int win_const[18][4] = {
786 { -3072, -134, -146, 3352 },
787 { -2747, -362, -471, 3579 },
788 { -2387, -529, -831, 3747 },
789 { -2004, -632,-1214, 3850 },
790 { -1609, -666,-1609, 3884 },
791 { -1214, -632,-2004, 3850 },
792 { -831, -529,-2387, 3747 },
793 { -471, -362,-2747, 3579 },
794 { -146, -134,-3072, 3352 },
795 { 134,-3072,-3352, -146 },
796 { 362,-2747,-3579, -471 },
797 { 529,-2387,-3747, -831 },
798 { 632,-2004,-3850,-1214 },
799 { 666,-1609,-3884,-1609 },
800 { 632,-1214,-3850,-2004 },
801 { 529, -831,-3747,-2387 },
802 { 362, -471,-3579,-2747 },
803 { 134, -146,-3352,-3072 } };
806 static const char* wav_filename;
807 static int mp3file, wavfile, wav_size, frames;
808 static uint32_t enc_buffer[16384]; /* storage for 65536 Bytes */
809 static int enc_chunk = 0; /* encode chunk counter */
810 static int enc_size;
811 static config_t cfg;
812 static uint8_t band_scale_f[22];
815 /* forward declarations */
816 static int HuffmanCode( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table);
817 static int HuffmanCod1( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table);
818 static void putbits(uint32_t val, uint32_t nbit);
819 static int find_best_2( short *ix, uint32_t start, uint32_t end, const uint32_t *table,
820 uint32_t len, int *bits);
821 static int find_best_3( short *ix, uint32_t start, uint32_t end, const uint32_t *table,
822 uint32_t len, int *bits);
823 static int count_bit1 ( short *ix, uint32_t start, uint32_t end, int *bits );
824 static int count_bigv ( short *ix, uint32_t start, uint32_t end, int table0, int table1,
825 int *bits);
828 bool checkString(int fd, char *string)
830 char temp[4];
832 rb->read(fd, temp, 4);
834 /* return 1 on match, 0 on no match */
835 return !rb->memcmp(temp, string, 4);
838 int Read16BitsLowHigh(int fd)
840 char first, second;
842 rb->read(fd, &first, 1);
843 rb->read(fd, &second, 1);
845 return ((int)second << 8) | (first & 0xff);
849 int Read32BitsLowHigh(int fd)
851 int first = 0xffff & Read16BitsLowHigh(fd);
852 int second = 0xffff & Read16BitsLowHigh(fd);
854 return (second << 16) + first;
857 int wave_open(void)
859 unsigned short wFormatTag;
860 unsigned long dAvgBytesPerSec;
861 unsigned short wBlockAlign;
862 unsigned short bits_per_samp;
863 long header_size;
865 if((wavfile = rb->open(wav_filename, O_RDONLY)) < 0)
866 return -1;
868 if(!checkString(wavfile,"RIFF")) return -2;
869 Read32BitsLowHigh(wavfile); /* complete wave chunk size */
870 if(!checkString(wavfile,"WAVE")) return -3;
871 if(!checkString(wavfile,"fmt ")) return -4;
873 header_size = Read32BitsLowHigh(wavfile); /* chunk size */
874 wFormatTag = Read16BitsLowHigh(wavfile);
876 cfg.channels = Read16BitsLowHigh(wavfile);
877 cfg.samplerate = Read32BitsLowHigh(wavfile);
878 dAvgBytesPerSec = Read32BitsLowHigh(wavfile);
879 wBlockAlign = Read16BitsLowHigh(wavfile);
880 bits_per_samp = Read16BitsLowHigh(wavfile);
882 if(wFormatTag != 0x0001) return -5;
883 if(bits_per_samp != 16) return -6;
884 if(cfg.channels > 2) return -7;
885 if(!checkString(wavfile,"data")) return -8;
887 header_size = 0x28;
888 wav_size = rb->filesize(wavfile);
889 rb->lseek(wavfile, header_size, SEEK_SET);
891 return 0;
894 int read_samples(uint32_t *buffer, int num_samples)
896 int s, samples = rb->read(wavfile, buffer, 4 * num_samples) / 4;
897 /* Pad last sample with zeros */
898 for(s=samples; s<num_samples; s++)
899 buffer[s] = 0;
901 return samples;
904 inline uint32_t myswap32(uint32_t val)
906 const uint8_t* v = (const uint8_t*)&val;
908 return ((uint32_t)v[0]<<24) | ((uint32_t)v[1]<<16) | ((uint32_t)v[2]<<8) | v[3];
911 static void encodeSideInfo( side_info_t si[2][2] )
913 int gr, ch, header;
914 uint32_t cc=0, sz=0;
917 * MPEG header layout:
918 * AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM
919 * A (31-21) = frame sync
920 * B (20-19) = MPEG type
921 * C (18-17) = MPEG layer
922 * D (16) = protection bit
923 * E (15-12) = bitrate index
924 * F (11-10) = samplerate index
925 * G (9) = padding bit
926 * H (8) = private bit
927 * I (7-6) = channel mode
928 * J (5-4) = mode extension (jstereo only)
929 * K (3) = copyright bit
930 * L (2) = original
931 * M (1-0) = emphasis
934 header = (0xfff00000) | /* frame sync (AAAAAAAAA AAA)
935 mp3 type (upper): 1 (B) */
936 (0x01 << 17) | /* mp3 layer: 01 (CC) */
937 ( 0x1 << 16) | /* mp3 crc: 1 (D) */
938 ( 0x1 << 2); /* mp3 org: 1 (L) */
939 header |= cfg.mpg.type << 19;
940 header |= cfg.mpg.bitr_id << 12;
941 header |= cfg.mpg.smpl_id << 10;
942 header |= cfg.mpg.padding << 9;
943 header |= cfg.mpg.mode << 6;
944 /* no emphasis (bits 0-1) */
945 putbits( header, 32 );
947 if(cfg.mpg.type == 1)
948 { /* MPEG1 */
949 if(cfg.channels == 2) { putlong( 0, 20); }
950 else { putlong( 0, 18); }
952 for(gr=0; gr<cfg.granules; gr++)
953 for(ch=0; ch<cfg.channels; ch++)
955 side_info_t *gi = &si[gr][ch];
957 putlong((gi->part2_3_length+42),12 ); /* add scale_facs array size */
958 putlong( gi->address3>>1, 9 );
959 putlong( gi->global_gain, 8 );
960 putlong( 9, 4 ); /* set scale_facs compr type */
961 putlong( gi->table_select[0], 6 );
962 putlong( gi->table_select[1], 5 );
963 putlong( gi->table_select[2], 5 );
964 putlong( gi->region_0_1, 7 );
965 putlong( 1 , 2 ); /* set scale_facs to 1bit */
966 putlong( gi->table_select[3], 1 );
969 else
970 { /* MPEG2 */
971 if(cfg.channels == 2) { putlong( 0, 10); }
972 else { putlong( 0, 9); }
974 for(ch=0; ch<cfg.channels; ch++)
976 side_info_t *gi = &si[0][ch];
978 putlong((gi->part2_3_length+42),12 ); /* add scale_facs array size */
979 putlong( gi->address3>>1, 9 );
980 putlong( gi->global_gain, 8 );
981 putlong( 0xCA, 9 ); /* set scale_facs compr type */
982 putlong( gi->table_select[0], 6 );
983 putlong( gi->table_select[1], 5 );
984 putlong( gi->table_select[2], 5 );
985 putlong( gi->region_0_1 , 7 );
986 putlong( 1 , 1 ); /* set scale_facs to 1bit */
987 putlong( gi->table_select[3], 1 );
990 /* flush remaining bits */
991 putbits(cc, sz);
994 /* Note the discussion of huffmancodebits() on pages 28 and 29 of the IS,
995 as well as the definitions of the side information on pages 26 and 27. */
996 static void Huffmancodebits( short *ix, char *xr_sign, side_info_t *gi )
998 int region1 = gi->address1;
999 int region2 = gi->address2;
1000 int bigvals = gi->address3;
1001 int count1 = bigvals + (gi->count1 << 2);
1002 int stuffBits = 0;
1003 int bits = 0;
1004 int i, v;
1006 for(i=v=0; i<32; i+=2)
1007 v |= band_scale_f[i>>1] << (30-i);
1008 putbits(v, 32); // store scale_facs (part1)
1010 for(v=0; i<42; i+=2)
1011 v |= band_scale_f[i>>1] << (40-i);
1012 putbits(v, 10); // store scale_facs (part2)
1014 if(region1 > 0)
1015 bits += HuffmanCode(ix, xr_sign, 0 , region1, gi->table_select[0]);
1017 if(region2 > region1)
1018 bits += HuffmanCode(ix, xr_sign, region1, region2, gi->table_select[1]);
1020 if(bigvals > region2)
1021 bits += HuffmanCode(ix, xr_sign, region2, bigvals, gi->table_select[2]);
1023 if(count1 > bigvals)
1024 bits += HuffmanCod1(ix, xr_sign, bigvals, count1, gi->table_select[3]);
1026 if((stuffBits = gi->part2_3_length - bits) > 0)
1028 int stuffWords = stuffBits >> 5;
1029 int remainBits = stuffBits & 31;
1031 if( remainBits )
1032 putbits( ~0, remainBits );
1034 while( stuffWords-- )
1035 putbits( ~0, 32 ); /* Huffman code tables leed to padding ones */
1039 int HuffmanCod1( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int tbl)
1041 uint32_t cc=0, sz=0;
1042 uint32_t i, d, p;
1043 int sumbit=0, s=0, l=0, v, w, x, y;
1044 #define sgnv xr_sign[i+0]
1045 #define sgnw xr_sign[i+1]
1046 #define sgnx xr_sign[i+2]
1047 #define sgny xr_sign[i+3]
1049 for(i=begin; i<end; i+=4)
1051 v = ix[i+0];
1052 w = ix[i+1];
1053 x = ix[i+2];
1054 y = ix[i+3];
1055 p = (v << 3) + (w << 2) + (x << 1) + y;
1057 switch(p)
1059 case 0: l=0; s = 0; break;
1060 case 1: l=1; s = sgny; break;
1061 case 2: l=1; s = sgnx; break;
1062 case 3: l=2; s = (sgnx << 1) + sgny; break;
1063 case 4: l=1; s = sgnw; break;
1064 case 5: l=2; s = (sgnw << 1) + sgny; break;
1065 case 6: l=2; s = (sgnw << 1) + sgnx; break;
1066 case 7: l=3; s = (sgnw << 2) + (sgnx << 1) + sgny; break;
1067 case 8: l=1; s = sgnv; break;
1068 case 9: l=2; s = (sgnv << 1) + sgny; break;
1069 case 10: l=2; s = (sgnv << 1) + sgnx; break;
1070 case 11: l=3; s = (sgnv << 2) + (sgnx << 1) + sgny; break;
1071 case 12: l=2; s = (sgnv << 1) + sgnw; break;
1072 case 13: l=3; s = (sgnv << 2) + (sgnw << 1) + sgny; break;
1073 case 14: l=3; s = (sgnv << 2) + (sgnw << 1) + sgnx; break;
1074 case 15: l=4; s = (sgnv << 3) + (sgnw << 2) + (sgnx << 1) + sgny; break;
1077 d = (ht_count[tbl][0][p] << l) + s;
1078 l = ht_count[tbl][1][p];
1079 putlong( d, l );
1080 sumbit += l;
1083 /* flush remaining bits */
1084 putbits(cc, sz);
1086 return sumbit;
1089 /* Implements the pseudocode of page 98 of the IS */
1090 int HuffmanCode(short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table)
1092 uint32_t cc=0, sz=0, code;
1093 uint32_t i, xl=0, yl=0, idx;
1094 int x, y, bit, sumbit=0;
1095 #define sign_x xr_sign[i+0]
1096 #define sign_y xr_sign[i+1]
1098 if(table == 0)
1099 return 0;
1101 if( table > 15 )
1102 { /* ESC-table is used */
1103 uint32_t linbits = ht_big[table-16].linbits;
1104 uint16_t *hffcode = table < 24 ? t16HB : t24HB;
1105 uint8_t *hlen = table < 24 ? t16l : t24l;
1107 for(i=begin; i<end; i+=2)
1109 x = ix[ i ];
1110 y = ix[i+1];
1112 if(x > 14) { xl = x - 15; x = 15; }
1113 if(y > 14) { yl = y - 15; y = 15; }
1115 idx = x * 16 + y;
1116 code = hffcode[idx];
1117 bit = hlen [idx];
1119 if(x)
1121 if(x > 14)
1123 code = (code << linbits) | xl;
1124 bit += linbits;
1127 code = (code << 1) | sign_x;
1128 bit += 1;
1131 if(y)
1133 if(y > 14)
1135 if(bit + linbits + 1 > 32)
1137 putlong( code, bit );
1138 sumbit += bit;
1139 code = bit = 0;
1142 code = (code << linbits) | yl;
1143 bit += linbits;
1146 code = (code << 1) | sign_y;
1147 bit += 1;
1150 putlong( code, bit );
1151 sumbit += bit;
1154 else
1155 { /* No ESC-words */
1156 const struct huffcodetab *h = &ht[table];
1158 for(i=begin; i<end; i+=2)
1160 x = ix[i];
1161 y = ix[i+1];
1163 idx = x * h->len + y;
1164 code = h->table[idx];
1165 bit = h->hlen [idx];
1167 if(x)
1169 code = (code << 1) | sign_x;
1170 bit += 1;
1173 if(y)
1175 code = (code << 1) | sign_y;
1176 bit += 1;
1179 putlong( code, bit );
1180 sumbit += bit;
1184 /* flush remaining bits */
1185 putbits(cc, sz);
1187 return sumbit;
1190 void putbits(uint32_t val, uint32_t nbit)
1192 int new_bitpos = CodedData.bitpos + nbit;
1193 int ptrpos = CodedData.bitpos >> 5;
1195 val = val & (0xffffffff >> (32 - nbit));
1197 /* data fit in one uint32_t */
1198 if(((new_bitpos - 1) >> 5) == ptrpos)
1199 CodedData.bbuf[ptrpos] |= val << ((32 - new_bitpos) & 31);
1200 else
1202 CodedData.bbuf[ptrpos ] |= val >> ((new_bitpos - 32) & 31);
1203 CodedData.bbuf[ptrpos+1] |= val << ((32 - new_bitpos) & 31);
1206 CodedData.bitpos = new_bitpos;
1209 /***************************************************************************/
1210 /* Choose the Huffman table that will encode ix[begin..end] with */
1211 /* the fewest bits. */
1212 /* Note: This code contains knowledge about the sizes and characteristic */
1213 /* of the Huffman tables as defined in the IS (Table B.7), and will not */
1214 /* work with any arbitrary tables. */
1215 /***************************************************************************/
1216 int choose_table( short *ix, uint32_t begin, uint32_t end, int *bits )
1218 uint32_t i;
1219 int max, table0, table1;
1221 for(i=begin,max=0; i<end; i++)
1222 if(ix[i] > max)
1223 max = ix[i];
1225 if(max < 16)
1227 /* tables without linbits */
1228 /* indx: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
1229 /* len: 0, 2, 3, 3, 0, 4, 4, 6, 6, 6, 8, 8, 8, 16, 0, 16 */
1230 switch(max)
1232 case 0: return 0;
1233 case 1: return count_bit1(ix, begin, end, bits);
1234 case 2: return 2 + find_best_2(ix, begin, end, tab23, 3, bits);
1235 case 3: return 5 + find_best_2(ix, begin, end, tab56, 4, bits);
1236 case 4:
1237 case 5: return 7 + find_best_3(ix, begin, end, tab789, 6, bits);
1238 case 6:
1239 case 7: return 10 + find_best_3(ix, begin, end, tabABC, 8, bits);
1240 default: return 13 + find_best_2(ix, begin, end, tab1315, 16, bits) * 2;
1243 else
1245 /* tables with linbits */
1246 max -= 15;
1248 for(table0=0; table0<8; table0++)
1249 if(ht_big[table0].linmax >= max)
1250 break;
1252 for(table1=8; table1<16; table1++)
1253 if(ht_big[table1].linmax >= max)
1254 break;
1256 return 16 + count_bigv(ix, begin, end, table0, table1, bits);
1260 int find_best_2(short *ix, uint32_t start, uint32_t end, const uint32_t *table,
1261 uint32_t len, int *bits)
1263 uint32_t i, sum = 0;
1265 for(i=start; i<end; i+=2)
1266 sum += table[ix[i] * len + ix[i+1]];
1268 if((sum & 0xffff) <= (sum >> 16))
1270 *bits = (sum & 0xffff);
1271 return 1;
1273 else
1275 *bits = sum >> 16;
1276 return 0;
1280 int find_best_3(short *ix, uint32_t start, uint32_t end, const uint32_t *table,
1281 uint32_t len, int *bits)
1283 uint32_t i, j, sum = 0;
1284 int sum1 = 0;
1285 int sum2 = 0;
1286 int sum3 = 0;
1288 /* avoid overflow in packed additions: 78*13 < 1024 */
1289 for(i=start; i<end; )
1291 j = i + 2*78 > end ? end : i + 2*78;
1293 for(sum=0; i<j; i+=2)
1294 sum += table[ix[i] * len + ix[i+1]];
1296 sum1 += (sum >> 20);
1297 sum2 += (sum >> 10) & 0x3ff;
1298 sum3 += (sum >> 0) & 0x3ff;
1301 i = 0;
1302 if(sum1 > sum2) { sum1 = sum2; i = 1; }
1303 if(sum1 > sum3) { sum1 = sum3; i = 2; }
1305 *bits = sum1;
1307 return i;
1310 /*************************************************************************/
1311 /* Function: Count the number of bits necessary to code the subregion. */
1312 /*************************************************************************/
1313 int count_bit1(short *ix, uint32_t start, uint32_t end, int *bits )
1315 uint32_t i, sum = 0;
1317 for(i=start; i<end; i+=2)
1318 sum += t1l[4 + ix[i] * 2 + ix[i+1]];
1320 *bits = sum;
1322 return 1; /* this is table1 */
1325 int count_bigv(short *ix, uint32_t start, uint32_t end, int table0,
1326 int table1, int *bits )
1328 uint32_t i, sum0, sum1, sum=0, bigv=0, x, y;
1330 /* ESC-table is used */
1331 for(i=start; i<end; i+=2)
1333 x = ix[i];
1334 y = ix[i+1];
1336 if(x > 14) { x = 15; bigv++; }
1337 if(y > 14) { y = 15; bigv++; }
1339 sum += tab1624[x * 16 + y];
1342 sum0 = (sum >> 16) + bigv * ht_big[table0].linbits;
1343 sum1 = (sum & 0xffff) + bigv * ht_big[table1].linbits;
1345 if(sum0 <= sum1)
1347 *bits = sum0;
1348 return table0;
1350 else
1352 *bits = sum1;
1353 return table1;
1357 /*************************************************************************/
1358 /* Function: Calculation of rzero, count1, address3 */
1359 /* (Partitions ix into big values, quadruples and zeros). */
1360 /*************************************************************************/
1361 int calc_runlen( short *ix, side_info_t *si )
1363 int p, i, sum = 0;
1365 for(i=SAMPL2; i-=2; )
1366 if(*(uint32_t*)&ix[i-2]) /* !!!! short *ix; !!!!! */
1367 break;
1369 si->count1 = 0;
1371 for( ; i>3; i-=4)
1373 int v = ix[i-1];
1374 int w = ix[i-2];
1375 int x = ix[i-3];
1376 int y = ix[i-4];
1378 if((v | w | x | y) <= 1)
1380 p = (y<<3) + (x<<2) + (w<<1) + (v);
1382 sum += tab01[p];
1384 si->count1++;
1386 else break;
1389 si->address3 = i;
1391 if((sum >> 16) < (sum & 0xffff))
1393 si->table_select[3] = 0;
1394 return sum >> 16;
1396 else
1398 si->table_select[3] = 1;
1399 return sum & 0xffff;
1404 /*************************************************************************/
1405 /* Function: Quantization of the vector xr ( -> ix) */
1406 /*************************************************************************/
1407 int quantize_int(int *xr, short *ix, side_info_t *si)
1409 unsigned int i, idx, s, frac_pow[] = { 0x10000, 0xd745, 0xb505, 0x9838 };
1411 s = frac_pow[si->quantStep & 3] >> si->quantStep / 4;
1413 /* check for possible 'out of range' values */
1414 if(((si->max_val + 256) >> 8) * s >= (65536 << 8))
1415 return 0;
1417 if(((si->max_val + 256) >> 8) * s < (4096 << 8))
1418 { /* all values fit the table size */
1419 for(i=SAMPL2; i--; )
1420 ix[i] = int2idx[(xr[i] * s + 0x8000) >> 16];
1422 else
1423 { /* check each index wether it fits the table */
1424 for(i=SAMPL2; i--; )
1426 idx = (xr[i] * s + 0x08000) >> 16;
1428 if(idx > 4095) ix[i] = int2idx[(idx + 8) >> 4] << 3;
1429 else ix[i] = int2idx[idx];
1433 return 1;
1436 /*************************************************************************/
1437 /* subdivides the bigvalue region which will use separate Huffman tables */
1438 /*************************************************************************/
1439 void subdivide(side_info_t *si)
1441 int scfb, count0, count1;
1443 if( !si->address3 )
1444 { /* no bigvalue region */
1445 si->region_0_1 = 0;
1446 si->address1 = 0;
1447 si->address2 = 0;
1449 else
1451 /* Calculate scale factor band index */
1452 for(scfb=0; scalefac[scfb] < si->address3; )
1453 scfb++;
1455 count0 = subdv_table[scfb].region0_cnt;
1456 count1 = subdv_table[scfb].region1_cnt;
1458 si->region_0_1 = (count0 << 3) | count1;
1459 si->address1 = scalefac[count0 + 1];
1460 si->address2 = scalefac[count0 + 1 + count1 + 1];
1464 /*******************************************************************/
1465 /* Count the number of bits necessary to code the bigvalues region */
1466 /*******************************************************************/
1467 int bigv_bitcount(short *ix, side_info_t *gi)
1469 int b1=0, b2=0, b3=0;
1471 /* Select huffman code tables for bigvalues regions */
1472 gi->table_select[0] = 0;
1473 gi->table_select[1] = 0;
1474 gi->table_select[2] = 0;
1476 if( gi->address1 > 0 ) /* region0 */
1477 gi->table_select[0] = choose_table(ix, 0 , gi->address1, &b1);
1479 if( gi->address2 > gi->address1 ) /* region1 */
1480 gi->table_select[1] = choose_table(ix, gi->address1, gi->address2, &b2);
1482 if( gi->address3 > gi->address2 ) /* region2 */
1483 gi->table_select[2] = choose_table(ix, gi->address2, gi->address3, &b3);
1485 return b1+b2+b3;
1488 int quantize_and_count_bits(int *xr, short *ix, side_info_t *si)
1490 int bits = 10000;
1492 if(quantize_int(xr, ix, si))
1494 bits = calc_runlen(ix, si); /* rzero,count1,address3 */
1495 subdivide(si); /* bigvalues sfb division */
1496 bits += bigv_bitcount(ix,si); /* bit count */
1499 return bits;
1502 /************************************************************************/
1503 /* The code selects the best quantStep for a particular set of scalefacs*/
1504 /************************************************************************/
1505 int inner_loop(int *xr, int max_bits, side_info_t *si)
1507 int bits;
1509 while((bits=quantize_and_count_bits(xr, enc_data, si)) < max_bits-64)
1511 if(si->quantStep == 0)
1512 break;
1514 if(si->quantStep <= 2)
1515 si->quantStep = 0;
1516 else
1517 si->quantStep -= 2;
1520 while(bits > max_bits)
1522 si->quantStep++;
1523 bits = quantize_and_count_bits(xr, enc_data, si);
1526 return bits;
1529 void iteration_loop(int *xr, side_info_t *si, int gr_cnt)
1531 int remain, tar_bits, max_bits = cfg.mean_bits;
1533 /* distribute reserved bits to remaining granules */
1534 tar_bits = max_bits + (cfg.ResvSize / gr_cnt & ~7);
1535 if(tar_bits > max_bits + max_bits/2)
1536 tar_bits = max_bits + max_bits/2;
1538 si->part2_3_length = inner_loop(xr, tar_bits, si);
1539 si->global_gain = si->quantStep + 142 - si->additStep;
1541 /* unused bits of the reservoir can be used for remaining granules */
1542 cfg.ResvSize += max_bits - si->part2_3_length;
1544 /* end: distribute the reserved bits to one or two granules */
1545 if(gr_cnt == 1)
1547 si->part2_3_length += cfg.ResvSize;
1548 /* mp3 format allows max 12bits for granule length */
1549 if(si->part2_3_length > 4092)
1551 remain = (si->part2_3_length - 4092 + 31) >> 5;
1552 si->part2_3_length -= remain << 5;
1553 si[-1].part2_3_length += remain << 5;
1555 while(remain--)
1556 putbits(~0, 32);
1562 /* returns sum_j=0^31 a[j]*cos(PI*j*(k+1/2)/32), 0<=k<32 */
1563 void window_subband1(short *wk, int sb0[SBLIMIT], int sb1[SBLIMIT]) ICODE_ATTR;
1564 void window_subband1(short *wk, int sb0[SBLIMIT], int sb1[SBLIMIT])
1566 int k, i, u, v;
1567 short *wp, *x1, *x2;
1569 #ifdef CPU_COLDFIRE
1570 int s0, s1, t0, t1;
1572 for(k=0; k<18; k++, wk+=64, sb0+=SBLIMIT, sb1+=SBLIMIT)
1574 wp = enwindow;
1575 x1 = wk;
1576 x2 = x1 - 124;
1578 for(i=-15; i<0; i++)
1580 asm volatile(
1581 "move.l (-224*4,%[x2]), %%d4\n" /* d4 = x2[-224] */
1582 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1583 "mac.w %%d0u, %%d4u, %%acc0\n"
1584 "mac.w %%d0u, %%d4l, (-160*4,%[x2]), %%d4, %%acc1\n"
1585 "mac.w %%d0l, %%d4u, %%acc0\n"
1586 "mac.w %%d0l, %%d4l, ( -96*4,%[x2]), %%d4, %%acc1\n"
1587 "mac.w %%d1u, %%d4u, %%acc0\n"
1588 "mac.w %%d1u, %%d4l, ( -32*4,%[x2]), %%d4, %%acc1\n"
1589 "mac.w %%d1l, %%d4u, %%acc0\n"
1590 "mac.w %%d1l, %%d4l, ( 32*4,%[x2]), %%d4, %%acc1\n"
1591 "mac.w %%d2u, %%d4u, %%acc0\n"
1592 "mac.w %%d2u, %%d4l, ( 96*4,%[x2]), %%d4, %%acc1\n"
1593 "mac.w %%d2l, %%d4u, %%acc0\n"
1594 "mac.w %%d2l, %%d4l, ( 160*4,%[x2]), %%d4, %%acc1\n"
1595 "mac.w %%d3u, %%d4u, %%acc0\n"
1596 "mac.w %%d3u, %%d4l, ( 224*4,%[x2]), %%d4, %%acc1\n"
1597 "mac.w %%d3l, %%d4u, %%acc0\n"
1598 "mac.w %%d3l, %%d4l, (-256*4,%[x1]), %%d4, %%acc1\n"
1599 "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */
1600 "mac.w %%d0u, %%d4u, %%acc0\n"
1601 "mac.w %%d0u, %%d4l, (-192*4,%[x1]), %%d4, %%acc1\n"
1602 "mac.w %%d0l, %%d4u, %%acc0\n"
1603 "mac.w %%d0l, %%d4l, (-128*4,%[x1]), %%d4, %%acc1\n"
1604 "mac.w %%d1u, %%d4u, %%acc0\n"
1605 "mac.w %%d1u, %%d4l, ( -64*4,%[x1]), %%d4, %%acc1\n"
1606 "mac.w %%d1l, %%d4u, %%acc0\n"
1607 "mac.w %%d1l, %%d4l, ( 0*4,%[x1]), %%d4, %%acc1\n"
1608 "mac.w %%d2u, %%d4u, %%acc0\n"
1609 "mac.w %%d2u, %%d4l, ( 64*4,%[x1]), %%d4, %%acc1\n"
1610 "mac.w %%d2l, %%d4u, %%acc0\n"
1611 "mac.w %%d2l, %%d4l, ( 128*4,%[x1]), %%d4, %%acc1\n"
1612 "mac.w %%d3u, %%d4u, %%acc0\n"
1613 "mac.w %%d3u, %%d4l, ( 192*4,%[x1]), %%d4, %%acc1\n"
1614 "mac.w %%d3l, %%d4u, %%acc0\n"
1615 "mac.w %%d3l, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n"
1616 "movclr.l %%acc0, %%d0\n"
1617 "move.l %%d0, %[s0]\n"
1618 "movclr.l %%acc1, %%d0\n"
1619 "move.l %%d0, %[s1]\n"
1621 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1622 "mac.w %%d0u, %%d4u, %%acc0\n"
1623 "mac.w %%d0u, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n"
1624 "mac.w %%d0l, %%d4u, %%acc0\n"
1625 "mac.w %%d0l, %%d4l, ( 96*4,%[x1]), %%d4, %%acc1\n"
1626 "mac.w %%d1u, %%d4u, %%acc0\n"
1627 "mac.w %%d1u, %%d4l, ( 32*4,%[x1]), %%d4, %%acc1\n"
1628 "mac.w %%d1l, %%d4u, %%acc0\n"
1629 "mac.w %%d1l, %%d4l, ( -32*4,%[x1]), %%d4, %%acc1\n"
1630 "mac.w %%d2u, %%d4u, %%acc0\n"
1631 "mac.w %%d2u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n"
1632 "mac.w %%d2l, %%d4u, %%acc0\n"
1633 "mac.w %%d2l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n"
1634 "mac.w %%d3u, %%d4u, %%acc0\n"
1635 "mac.w %%d3u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n"
1636 "mac.w %%d3l, %%d4u, %%acc0\n"
1637 "mac.w %%d3l, %%d4l, ( 256*4,%[x2]), %%d4, %%acc1\n"
1638 "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */
1639 "mac.w %%d0u, %%d4u, %%acc0\n"
1640 "mac.w %%d0u, %%d4l, ( 192*4,%[x2]), %%d4, %%acc1\n"
1641 "mac.w %%d0l, %%d4u, %%acc0\n"
1642 "mac.w %%d0l, %%d4l, ( 128*4,%[x2]), %%d4, %%acc1\n"
1643 "mac.w %%d1u, %%d4u, %%acc0\n"
1644 "mac.w %%d1u, %%d4l, ( 64*4,%[x2]), %%d4, %%acc1\n"
1645 "mac.w %%d1l, %%d4u, %%acc0\n"
1646 "mac.w %%d1l, %%d4l, ( 0*4,%[x2]), %%d4, %%acc1\n"
1647 "mac.w %%d2u, %%d4u, %%acc0\n"
1648 "mac.w %%d2u, %%d4l, ( -64*4,%[x2]), %%d4, %%acc1\n"
1649 "mac.w %%d2l, %%d4u, %%acc0\n"
1650 "mac.w %%d2l, %%d4l, (-128*4,%[x2]), %%d4, %%acc1\n"
1651 "mac.w %%d3u, %%d4u, %%acc0\n"
1652 "mac.w %%d3u, %%d4l, (-192*4,%[x2]), %%d4, %%acc1\n"
1653 "mac.w %%d3l, %%d4u, %%acc0\n"
1654 "mac.w %%d3l, %%d4l, %%acc1\n"
1655 "movclr.l %%acc0, %%d0\n"
1656 "move.l %%d0, %[t0]\n"
1657 "movclr.l %%acc1, %%d0\n"
1658 "move.l %%d0, %[t1]\n"
1660 : [x1] "+a" (x1), [x2] "+a" (x2), [s0] "+m" (s0), [t0] "+m" (t0),
1661 [s1] "+m" (s1), [t1] "+m" (t1)
1662 : [wp] "a" (wp) : "d0", "d1", "d2", "d3", "d4");
1664 sb0[30+i*2] = shft4(t0) + shft13(s0) * wp[24];
1665 sb0[31+i*2] = shft13(t0) * wp[25] - shft13(s0) * wp[26];
1666 sb1[30+i*2] = shft4(t1) + shft13(s1) * wp[24];
1667 sb1[31+i*2] = shft13(t1) * wp[25] - shft13(s1) * wp[26];
1668 wp += 27;
1669 x1 -= 2;
1670 x2 += 2;
1673 asm volatile(
1674 "move.l ( -32*4,%[x1]), %%d4\n" /* d4 = x1[-32] */
1675 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1677 "mac.w %%d0u, %%d4u, %%acc0\n"
1678 "mac.w %%d0u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n"
1679 "mac.w %%d0l, %%d4u, %%acc0\n"
1680 "mac.w %%d0l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n"
1681 "mac.w %%d1u, %%d4u, %%acc0\n"
1682 "mac.w %%d1u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n"
1683 "mac.w %%d1l, %%d4u, %%acc0\n"
1684 "mac.w %%d1l, %%d4l, ( 32*4,%[x1]), %%d4, %%acc1\n"
1685 "mac.w %%d2u, %%d4u, %%acc0\n"
1686 "mac.w %%d2u, %%d4l, ( 96*4,%[x1]), %%d4, %%acc1\n"
1687 "mac.w %%d2l, %%d4u, %%acc0\n"
1688 "mac.w %%d2l, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n"
1689 "mac.w %%d3u, %%d4u, %%acc0\n"
1690 "mac.w %%d3u, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n"
1691 "mac.w %%d3l, %%d4u, %%acc0\n"
1692 "mac.w %%d3l, %%d4l, ( -16*4,%[x1]), %%d4, %%acc1\n"
1693 "movclr.l %%acc0, %%d0\n"
1694 "move.l %%d0, %[s0]\n"
1695 "movclr.l %%acc1, %%d0\n"
1696 "move.l %%d0, %[s1]\n"
1698 "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */
1699 "mac.w %%d0u, %%d4u, %%acc0\n"
1700 "mac.w %%d0u, %%d4l, ( -48*4,%[x1]), %%d4, %%acc1\n"
1701 "mac.w %%d1u, %%d4u, %%acc0\n"
1702 "mac.w %%d1u, %%d4l, ( 16*4,%[x1]), %%d4, %%acc1\n"
1703 "mac.w %%d1l, %%d4u, %%acc0\n"
1704 "mac.w %%d1l, %%d4l, ( -80*4,%[x1]), %%d4, %%acc1\n"
1705 "mac.w %%d2u, %%d4u, %%acc0\n"
1706 "mac.w %%d2u, %%d4l, ( 48*4,%[x1]), %%d4, %%acc1\n"
1707 "mac.w %%d2u, %%d4u, %%acc0\n"
1708 "mac.w %%d2u, %%d4l, (-112*4,%[x1]), %%d4, %%acc1\n"
1709 "mac.w %%d3u, %%d4u, %%acc0\n"
1710 "mac.w %%d3u, %%d4l, ( 80*4,%[x1]), %%d4, %%acc1\n"
1711 "mac.w %%d3l, %%d4u, %%acc0\n"
1712 "mac.w %%d3l, %%d4l, (-144*4,%[x1]), %%d4, %%acc1\n"
1713 "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */
1714 "mac.w %%d0u, %%d4u, %%acc0\n"
1715 "mac.w %%d0u, %%d4l, ( 112*4,%[x1]), %%d4, %%acc1\n"
1716 "mac.w %%d0u, %%d4u, %%acc0\n"
1717 "mac.w %%d0u, %%d4l, (-176*4,%[x1]), %%d4, %%acc1\n"
1718 "mac.w %%d1u, %%d4u, %%acc0\n"
1719 "mac.w %%d1u, %%d4l, ( 144*4,%[x1]), %%d4, %%acc1\n"
1720 "mac.w %%d1l, %%d4u, %%acc0\n"
1721 "mac.w %%d1l, %%d4l, (-208*4,%[x1]), %%d4, %%acc1\n"
1722 "mac.w %%d2u, %%d4u, %%acc0\n"
1723 "mac.w %%d2u, %%d4l, ( 176*4,%[x1]), %%d4, %%acc1\n"
1724 "mac.w %%d2u, %%d4u, %%acc0\n"
1725 "mac.w %%d2u, %%d4l, (-240*4,%[x1]), %%d4, %%acc1\n"
1726 "mac.w %%d3u, %%d4u, %%acc0\n"
1727 "mac.w %%d3u, %%d4l, ( 208*4,%[x1]), %%d4, %%acc1\n"
1728 "mac.w %%d3l, %%d4u, %%acc0\n"
1729 "mac.w %%d3l, %%d4l, %%acc1\n"
1730 "movclr.l %%acc0, %%d0\n"
1731 "move.l %%d0, %[t0]\n"
1732 "movclr.l %%acc1, %%d0\n"
1733 "move.l %%d0, %[t1]\n"
1735 : [x1] "+a" (x1), [s0] "+m" (s0), [t0] "+m" (t0),
1736 [s1] "+m" (s1), [t1] "+m" (t1)
1737 : [wp] "a" (wp) : "d0", "d1", "d2", "d3", "d4");
1739 u = shft4(s0 - t0);
1740 v = shft4(s0 + t0);
1741 t0 = sb0[14];
1742 s0 = sb0[15] - t0;
1744 sb0[31] = v + t0; /* A0 */
1745 sb0[30] = u + s0; /* A1 */
1746 sb0[15] = u - s0; /* A2 */
1747 sb0[14] = v - t0; /* A3 */
1749 u = shft4(s1 - t1);
1750 v = shft4(s1 + t1);
1751 t1 = sb1[14];
1752 s1 = sb1[15] - t1;
1754 sb1[31] = v + t1; /* A0 */
1755 sb1[30] = u + s1; /* A1 */
1756 sb1[15] = u - s1; /* A2 */
1757 sb1[14] = v - t1; /* A3 */
1759 #else
1760 int ch, s, t, *a;
1762 for(ch=0; ch<cfg.channels; ch++)
1764 a = ch ? sb1 : sb0;
1765 for(k=0; k<18; k++, wk+=64, a+=SBLIMIT)
1767 wp = enwindow;
1768 x1 = wk;
1769 x2 = x1 - 124;
1771 /* x1[-572] .... x1[448] = 1022 */
1772 /* 18*4*16*32 */
1773 for(i=-15; i<0; i++)
1775 s = (int)x2[-224*2] * wp[ 0]; t = (int)x1[ 224*2] * wp[ 0];
1776 s += (int)x2[-160*2] * wp[ 1]; t += (int)x1[ 160*2] * wp[ 1];
1777 s += (int)x2[- 96*2] * wp[ 2]; t += (int)x1[ 96*2] * wp[ 2];
1778 s += (int)x2[- 32*2] * wp[ 3]; t += (int)x1[ 32*2] * wp[ 3];
1779 s += (int)x2[ 32*2] * wp[ 4]; t += (int)x1[- 32*2] * wp[ 4];
1780 s += (int)x2[ 96*2] * wp[ 5]; t += (int)x1[- 96*2] * wp[ 5];
1781 s += (int)x2[ 160*2] * wp[ 6]; t += (int)x1[-160*2] * wp[ 6];
1782 s += (int)x2[ 224*2] * wp[ 7]; t += (int)x1[-224*2] * wp[ 7];
1783 s += (int)x1[-256*2] * wp[ 8]; t += (int)x2[ 256*2] * wp[16];
1784 s += (int)x1[-192*2] * wp[ 9]; t += (int)x2[ 192*2] * wp[17];
1785 s += (int)x1[-128*2] * wp[10]; t += (int)x2[ 128*2] * wp[18];
1786 s += (int)x1[- 64*2] * wp[11]; t += (int)x2[ 64*2] * wp[19];
1787 s += (int)x1[ 0*2] * wp[12]; t += (int)x2[ 0*2] * wp[20];
1788 s += (int)x1[ 64*2] * wp[13]; t += (int)x2[- 64*2] * wp[21];
1789 s += (int)x1[ 128*2] * wp[14]; t += (int)x2[-128*2] * wp[22];
1790 s += (int)x1[ 192*2] * wp[15]; t += (int)x2[-192*2] * wp[23];
1792 a[30+i*2] = shft4(t) + shft13(s) * wp[24];
1793 a[31+i*2] = shft13(t) * wp[25] - shft13(s) * wp[26];
1794 wp += 27;
1795 x1 -= 2;
1796 x2 += 2;
1799 t = (int)x1[- 16*2] * wp[ 8]; s = (int)x1[ -32*2] * wp[0];
1800 t += ((int)x1[- 48*2]-x1[ 16*2]) * wp[10]; s += (int)x1[ -96*2] * wp[1];
1801 t += ((int)x1[- 80*2]+x1[ 48*2]) * wp[12]; s += (int)x1[-160*2] * wp[2];
1802 t += ((int)x1[-112*2]-x1[ 80*2]) * wp[14]; s += (int)x1[-224*2] * wp[3];
1803 t += ((int)x1[-144*2]+x1[112*2]) * wp[16]; s += (int)x1[ 32*2] * wp[4];
1804 t += ((int)x1[-176*2]-x1[144*2]) * wp[18]; s += (int)x1[ 96*2] * wp[5];
1805 t += ((int)x1[-208*2]+x1[176*2]) * wp[20]; s += (int)x1[ 160*2] * wp[6];
1806 t += ((int)x1[-240*2]-x1[208*2]) * wp[22]; s += (int)x1[ 224*2] * wp[7];
1808 u = shft4(s - t);
1809 v = shft4(s + t);
1810 t = a[14];
1811 s = a[15] - t;
1813 a[31] = v + t; /* A0 */
1814 a[30] = u + s; /* A1 */
1815 a[15] = u - s; /* A2 */
1816 a[14] = v - t; /* A3 */
1818 wk -= 18 * 64 - 1; /* rewind wk (to next channel start) */
1820 #endif
1823 void window_subband2(short *x1, int a[SBLIMIT]) ICODE_ATTR;
1824 void window_subband2(short *x1, int a[SBLIMIT])
1826 int xr;
1827 short *wp = enwindow;
1828 short *x2 = x1 - 124;
1830 wp += 27 * 15;
1831 x1 -= 2 * 15;
1832 x2 += 2 * 15;
1834 xr = a[28] - a[0]; a[0] += a[28]; a[28] = shft9(xr) * wp[-2*27+25];
1835 xr = a[29] - a[1]; a[1] += a[29]; a[29] = shft9(xr) * wp[-2*27+25];
1836 xr = a[26] - a[2]; a[2] += a[26]; a[26] = shft9(xr) * wp[-4*27+25];
1837 xr = a[27] - a[3]; a[3] += a[27]; a[27] = shft9(xr) * wp[-4*27+25];
1838 xr = a[24] - a[4]; a[4] += a[24]; a[24] = shft9(xr) * wp[-6*27+25];
1839 xr = a[25] - a[5]; a[5] += a[25]; a[25] = shft9(xr) * wp[-6*27+25];
1840 xr = a[22] - a[6]; a[6] += a[22]; a[22] = shft9(xr) * SQRT ;
1841 xr = a[23] - a[7]; a[7] += a[23]; a[23] = shft9(xr) * SQRT - a[7];
1842 a[ 7] -= a[ 6];
1843 a[22] -= a[ 7];
1844 a[23] -= a[22];
1846 xr = a[ 6]; a[ 6] = a[31] - xr; a[31] = a[31] + xr;
1847 xr = a[ 7]; a[ 7] = a[30] - xr; a[30] = a[30] + xr;
1848 xr = a[22]; a[22] = a[15] - xr; a[15] = a[15] + xr;
1849 xr = a[23]; a[23] = a[14] - xr; a[14] = a[14] + xr;
1851 xr = a[20] - a[ 8]; a[ 8] += a[20]; a[20] = shft9(xr) * wp[-10*27+25];
1852 xr = a[21] - a[ 9]; a[ 9] += a[21]; a[21] = shft9(xr) * wp[-10*27+25];
1853 xr = a[18] - a[10]; a[10] += a[18]; a[18] = shft9(xr) * wp[-12*27+25];
1854 xr = a[19] - a[11]; a[11] += a[19]; a[19] = shft9(xr) * wp[-12*27+25];
1855 xr = a[16] - a[12]; a[12] += a[16]; a[16] = shft9(xr) * wp[-14*27+25];
1856 xr = a[17] - a[13]; a[13] += a[17]; a[17] = shft9(xr) * wp[-14*27+25];
1857 xr =-a[20] + a[24]; a[20] += a[24]; a[24] = shft9(xr) * wp[-12*27+25];
1858 xr =-a[21] + a[25]; a[21] += a[25]; a[25] = shft9(xr) * wp[-12*27+25];
1859 xr = a[ 4] - a[ 8]; a[ 4] += a[ 8]; a[ 8] = shft9(xr) * wp[-12*27+25];
1860 xr = a[ 5] - a[ 9]; a[ 5] += a[ 9]; a[ 9] = shft9(xr) * wp[-12*27+25];
1861 xr = a[ 0] - a[12]; a[ 0] += a[12]; a[12] = shft9(xr) * wp[ -4*27+25];
1862 xr = a[ 1] - a[13]; a[ 1] += a[13]; a[13] = shft9(xr) * wp[ -4*27+25];
1863 xr = a[16] - a[28]; a[16] += a[28]; a[28] = shft9(xr) * wp[ -4*27+25];
1864 xr =-a[17] + a[29]; a[17] += a[29]; a[29] = shft9(xr) * wp[ -4*27+25];
1866 xr = SQRT * shft9(a[ 2] - a[10]); a[ 2] += a[10]; a[10] = xr;
1867 xr = SQRT * shft9(a[ 3] - a[11]); a[ 3] += a[11]; a[11] = xr;
1868 xr = SQRT * shft9(a[26] - a[18]); a[18] += a[26]; a[26] = xr - a[18];
1869 xr = SQRT * shft9(a[27] - a[19]); a[19] += a[27]; a[27] = xr - a[19];
1871 xr = a[ 2]; a[19] -= a[ 3]; a[ 3] -= xr; a[ 2] = a[31] - xr; a[31] += xr;
1872 xr = a[ 3]; a[11] -= a[19]; a[18] -= xr; a[ 3] = a[30] - xr; a[30] += xr;
1873 xr = a[18]; a[27] -= a[11]; a[19] -= xr; a[18] = a[15] - xr; a[15] += xr;
1875 xr = a[19]; a[10] -= xr; a[19] = a[14] - xr; a[14] += xr;
1876 xr = a[10]; a[11] -= xr; a[10] = a[23] - xr; a[23] += xr;
1877 xr = a[11]; a[26] -= xr; a[11] = a[22] - xr; a[22] += xr;
1878 xr = a[26]; a[27] -= xr; a[26] = a[ 7] - xr; a[ 7] += xr;
1880 xr = a[27]; a[27] = a[6] - xr; a[6] += xr;
1882 xr = SQRT * shft9(a[ 0] - a[ 4]); a[ 0] += a[ 4]; a[ 4] = xr;
1883 xr = SQRT * shft9(a[ 1] - a[ 5]); a[ 1] += a[ 5]; a[ 5] = xr;
1884 xr = SQRT * shft9(a[16] - a[20]); a[16] += a[20]; a[20] = xr;
1885 xr = SQRT * shft9(a[17] - a[21]); a[17] += a[21]; a[21] = xr;
1886 xr =-SQRT * shft9(a[ 8] - a[12]); a[ 8] += a[12]; a[12] = xr - a[ 8];
1887 xr =-SQRT * shft9(a[ 9] - a[13]); a[ 9] += a[13]; a[13] = xr - a[ 9];
1888 xr =-SQRT * shft9(a[25] - a[29]); a[25] += a[29]; a[29] = xr - a[25];
1889 xr =-SQRT * shft9(a[24] + a[28]); a[24] -= a[28]; a[28] = xr - a[24];
1891 xr = a[24] - a[16]; a[24] = xr;
1892 xr = a[20] - xr; a[20] = xr;
1893 xr = a[28] - xr; a[28] = xr;
1895 xr = a[25] - a[17]; a[25] = xr;
1896 xr = a[21] - xr; a[21] = xr;
1897 xr = a[29] - xr; a[29] = xr;
1899 xr = a[17] - a[1]; a[17] = xr;
1900 xr = a[ 9] - xr; a[ 9] = xr;
1901 xr = a[25] - xr; a[25] = xr;
1902 xr = a[ 5] - xr; a[ 5] = xr;
1903 xr = a[21] - xr; a[21] = xr;
1904 xr = a[13] - xr; a[13] = xr;
1905 xr = a[29] - xr; a[29] = xr;
1907 xr = a[ 1] - a[0]; a[ 1] = xr;
1908 xr = a[16] - xr; a[16] = xr;
1909 xr = a[17] - xr; a[17] = xr;
1910 xr = a[ 8] - xr; a[ 8] = xr;
1911 xr = a[ 9] - xr; a[ 9] = xr;
1912 xr = a[24] - xr; a[24] = xr;
1913 xr = a[25] - xr; a[25] = xr;
1914 xr = a[ 4] - xr; a[ 4] = xr;
1915 xr = a[ 5] - xr; a[ 5] = xr;
1916 xr = a[20] - xr; a[20] = xr;
1917 xr = a[21] - xr; a[21] = xr;
1918 xr = a[12] - xr; a[12] = xr;
1919 xr = a[13] - xr; a[13] = xr;
1920 xr = a[28] - xr; a[28] = xr;
1921 xr = a[29] - xr; a[29] = xr;
1923 xr = a[ 0]; a[ 0] += a[31]; a[31] -= xr;
1924 xr = a[ 1]; a[ 1] += a[30]; a[30] -= xr;
1925 xr = a[16]; a[16] += a[15]; a[15] -= xr;
1926 xr = a[17]; a[17] += a[14]; a[14] -= xr;
1927 xr = a[ 8]; a[ 8] += a[23]; a[23] -= xr;
1928 xr = a[ 9]; a[ 9] += a[22]; a[22] -= xr;
1929 xr = a[24]; a[24] += a[ 7]; a[ 7] -= xr;
1930 xr = a[25]; a[25] += a[ 6]; a[ 6] -= xr;
1931 xr = a[ 4]; a[ 4] += a[27]; a[27] -= xr;
1932 xr = a[ 5]; a[ 5] += a[26]; a[26] -= xr;
1933 xr = a[20]; a[20] += a[11]; a[11] -= xr;
1934 xr = a[21]; a[21] += a[10]; a[10] -= xr;
1935 xr = a[12]; a[12] += a[19]; a[19] -= xr;
1936 xr = a[13]; a[13] += a[18]; a[18] -= xr;
1937 xr = a[28]; a[28] += a[ 3]; a[ 3] -= xr;
1938 xr = a[29]; a[29] += a[ 2]; a[ 2] -= xr;
1941 void mdct_long(int *out, int *in) ICODE_ATTR;
1942 void mdct_long(int *out, int *in)
1944 int ct,st;
1945 int tc1, tc2, tc3, tc4, ts5, ts6, ts7, ts8;
1946 int ts1, ts2, ts3, ts4, tc5, tc6, tc7, tc8;
1948 /* 1,2, 5,6, 9,10, 13,14, 17 */
1949 tc1 = in[17] - in[ 9];
1950 tc3 = in[15] - in[11];
1951 tc4 = in[14] - in[12];
1952 ts5 = in[ 0] + in[ 8];
1953 ts6 = in[ 1] + in[ 7];
1954 ts7 = in[ 2] + in[ 6];
1955 ts8 = in[ 3] + in[ 5];
1957 out[17] = (ts5 + ts7 - ts8) * cx[8] - (ts6 - in[4]) * cx[8];
1958 st = (ts5 + ts7 - ts8) * cx[7] + (ts6 - in[4]) * cx[8];
1959 ct = (tc1 - tc3 - tc4) * cx[6];
1960 out[5] = ct + st;
1961 out[6] = ct - st;
1963 tc2 = (in[16] - in[10]) * cx[6];
1964 ts6 = ts6 * cx[7] + in[4] * cx[8];
1966 ct = tc1 * cx[0] + tc2 + tc3 * cx[1] + tc4 * cx[2];
1967 st = -ts5 * cx[4] + ts6 - ts7 * cx[5] + ts8 * cx[3];
1968 out[1] = ct + st;
1969 out[2] = ct - st;
1971 ct = tc1 * cx[1] - tc2 - tc3 * cx[2] + tc4 * cx[0];
1972 st = -ts5 * cx[5] + ts6 - ts7 * cx[3] + ts8 * cx[4];
1973 out[ 9] = ct + st;
1974 out[10] = ct - st;
1976 ct = tc1 * cx[2] - tc2 + tc3 * cx[0] - tc4 * cx[1];
1977 st = ts5 * cx[3] - ts6 + ts7 * cx[4] - ts8 * cx[5];
1978 out[13] = ct + st;
1979 out[14] = ct - st;
1981 ts1 = in[ 8] - in[ 0];
1982 ts3 = in[ 6] - in[ 2];
1983 ts4 = in[ 5] - in[ 3];
1984 tc5 = in[17] + in[ 9];
1985 tc6 = in[16] + in[10];
1986 tc7 = in[15] + in[11];
1987 tc8 = in[14] + in[12];
1989 out[0] = (tc5 + tc7 + tc8) * cx[8] + (tc6 + in[13]) * cx[8];
1990 ct = (tc5 + tc7 + tc8) * cx[7] - (tc6 + in[13]) * cx[8];
1991 st = (ts1 - ts3 + ts4) * cx[6];
1992 out[11] = ct + st;
1993 out[12] = ct - st;
1995 ts2 = (in[7] - in[1]) * cx[6];
1996 tc6 = in[13] * cx[8] - tc6 * cx[7];
1998 ct = tc5 * cx[3] - tc6 + tc7 * cx[4] + tc8 * cx[5];
1999 st = ts1 * cx[2] + ts2 + ts3 * cx[0] + ts4 * cx[1];
2000 out[3] = ct + st;
2001 out[4] = ct - st;
2003 ct =-tc5 * cx[5] + tc6 - tc7 * cx[3] - tc8 * cx[4];
2004 st = ts1 * cx[1] + ts2 - ts3 * cx[2] - ts4 * cx[0];
2005 out[7] = ct + st;
2006 out[8] = ct - st;
2008 ct =-tc5 * cx[4] + tc6 - tc7 * cx[5] - tc8 * cx[3];
2009 st = ts1 * cx[0] - ts2 + ts3 * cx[1] - ts4 * cx[2];
2010 out[15] = ct + st;
2011 out[16] = ct - st;
2014 static int find_bitrate_index(int type, int bitrate)
2016 int i;
2018 for(i=0;i<14;i++)
2019 if(bitrate == bitr_index[type][i])
2020 break;
2022 return i;
2025 static int find_samplerate_index(long freq, int *mp3_type)
2027 int mpg, rate;
2029 /* set default values: MPEG1 at 44100/s */
2030 *mp3_type = 1;
2032 for(mpg=0; mpg<2; mpg++)
2033 for(rate=0; rate<3; rate++)
2034 if(freq == sampr_index[mpg][rate])
2035 { *mp3_type = mpg; return rate; }
2037 return 0;
2040 void init_mp3_encoder_engine(bool stereo, int bitrate, int sample_rate)
2042 uint32_t avg_byte_per_frame;
2044 #ifdef ROCKBOX_LITTLE_ENDIAN
2045 cfg.byte_order = order_littleEndian;
2046 #else
2047 cfg.byte_order = order_bigEndian;
2048 #endif
2050 if(bitrate < 96 && stereo && sample_rate >= 32000)
2051 { /* use MPEG2 format */
2052 sample_rate >>= 1;
2053 cfg.resample = 1;
2054 cfg.granules = 1;
2056 else
2057 { /* use MPEG1 format */
2058 cfg.resample = 0;
2059 cfg.granules = 2;
2062 cfg.samplerate = sample_rate;
2063 cfg.channels = stereo ? 2 : 1;
2064 cfg.mpg.mode = stereo ? 0 : 3; /* 0=stereo, 3=mono */
2065 cfg.mpg.bitrate = stereo ? bitrate : bitrate > 160 ? 160 : bitrate;
2066 cfg.mpg.smpl_id = find_samplerate_index(cfg.samplerate, &cfg.mpg.type);
2067 cfg.mpg.bitr_id = find_bitrate_index(cfg.mpg.type, cfg.mpg.bitrate);
2068 cfg.mpg.num_bands = num_bands[stereo ? cfg.mpg.type : 2][cfg.mpg.bitr_id];
2070 memcpy(scalefac, sfBand[cfg.mpg.smpl_id + 3*cfg.mpg.type], sizeof(scalefac));
2071 memset(mfbuf , 0 , sizeof(mfbuf ));
2072 memset(mdct_freq , 0 , sizeof(mdct_freq ));
2073 memset(enc_data , 0 , sizeof(enc_data ));
2074 memset(sb_data , 0 , sizeof(sb_data ));
2075 memset(&CodedData, 0 , sizeof(CodedData ));
2076 memcpy(ca , ca_const , sizeof(ca ));
2077 memcpy(cs , cs_const , sizeof(cs ));
2078 memcpy(cx , cx_const , sizeof(cx ));
2079 memcpy(win , win_const , sizeof(win ));
2080 memcpy(enwindow , enwindow_const , sizeof(enwindow ));
2081 memcpy(int2idx , int2idx_const , sizeof(int2idx ));
2082 memcpy(ht_count , ht_count_const , sizeof(ht_count ));
2083 memcpy( tab01 , tab01_const , sizeof(tab01 ));
2084 memcpy( tab23 , tab23_const , sizeof(tab23 ));
2085 memcpy( tab56 , tab56_const , sizeof(tab56 ));
2086 memcpy( tab1315 , tab1315_const , sizeof(tab1315 ));
2087 memcpy( tab1624 , tab1624_const , sizeof(tab1624 ));
2088 memcpy( tab789 , tab789_const , sizeof(tab789 ));
2089 memcpy( tabABC , tabABC_const , sizeof(tabABC ));
2090 memcpy( t1HB , t1HB_const , sizeof(t1HB ));
2091 memcpy( t2HB , t2HB_const , sizeof(t2HB ));
2092 memcpy( t3HB , t3HB_const , sizeof(t3HB ));
2093 memcpy( t5HB , t5HB_const , sizeof(t5HB ));
2094 memcpy( t6HB , t6HB_const , sizeof(t6HB ));
2095 memcpy( t7HB , t7HB_const , sizeof(t7HB ));
2096 memcpy( t8HB , t8HB_const , sizeof(t8HB ));
2097 memcpy( t9HB , t9HB_const , sizeof(t9HB ));
2098 memcpy(t10HB , t10HB_const , sizeof(t10HB ));
2099 memcpy(t11HB , t11HB_const , sizeof(t11HB ));
2100 memcpy(t12HB , t12HB_const , sizeof(t12HB ));
2101 memcpy(t13HB , t13HB_const , sizeof(t13HB ));
2102 memcpy(t15HB , t15HB_const , sizeof(t15HB ));
2103 memcpy(t16HB , t16HB_const , sizeof(t16HB ));
2104 memcpy(t24HB , t24HB_const , sizeof(t24HB ));
2105 memcpy( t1l , t1l_const , sizeof(t1l ));
2106 memcpy( t2l , t2l_const , sizeof(t2l ));
2107 memcpy( t3l , t3l_const , sizeof(t3l ));
2108 memcpy( t5l , t5l_const , sizeof(t5l ));
2109 memcpy( t6l , t6l_const , sizeof(t6l ));
2110 memcpy( t7l , t7l_const , sizeof(t7l ));
2111 memcpy( t8l , t8l_const , sizeof(t8l ));
2112 memcpy( t9l , t9l_const , sizeof(t9l ));
2113 memcpy(t10l , t10l_const , sizeof(t10l ));
2114 memcpy(t11l , t11l_const , sizeof(t11l ));
2115 memcpy(t12l , t12l_const , sizeof(t12l ));
2116 memcpy(t13l , t13l_const , sizeof(t13l ));
2117 memcpy(t15l , t15l_const , sizeof(t15l ));
2118 memcpy(t16l , t16l_const , sizeof(t16l ));
2119 memcpy(t24l , t24l_const , sizeof(t24l ));
2120 memcpy(ht , ht_const , sizeof(ht ));
2122 ht[ 0].table = NULL; ht[ 0].hlen = NULL; /* Apparently not used */
2123 ht[ 1].table = t1HB; ht[ 1].hlen = t1l;
2124 ht[ 2].table = t2HB; ht[ 2].hlen = t2l;
2125 ht[ 3].table = t3HB; ht[ 3].hlen = t3l;
2126 ht[ 4].table = NULL; ht[ 4].hlen = NULL; /* Apparently not used */
2127 ht[ 5].table = t5HB; ht[ 5].hlen = t5l;
2128 ht[ 6].table = t6HB; ht[ 6].hlen = t6l;
2129 ht[ 7].table = t7HB; ht[ 7].hlen = t7l;
2130 ht[ 8].table = t8HB; ht[ 8].hlen = t8l;
2131 ht[ 9].table = t9HB; ht[ 9].hlen = t9l;
2132 ht[10].table = t10HB; ht[10].hlen = t10l;
2133 ht[11].table = t11HB; ht[11].hlen = t11l;
2134 ht[12].table = t12HB; ht[12].hlen = t12l;
2135 ht[13].table = t13HB; ht[13].hlen = t13l;
2136 ht[14].table = NULL; ht[14].hlen = NULL; /* Apparently not used */
2137 ht[15].table = t15HB; ht[15].hlen = t15l;
2139 /* Figure average number of 'bytes' per frame */
2140 avg_byte_per_frame = SAMPL2 * 16000 * cfg.mpg.bitrate / (2 - cfg.mpg.type);
2141 avg_byte_per_frame = avg_byte_per_frame / cfg.samplerate;
2142 cfg.byte_per_frame = avg_byte_per_frame / 64;
2143 cfg.frac_per_frame = avg_byte_per_frame & 63;
2144 cfg.slot_lag = 0;
2145 cfg.sideinfo_len = 32 + (cfg.mpg.type ? (cfg.channels == 1 ? 136 : 256)
2146 : (cfg.channels == 1 ? 72 : 136));
2149 void set_scale_facs(int *mdct_freq)
2151 unsigned int i, is, ie, k, s;
2152 int max_freq_val, avrg_freq_val;
2154 /* calc average of first 256 frequency values */
2155 for(avrg_freq_val=i=0; i<256; i++)
2156 avrg_freq_val += mdct_freq[i];
2157 avrg_freq_val >>= 8;
2159 /* if max of current band is smaller than average, increase precision */
2160 /* last band keeps untouched (not scaled) */
2161 for(is=k=0; is<scalefac[21]; k++)
2163 max_freq_val = 0;
2165 for(i=is, ie=scalefac[k+1]; i<ie; i++)
2166 if(max_freq_val < mdct_freq[i])
2167 max_freq_val = mdct_freq[i];
2169 for(s=0; s<3; s++)
2170 if((max_freq_val<<s) > avrg_freq_val)
2171 break;
2173 band_scale_f[k] = (unsigned char)s;
2175 for(i=is; s && i<ie; i++)
2176 mdct_freq[i] <<= s;
2178 is = ie;
2182 void compress(void)
2184 int i, gr, gr_cnt;
2185 char stg[20];
2186 uint32_t max;
2188 while(1)
2190 if((frames & 7) == 0)
2191 { rb->lcd_clear_display();
2192 rb->snprintf(stg, 20, "Frame %d / %d", frames, wav_size/SAMPL2/8);
2193 rb->lcd_putsxy(4, 20, stg);
2194 rb->lcd_update();
2196 /* encode one mp3 frame in this loop */
2197 memset(CodedData.bbuf, 0, sizeof(CodedData.bbuf));
2199 if((cfg.slot_lag += cfg.frac_per_frame) >= 64)
2200 { /* Padding for this frame */
2201 cfg.slot_lag -= 64;
2202 cfg.mpg.padding = 1;
2204 else
2205 cfg.mpg.padding = 0;
2207 cfg.mean_bits = (8 * cfg.byte_per_frame + 8 * cfg.mpg.padding
2208 - cfg.sideinfo_len) / cfg.granules / cfg.channels
2209 - 42; // reserved for scale_facs
2211 /* shift out old samples */
2212 memcpy(mfbuf, mfbuf + 2*cfg.granules*576, 4*512);
2214 /* read new samples to iram for further processing */
2215 if(read_samples((uint32_t*)(mfbuf + 2*512), SAMP_PER_FRAME) == 0)
2216 break;
2218 /* swap bytes if neccessary */
2219 if(cfg.byte_order == order_bigEndian)
2220 for(i=0; i<SAMP_PER_FRAME; i++)
2222 uint32_t t = ((uint32_t*)mfbuf)[512 + i];
2223 t = ((t >> 8) & 0xff00ff) | ((t << 8) & 0xff00ff00);
2224 ((uint32_t*)mfbuf)[512 + i] = t;
2227 if(cfg.resample) /* downsample to half of original */
2228 for(i=2*512; i<2*512+2*SAMP_PER_FRAME; i+=4)
2230 mfbuf[i/2+512] = (short)(((int)mfbuf[i+0] + mfbuf[i+2]) >> 1);
2231 mfbuf[i/2+513] = (short)(((int)mfbuf[i+1] + mfbuf[i+3]) >> 1);
2234 if(cfg.channels == 1) /* mix left and right channels to mono */
2235 for(i=2*512; i<2*512+2*SAMP_PER_FRAME; i+=2)
2236 mfbuf[i] = mfbuf[i+1] = (short)(((int)mfbuf[i] + mfbuf[i+1]) >> 1);
2238 cfg.ResvSize = 0;
2239 gr_cnt = cfg.granules * cfg.channels;
2240 CodedData.bitpos = cfg.sideinfo_len; /* leave space for mp3 header */
2242 for(gr=0; gr<cfg.granules; gr++)
2244 short *wk = mfbuf + 2*286 + gr*1152;
2245 int ch;
2247 /* 16bit packed wav data can be windowed efficiently on coldfire */
2248 window_subband1(wk, sb_data[0][1-gr][0], sb_data[1][1-gr][0]);
2250 for(ch=0; ch<cfg.channels; ch++)
2252 int ii, k, shift;
2254 wk = mfbuf + 2*286 + gr*1152 + ch;
2256 /* 36864=4*18*16*32 */
2257 for(k=0; k<18; k++, wk+=64)
2259 window_subband2(wk, sb_data[ch][1-gr][k]);
2260 /* Compensate for inversion in the analysis filter */
2261 if(k & 1)
2263 int band;
2264 for(band=1; band<32; band+=2)
2265 sb_data[ch][1-gr][k][band] *= -1;
2269 /* Perform imdct of 18 previous + 18 current subband samples */
2270 /* for integer precision do this loop again (if neccessary) */
2271 shift = 14 - (cfg.cod_info[gr][ch].additStep >> 2);
2272 for(k=1,ii=0; ii<3 && k; ii++)
2274 int *mdct = mdct_freq;
2275 int band;
2277 cfg.cod_info[gr][ch].additStep = 4 * (14 - shift);
2278 for(band=0; band<cfg.mpg.num_bands; band++, mdct+=18)
2280 int *band0 = sb_data[ch][ gr][0] + order[band];
2281 int *band1 = sb_data[ch][1-gr][0] + order[band];
2282 int work[18];
2284 /* 9216=4*32*9*8 */
2285 for(k=-9; k<0; k++)
2287 int a = shft_n(band1[(k+9)*32], shift);
2288 int b = shft_n(band1[(8-k)*32], shift);
2289 int c = shft_n(band0[(k+9)*32], shift);
2290 int d = shft_n(band0[(8-k)*32], shift);
2292 work[k+ 9] = shft16(a * win[k+ 9][0] +
2293 b * win[k+ 9][1] +
2294 c * win[k+ 9][2] +
2295 d * win[k+ 9][3]);
2297 work[k+18] = shft16(c * win[k+18][0] +
2298 d * win[k+18][1] +
2299 a * win[k+18][2] +
2300 b * win[k+18][3]);
2303 /* 7200=4*18*100 */
2304 mdct_long(mdct, work);
2306 /* Perform aliasing reduction butterfly */
2307 if(band != 0)
2309 for(k=7; k>=0; --k)
2311 int bu, bd;
2312 bu = shft15(mdct[k]) * ca[k] +
2313 shft15(mdct[-1-k]) * cs[k];
2314 bd = shft15(mdct[k]) * cs[k] -
2315 shft15(mdct[-1-k]) * ca[k];
2316 mdct[-1-k] = bu;
2317 mdct[ k ] = bd;
2322 max = 0;
2323 for(k=0; k<576; k++)
2325 if(mdct_freq[k] < 0)
2327 mdct_sign[k] = 1; /* negative */
2328 mdct_freq[k] = shft13(-mdct_freq[k]);
2330 else
2332 mdct_sign[k] = 0; /* positive */
2333 mdct_freq[k] = shft13(mdct_freq[k]);
2336 if(max < (uint32_t)mdct_freq[k])
2337 max = (uint32_t)mdct_freq[k];
2340 cfg.cod_info[gr][ch].max_val = max;
2342 /* calc new shift for higher integer precision */
2343 for(k=0; max<(uint32_t)(0x7800>>k); k++) shift--;
2344 for( ; (max>>k)>=(uint32_t)0x10000; k++) shift++;
2345 if(shift < 0) shift = 0;
2348 cfg.cod_info[gr][ch].quantStep +=
2349 cfg.cod_info[gr][ch].additStep;
2351 set_scale_facs(mdct_freq);
2353 /* bit and noise allocation */
2354 iteration_loop(mdct_freq, &cfg.cod_info[gr][ch],
2355 gr_cnt--);
2356 /* write the frame to the bitstream */
2357 Huffmancodebits(enc_data, mdct_sign,
2358 &cfg.cod_info[gr][ch]);
2360 cfg.cod_info[gr][ch].quantStep -=
2361 cfg.cod_info[gr][ch].additStep;
2363 if(cfg.granules == 1)
2365 memcpy(sb_data[ch][0], sb_data[ch][1],
2366 sizeof(sb_data[ch][0]));
2371 enc_size = (CodedData.bitpos + 7) >> 3;
2372 /* finish this chunk by adding sideinfo header data */
2373 CodedData.bitpos = 0;
2374 encodeSideInfo( cfg.cod_info );
2376 if(cfg.byte_order != order_bigEndian)
2377 for(i=0; i<(enc_size+3)/4; i++)
2378 CodedData.bbuf[i] = myswap32(CodedData.bbuf[i]);
2380 if(enc_chunk + enc_size > 65536)
2382 /* copy iram mp3 buffer to sdram/file */
2383 rb->write(mp3file, enc_buffer, enc_chunk & ~3);
2384 memcpy(enc_buffer, enc_buffer + (enc_chunk >> 2), enc_chunk & 3);
2385 enc_chunk &= 3;
2388 memcpy((char*)enc_buffer + enc_chunk, CodedData.bbuf, enc_size);
2389 enc_chunk += enc_size;
2390 frames++;
2392 /* write last chunks to disk */
2393 rb->write(mp3file, enc_buffer, enc_chunk);
2397 int num_file;
2398 char mp3_name[80];
2400 void get_mp3_filename(const char *wav_name)
2402 rb->strlcpy(mp3_name, wav_name, sizeof(mp3_name));
2403 rb->strlcpy(mp3_name + rb->strlen(mp3_name) - 4, ".mp3", 5);
2406 #if CONFIG_KEYPAD == IRIVER_H100_PAD || CONFIG_KEYPAD == IRIVER_H300_PAD
2407 #define MP3ENC_PREV BUTTON_UP
2408 #define MP3ENC_NEXT BUTTON_DOWN
2409 #define MP3ENC_DONE BUTTON_OFF
2410 #define MP3ENC_SELECT BUTTON_SELECT
2412 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \
2413 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
2414 #define MP3ENC_PREV BUTTON_SCROLL_BACK
2415 #define MP3ENC_NEXT BUTTON_SCROLL_FWD
2416 #define MP3ENC_DONE BUTTON_MENU
2417 #define MP3ENC_SELECT BUTTON_SELECT
2419 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
2420 #define MP3ENC_PREV BUTTON_UP
2421 #define MP3ENC_NEXT BUTTON_DOWN
2422 #define MP3ENC_DONE BUTTON_POWER
2423 #define MP3ENC_SELECT BUTTON_SELECT
2425 #elif CONFIG_KEYPAD == GIGABEAT_PAD
2426 #define MP3ENC_PREV BUTTON_UP
2427 #define MP3ENC_NEXT BUTTON_DOWN
2428 #define MP3ENC_DONE BUTTON_POWER
2429 #define MP3ENC_SELECT BUTTON_SELECT
2431 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
2432 (CONFIG_KEYPAD == SANSA_C200_PAD) || \
2433 (CONFIG_KEYPAD == SANSA_CLIP_PAD) || \
2434 (CONFIG_KEYPAD == SANSA_M200_PAD)
2435 #define MP3ENC_PREV BUTTON_UP
2436 #define MP3ENC_NEXT BUTTON_DOWN
2437 #define MP3ENC_DONE BUTTON_POWER
2438 #define MP3ENC_SELECT BUTTON_SELECT
2440 #elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
2441 #define MP3ENC_PREV BUTTON_SCROLL_BACK
2442 #define MP3ENC_NEXT BUTTON_SCROLL_FWD
2443 #define MP3ENC_DONE BUTTON_UP
2444 #define MP3ENC_SELECT BUTTON_SELECT
2446 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
2447 #define MP3ENC_PREV BUTTON_SCROLL_UP
2448 #define MP3ENC_NEXT BUTTON_SCROLL_DOWN
2449 #define MP3ENC_DONE BUTTON_POWER
2450 #define MP3ENC_SELECT BUTTON_PLAY
2452 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
2453 #define MP3ENC_PREV BUTTON_UP
2454 #define MP3ENC_NEXT BUTTON_DOWN
2455 #define MP3ENC_DONE BUTTON_BACK
2456 #define MP3ENC_SELECT BUTTON_SELECT
2458 #elif CONFIG_KEYPAD == MROBE100_PAD
2459 #define MP3ENC_PREV BUTTON_UP
2460 #define MP3ENC_NEXT BUTTON_DOWN
2461 #define MP3ENC_DONE BUTTON_POWER
2462 #define MP3ENC_SELECT BUTTON_SELECT
2464 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
2465 #define MP3ENC_PREV BUTTON_RC_VOL_UP
2466 #define MP3ENC_NEXT BUTTON_RC_VOL_DOWN
2467 #define MP3ENC_DONE BUTTON_RC_REC
2468 #define MP3ENC_SELECT BUTTON_RC_FF
2470 #elif CONFIG_KEYPAD == COWON_D2_PAD
2471 #define MP3ENC_DONE BUTTON_POWER
2473 #elif CONFIG_KEYPAD == IAUDIO67_PAD
2474 #define MP3ENC_PREV BUTTON_LEFT
2475 #define MP3ENC_NEXT BUTTON_RIGHT
2476 #define MP3ENC_DONE BUTTON_POWER
2477 #define MP3ENC_SELECT BUTTON_PLAY
2479 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
2480 #define MP3ENC_PREV BUTTON_UP
2481 #define MP3ENC_NEXT BUTTON_DOWN
2482 #define MP3ENC_DONE BUTTON_BACK
2483 #define MP3ENC_SELECT BUTTON_SELECT
2485 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
2486 #define MP3ENC_PREV BUTTON_UP
2487 #define MP3ENC_NEXT BUTTON_DOWN
2488 #define MP3ENC_DONE BUTTON_POWER
2489 #define MP3ENC_SELECT BUTTON_SELECT
2491 #elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
2492 #define MP3ENC_PREV BUTTON_UP
2493 #define MP3ENC_NEXT BUTTON_DOWN
2494 #define MP3ENC_DONE BUTTON_POWER
2495 #define MP3ENC_SELECT BUTTON_PLAY
2497 #elif CONFIG_KEYPAD == ONDAVX747_PAD || \
2498 CONFIG_KEYPAD == ONDAVX777_PAD || \
2499 CONFIG_KEYPAD == MROBE500_PAD
2500 #define MP3ENC_DONE BUTTON_POWER
2502 #elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
2503 #define MP3ENC_PREV BUTTON_UP
2504 #define MP3ENC_NEXT BUTTON_DOWN
2505 #define MP3ENC_DONE BUTTON_PLAY
2506 #define MP3ENC_SELECT BUTTON_RIGHT
2508 #elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
2509 #define MP3ENC_PREV BUTTON_UP
2510 #define MP3ENC_NEXT BUTTON_DOWN
2511 #define MP3ENC_DONE BUTTON_REC
2512 #define MP3ENC_SELECT BUTTON_OK
2514 #elif CONFIG_KEYPAD == MPIO_HD200_PAD
2515 #define MP3ENC_PREV BUTTON_PREV
2516 #define MP3ENC_NEXT BUTTON_NEXT
2517 #define MP3ENC_DONE BUTTON_PLAY
2518 #define MP3ENC_SELECT BUTTON_SELECT
2520 #else
2521 #error No keymap defined!
2522 #endif
2524 #ifdef HAVE_TOUCHSCREEN
2525 #ifndef MP3ENC_PREV
2526 #define MP3ENC_PREV BUTTON_MIDLEFT
2527 #endif
2528 #ifndef MP3ENC_NEXT
2529 #define MP3ENC_NEXT BUTTON_MIDRIGHT
2530 #endif
2531 #ifndef MP3ENC_DONE
2532 #define MP3ENC_DONE BUTTON_TOPLEFT
2533 #endif
2534 #ifndef MP3ENC_SELECT
2535 #define MP3ENC_SELECT BUTTON_CENTER
2536 #endif
2537 #endif
2539 enum plugin_status plugin_start(const void* parameter)
2541 int rat, srat, nrat; /* for rate selection */
2542 int cont = 1, butt;
2543 long tim = 0;
2544 char stg[40];
2545 static const char* bstrg[] = {
2546 "64", "80", "96", "112", "128", "160", "192", "224", "256", "320"
2548 static const int brate[] = {
2549 64, 80, 96, 112, 128, 160, 192, 224, 256, 320
2552 if (parameter == NULL)
2553 return PLUGIN_ERROR;
2555 PLUGIN_IRAM_INIT(rb)
2557 #ifdef CPU_COLDFIRE
2558 coldfire_set_macsr(0); /* integer mode */
2559 #endif
2561 rb->lcd_setfont(FONT_SYSFIXED);
2563 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
2564 rb->cpu_boost(true);
2565 #endif
2566 rb->button_clear_queue();
2568 nrat = 9;
2569 srat = 4; /* set 128kBit as default */
2571 while(cont && (butt = rb->button_get_w_tmo(HZ/10)) != MP3ENC_SELECT)
2573 switch(butt)
2575 case MP3ENC_DONE: cont = 0; break;
2576 case MP3ENC_PREV|BUTTON_REPEAT:
2577 case MP3ENC_PREV: if(srat > 0 ) srat--; break;
2578 case MP3ENC_NEXT|BUTTON_REPEAT:
2579 case MP3ENC_NEXT: if(srat < nrat) srat++; break;
2582 rb->lcd_clear_display();
2583 rb->lcd_putsxy(2, 2, "-- Select Bitrate --");
2585 for(rat=0; rat<=nrat; rat++)
2586 rb->lcd_putsxy(2, 12 + rat*8, bstrg[rat]);
2587 rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
2588 rb->lcd_fillrect(0, 12 + srat*8, 127, 8);
2589 rb->lcd_set_drawmode(DRMODE_SOLID);
2590 rb->lcd_update();
2593 wav_filename = parameter;
2595 if(cont)
2597 if(wave_open() == 0)
2599 init_mp3_encoder_engine(true, brate[srat], cfg.samplerate);
2600 get_mp3_filename(wav_filename);
2601 mp3file = rb->open(mp3_name , O_WRONLY|O_CREAT|O_TRUNC, 0666);
2602 frames = 0;
2604 tim = *rb->current_tick;
2605 compress();
2606 tim = *rb->current_tick - tim;
2608 rb->close(wavfile);
2609 rb->close(mp3file);
2611 else
2613 rb->close(wavfile);
2614 rb->snprintf(stg, 20, "WaveOpen failed %d", wave_open());
2615 rb->lcd_putsxy(0, 20, stg);
2616 rb->lcd_update();
2617 rb->sleep(5*HZ);
2620 rb->lcd_clear_display();
2621 rb->snprintf(stg, 30, " Conversion: %ld.%02lds ", tim/100, tim%100);
2622 rb->lcd_putsxy(0, 30, stg);
2623 tim = frames * SAMP_PER_FRAME * 100 / 44100; /* unit=.01s */
2624 rb->snprintf(stg, 30, " WAV-Length: %ld.%02lds ", tim/100, tim%100);
2625 rb->lcd_putsxy(0, 20, stg);
2626 rb->lcd_update();
2627 rb->sleep(5*HZ);
2630 rb->lcd_setfont(FONT_UI);
2631 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
2632 rb->cpu_boost(false);
2633 #endif
2634 return PLUGIN_OK;