Initial 800x480 cabbiev2 port, based on 480x800x16 one
[kugel-rb.git] / apps / plugins / mp3_encoder.c
blobbdfb4d8cdd3d254f197552a1b5c709c76f1c7ab6
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"
18 #define SAMP_PER_FRAME 1152
19 #define SAMPL2 576
20 #define SBLIMIT 32
21 #define HTN 16
22 #define putlong(c, s) if(s+sz <= 32) { cc = (cc << s) | c; sz+= s; } \
23 else { putbits(cc, sz); cc = c; sz = s; }
25 enum e_byte_order { order_unknown, order_bigEndian, order_littleEndian };
27 typedef struct {
28 int type; /* 0=(MPEG2 - 22.05,24,16kHz) 1=(MPEG1 - 44.1,48,32kHz) */
29 int mode; /* 0=stereo, 1=jstereo, 2=dual, 3=mono */
30 int padding;
31 long bitr_id;
32 int smpl_id;
33 uint16_t bitrate;
34 uint8_t num_bands;
35 } mpeg_t;
37 /* Side information */
38 typedef struct {
39 uint32_t part2_3_length;
40 int count1; /* number of 0-1-quadruples */
41 uint32_t global_gain;
42 uint32_t table_select[4];
43 uint32_t address1;
44 uint32_t address2;
45 uint32_t address3;
46 long quantStep;
47 long additStep;
48 uint32_t max_val;
49 uint8_t region_0_1;
50 } side_info_t;
52 typedef struct {
53 enum e_byte_order byte_order;
54 side_info_t cod_info[2][2];
55 mpeg_t mpg;
56 long frac_per_frame;
57 long byte_per_frame;
58 long slot_lag;
59 int sideinfo_len;
60 int mean_bits;
61 int ResvSize;
62 int channels;
63 int granules;
64 int resample;
65 uint16_t samplerate;
66 } config_t;
68 typedef struct {
69 int bitpos; /* current bitpos for writing */
70 uint32_t bbuf[263];
71 } BF_Data;
73 struct huffcodetab {
74 const uint8_t len; /* max. index */
75 const uint8_t const *table; /* pointer to array[len][len] */
76 const uint8_t const *hlen; /* pointer to array[len][len] */
79 struct huffcodebig {
80 const uint8_t len; /* max. index */
81 const uint8_t linbits; /* number of linbits */
82 const uint16_t linmax; /* max number stored in linbits */
85 #define shft4(x) ((x + 8) >> 4)
86 #define shft9(x) ((x + 256) >> 9)
87 #define shft13(x) ((x + 4096) >> 13)
88 #define shft15(x) ((x + 16384) >> 15)
89 #define shft16(x) ((x + 32768) >> 16)
90 #define shft_n(x,n) ((x) >> n)
91 #define SQRT 724 /* sqrt(2) * 512 */
93 static short mfbuf [2*(1152+512)] IBSS_ATTR; /* 6656 Bytes */
94 static int sb_data [2][2][18][SBLIMIT] IBSS_ATTR; /* 9216 Bytes */
95 static int mdct_freq [SAMPL2] IBSS_ATTR; /* 2304 Bytes */
96 static char mdct_sign [SAMPL2] IBSS_ATTR; /* 576 Bytes */
97 static short enc_data [SAMPL2] IBSS_ATTR; /* 1152 Bytes */
98 static BF_Data CodedData IBSS_ATTR; /* 1056 Bytes */
100 static const uint16_t sfBand[6][23] ICONST_ATTR;
101 static const uint16_t const *scalefac IBSS_ATTR;
103 static const int16_t ca [8] ICONST_ATTR; /* 16 Bytes */
104 static const uint16_t cs [8] ICONST_ATTR; /* 16 Bytes */
105 static const int16_t cx [9] ICONST_ATTR; /* 18 Bytes */
106 static const int16_t win [18][4] ICONST_ATTR; /* 144 Bytes */
107 static const int16_t enwindow [15*27+24] ICONST_ATTR; /* 862 Bytes */
108 static const uint16_t int2idx [4096] ICONST_ATTR; /* 8192 Bytes */
109 static const uint8_t ht_count[2][2][16] ICONST_ATTR; /* 64 Bytes */
110 static const uint32_t tab01 [ 16] ICONST_ATTR; /* 64 Bytes */
111 static const uint32_t tab23 [ 9] ICONST_ATTR; /* 36 Bytes */
112 static const uint32_t tab56 [ 16] ICONST_ATTR; /* 64 Bytes */
113 static const uint32_t tab1315 [256] ICONST_ATTR; /* 1024 Bytes */
114 static const uint32_t tab1624 [256] ICONST_ATTR; /* 1024 Bytes */
115 static const uint32_t tab789 [ 36] ICONST_ATTR; /* 144 Bytes */
116 static const uint32_t tabABC [ 64] ICONST_ATTR; /* 256 Bytes */
117 static const uint8_t t1HB [ 4] ICONST_ATTR;
118 static const uint8_t t2HB [ 9] ICONST_ATTR;
119 static const uint8_t t3HB [ 9] ICONST_ATTR;
120 static const uint8_t t5HB [ 16] ICONST_ATTR;
121 static const uint8_t t6HB [ 16] ICONST_ATTR;
122 static const uint8_t t7HB [ 36] ICONST_ATTR;
123 static const uint8_t t8HB [ 36] ICONST_ATTR;
124 static const uint8_t t9HB [ 36] ICONST_ATTR;
125 static const uint8_t t10HB [ 64] ICONST_ATTR;
126 static const uint8_t t11HB [ 64] ICONST_ATTR;
127 static const uint8_t t12HB [ 64] ICONST_ATTR;
128 static const uint8_t t13HB [256] ICONST_ATTR;
129 static const uint8_t t15HB [256] ICONST_ATTR;
130 static const uint16_t t16HB [256] ICONST_ATTR;
131 static const uint16_t t24HB [256] ICONST_ATTR;
132 static const uint8_t t1l [ 8] ICONST_ATTR;
133 static const uint8_t t2l [ 9] ICONST_ATTR;
134 static const uint8_t t3l [ 9] ICONST_ATTR;
135 static const uint8_t t5l [ 16] ICONST_ATTR;
136 static const uint8_t t6l [ 16] ICONST_ATTR;
137 static const uint8_t t7l [ 36] ICONST_ATTR;
138 static const uint8_t t8l [ 36] ICONST_ATTR;
139 static const uint8_t t9l [ 36] ICONST_ATTR;
140 static const uint8_t t10l [ 64] ICONST_ATTR;
141 static const uint8_t t11l [ 64] ICONST_ATTR;
142 static const uint8_t t12l [ 64] ICONST_ATTR;
143 static const uint8_t t13l [256] ICONST_ATTR;
144 static const uint8_t t15l [256] ICONST_ATTR;
145 static const uint8_t t16l [256] ICONST_ATTR;
146 static const uint8_t t24l [256] ICONST_ATTR;
147 static struct huffcodetab ht [HTN] IDATA_ATTR;
149 static const uint8_t ht_count[2][2][16] =
150 { { { 1, 5, 4, 5, 6, 5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1 }, /* table0 */
151 { 1, 5, 5, 7, 5, 8, 7, 9, 5, 7, 7, 9, 7, 9, 9,10 } }, /* hleng0 */
152 { {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, /* table1 */
153 { 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 } } }; /* hleng1 */
155 static const uint8_t t1HB[4] = {1,1,1,0};
156 static const uint8_t t2HB[9] = {1,2,1,3,1,1,3,2,0};
157 static const uint8_t t3HB[9] = {3,2,1,1,1,1,3,2,0};
158 static const uint8_t t5HB[16] = {1,2,6,5,3,1,4,4,7,5,7,1,6,1,1,0};
159 static const uint8_t t6HB[16] = {7,3,5,1,6,2,3,2,5,4,4,1,3,3,2,0};
161 static const uint8_t t7HB[36] =
162 { 1, 2,10,19,16,10, 3, 3, 7,10, 5, 3,11, 4,13,17, 8, 4,
163 12,11,18,15,11, 2, 7, 6, 9,14, 3, 1, 6, 4, 5, 3, 2, 0 };
165 static const uint8_t t8HB[36] =
166 { 3, 4, 6,18,12, 5, 5, 1, 2,16, 9, 3, 7, 3, 5,14, 7, 3,
167 19,17,15,13,10, 4,13, 5, 8,11, 5, 1,12, 4, 4, 1, 1, 0 };
169 static const uint8_t t9HB[36] =
170 { 7, 5, 9,14,15, 7, 6, 4, 5, 5, 6, 7, 7, 6, 8, 8, 8, 5,
171 15, 6, 9,10, 5, 1,11, 7, 9, 6, 4, 1,14, 4, 6, 2, 6, 0 };
173 static const uint8_t t10HB[64] =
174 {1,2,10,23,35,30,12,17,3,3,8,12,18,21,12,7,11,9,15,21,32,
175 40,19,6,14,13,22,34,46,23,18,7,20,19,33,47,27,22,9,3,31,22,
176 41,26,21,20,5,3,14,13,10,11,16,6,5,1,9,8,7,8,4,4,2,0 };
178 static const uint8_t t11HB[64] =
179 {3,4,10,24,34,33,21,15,5,3,4,10,32,17,11,10,11,7,13,18,30,
180 31,20,5,25,11,19,59,27,18,12,5,35,33,31,58,30,16,7,5,28,26,
181 32,19,17,15,8,14,14,12,9,13,14,9,4,1,11,4,6,6,6,3,2,0 };
183 static const uint8_t t12HB[64] =
184 {9,6,16,33,41,39,38,26,7,5,6,9,23,16,26,11,17,7,11,14,21,
185 30,10,7,17,10,15,12,18,28,14,5,32,13,22,19,18,16,9,5,40,17,
186 31,29,17,13,4,2,27,12,11,15,10,7,4,1,27,12,8,12,6,3,1,0 };
188 static const uint8_t t13HB[256] =
189 {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,
190 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,
191 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,
192 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,
193 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,
194 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,
195 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,
196 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,
197 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,
198 10,6,1,4,2,16,15,17,27,25,20,29,11,17,12,16,8,1,1,0,1 };
200 static const uint8_t t15HB[256] =
201 {7,12,18,53,47,76,124,108,89,123,108,119,107,81,122,63,13,5,16,27,46,36,61,51,
202 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,
203 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,
204 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,
205 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,
206 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,
207 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,
208 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,
209 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,
210 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};
212 static const uint16_t t16HB[256] =
213 {1,5,14,44,74,63,110,93,172,149,138,242,225,195,376,17,3,4,12,20,35,62,53,47,
214 83,75,68,119,201,107,207,9,15,13,23,38,67,58,103,90,161,72,127,117,110,209,
215 206,16,45,21,39,69,64,114,99,87,158,140,252,212,199,387,365,26,75,36,68,65,
216 115,101,179,164,155,264,246,226,395,382,362,9,66,30,59,56,102,185,173,265,142,
217 253,232,400,388,378,445,16,111,54,52,100,184,178,160,133,257,244,228,217,385,
218 366,715,10,98,48,91,88,165,157,148,261,248,407,397,372,380,889,884,8,85,84,81,
219 159,156,143,260,249,427,401,392,383,727,713,708,7,154,76,73,141,131,256,245,
220 426,406,394,384,735,359,710,352,11,139,129,67,125,247,233,229,219,393,743,737,
221 720,885,882,439,4,243,120,118,115,227,223,396,746,742,736,721,712,706,223,436,
222 6,202,224,222,218,216,389,386,381,364,888,443,707,440,437,1728,4,747,211,210,
223 208,370,379,734,723,714,1735,883,877,876,3459,865,2,377,369,102,187,726,722,
224 358,711,709,866,1734,871,3458,870,434,0,12,10,7,11,10,17,11,9,13,12,10,7,5,3,
225 1,3};
227 static const uint16_t t24HB[256] =
228 {15,13,46,80,146,262,248,434,426,669,653,649,621,517,1032,88,14,12,21,38,71,
229 130,122,216,209,198,327,345,319,297,279,42,47,22,41,74,68,128,120,221,207,194,
230 182,340,315,295,541,18,81,39,75,70,134,125,116,220,204,190,178,325,311,293,
231 271,16,147,72,69,135,127,118,112,210,200,188,352,323,306,285,540,14,263,66,
232 129,126,119,114,214,202,192,180,341,317,301,281,262,12,249,123,121,117,113,
233 215,206,195,185,347,330,308,291,272,520,10,435,115,111,109,211,203,196,187,
234 353,332,313,298,283,531,381,17,427,212,208,205,201,193,186,177,169,320,303,
235 286,268,514,377,16,335,199,197,191,189,181,174,333,321,305,289,275,521,379,
236 371,11,668,184,183,179,175,344,331,314,304,290,277,530,383,373,366,10,652,346,
237 171,168,164,318,309,299,287,276,263,513,375,368,362,6,648,322,316,312,307,302,
238 292,284,269,261,512,376,370,364,359,4,620,300,296,294,288,282,273,266,515,380,
239 374,369,365,361,357,2,1033,280,278,274,267,264,259,382,378,372,367,363,360,
240 358,356,0,43,20,19,17,15,13,11,9,7,6,4,7,5,3,1,3};
242 static const uint32_t tab1315[256] =
243 { 0x010003,0x050005,0x070006,0x080008,0x090008,0x0a0009,0x0a000a,0x0b000a,
244 0x0a000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0d000c,0x0e000d,0x0e000e,
245 0x040005,0x060005,0x080007,0x090008,0x0a0009,0x0a0009,0x0b000a,0x0b000a,
246 0x0b000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0e000c,0x0e000d,0x0e000d,
247 0x070006,0x080007,0x090007,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,
248 0x0b000a,0x0c000b,0x0c000b,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d,
249 0x080007,0x090008,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0c000b,
250 0x0c000b,0x0d000b,0x0d000c,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d,
251 0x090008,0x090008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0d000b,0x0d000b,
252 0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000d,
253 0x0a0009,0x0a0009,0x0b0009,0x0c000a,0x0c000a,0x0c000a,0x0d000b,0x0d000b,
254 0x0d000b,0x0d000b,0x0e000c,0x0d000c,0x0f000d,0x0f000d,0x10000d,0x10000e,
255 0x0a000a,0x0b0009,0x0c000a,0x0c000a,0x0d000a,0x0d000b,0x0d000b,0x0d000b,
256 0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x10000e,
257 0x0b000a,0x0b000a,0x0c000a,0x0d000b,0x0d000b,0x0d000b,0x0e000b,0x0e000c,
258 0x0e000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x12000d,0x12000e,
259 0x0a000a,0x0a000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0e000c,
260 0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x11000e,0x11000e,
261 0x0b000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0d000c,0x0f000c,
262 0x0e000c,0x0f000d,0x0f000d,0x10000d,0x10000d,0x10000e,0x12000e,0x11000e,
263 0x0b000b,0x0c000b,0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000c,
264 0x0e000c,0x0f000d,0x10000d,0x0f000d,0x10000d,0x11000e,0x12000f,0x13000e,
265 0x0c000b,0x0c000b,0x0c000b,0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0e000c,
266 0x0f000d,0x0f000d,0x0f000d,0x10000d,0x11000e,0x11000e,0x11000e,0x12000f,
267 0x0c000c,0x0d000c,0x0d000b,0x0e000c,0x0e000c,0x0f000c,0x0e000d,0x0f000d,
268 0x10000d,0x10000d,0x11000d,0x11000d,0x11000e,0x12000e,0x12000f,0x12000f,
269 0x0d000c,0x0d000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x10000d,
270 0x10000d,0x10000e,0x10000e,0x11000e,0x12000e,0x11000e,0x12000f,0x12000f,
271 0x0e000d,0x0e000d,0x0e000d,0x0f000d,0x0f000d,0x0f000d,0x11000d,0x10000d,
272 0x10000e,0x13000e,0x11000e,0x11000e,0x11000f,0x13000f,0x12000e,0x12000f,
273 0x0d000d,0x0e000d,0x0f000d,0x10000d,0x10000d,0x10000d,0x11000d,0x10000e,
274 0x11000e,0x11000e,0x12000e,0x12000e,0x15000f,0x14000f,0x15000f,0x12000f };
276 static const uint32_t tab01[16] =
277 { 0x10004,0x50005,0x50005,0x70006,0x50005,0x80006,0x70006,0x90007,
278 0x50005,0x70006,0x70006,0x90007,0x70006,0x90007,0x90007,0xa0008 };
280 static const uint32_t tab23[ 9] =
281 { 0x10002,0x40003,0x70007,0x40004,0x50004,0x70007,0x60006,0x70007,0x80008 };
283 static const uint32_t tab56[16] =
284 { 0x10003,0x40004,0x70006,0x80008,0x40004,0x50004,0x80006,0x90007,
285 0x70005,0x80006,0x90007,0xa0008,0x80007,0x80007,0x90008,0xa0009 };
287 static const uint32_t tab789[36] =
288 {0x00100803,0x00401004,0x00701c06,0x00902407,0x00902409,0x00a0280a,0x00401004,
289 0x00601005,0x00801806,0x00902807,0x00902808,0x00a0280a,0x00701c05,0x00701806,
290 0x00902007,0x00a02808,0x00a02809,0x00b02c0a,0x00802407,0x00902807,0x00a02808,
291 0x00b02c09,0x00b02c09,0x00b0300a,0x00802408,0x00902408,0x00a02809,0x00b02c09,
292 0x00b0300a,0x00c0300b,0x00902809,0x00a02809,0x00b02c0a,0x00c02c0a,0x00c0340b,
293 0x00c0340b};
295 static const uint32_t tabABC[64] =
296 {0x00100804,0x00401004,0x00701806,0x00902008,0x00a02409,0x00a0280a,0x00a0240a,
297 0x00b0280a,0x00401004,0x00601405,0x00801806,0x00902007,0x00a02809,0x00b02809,
298 0x00a0240a,0x00a0280a,0x00701806,0x00801c06,0x00902007,0x00a02408,0x00b02809,
299 0x00c02c0a,0x00b02809,0x00b0280a,0x00802007,0x00902007,0x00a02408,0x00b02c08,
300 0x00c02809,0x00c0300a,0x00b0280a,0x00c02c0a,0x00902408,0x00a02808,0x00b02809,
301 0x00c02c09,0x00c02c0a,0x00c0300a,0x00c02c0a,0x00c0300b,0x00a02409,0x00b02809,
302 0x00c02c0a,0x00c0300a,0x00d0300a,0x00d0340b,0x00c0300a,0x00d0340b,0x00902409,
303 0x00a02409,0x00b02409,0x00c0280a,0x00c02c0a,0x00c0300b,0x00d0300b,0x00d0300c,
304 0x00a0240a,0x00a0240a,0x00b0280a,0x00c02c0b,0x00c0300b,0x00d0300b,0x00d0300b,
305 0x00d0300c};
307 static const uint32_t tab1624[256] =
308 {0x00010004,0x00050005,0x00070007,0x00090008,0x000a0009,0x000a000a,0x000b000a,
309 0x000b000b,0x000c000b,0x000c000c,0x000c000c,0x000d000c,0x000d000c,0x000d000c,
310 0x000e000d,0x000a000a,0x00040005,0x00060006,0x00080007,0x00090008,0x000a0009,
311 0x000b000a,0x000b000a,0x000b000b,0x000c000b,0x000c000b,0x000c000c,0x000d000c,
312 0x000e000c,0x000d000c,0x000e000c,0x000a000a,0x00070007,0x00080007,0x00090008,
313 0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000b,0x000d000b,0x000c000b,
314 0x000d000b,0x000d000c,0x000d000c,0x000e000c,0x000e000d,0x000b0009,0x00090008,
315 0x00090008,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a,0x000c000b,
316 0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c,0x000f000c,
317 0x000c0009,0x000a0009,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a,
318 0x000d000a,0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c,
319 0x000f000c,0x000f000d,0x000b0009,0x000a000a,0x000a0009,0x000b000a,0x000b000a,
320 0x000c000a,0x000d000a,0x000d000b,0x000e000b,0x000d000b,0x000e000b,0x000e000c,
321 0x000f000c,0x000f000c,0x000f000c,0x0010000c,0x000c0009,0x000b000a,0x000b000a,
322 0x000b000a,0x000c000a,0x000d000a,0x000d000b,0x000d000b,0x000d000b,0x000e000b,
323 0x000e000c,0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000d,0x000c0009,
324 0x000b000b,0x000b000a,0x000c000a,0x000c000a,0x000d000b,0x000d000b,0x000d000b,
325 0x000e000b,0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000d,
326 0x0011000d,0x000c000a,0x000b000b,0x000c000b,0x000c000b,0x000d000b,0x000d000b,
327 0x000d000b,0x000e000b,0x000e000b,0x000f000b,0x000f000c,0x000f000c,0x000f000c,
328 0x0010000c,0x0010000d,0x0010000d,0x000c000a,0x000c000b,0x000c000b,0x000c000b,
329 0x000d000b,0x000d000b,0x000e000b,0x000e000b,0x000f000c,0x000f000c,0x000f000c,
330 0x000f000c,0x0010000c,0x000f000d,0x0010000d,0x000f000d,0x000d000a,0x000c000c,
331 0x000d000b,0x000c000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000e000c,
332 0x000f000c,0x0010000c,0x0010000c,0x0010000d,0x0011000d,0x0011000d,0x0010000d,
333 0x000c000a,0x000d000c,0x000d000c,0x000d000b,0x000d000b,0x000e000b,0x000e000c,
334 0x000f000c,0x0010000c,0x0010000c,0x0010000c,0x0010000c,0x0010000d,0x0010000d,
335 0x000f000d,0x0010000d,0x000d000a,0x000d000c,0x000e000c,0x000e000c,0x000e000c,
336 0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000c,0x0010000d,
337 0x0010000d,0x0010000d,0x0010000d,0x0012000d,0x000d000a,0x000f000c,0x000e000c,
338 0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000c,0x0010000c,0x0010000d,
339 0x0012000d,0x0011000d,0x0011000d,0x0011000d,0x0013000d,0x0011000d,0x000d000a,
340 0x000e000d,0x000f000c,0x000d000c,0x000e000c,0x0010000c,0x0010000c,0x000f000c,
341 0x0010000d,0x0010000d,0x0011000d,0x0012000d,0x0011000d,0x0013000d,0x0011000d,
342 0x0010000d,0x000d000a,0x000a0009,0x000a0009,0x000a0009,0x000b0009,0x000b0009,
343 0x000c0009,0x000c0009,0x000c0009,0x000d0009,0x000d0009,0x000d0009,0x000d000a,
344 0x000d000a,0x000d000a,0x000d000a,0x000a0006};
346 static const uint8_t t1l[8] = {1,3,2,3,1,4,3,5};
347 static const uint8_t t2l[9] = {1,3,6,3,3,5,5,5,6};
348 static const uint8_t t3l[9] = {2,2,6,3,2,5,5,5,6};
349 static const uint8_t t5l[16] = {1,3,6,7,3,3,6,7,6,6,7,8,7,6,7,8};
350 static const uint8_t t6l[16] = {3,3,5,7,3,2,4,5,4,4,5,6,6,5,6,7};
352 static const uint8_t t7l[36] =
353 {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};
355 static const uint8_t t8l[36] =
356 {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};
358 static const uint8_t t9l[36] =
359 {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};
361 static const uint8_t t10l[64] =
362 {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,
363 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};
365 static const uint8_t t11l[64] =
366 {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,
367 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};
369 static const uint8_t t12l[64] =
370 {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,
371 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};
373 static const uint8_t t13l[256] =
374 {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,
375 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,
376 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,
377 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,
378 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,
379 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,
380 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,
381 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,
382 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,
383 15,15,16,16,19,18,19,16};
385 static const uint8_t t15l[256] =
386 {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,
387 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,
388 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,
389 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,
390 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,
391 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,
392 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,
393 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,
394 13,12,11,11,11,11,11,11,12,12,12,12,12,13,13,13,13};
396 static const uint8_t t16l[256] =
397 {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,
398 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,
399 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,
400 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,
401 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,
402 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,
403 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,
404 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,
405 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,
406 11,11,11,11,11,11,11,8};
408 static const uint8_t t24l[256] =
409 {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,
410 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,
411 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,
412 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,
413 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,
414 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,
415 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,
416 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,
417 7,7,7,7,7,7,8,8,8,8,4};
419 static struct huffcodetab ht[HTN] =
420 { { 0, NULL, NULL}, /* Apparently not used */
421 { 2, t1HB, t1l},
422 { 3, t2HB, t2l},
423 { 3, t3HB, t3l},
424 { 0, NULL, NULL}, /* Apparently not used */
425 { 4, t5HB, t5l},
426 { 4, t6HB, t6l},
427 { 6, t7HB, t7l},
428 { 6, t8HB, t8l},
429 { 6, t9HB, t9l},
430 { 8, t10HB, t10l},
431 { 8, t11HB, t11l},
432 { 8, t12HB, t12l},
433 {16, t13HB, t13l},
434 { 0, NULL, NULL}, /* Apparently not used */
435 {16, t15HB, t15l} };
437 static const struct huffcodebig ht_big[HTN] =
438 { { 16, 1, 1 },
439 { 16, 2, 3 },
440 { 16, 3, 7 },
441 { 16, 4, 15 },
442 { 16, 6, 63 },
443 { 16, 8, 255 },
444 { 16, 10, 1023 },
445 { 16, 13, 8191 },
446 { 16, 4, 15 },
447 { 16, 5, 31 },
448 { 16, 6, 63 },
449 { 16, 7, 127 },
450 { 16, 8, 255 },
451 { 16, 9, 511 },
452 { 16, 11, 2047 },
453 { 16, 13, 8191 } };
455 static const struct
457 const uint8_t region0_cnt;
458 const uint8_t region1_cnt;
459 } subdv_table[23] =
460 { {0, 0}, /* 0 bands */
461 {0, 0}, /* 1 bands */
462 {0, 0}, /* 2 bands */
463 {0, 0}, /* 3 bands */
464 {0, 0}, /* 4 bands */
465 {0, 1}, /* 5 bands */
466 {1, 1}, /* 6 bands */
467 {1, 1}, /* 7 bands */
468 {1, 2}, /* 8 bands */
469 {2, 2}, /* 9 bands */
470 {2, 3}, /* 10 bands */
471 {2, 3}, /* 11 bands */
472 {3, 4}, /* 12 bands */
473 {3, 4}, /* 13 bands */
474 {3, 4}, /* 14 bands */
475 {4, 5}, /* 15 bands */
476 {4, 5}, /* 16 bands */
477 {4, 6}, /* 17 bands */
478 {5, 6}, /* 18 bands */
479 {5, 6}, /* 19 bands */
480 {5, 7}, /* 20 bands */
481 {6, 7}, /* 21 bands */
482 {6, 7}, /* 22 bands */
485 static const uint16_t sfBand[6][23] =
487 /* Table B.2.b: 22.05 kHz */
488 {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
489 /* Table B.2.c: 24 kHz */
490 {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576},
491 /* Table B.2.a: 16 kHz */
492 {0,6,12,18,24,30,36,44,45,66,80,96,116,140,168,200,238,248,336,396,464,522,576},
493 /* Table B.8.b: 44.1 kHz */
494 {0,4, 8,12,16,20,24,30,36,44,52,62, 74, 90,110,134,162,196,238,288,342,418,576},
495 /* Table B.8.c: 48 kHz */
496 {0,4, 8,12,16,20,24,30,36,42,50,60, 72, 88,106,128,156,190,230,276,330,384,576},
497 /* Table B.8.a: 32 kHz */
498 {0,4, 8,12,16,20,24,30,36,44,54,66, 82,102,126,156,194,240,296,364,448,550,576} };
501 static const uint16_t int2idx[4096] = /* int2idx[i] = sqrt(i*sqrt(i)); */
503 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9,
504 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16,
505 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21,
506 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26,
507 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
508 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36,
509 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40,
510 41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45,
511 45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49,
512 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53,
513 53, 53, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 57, 57, 57,
514 57, 57, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 61, 61,
515 61, 61, 61, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 65,
516 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68,
517 68, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 72, 72, 72,
518 72, 72, 72, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75,
519 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 79, 79, 79,
520 79, 79, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82,
521 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 86, 86, 86,
522 86, 86, 86, 87, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89,
523 89, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 93,
524 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 96, 96, 96,
525 96, 96, 96, 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99,
526 99, 99,100,100,100,100,100,100,101,101,101,101,101,101,102,102,102,102,102,102,
527 103,103,103,103,103,103,104,104,104,104,104,104,104,105,105,105,105,105,105,106,
528 106,106,106,106,106,107,107,107,107,107,107,107,108,108,108,108,108,108,109,109,
529 109,109,109,109,110,110,110,110,110,110,110,111,111,111,111,111,111,112,112,112,
530 112,112,112,112,113,113,113,113,113,113,114,114,114,114,114,114,115,115,115,115,
531 115,115,115,116,116,116,116,116,116,117,117,117,117,117,117,117,118,118,118,118,
532 118,118,118,119,119,119,119,119,119,120,120,120,120,120,120,120,121,121,121,121,
533 121,121,122,122,122,122,122,122,122,123,123,123,123,123,123,123,124,124,124,124,
534 124,124,125,125,125,125,125,125,125,126,126,126,126,126,126,126,127,127,127,127,
535 127,127,128,128,128,128,128,128,128,129,129,129,129,129,129,129,130,130,130,130,
536 130,130,131,131,131,131,131,131,131,132,132,132,132,132,132,132,133,133,133,133,
537 133,133,133,134,134,134,134,134,134,134,135,135,135,135,135,135,136,136,136,136,
538 136,136,136,137,137,137,137,137,137,137,138,138,138,138,138,138,138,139,139,139,
539 139,139,139,139,140,140,140,140,140,140,140,141,141,141,141,141,141,141,142,142,
540 142,142,142,142,142,143,143,143,143,143,143,143,144,144,144,144,144,144,144,145,
541 145,145,145,145,145,145,146,146,146,146,146,146,146,147,147,147,147,147,147,147,
542 148,148,148,148,148,148,148,149,149,149,149,149,149,149,150,150,150,150,150,150,
543 150,151,151,151,151,151,151,151,152,152,152,152,152,152,152,153,153,153,153,153,
544 153,153,154,154,154,154,154,154,154,154,155,155,155,155,155,155,155,156,156,156,
545 156,156,156,156,157,157,157,157,157,157,157,158,158,158,158,158,158,158,159,159,
546 159,159,159,159,159,160,160,160,160,160,160,160,160,161,161,161,161,161,161,161,
547 162,162,162,162,162,162,162,163,163,163,163,163,163,163,163,164,164,164,164,164,
548 164,164,165,165,165,165,165,165,165,166,166,166,166,166,166,166,167,167,167,167,
549 167,167,167,167,168,168,168,168,168,168,168,169,169,169,169,169,169,169,169,170,
550 170,170,170,170,170,170,171,171,171,171,171,171,171,172,172,172,172,172,172,172,
551 172,173,173,173,173,173,173,173,174,174,174,174,174,174,174,174,175,175,175,175,
552 175,175,175,176,176,176,176,176,176,176,176,177,177,177,177,177,177,177,178,178,
553 178,178,178,178,178,178,179,179,179,179,179,179,179,180,180,180,180,180,180,180,
554 180,181,181,181,181,181,181,181,182,182,182,182,182,182,182,182,183,183,183,183,
555 183,183,183,184,184,184,184,184,184,184,184,185,185,185,185,185,185,185,186,186,
556 186,186,186,186,186,186,187,187,187,187,187,187,187,187,188,188,188,188,188,188,
557 188,189,189,189,189,189,189,189,189,190,190,190,190,190,190,190,190,191,191,191,
558 191,191,191,191,192,192,192,192,192,192,192,192,193,193,193,193,193,193,193,193,
559 194,194,194,194,194,194,194,195,195,195,195,195,195,195,195,196,196,196,196,196,
560 196,196,196,197,197,197,197,197,197,197,197,198,198,198,198,198,198,198,199,199,
561 199,199,199,199,199,199,200,200,200,200,200,200,200,200,201,201,201,201,201,201,
562 201,201,202,202,202,202,202,202,202,202,203,203,203,203,203,203,203,204,204,204,
563 204,204,204,204,204,205,205,205,205,205,205,205,205,206,206,206,206,206,206,206,
564 206,207,207,207,207,207,207,207,207,208,208,208,208,208,208,208,208,209,209,209,
565 209,209,209,209,209,210,210,210,210,210,210,210,210,211,211,211,211,211,211,211,
566 211,212,212,212,212,212,212,212,212,213,213,213,213,213,213,213,213,214,214,214,
567 214,214,214,214,214,215,215,215,215,215,215,215,215,216,216,216,216,216,216,216,
568 216,217,217,217,217,217,217,217,217,218,218,218,218,218,218,218,218,219,219,219,
569 219,219,219,219,219,220,220,220,220,220,220,220,220,221,221,221,221,221,221,221,
570 221,222,222,222,222,222,222,222,222,223,223,223,223,223,223,223,223,224,224,224,
571 224,224,224,224,224,225,225,225,225,225,225,225,225,226,226,226,226,226,226,226,
572 226,227,227,227,227,227,227,227,227,228,228,228,228,228,228,228,228,229,229,229,
573 229,229,229,229,229,229,230,230,230,230,230,230,230,230,231,231,231,231,231,231,
574 231,231,232,232,232,232,232,232,232,232,233,233,233,233,233,233,233,233,234,234,
575 234,234,234,234,234,234,234,235,235,235,235,235,235,235,235,236,236,236,236,236,
576 236,236,236,237,237,237,237,237,237,237,237,238,238,238,238,238,238,238,238,238,
577 239,239,239,239,239,239,239,239,240,240,240,240,240,240,240,240,241,241,241,241,
578 241,241,241,241,242,242,242,242,242,242,242,242,242,243,243,243,243,243,243,243,
579 243,244,244,244,244,244,244,244,244,245,245,245,245,245,245,245,245,245,246,246,
580 246,246,246,246,246,246,247,247,247,247,247,247,247,247,248,248,248,248,248,248,
581 248,248,248,249,249,249,249,249,249,249,249,250,250,250,250,250,250,250,250,250,
582 251,251,251,251,251,251,251,251,252,252,252,252,252,252,252,252,253,253,253,253,
583 253,253,253,253,253,254,254,254,254,254,254,254,254,255,255,255,255,255,255,255,
584 255,255,256,256,256,256,256,256,256,256,257,257,257,257,257,257,257,257,257,258,
585 258,258,258,258,258,258,258,259,259,259,259,259,259,259,259,259,260,260,260,260,
586 260,260,260,260,261,261,261,261,261,261,261,261,261,262,262,262,262,262,262,262,
587 262,263,263,263,263,263,263,263,263,263,264,264,264,264,264,264,264,264,265,265,
588 265,265,265,265,265,265,265,266,266,266,266,266,266,266,266,267,267,267,267,267,
589 267,267,267,267,268,268,268,268,268,268,268,268,268,269,269,269,269,269,269,269,
590 269,270,270,270,270,270,270,270,270,270,271,271,271,271,271,271,271,271,271,272,
591 272,272,272,272,272,272,272,273,273,273,273,273,273,273,273,273,274,274,274,274,
592 274,274,274,274,275,275,275,275,275,275,275,275,275,276,276,276,276,276,276,276,
593 276,276,277,277,277,277,277,277,277,277,277,278,278,278,278,278,278,278,278,279,
594 279,279,279,279,279,279,279,279,280,280,280,280,280,280,280,280,280,281,281,281,
595 281,281,281,281,281,282,282,282,282,282,282,282,282,282,283,283,283,283,283,283,
596 283,283,283,284,284,284,284,284,284,284,284,284,285,285,285,285,285,285,285,285,
597 286,286,286,286,286,286,286,286,286,287,287,287,287,287,287,287,287,287,288,288,
598 288,288,288,288,288,288,288,289,289,289,289,289,289,289,289,289,290,290,290,290,
599 290,290,290,290,291,291,291,291,291,291,291,291,291,292,292,292,292,292,292,292,
600 292,292,293,293,293,293,293,293,293,293,293,294,294,294,294,294,294,294,294,294,
601 295,295,295,295,295,295,295,295,295,296,296,296,296,296,296,296,296,296,297,297,
602 297,297,297,297,297,297,297,298,298,298,298,298,298,298,298,299,299,299,299,299,
603 299,299,299,299,300,300,300,300,300,300,300,300,300,301,301,301,301,301,301,301,
604 301,301,302,302,302,302,302,302,302,302,302,303,303,303,303,303,303,303,303,303,
605 304,304,304,304,304,304,304,304,304,305,305,305,305,305,305,305,305,305,306,306,
606 306,306,306,306,306,306,306,307,307,307,307,307,307,307,307,307,308,308,308,308,
607 308,308,308,308,308,309,309,309,309,309,309,309,309,309,310,310,310,310,310,310,
608 310,310,310,311,311,311,311,311,311,311,311,311,312,312,312,312,312,312,312,312,
609 312,313,313,313,313,313,313,313,313,313,314,314,314,314,314,314,314,314,314,315,
610 315,315,315,315,315,315,315,315,316,316,316,316,316,316,316,316,316,317,317,317,
611 317,317,317,317,317,317,318,318,318,318,318,318,318,318,318,318,319,319,319,319,
612 319,319,319,319,319,320,320,320,320,320,320,320,320,320,321,321,321,321,321,321,
613 321,321,321,322,322,322,322,322,322,322,322,322,323,323,323,323,323,323,323,323,
614 323,324,324,324,324,324,324,324,324,324,325,325,325,325,325,325,325,325,325,325,
615 326,326,326,326,326,326,326,326,326,327,327,327,327,327,327,327,327,327,328,328,
616 328,328,328,328,328,328,328,329,329,329,329,329,329,329,329,329,330,330,330,330,
617 330,330,330,330,330,330,331,331,331,331,331,331,331,331,331,332,332,332,332,332,
618 332,332,332,332,333,333,333,333,333,333,333,333,333,334,334,334,334,334,334,334,
619 334,334,335,335,335,335,335,335,335,335,335,335,336,336,336,336,336,336,336,336,
620 336,337,337,337,337,337,337,337,337,337,338,338,338,338,338,338,338,338,338,338,
621 339,339,339,339,339,339,339,339,339,340,340,340,340,340,340,340,340,340,341,341,
622 341,341,341,341,341,341,341,341,342,342,342,342,342,342,342,342,342,343,343,343,
623 343,343,343,343,343,343,344,344,344,344,344,344,344,344,344,344,345,345,345,345,
624 345,345,345,345,345,346,346,346,346,346,346,346,346,346,347,347,347,347,347,347,
625 347,347,347,347,348,348,348,348,348,348,348,348,348,349,349,349,349,349,349,349,
626 349,349,350,350,350,350,350,350,350,350,350,350,351,351,351,351,351,351,351,351,
627 351,352,352,352,352,352,352,352,352,352,352,353,353,353,353,353,353,353,353,353,
628 354,354,354,354,354,354,354,354,354,355,355,355,355,355,355,355,355,355,355,356,
629 356,356,356,356,356,356,356,356,357,357,357,357,357,357,357,357,357,357,358,358,
630 358,358,358,358,358,358,358,359,359,359,359,359,359,359,359,359,359,360,360,360,
631 360,360,360,360,360,360,361,361,361,361,361,361,361,361,361,361,362,362,362,362,
632 362,362,362,362,362,363,363,363,363,363,363,363,363,363,363,364,364,364,364,364,
633 364,364,364,364,365,365,365,365,365,365,365,365,365,365,366,366,366,366,366,366,
634 366,366,366,367,367,367,367,367,367,367,367,367,367,368,368,368,368,368,368,368,
635 368,368,369,369,369,369,369,369,369,369,369,369,370,370,370,370,370,370,370,370,
636 370,370,371,371,371,371,371,371,371,371,371,372,372,372,372,372,372,372,372,372,
637 372,373,373,373,373,373,373,373,373,373,374,374,374,374,374,374,374,374,374,374,
638 375,375,375,375,375,375,375,375,375,375,376,376,376,376,376,376,376,376,376,377,
639 377,377,377,377,377,377,377,377,377,378,378,378,378,378,378,378,378,378,379,379,
640 379,379,379,379,379,379,379,379,380,380,380,380,380,380,380,380,380,380,381,381,
641 381,381,381,381,381,381,381,382,382,382,382,382,382,382,382,382,382,383,383,383,
642 383,383,383,383,383,383,383,384,384,384,384,384,384,384,384,384,385,385,385,385,
643 385,385,385,385,385,385,386,386,386,386,386,386,386,386,386,386,387,387,387,387,
644 387,387,387,387,387,387,388,388,388,388,388,388,388,388,388,389,389,389,389,389,
645 389,389,389,389,389,390,390,390,390,390,390,390,390,390,390,391,391,391,391,391,
646 391,391,391,391,391,392,392,392,392,392,392,392,392,392,393,393,393,393,393,393,
647 393,393,393,393,394,394,394,394,394,394,394,394,394,394,395,395,395,395,395,395,
648 395,395,395,395,396,396,396,396,396,396,396,396,396,397,397,397,397,397,397,397,
649 397,397,397,398,398,398,398,398,398,398,398,398,398,399,399,399,399,399,399,399,
650 399,399,399,400,400,400,400,400,400,400,400,400,400,401,401,401,401,401,401,401,
651 401,401,402,402,402,402,402,402,402,402,402,402,403,403,403,403,403,403,403,403,
652 403,403,404,404,404,404,404,404,404,404,404,404,405,405,405,405,405,405,405,405,
653 405,405,406,406,406,406,406,406,406,406,406,406,407,407,407,407,407,407,407,407,
654 407,407,408,408,408,408,408,408,408,408,408,408,409,409,409,409,409,409,409,409,
655 409,410,410,410,410,410,410,410,410,410,410,411,411,411,411,411,411,411,411,411,
656 411,412,412,412,412,412,412,412,412,412,412,413,413,413,413,413,413,413,413,413,
657 413,414,414,414,414,414,414,414,414,414,414,415,415,415,415,415,415,415,415,415,
658 415,416,416,416,416,416,416,416,416,416,416,417,417,417,417,417,417,417,417,417,
659 417,418,418,418,418,418,418,418,418,418,418,419,419,419,419,419,419,419,419,419,
660 419,420,420,420,420,420,420,420,420,420,420,421,421,421,421,421,421,421,421,421,
661 421,422,422,422,422,422,422,422,422,422,422,423,423,423,423,423,423,423,423,423,
662 423,424,424,424,424,424,424,424,424,424,424,425,425,425,425,425,425,425,425,425,
663 425,426,426,426,426,426,426,426,426,426,426,427,427,427,427,427,427,427,427,427,
664 427,428,428,428,428,428,428,428,428,428,428,429,429,429,429,429,429,429,429,429,
665 429,430,430,430,430,430,430,430,430,430,430,431,431,431,431,431,431,431,431,431,
666 431,432,432,432,432,432,432,432,432,432,432,433,433,433,433,433,433,433,433,433,
667 433,434,434,434,434,434,434,434,434,434,434,435,435,435,435,435,435,435,435,435,
668 435,435,436,436,436,436,436,436,436,436,436,436,437,437,437,437,437,437,437,437,
669 437,437,438,438,438,438,438,438,438,438,438,438,439,439,439,439,439,439,439,439,
670 439,439,440,440,440,440,440,440,440,440,440,440,441,441,441,441,441,441,441,441,
671 441,441,442,442,442,442,442,442,442,442,442,442,443,443,443,443,443,443,443,443,
672 443,443,443,444,444,444,444,444,444,444,444,444,444,445,445,445,445,445,445,445,
673 445,445,445,446,446,446,446,446,446,446,446,446,446,447,447,447,447,447,447,447,
674 447,447,447,448,448,448,448,448,448,448,448,448,448,448,449,449,449,449,449,449,
675 449,449,449,449,450,450,450,450,450,450,450,450,450,450,451,451,451,451,451,451,
676 451,451,451,451,452,452,452,452,452,452,452,452,452,452,453,453,453,453,453,453,
677 453,453,453,453,453,454,454,454,454,454,454,454,454,454,454,455,455,455,455,455,
678 455,455,455,455,455,456,456,456,456,456,456,456,456,456,456,457,457,457,457,457,
679 457,457,457,457,457,457,458,458,458,458,458,458,458,458,458,458,459,459,459,459,
680 459,459,459,459,459,459,460,460,460,460,460,460,460,460,460,460,460,461,461,461,
681 461,461,461,461,461,461,461,462,462,462,462,462,462,462,462,462,462,463,463,463,
682 463,463,463,463,463,463,463,463,464,464,464,464,464,464,464,464,464,464,465,465,
683 465,465,465,465,465,465,465,465,466,466,466,466,466,466,466,466,466,466,466,467,
684 467,467,467,467,467,467,467,467,467,468,468,468,468,468,468,468,468,468,468,469,
685 469,469,469,469,469,469,469,469,469,469,470,470,470,470,470,470,470,470,470,470,
686 471,471,471,471,471,471,471,471,471,471,472,472,472,472,472,472,472,472,472,472,
687 472,473,473,473,473,473,473,473,473,473,473,474,474,474,474,474,474,474,474,474,
688 474,475,475,475,475,475,475,475,475,475,475,475,476,476,476,476,476,476,476,476,
689 476,476,477,477,477,477,477,477,477,477,477,477,477,478,478,478,478,478,478,478,
690 478,478,478,479,479,479,479,479,479,479,479,479,479,479,480,480,480,480,480,480,
691 480,480,480,480,481,481,481,481,481,481,481,481,481,481,482,482,482,482,482,482,
692 482,482,482,482,482,483,483,483,483,483,483,483,483,483,483,484,484,484,484,484,
693 484,484,484,484,484,484,485,485,485,485,485,485,485,485,485,485,486,486,486,486,
694 486,486,486,486,486,486,486,487,487,487,487,487,487,487,487,487,487,488,488,488,
695 488,488,488,488,488,488,488,488,489,489,489,489,489,489,489,489,489,489,490,490,
696 490,490,490,490,490,490,490,490,490,491,491,491,491,491,491,491,491,491,491,492,
697 492,492,492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493,493,493,
698 494,494,494,494,494,494,494,494,494,494,494,495,495,495,495,495,495,495,495,495,
699 495,496,496,496,496,496,496,496,496,496,496,496,497,497,497,497,497,497,497,497,
700 497,497,497,498,498,498,498,498,498,498,498,498,498,499,499,499,499,499,499,499,
701 499,499,499,499,500,500,500,500,500,500,500,500,500,500,501,501,501,501,501,501,
702 501,501,501,501,501,502,502,502,502,502,502,502,502,502,502,503,503,503,503,503,
703 503,503,503,503,503,503,504,504,504,504,504,504,504,504,504,504,504,505,505,505,
704 505,505,505,505,505,505,505,506,506,506,506,506,506,506,506,506,506,506,507,507,
705 507,507,507,507,507,507,507,507,507,508,508,508,508,508,508,508,508,508,508,509,
706 509,509,509,509,509,509,509,509,509,509,510,510,510,510,510,510,510,510,510,510,
707 510,511,511,511,511,511,511,511,511,511,511,512,512,512,512,512 };
709 static const uint8_t order[32] =
710 { 0, 1, 16, 17, 8, 9, 24, 25, 4, 5, 20, 21, 12, 13, 28, 29,
711 2, 3, 18, 19,10,11, 26, 27, 6, 7, 22, 23, 14, 15, 30, 31 };
713 static const uint16_t sampr_index[2][3] =
714 { { 22050, 24000, 16000 }, /* MPEG 2 */
715 { 44100, 48000, 32000 } }; /* MPEG 1 */
717 static const uint16_t bitr_index[2][15] =
718 { {0, 8,16,24,32,40,48,56, 64, 80, 96,112,128,144,160}, /* MPEG 2 */
719 {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320} }; /* MPEG 1 */
721 static const uint8_t num_bands[3][15] =
722 { {0,10,10,10,10,12,14,16, 20, 22, 24, 26, 28, 30, 32},
723 {0,10,10,10,10,10,12,14, 18, 24, 26, 28, 30, 32, 32},
724 {0,10,12,14,18,24,26,28, 30, 32, 32, 32, 32, 32, 32} };
726 static const int16_t cx[9] =
727 { 16135, 10531, 5604, 15396, -2845,-12551, 14189, 8192, 16384 };
729 static const int16_t ca[8] =
730 {-16859,-15458,-10269, -5961, -3099, -1342, -465, -121 };
732 static const uint16_t cs[8] =
733 { 28098, 28893, 31117, 32221, 32621, 32740, 32765, 32768 };
735 static const int16_t enwindow[15*27+24] =
736 { 0, 65, 593, 1766, 22228, 2115, 611, 62,
737 8, 119, 1419, 10564,-11659,-1635,-154, -9,
738 -8, -119,-1419,-10564, 11659, 1635, 154, 9, 464, 100, 91,
739 0, 69, 604, 1635, 23148, 2363, 643, 62,
740 7, 107, 1368, 10449,-12733,-1818,-180,-11,
741 -7, -107,-1368,-10449, 12733, 1818, 180, 11, 420, 200, 164,
742 0, 72, 608, 1465, 23979, 2600, 671, 63,
743 7, 94, 1305, 10265,-13818,-2004,-207,-12,
744 -7, -94,-1305,-10265, 13818, 2004, 207, 12, 380, 297, 220,
745 0, 76, 606, 1256, 24718, 2825, 693, 63,
746 6, 81, 1232, 10016,-14908,-2192,-236,-14,
747 -6, -81,-1232,-10016, 14908, 2192, 236, 14, 342, 392, 262,
748 0, 78, 597, 1007, 25359, 3033, 712, 63,
749 6, 68, 1150, 9706,-15995,-2380,-267,-15,
750 -6, -68,-1150, -9706, 15995, 2380, 267, 15, 307, 483, 289,
751 0, 80, 580, 719, 25901, 3224, 726, 62,
752 6, 54, 1060, 9343,-17072,-2565,-299,-17,
753 -6, -54,-1060, -9343, 17072, 2565, 299, 17, 274, 569, 304,
754 -1, 82, 555, 391, 26339, 3395, 735, 61,
755 5, 40, 963, 8930,-18131,-2747,-332,-19,
756 -5, -40, -963, -8930, 18131, 2747, 332, 19, 242, 650, 307,
757 -1, 83, 523, 26, 26672, 3545, 740, 60,
758 5, 27, 861, 8474,-19164,-2923,-366,-21,
759 -5, -27, -861, -8474, 19164, 2923, 366, 21, 212, 724, 300,
760 -1, 83, 482, -376, 26900, 3672, 739, 58,
761 4, 14, 756, 7981,-20163,-3092,-401,-24,
762 -4, -14, -756, -7981, 20163, 3092, 401, 24, 183, 792, 283,
763 -1, 82, 433, -812, 27022, 3776, 735, 56,
764 4, 1, 648, 7456,-21122,-3250,-435,-26,
765 -4, -1, -648, -7456, 21122, 3250, 435, 26, 155, 851, 258,
766 -1, 81, 376, -1281, 27038, 3855, 726, 54,
767 3, -11, 539, 6907,-22032,-3397,-470,-28,
768 -3, 11, -539, -6907, 22032, 3397, 470, 28, 128, 903, 226,
769 -1, 78, 312, -1778, 26951, 3910, 713, 52,
770 3, -22, 430, 6338,-22887,-3530,-503,-31,
771 -3, 22, -430, -6338, 22887, 3530, 503, 31, 102, 946, 188,
772 -2, 75, 239, -2302, 26761, 3941, 696, 49,
773 3, -33, 322, 5757,-23678,-3648,-537,-34,
774 -3, 33, -322, -5757, 23678, 3648, 537, 34, 76, 980, 145,
775 -2, 70, 160, -2848, 26472, 3948, 676, 47,
776 3, -42, 217, 5167,-24399,-3749,-568,-36,
777 -3, 42, -217, -5167, 24399, 3749, 568, 36, 50, 1004, 99,
778 -2, 65, 74, -3412, 26087, 3931, 653, 44,
779 2, -51, 115, 4577,-25045,-3830,-599,-39,
780 -2, 51, -115, -4577, 25045, 3830, 599, 39, 25, 1019, 50,
782 25610,3891,627,42,-3990,-18,58,-2,
783 21226,-21226,10604,-10604,1860,-1860,1458,-1458,576,-576,130,-130,60,-60,8,-8
786 static const int16_t win[18][4] = {
787 { -3072, -134, -146, 3352 },
788 { -2747, -362, -471, 3579 },
789 { -2387, -529, -831, 3747 },
790 { -2004, -632,-1214, 3850 },
791 { -1609, -666,-1609, 3884 },
792 { -1214, -632,-2004, 3850 },
793 { -831, -529,-2387, 3747 },
794 { -471, -362,-2747, 3579 },
795 { -146, -134,-3072, 3352 },
796 { 134,-3072,-3352, -146 },
797 { 362,-2747,-3579, -471 },
798 { 529,-2387,-3747, -831 },
799 { 632,-2004,-3850,-1214 },
800 { 666,-1609,-3884,-1609 },
801 { 632,-1214,-3850,-2004 },
802 { 529, -831,-3747,-2387 },
803 { 362, -471,-3579,-2747 },
804 { 134, -146,-3352,-3072 } };
807 static const char* wav_filename;
808 static int mp3file, wavfile, wav_size, frames;
809 static void *enc_buffer;
810 static size_t enc_buffer_size;
811 static int enc_chunk = 0; /* encode chunk counter */
812 static int enc_size;
813 static config_t cfg;
814 static uint8_t band_scale_f[22];
817 /* forward declarations */
818 static int HuffmanCode( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table);
819 static int HuffmanCod1( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table);
820 static void putbits(uint32_t val, uint32_t nbit);
821 static int find_best_2( short *ix, uint32_t start, uint32_t end, const uint32_t *table,
822 uint32_t len, int *bits);
823 static int find_best_3( short *ix, uint32_t start, uint32_t end, const uint32_t *table,
824 uint32_t len, int *bits);
825 static int count_bit1 ( short *ix, uint32_t start, uint32_t end, int *bits );
826 static int count_bigv ( short *ix, uint32_t start, uint32_t end, int table0, int table1,
827 int *bits);
830 bool checkString(int fd, char *string)
832 char temp[4];
834 rb->read(fd, temp, 4);
836 /* return 1 on match, 0 on no match */
837 return !rb->memcmp(temp, string, 4);
840 int Read16BitsLowHigh(int fd)
842 char first, second;
844 rb->read(fd, &first, 1);
845 rb->read(fd, &second, 1);
847 return ((int)second << 8) | (first & 0xff);
851 int Read32BitsLowHigh(int fd)
853 int first = 0xffff & Read16BitsLowHigh(fd);
854 int second = 0xffff & Read16BitsLowHigh(fd);
856 return (second << 16) + first;
859 int wave_open(void)
861 unsigned short wFormatTag;
862 unsigned long dAvgBytesPerSec;
863 unsigned short wBlockAlign;
864 unsigned short bits_per_samp;
865 long header_size;
867 if((wavfile = rb->open(wav_filename, O_RDONLY)) < 0)
868 return -1;
870 if(!checkString(wavfile,"RIFF")) return -2;
871 Read32BitsLowHigh(wavfile); /* complete wave chunk size */
872 if(!checkString(wavfile,"WAVE")) return -3;
873 if(!checkString(wavfile,"fmt ")) return -4;
875 header_size = Read32BitsLowHigh(wavfile); /* chunk size */
876 wFormatTag = Read16BitsLowHigh(wavfile);
878 cfg.channels = Read16BitsLowHigh(wavfile);
879 cfg.samplerate = Read32BitsLowHigh(wavfile);
880 dAvgBytesPerSec = Read32BitsLowHigh(wavfile);
881 wBlockAlign = Read16BitsLowHigh(wavfile);
882 bits_per_samp = Read16BitsLowHigh(wavfile);
884 if(wFormatTag != 0x0001) return -5;
885 if(bits_per_samp != 16) return -6;
886 if(cfg.channels > 2) return -7;
887 if(!checkString(wavfile,"data")) return -8;
889 header_size = 0x28;
890 wav_size = rb->filesize(wavfile);
891 rb->lseek(wavfile, header_size, SEEK_SET);
893 return 0;
896 int read_samples(uint32_t *buffer, int num_samples)
898 int s, samples = rb->read(wavfile, buffer, 4 * num_samples) / 4;
899 /* Pad last sample with zeros */
900 for(s=samples; s<num_samples; s++)
901 buffer[s] = 0;
903 return samples;
906 static inline uint32_t myswap32(uint32_t val)
908 const uint8_t* v = (const uint8_t*)&val;
910 return ((uint32_t)v[0]<<24) | ((uint32_t)v[1]<<16) | ((uint32_t)v[2]<<8) | v[3];
913 static void encodeSideInfo( side_info_t si[2][2] )
915 int gr, ch, header;
916 uint32_t cc=0, sz=0;
919 * MPEG header layout:
920 * AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM
921 * A (31-21) = frame sync
922 * B (20-19) = MPEG type
923 * C (18-17) = MPEG layer
924 * D (16) = protection bit
925 * E (15-12) = bitrate index
926 * F (11-10) = samplerate index
927 * G (9) = padding bit
928 * H (8) = private bit
929 * I (7-6) = channel mode
930 * J (5-4) = mode extension (jstereo only)
931 * K (3) = copyright bit
932 * L (2) = original
933 * M (1-0) = emphasis
936 header = (0xfff00000) | /* frame sync (AAAAAAAAA AAA)
937 mp3 type (upper): 1 (B) */
938 (0x01 << 17) | /* mp3 layer: 01 (CC) */
939 ( 0x1 << 16) | /* mp3 crc: 1 (D) */
940 ( 0x1 << 2); /* mp3 org: 1 (L) */
941 header |= cfg.mpg.type << 19;
942 header |= cfg.mpg.bitr_id << 12;
943 header |= cfg.mpg.smpl_id << 10;
944 header |= cfg.mpg.padding << 9;
945 header |= cfg.mpg.mode << 6;
946 /* no emphasis (bits 0-1) */
947 putbits( header, 32 );
949 if(cfg.mpg.type == 1)
950 { /* MPEG1 */
951 if(cfg.channels == 2) { putlong( 0, 20); }
952 else { putlong( 0, 18); }
954 for(gr=0; gr<cfg.granules; gr++)
955 for(ch=0; ch<cfg.channels; ch++)
957 side_info_t *gi = &si[gr][ch];
959 putlong((gi->part2_3_length+42),12 ); /* add scale_facs array size */
960 putlong( gi->address3>>1, 9 );
961 putlong( gi->global_gain, 8 );
962 putlong( 9, 4 ); /* set scale_facs compr type */
963 putlong( gi->table_select[0], 6 );
964 putlong( gi->table_select[1], 5 );
965 putlong( gi->table_select[2], 5 );
966 putlong( gi->region_0_1, 7 );
967 putlong( 1 , 2 ); /* set scale_facs to 1bit */
968 putlong( gi->table_select[3], 1 );
971 else
972 { /* MPEG2 */
973 if(cfg.channels == 2) { putlong( 0, 10); }
974 else { putlong( 0, 9); }
976 for(ch=0; ch<cfg.channels; ch++)
978 side_info_t *gi = &si[0][ch];
980 putlong((gi->part2_3_length+42),12 ); /* add scale_facs array size */
981 putlong( gi->address3>>1, 9 );
982 putlong( gi->global_gain, 8 );
983 putlong( 0xCA, 9 ); /* set scale_facs compr type */
984 putlong( gi->table_select[0], 6 );
985 putlong( gi->table_select[1], 5 );
986 putlong( gi->table_select[2], 5 );
987 putlong( gi->region_0_1 , 7 );
988 putlong( 1 , 1 ); /* set scale_facs to 1bit */
989 putlong( gi->table_select[3], 1 );
992 /* flush remaining bits */
993 putbits(cc, sz);
996 /* Note the discussion of huffmancodebits() on pages 28 and 29 of the IS,
997 as well as the definitions of the side information on pages 26 and 27. */
998 static void Huffmancodebits( short *ix, char *xr_sign, side_info_t *gi )
1000 int region1 = gi->address1;
1001 int region2 = gi->address2;
1002 int bigvals = gi->address3;
1003 int count1 = bigvals + (gi->count1 << 2);
1004 int stuffBits = 0;
1005 int bits = 0;
1006 int i, v;
1008 for(i=v=0; i<32; i+=2)
1009 v |= band_scale_f[i>>1] << (30-i);
1010 putbits(v, 32); // store scale_facs (part1)
1012 for(v=0; i<42; i+=2)
1013 v |= band_scale_f[i>>1] << (40-i);
1014 putbits(v, 10); // store scale_facs (part2)
1016 if(region1 > 0)
1017 bits += HuffmanCode(ix, xr_sign, 0 , region1, gi->table_select[0]);
1019 if(region2 > region1)
1020 bits += HuffmanCode(ix, xr_sign, region1, region2, gi->table_select[1]);
1022 if(bigvals > region2)
1023 bits += HuffmanCode(ix, xr_sign, region2, bigvals, gi->table_select[2]);
1025 if(count1 > bigvals)
1026 bits += HuffmanCod1(ix, xr_sign, bigvals, count1, gi->table_select[3]);
1028 if((stuffBits = gi->part2_3_length - bits) > 0)
1030 int stuffWords = stuffBits >> 5;
1031 int remainBits = stuffBits & 31;
1033 if( remainBits )
1034 putbits( ~0, remainBits );
1036 while( stuffWords-- )
1037 putbits( ~0, 32 ); /* Huffman code tables leed to padding ones */
1041 int HuffmanCod1( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int tbl)
1043 uint32_t cc=0, sz=0;
1044 uint32_t i, d, p;
1045 int sumbit=0, s=0, l=0, v, w, x, y;
1046 #define sgnv xr_sign[i+0]
1047 #define sgnw xr_sign[i+1]
1048 #define sgnx xr_sign[i+2]
1049 #define sgny xr_sign[i+3]
1051 for(i=begin; i<end; i+=4)
1053 v = ix[i+0];
1054 w = ix[i+1];
1055 x = ix[i+2];
1056 y = ix[i+3];
1057 p = (v << 3) + (w << 2) + (x << 1) + y;
1059 switch(p)
1061 case 0: l=0; s = 0; break;
1062 case 1: l=1; s = sgny; break;
1063 case 2: l=1; s = sgnx; break;
1064 case 3: l=2; s = (sgnx << 1) + sgny; break;
1065 case 4: l=1; s = sgnw; break;
1066 case 5: l=2; s = (sgnw << 1) + sgny; break;
1067 case 6: l=2; s = (sgnw << 1) + sgnx; break;
1068 case 7: l=3; s = (sgnw << 2) + (sgnx << 1) + sgny; break;
1069 case 8: l=1; s = sgnv; break;
1070 case 9: l=2; s = (sgnv << 1) + sgny; break;
1071 case 10: l=2; s = (sgnv << 1) + sgnx; break;
1072 case 11: l=3; s = (sgnv << 2) + (sgnx << 1) + sgny; break;
1073 case 12: l=2; s = (sgnv << 1) + sgnw; break;
1074 case 13: l=3; s = (sgnv << 2) + (sgnw << 1) + sgny; break;
1075 case 14: l=3; s = (sgnv << 2) + (sgnw << 1) + sgnx; break;
1076 case 15: l=4; s = (sgnv << 3) + (sgnw << 2) + (sgnx << 1) + sgny; break;
1079 d = (ht_count[tbl][0][p] << l) + s;
1080 l = ht_count[tbl][1][p];
1081 putlong( d, l );
1082 sumbit += l;
1085 /* flush remaining bits */
1086 putbits(cc, sz);
1088 return sumbit;
1091 /* Implements the pseudocode of page 98 of the IS */
1092 int HuffmanCode(short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table)
1094 uint32_t cc=0, sz=0, code;
1095 uint32_t i, xl=0, yl=0, idx;
1096 int x, y, bit, sumbit=0;
1097 #define sign_x xr_sign[i+0]
1098 #define sign_y xr_sign[i+1]
1100 if(table == 0)
1101 return 0;
1103 if( table > 15 )
1104 { /* ESC-table is used */
1105 uint32_t linbits = ht_big[table-16].linbits;
1106 const uint16_t *hffcode = table < 24 ? t16HB : t24HB;
1107 const uint8_t *hlen = table < 24 ? t16l : t24l;
1109 for(i=begin; i<end; i+=2)
1111 x = ix[ i ];
1112 y = ix[i+1];
1114 if(x > 14) { xl = x - 15; x = 15; }
1115 if(y > 14) { yl = y - 15; y = 15; }
1117 idx = x * 16 + y;
1118 code = hffcode[idx];
1119 bit = hlen [idx];
1121 if(x)
1123 if(x > 14)
1125 code = (code << linbits) | xl;
1126 bit += linbits;
1129 code = (code << 1) | sign_x;
1130 bit += 1;
1133 if(y)
1135 if(y > 14)
1137 if(bit + linbits + 1 > 32)
1139 putlong( code, bit );
1140 sumbit += bit;
1141 code = bit = 0;
1144 code = (code << linbits) | yl;
1145 bit += linbits;
1148 code = (code << 1) | sign_y;
1149 bit += 1;
1152 putlong( code, bit );
1153 sumbit += bit;
1156 else
1157 { /* No ESC-words */
1158 const struct huffcodetab *h = &ht[table];
1160 for(i=begin; i<end; i+=2)
1162 x = ix[i];
1163 y = ix[i+1];
1165 idx = x * h->len + y;
1166 code = h->table[idx];
1167 bit = h->hlen [idx];
1169 if(x)
1171 code = (code << 1) | sign_x;
1172 bit += 1;
1175 if(y)
1177 code = (code << 1) | sign_y;
1178 bit += 1;
1181 putlong( code, bit );
1182 sumbit += bit;
1186 /* flush remaining bits */
1187 putbits(cc, sz);
1189 return sumbit;
1192 void putbits(uint32_t val, uint32_t nbit)
1194 int new_bitpos = CodedData.bitpos + nbit;
1195 int ptrpos = CodedData.bitpos >> 5;
1197 val = val & (0xffffffff >> (32 - nbit));
1199 /* data fit in one uint32_t */
1200 if(((new_bitpos - 1) >> 5) == ptrpos)
1201 CodedData.bbuf[ptrpos] |= val << ((32 - new_bitpos) & 31);
1202 else
1204 CodedData.bbuf[ptrpos ] |= val >> ((new_bitpos - 32) & 31);
1205 CodedData.bbuf[ptrpos+1] |= val << ((32 - new_bitpos) & 31);
1208 CodedData.bitpos = new_bitpos;
1211 /***************************************************************************/
1212 /* Choose the Huffman table that will encode ix[begin..end] with */
1213 /* the fewest bits. */
1214 /* Note: This code contains knowledge about the sizes and characteristic */
1215 /* of the Huffman tables as defined in the IS (Table B.7), and will not */
1216 /* work with any arbitrary tables. */
1217 /***************************************************************************/
1218 int choose_table( short *ix, uint32_t begin, uint32_t end, int *bits )
1220 uint32_t i;
1221 int max, table0, table1;
1223 for(i=begin,max=0; i<end; i++)
1224 if(ix[i] > max)
1225 max = ix[i];
1227 if(max < 16)
1229 /* tables without linbits */
1230 /* indx: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
1231 /* len: 0, 2, 3, 3, 0, 4, 4, 6, 6, 6, 8, 8, 8, 16, 0, 16 */
1232 switch(max)
1234 case 0: return 0;
1235 case 1: return count_bit1(ix, begin, end, bits);
1236 case 2: return 2 + find_best_2(ix, begin, end, tab23, 3, bits);
1237 case 3: return 5 + find_best_2(ix, begin, end, tab56, 4, bits);
1238 case 4:
1239 case 5: return 7 + find_best_3(ix, begin, end, tab789, 6, bits);
1240 case 6:
1241 case 7: return 10 + find_best_3(ix, begin, end, tabABC, 8, bits);
1242 default: return 13 + find_best_2(ix, begin, end, tab1315, 16, bits) * 2;
1245 else
1247 /* tables with linbits */
1248 max -= 15;
1250 for(table0=0; table0<8; table0++)
1251 if(ht_big[table0].linmax >= max)
1252 break;
1254 for(table1=8; table1<16; table1++)
1255 if(ht_big[table1].linmax >= max)
1256 break;
1258 return 16 + count_bigv(ix, begin, end, table0, table1, bits);
1262 int find_best_2(short *ix, uint32_t start, uint32_t end, const uint32_t *table,
1263 uint32_t len, int *bits)
1265 uint32_t i, sum = 0;
1267 for(i=start; i<end; i+=2)
1268 sum += table[ix[i] * len + ix[i+1]];
1270 if((sum & 0xffff) <= (sum >> 16))
1272 *bits = (sum & 0xffff);
1273 return 1;
1275 else
1277 *bits = sum >> 16;
1278 return 0;
1282 int find_best_3(short *ix, uint32_t start, uint32_t end, const uint32_t *table,
1283 uint32_t len, int *bits)
1285 uint32_t i, j, sum = 0;
1286 int sum1 = 0;
1287 int sum2 = 0;
1288 int sum3 = 0;
1290 /* avoid overflow in packed additions: 78*13 < 1024 */
1291 for(i=start; i<end; )
1293 j = i + 2*78 > end ? end : i + 2*78;
1295 for(sum=0; i<j; i+=2)
1296 sum += table[ix[i] * len + ix[i+1]];
1298 sum1 += (sum >> 20);
1299 sum2 += (sum >> 10) & 0x3ff;
1300 sum3 += (sum >> 0) & 0x3ff;
1303 i = 0;
1304 if(sum1 > sum2) { sum1 = sum2; i = 1; }
1305 if(sum1 > sum3) { sum1 = sum3; i = 2; }
1307 *bits = sum1;
1309 return i;
1312 /*************************************************************************/
1313 /* Function: Count the number of bits necessary to code the subregion. */
1314 /*************************************************************************/
1315 int count_bit1(short *ix, uint32_t start, uint32_t end, int *bits )
1317 uint32_t i, sum = 0;
1319 for(i=start; i<end; i+=2)
1320 sum += t1l[4 + ix[i] * 2 + ix[i+1]];
1322 *bits = sum;
1324 return 1; /* this is table1 */
1327 int count_bigv(short *ix, uint32_t start, uint32_t end, int table0,
1328 int table1, int *bits )
1330 uint32_t i, sum0, sum1, sum=0, bigv=0, x, y;
1332 /* ESC-table is used */
1333 for(i=start; i<end; i+=2)
1335 x = ix[i];
1336 y = ix[i+1];
1338 if(x > 14) { x = 15; bigv++; }
1339 if(y > 14) { y = 15; bigv++; }
1341 sum += tab1624[x * 16 + y];
1344 sum0 = (sum >> 16) + bigv * ht_big[table0].linbits;
1345 sum1 = (sum & 0xffff) + bigv * ht_big[table1].linbits;
1347 if(sum0 <= sum1)
1349 *bits = sum0;
1350 return table0;
1352 else
1354 *bits = sum1;
1355 return table1;
1359 /*************************************************************************/
1360 /* Function: Calculation of rzero, count1, address3 */
1361 /* (Partitions ix into big values, quadruples and zeros). */
1362 /*************************************************************************/
1363 int calc_runlen( short *ix, side_info_t *si )
1365 int p, i, sum = 0;
1367 for(i=SAMPL2; i-=2; )
1368 if(*(uint32_t*)&ix[i-2]) /* !!!! short *ix; !!!!! */
1369 break;
1371 si->count1 = 0;
1373 for( ; i>3; i-=4)
1375 int v = ix[i-1];
1376 int w = ix[i-2];
1377 int x = ix[i-3];
1378 int y = ix[i-4];
1380 if((v | w | x | y) <= 1)
1382 p = (y<<3) + (x<<2) + (w<<1) + (v);
1384 sum += tab01[p];
1386 si->count1++;
1388 else break;
1391 si->address3 = i;
1393 if((sum >> 16) < (sum & 0xffff))
1395 si->table_select[3] = 0;
1396 return sum >> 16;
1398 else
1400 si->table_select[3] = 1;
1401 return sum & 0xffff;
1406 /*************************************************************************/
1407 /* Function: Quantization of the vector xr ( -> ix) */
1408 /*************************************************************************/
1409 int quantize_int(int *xr, short *ix, side_info_t *si)
1411 unsigned int i, idx, s, frac_pow[] = { 0x10000, 0xd745, 0xb505, 0x9838 };
1413 s = frac_pow[si->quantStep & 3] >> si->quantStep / 4;
1415 /* check for possible 'out of range' values */
1416 if(((si->max_val + 256) >> 8) * s >= (65536 << 8))
1417 return 0;
1419 if(((si->max_val + 256) >> 8) * s < (4096 << 8))
1420 { /* all values fit the table size */
1421 for(i=SAMPL2; i--; )
1422 ix[i] = int2idx[(xr[i] * s + 0x8000) >> 16];
1424 else
1425 { /* check each index wether it fits the table */
1426 for(i=SAMPL2; i--; )
1428 idx = (xr[i] * s + 0x08000) >> 16;
1430 if(idx > 4095) ix[i] = int2idx[(idx + 8) >> 4] << 3;
1431 else ix[i] = int2idx[idx];
1435 return 1;
1438 /*************************************************************************/
1439 /* subdivides the bigvalue region which will use separate Huffman tables */
1440 /*************************************************************************/
1441 void subdivide(side_info_t *si)
1443 int scfb, count0, count1;
1445 if( !si->address3 )
1446 { /* no bigvalue region */
1447 si->region_0_1 = 0;
1448 si->address1 = 0;
1449 si->address2 = 0;
1451 else
1453 /* Calculate scale factor band index */
1454 for(scfb=0; scalefac[scfb] < si->address3; )
1455 scfb++;
1457 count0 = subdv_table[scfb].region0_cnt;
1458 count1 = subdv_table[scfb].region1_cnt;
1460 si->region_0_1 = (count0 << 3) | count1;
1461 si->address1 = scalefac[count0 + 1];
1462 si->address2 = scalefac[count0 + 1 + count1 + 1];
1466 /*******************************************************************/
1467 /* Count the number of bits necessary to code the bigvalues region */
1468 /*******************************************************************/
1469 int bigv_bitcount(short *ix, side_info_t *gi)
1471 int b1=0, b2=0, b3=0;
1473 /* Select huffman code tables for bigvalues regions */
1474 gi->table_select[0] = 0;
1475 gi->table_select[1] = 0;
1476 gi->table_select[2] = 0;
1478 if( gi->address1 > 0 ) /* region0 */
1479 gi->table_select[0] = choose_table(ix, 0 , gi->address1, &b1);
1481 if( gi->address2 > gi->address1 ) /* region1 */
1482 gi->table_select[1] = choose_table(ix, gi->address1, gi->address2, &b2);
1484 if( gi->address3 > gi->address2 ) /* region2 */
1485 gi->table_select[2] = choose_table(ix, gi->address2, gi->address3, &b3);
1487 return b1+b2+b3;
1490 int quantize_and_count_bits(int *xr, short *ix, side_info_t *si)
1492 int bits = 10000;
1494 if(quantize_int(xr, ix, si))
1496 bits = calc_runlen(ix, si); /* rzero,count1,address3 */
1497 subdivide(si); /* bigvalues sfb division */
1498 bits += bigv_bitcount(ix,si); /* bit count */
1501 return bits;
1504 /************************************************************************/
1505 /* The code selects the best quantStep for a particular set of scalefacs*/
1506 /************************************************************************/
1507 int inner_loop(int *xr, int max_bits, side_info_t *si)
1509 int bits;
1511 while((bits=quantize_and_count_bits(xr, enc_data, si)) < max_bits-64)
1513 if(si->quantStep == 0)
1514 break;
1516 if(si->quantStep <= 2)
1517 si->quantStep = 0;
1518 else
1519 si->quantStep -= 2;
1522 while(bits > max_bits)
1524 si->quantStep++;
1525 bits = quantize_and_count_bits(xr, enc_data, si);
1528 return bits;
1531 void iteration_loop(int *xr, side_info_t *si, int gr_cnt)
1533 int remain, tar_bits, max_bits = cfg.mean_bits;
1535 /* distribute reserved bits to remaining granules */
1536 tar_bits = max_bits + (cfg.ResvSize / gr_cnt & ~7);
1537 if(tar_bits > max_bits + max_bits/2)
1538 tar_bits = max_bits + max_bits/2;
1540 si->part2_3_length = inner_loop(xr, tar_bits, si);
1541 si->global_gain = si->quantStep + 142 - si->additStep;
1543 /* unused bits of the reservoir can be used for remaining granules */
1544 cfg.ResvSize += max_bits - si->part2_3_length;
1546 /* end: distribute the reserved bits to one or two granules */
1547 if(gr_cnt == 1)
1549 si->part2_3_length += cfg.ResvSize;
1550 /* mp3 format allows max 12bits for granule length */
1551 if(si->part2_3_length > 4092)
1553 remain = (si->part2_3_length - 4092 + 31) >> 5;
1554 si->part2_3_length -= remain << 5;
1555 si[-1].part2_3_length += remain << 5;
1557 while(remain--)
1558 putbits(~0, 32);
1564 /* returns sum_j=0^31 a[j]*cos(PI*j*(k+1/2)/32), 0<=k<32 */
1565 void window_subband1(short *wk, int sb0[SBLIMIT], int sb1[SBLIMIT]) ICODE_ATTR;
1566 void window_subband1(short *wk, int sb0[SBLIMIT], int sb1[SBLIMIT])
1568 int k, i, u, v;
1569 short *x1, *x2;
1570 short const *wp;
1572 #ifdef CPU_COLDFIRE
1573 int s0, s1, t0, t1;
1575 for(k=0; k<18; k++, wk+=64, sb0+=SBLIMIT, sb1+=SBLIMIT)
1577 wp = enwindow;
1578 x1 = wk;
1579 x2 = x1 - 124;
1581 for(i=-15; i<0; i++)
1583 asm volatile(
1584 "move.l (-224*4,%[x2]), %%d4\n" /* d4 = x2[-224] */
1585 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1586 "mac.w %%d0u, %%d4u, %%acc0\n"
1587 "mac.w %%d0u, %%d4l, (-160*4,%[x2]), %%d4, %%acc1\n"
1588 "mac.w %%d0l, %%d4u, %%acc0\n"
1589 "mac.w %%d0l, %%d4l, ( -96*4,%[x2]), %%d4, %%acc1\n"
1590 "mac.w %%d1u, %%d4u, %%acc0\n"
1591 "mac.w %%d1u, %%d4l, ( -32*4,%[x2]), %%d4, %%acc1\n"
1592 "mac.w %%d1l, %%d4u, %%acc0\n"
1593 "mac.w %%d1l, %%d4l, ( 32*4,%[x2]), %%d4, %%acc1\n"
1594 "mac.w %%d2u, %%d4u, %%acc0\n"
1595 "mac.w %%d2u, %%d4l, ( 96*4,%[x2]), %%d4, %%acc1\n"
1596 "mac.w %%d2l, %%d4u, %%acc0\n"
1597 "mac.w %%d2l, %%d4l, ( 160*4,%[x2]), %%d4, %%acc1\n"
1598 "mac.w %%d3u, %%d4u, %%acc0\n"
1599 "mac.w %%d3u, %%d4l, ( 224*4,%[x2]), %%d4, %%acc1\n"
1600 "mac.w %%d3l, %%d4u, %%acc0\n"
1601 "mac.w %%d3l, %%d4l, (-256*4,%[x1]), %%d4, %%acc1\n"
1602 "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */
1603 "mac.w %%d0u, %%d4u, %%acc0\n"
1604 "mac.w %%d0u, %%d4l, (-192*4,%[x1]), %%d4, %%acc1\n"
1605 "mac.w %%d0l, %%d4u, %%acc0\n"
1606 "mac.w %%d0l, %%d4l, (-128*4,%[x1]), %%d4, %%acc1\n"
1607 "mac.w %%d1u, %%d4u, %%acc0\n"
1608 "mac.w %%d1u, %%d4l, ( -64*4,%[x1]), %%d4, %%acc1\n"
1609 "mac.w %%d1l, %%d4u, %%acc0\n"
1610 "mac.w %%d1l, %%d4l, ( 0*4,%[x1]), %%d4, %%acc1\n"
1611 "mac.w %%d2u, %%d4u, %%acc0\n"
1612 "mac.w %%d2u, %%d4l, ( 64*4,%[x1]), %%d4, %%acc1\n"
1613 "mac.w %%d2l, %%d4u, %%acc0\n"
1614 "mac.w %%d2l, %%d4l, ( 128*4,%[x1]), %%d4, %%acc1\n"
1615 "mac.w %%d3u, %%d4u, %%acc0\n"
1616 "mac.w %%d3u, %%d4l, ( 192*4,%[x1]), %%d4, %%acc1\n"
1617 "mac.w %%d3l, %%d4u, %%acc0\n"
1618 "mac.w %%d3l, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n"
1619 "movclr.l %%acc0, %%d0\n"
1620 "move.l %%d0, %[s0]\n"
1621 "movclr.l %%acc1, %%d0\n"
1622 "move.l %%d0, %[s1]\n"
1624 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1625 "mac.w %%d0u, %%d4u, %%acc0\n"
1626 "mac.w %%d0u, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n"
1627 "mac.w %%d0l, %%d4u, %%acc0\n"
1628 "mac.w %%d0l, %%d4l, ( 96*4,%[x1]), %%d4, %%acc1\n"
1629 "mac.w %%d1u, %%d4u, %%acc0\n"
1630 "mac.w %%d1u, %%d4l, ( 32*4,%[x1]), %%d4, %%acc1\n"
1631 "mac.w %%d1l, %%d4u, %%acc0\n"
1632 "mac.w %%d1l, %%d4l, ( -32*4,%[x1]), %%d4, %%acc1\n"
1633 "mac.w %%d2u, %%d4u, %%acc0\n"
1634 "mac.w %%d2u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n"
1635 "mac.w %%d2l, %%d4u, %%acc0\n"
1636 "mac.w %%d2l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n"
1637 "mac.w %%d3u, %%d4u, %%acc0\n"
1638 "mac.w %%d3u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n"
1639 "mac.w %%d3l, %%d4u, %%acc0\n"
1640 "mac.w %%d3l, %%d4l, ( 256*4,%[x2]), %%d4, %%acc1\n"
1641 "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */
1642 "mac.w %%d0u, %%d4u, %%acc0\n"
1643 "mac.w %%d0u, %%d4l, ( 192*4,%[x2]), %%d4, %%acc1\n"
1644 "mac.w %%d0l, %%d4u, %%acc0\n"
1645 "mac.w %%d0l, %%d4l, ( 128*4,%[x2]), %%d4, %%acc1\n"
1646 "mac.w %%d1u, %%d4u, %%acc0\n"
1647 "mac.w %%d1u, %%d4l, ( 64*4,%[x2]), %%d4, %%acc1\n"
1648 "mac.w %%d1l, %%d4u, %%acc0\n"
1649 "mac.w %%d1l, %%d4l, ( 0*4,%[x2]), %%d4, %%acc1\n"
1650 "mac.w %%d2u, %%d4u, %%acc0\n"
1651 "mac.w %%d2u, %%d4l, ( -64*4,%[x2]), %%d4, %%acc1\n"
1652 "mac.w %%d2l, %%d4u, %%acc0\n"
1653 "mac.w %%d2l, %%d4l, (-128*4,%[x2]), %%d4, %%acc1\n"
1654 "mac.w %%d3u, %%d4u, %%acc0\n"
1655 "mac.w %%d3u, %%d4l, (-192*4,%[x2]), %%d4, %%acc1\n"
1656 "mac.w %%d3l, %%d4u, %%acc0\n"
1657 "mac.w %%d3l, %%d4l, %%acc1\n"
1658 "movclr.l %%acc0, %%d0\n"
1659 "move.l %%d0, %[t0]\n"
1660 "movclr.l %%acc1, %%d0\n"
1661 "move.l %%d0, %[t1]\n"
1663 : [x1] "+a" (x1), [x2] "+a" (x2), [s0] "+m" (s0), [t0] "+m" (t0),
1664 [s1] "+m" (s1), [t1] "+m" (t1)
1665 : [wp] "a" (wp) : "d0", "d1", "d2", "d3", "d4");
1667 sb0[30+i*2] = shft4(t0) + shft13(s0) * wp[24];
1668 sb0[31+i*2] = shft13(t0) * wp[25] - shft13(s0) * wp[26];
1669 sb1[30+i*2] = shft4(t1) + shft13(s1) * wp[24];
1670 sb1[31+i*2] = shft13(t1) * wp[25] - shft13(s1) * wp[26];
1671 wp += 27;
1672 x1 -= 2;
1673 x2 += 2;
1676 asm volatile(
1677 "move.l ( -32*4,%[x1]), %%d4\n" /* d4 = x1[-32] */
1678 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1680 "mac.w %%d0u, %%d4u, %%acc0\n"
1681 "mac.w %%d0u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n"
1682 "mac.w %%d0l, %%d4u, %%acc0\n"
1683 "mac.w %%d0l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n"
1684 "mac.w %%d1u, %%d4u, %%acc0\n"
1685 "mac.w %%d1u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n"
1686 "mac.w %%d1l, %%d4u, %%acc0\n"
1687 "mac.w %%d1l, %%d4l, ( 32*4,%[x1]), %%d4, %%acc1\n"
1688 "mac.w %%d2u, %%d4u, %%acc0\n"
1689 "mac.w %%d2u, %%d4l, ( 96*4,%[x1]), %%d4, %%acc1\n"
1690 "mac.w %%d2l, %%d4u, %%acc0\n"
1691 "mac.w %%d2l, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n"
1692 "mac.w %%d3u, %%d4u, %%acc0\n"
1693 "mac.w %%d3u, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n"
1694 "mac.w %%d3l, %%d4u, %%acc0\n"
1695 "mac.w %%d3l, %%d4l, ( -16*4,%[x1]), %%d4, %%acc1\n"
1696 "movclr.l %%acc0, %%d0\n"
1697 "move.l %%d0, %[s0]\n"
1698 "movclr.l %%acc1, %%d0\n"
1699 "move.l %%d0, %[s1]\n"
1701 "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */
1702 "mac.w %%d0u, %%d4u, %%acc0\n"
1703 "mac.w %%d0u, %%d4l, ( -48*4,%[x1]), %%d4, %%acc1\n"
1704 "mac.w %%d1u, %%d4u, %%acc0\n"
1705 "mac.w %%d1u, %%d4l, ( 16*4,%[x1]), %%d4, %%acc1\n"
1706 "mac.w %%d1l, %%d4u, %%acc0\n"
1707 "mac.w %%d1l, %%d4l, ( -80*4,%[x1]), %%d4, %%acc1\n"
1708 "mac.w %%d2u, %%d4u, %%acc0\n"
1709 "mac.w %%d2u, %%d4l, ( 48*4,%[x1]), %%d4, %%acc1\n"
1710 "mac.w %%d2u, %%d4u, %%acc0\n"
1711 "mac.w %%d2u, %%d4l, (-112*4,%[x1]), %%d4, %%acc1\n"
1712 "mac.w %%d3u, %%d4u, %%acc0\n"
1713 "mac.w %%d3u, %%d4l, ( 80*4,%[x1]), %%d4, %%acc1\n"
1714 "mac.w %%d3l, %%d4u, %%acc0\n"
1715 "mac.w %%d3l, %%d4l, (-144*4,%[x1]), %%d4, %%acc1\n"
1716 "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */
1717 "mac.w %%d0u, %%d4u, %%acc0\n"
1718 "mac.w %%d0u, %%d4l, ( 112*4,%[x1]), %%d4, %%acc1\n"
1719 "mac.w %%d0u, %%d4u, %%acc0\n"
1720 "mac.w %%d0u, %%d4l, (-176*4,%[x1]), %%d4, %%acc1\n"
1721 "mac.w %%d1u, %%d4u, %%acc0\n"
1722 "mac.w %%d1u, %%d4l, ( 144*4,%[x1]), %%d4, %%acc1\n"
1723 "mac.w %%d1l, %%d4u, %%acc0\n"
1724 "mac.w %%d1l, %%d4l, (-208*4,%[x1]), %%d4, %%acc1\n"
1725 "mac.w %%d2u, %%d4u, %%acc0\n"
1726 "mac.w %%d2u, %%d4l, ( 176*4,%[x1]), %%d4, %%acc1\n"
1727 "mac.w %%d2u, %%d4u, %%acc0\n"
1728 "mac.w %%d2u, %%d4l, (-240*4,%[x1]), %%d4, %%acc1\n"
1729 "mac.w %%d3u, %%d4u, %%acc0\n"
1730 "mac.w %%d3u, %%d4l, ( 208*4,%[x1]), %%d4, %%acc1\n"
1731 "mac.w %%d3l, %%d4u, %%acc0\n"
1732 "mac.w %%d3l, %%d4l, %%acc1\n"
1733 "movclr.l %%acc0, %%d0\n"
1734 "move.l %%d0, %[t0]\n"
1735 "movclr.l %%acc1, %%d0\n"
1736 "move.l %%d0, %[t1]\n"
1738 : [x1] "+a" (x1), [s0] "+m" (s0), [t0] "+m" (t0),
1739 [s1] "+m" (s1), [t1] "+m" (t1)
1740 : [wp] "a" (wp) : "d0", "d1", "d2", "d3", "d4");
1742 u = shft4(s0 - t0);
1743 v = shft4(s0 + t0);
1744 t0 = sb0[14];
1745 s0 = sb0[15] - t0;
1747 sb0[31] = v + t0; /* A0 */
1748 sb0[30] = u + s0; /* A1 */
1749 sb0[15] = u - s0; /* A2 */
1750 sb0[14] = v - t0; /* A3 */
1752 u = shft4(s1 - t1);
1753 v = shft4(s1 + t1);
1754 t1 = sb1[14];
1755 s1 = sb1[15] - t1;
1757 sb1[31] = v + t1; /* A0 */
1758 sb1[30] = u + s1; /* A1 */
1759 sb1[15] = u - s1; /* A2 */
1760 sb1[14] = v - t1; /* A3 */
1762 #else
1763 int ch, s, t, *a;
1765 for(ch=0; ch<cfg.channels; ch++)
1767 a = ch ? sb1 : sb0;
1768 for(k=0; k<18; k++, wk+=64, a+=SBLIMIT)
1770 wp = enwindow;
1771 x1 = wk;
1772 x2 = x1 - 124;
1774 /* x1[-572] .... x1[448] = 1022 */
1775 /* 18*4*16*32 */
1776 for(i=-15; i<0; i++)
1778 s = (int)x2[-224*2] * wp[ 0]; t = (int)x1[ 224*2] * wp[ 0];
1779 s += (int)x2[-160*2] * wp[ 1]; t += (int)x1[ 160*2] * wp[ 1];
1780 s += (int)x2[- 96*2] * wp[ 2]; t += (int)x1[ 96*2] * wp[ 2];
1781 s += (int)x2[- 32*2] * wp[ 3]; t += (int)x1[ 32*2] * wp[ 3];
1782 s += (int)x2[ 32*2] * wp[ 4]; t += (int)x1[- 32*2] * wp[ 4];
1783 s += (int)x2[ 96*2] * wp[ 5]; t += (int)x1[- 96*2] * wp[ 5];
1784 s += (int)x2[ 160*2] * wp[ 6]; t += (int)x1[-160*2] * wp[ 6];
1785 s += (int)x2[ 224*2] * wp[ 7]; t += (int)x1[-224*2] * wp[ 7];
1786 s += (int)x1[-256*2] * wp[ 8]; t += (int)x2[ 256*2] * wp[16];
1787 s += (int)x1[-192*2] * wp[ 9]; t += (int)x2[ 192*2] * wp[17];
1788 s += (int)x1[-128*2] * wp[10]; t += (int)x2[ 128*2] * wp[18];
1789 s += (int)x1[- 64*2] * wp[11]; t += (int)x2[ 64*2] * wp[19];
1790 s += (int)x1[ 0*2] * wp[12]; t += (int)x2[ 0*2] * wp[20];
1791 s += (int)x1[ 64*2] * wp[13]; t += (int)x2[- 64*2] * wp[21];
1792 s += (int)x1[ 128*2] * wp[14]; t += (int)x2[-128*2] * wp[22];
1793 s += (int)x1[ 192*2] * wp[15]; t += (int)x2[-192*2] * wp[23];
1795 a[30+i*2] = shft4(t) + shft13(s) * wp[24];
1796 a[31+i*2] = shft13(t) * wp[25] - shft13(s) * wp[26];
1797 wp += 27;
1798 x1 -= 2;
1799 x2 += 2;
1802 t = (int)x1[- 16*2] * wp[ 8]; s = (int)x1[ -32*2] * wp[0];
1803 t += ((int)x1[- 48*2]-x1[ 16*2]) * wp[10]; s += (int)x1[ -96*2] * wp[1];
1804 t += ((int)x1[- 80*2]+x1[ 48*2]) * wp[12]; s += (int)x1[-160*2] * wp[2];
1805 t += ((int)x1[-112*2]-x1[ 80*2]) * wp[14]; s += (int)x1[-224*2] * wp[3];
1806 t += ((int)x1[-144*2]+x1[112*2]) * wp[16]; s += (int)x1[ 32*2] * wp[4];
1807 t += ((int)x1[-176*2]-x1[144*2]) * wp[18]; s += (int)x1[ 96*2] * wp[5];
1808 t += ((int)x1[-208*2]+x1[176*2]) * wp[20]; s += (int)x1[ 160*2] * wp[6];
1809 t += ((int)x1[-240*2]-x1[208*2]) * wp[22]; s += (int)x1[ 224*2] * wp[7];
1811 u = shft4(s - t);
1812 v = shft4(s + t);
1813 t = a[14];
1814 s = a[15] - t;
1816 a[31] = v + t; /* A0 */
1817 a[30] = u + s; /* A1 */
1818 a[15] = u - s; /* A2 */
1819 a[14] = v - t; /* A3 */
1821 wk -= 18 * 64 - 1; /* rewind wk (to next channel start) */
1823 #endif
1826 void window_subband2(short *x1, int a[SBLIMIT]) ICODE_ATTR;
1827 void window_subband2(short *x1, int a[SBLIMIT])
1829 int xr;
1830 short const *wp = enwindow;
1831 short *x2 = x1 - 124;
1833 wp += 27 * 15;
1834 x1 -= 2 * 15;
1835 x2 += 2 * 15;
1837 xr = a[28] - a[0]; a[0] += a[28]; a[28] = shft9(xr) * wp[-2*27+25];
1838 xr = a[29] - a[1]; a[1] += a[29]; a[29] = shft9(xr) * wp[-2*27+25];
1839 xr = a[26] - a[2]; a[2] += a[26]; a[26] = shft9(xr) * wp[-4*27+25];
1840 xr = a[27] - a[3]; a[3] += a[27]; a[27] = shft9(xr) * wp[-4*27+25];
1841 xr = a[24] - a[4]; a[4] += a[24]; a[24] = shft9(xr) * wp[-6*27+25];
1842 xr = a[25] - a[5]; a[5] += a[25]; a[25] = shft9(xr) * wp[-6*27+25];
1843 xr = a[22] - a[6]; a[6] += a[22]; a[22] = shft9(xr) * SQRT ;
1844 xr = a[23] - a[7]; a[7] += a[23]; a[23] = shft9(xr) * SQRT - a[7];
1845 a[ 7] -= a[ 6];
1846 a[22] -= a[ 7];
1847 a[23] -= a[22];
1849 xr = a[ 6]; a[ 6] = a[31] - xr; a[31] = a[31] + xr;
1850 xr = a[ 7]; a[ 7] = a[30] - xr; a[30] = a[30] + xr;
1851 xr = a[22]; a[22] = a[15] - xr; a[15] = a[15] + xr;
1852 xr = a[23]; a[23] = a[14] - xr; a[14] = a[14] + xr;
1854 xr = a[20] - a[ 8]; a[ 8] += a[20]; a[20] = shft9(xr) * wp[-10*27+25];
1855 xr = a[21] - a[ 9]; a[ 9] += a[21]; a[21] = shft9(xr) * wp[-10*27+25];
1856 xr = a[18] - a[10]; a[10] += a[18]; a[18] = shft9(xr) * wp[-12*27+25];
1857 xr = a[19] - a[11]; a[11] += a[19]; a[19] = shft9(xr) * wp[-12*27+25];
1858 xr = a[16] - a[12]; a[12] += a[16]; a[16] = shft9(xr) * wp[-14*27+25];
1859 xr = a[17] - a[13]; a[13] += a[17]; a[17] = shft9(xr) * wp[-14*27+25];
1860 xr =-a[20] + a[24]; a[20] += a[24]; a[24] = shft9(xr) * wp[-12*27+25];
1861 xr =-a[21] + a[25]; a[21] += a[25]; a[25] = shft9(xr) * wp[-12*27+25];
1862 xr = a[ 4] - a[ 8]; a[ 4] += a[ 8]; a[ 8] = shft9(xr) * wp[-12*27+25];
1863 xr = a[ 5] - a[ 9]; a[ 5] += a[ 9]; a[ 9] = shft9(xr) * wp[-12*27+25];
1864 xr = a[ 0] - a[12]; a[ 0] += a[12]; a[12] = shft9(xr) * wp[ -4*27+25];
1865 xr = a[ 1] - a[13]; a[ 1] += a[13]; a[13] = shft9(xr) * wp[ -4*27+25];
1866 xr = a[16] - a[28]; a[16] += a[28]; a[28] = shft9(xr) * wp[ -4*27+25];
1867 xr =-a[17] + a[29]; a[17] += a[29]; a[29] = shft9(xr) * wp[ -4*27+25];
1869 xr = SQRT * shft9(a[ 2] - a[10]); a[ 2] += a[10]; a[10] = xr;
1870 xr = SQRT * shft9(a[ 3] - a[11]); a[ 3] += a[11]; a[11] = xr;
1871 xr = SQRT * shft9(a[26] - a[18]); a[18] += a[26]; a[26] = xr - a[18];
1872 xr = SQRT * shft9(a[27] - a[19]); a[19] += a[27]; a[27] = xr - a[19];
1874 xr = a[ 2]; a[19] -= a[ 3]; a[ 3] -= xr; a[ 2] = a[31] - xr; a[31] += xr;
1875 xr = a[ 3]; a[11] -= a[19]; a[18] -= xr; a[ 3] = a[30] - xr; a[30] += xr;
1876 xr = a[18]; a[27] -= a[11]; a[19] -= xr; a[18] = a[15] - xr; a[15] += xr;
1878 xr = a[19]; a[10] -= xr; a[19] = a[14] - xr; a[14] += xr;
1879 xr = a[10]; a[11] -= xr; a[10] = a[23] - xr; a[23] += xr;
1880 xr = a[11]; a[26] -= xr; a[11] = a[22] - xr; a[22] += xr;
1881 xr = a[26]; a[27] -= xr; a[26] = a[ 7] - xr; a[ 7] += xr;
1883 xr = a[27]; a[27] = a[6] - xr; a[6] += xr;
1885 xr = SQRT * shft9(a[ 0] - a[ 4]); a[ 0] += a[ 4]; a[ 4] = xr;
1886 xr = SQRT * shft9(a[ 1] - a[ 5]); a[ 1] += a[ 5]; a[ 5] = xr;
1887 xr = SQRT * shft9(a[16] - a[20]); a[16] += a[20]; a[20] = xr;
1888 xr = SQRT * shft9(a[17] - a[21]); a[17] += a[21]; a[21] = xr;
1889 xr =-SQRT * shft9(a[ 8] - a[12]); a[ 8] += a[12]; a[12] = xr - a[ 8];
1890 xr =-SQRT * shft9(a[ 9] - a[13]); a[ 9] += a[13]; a[13] = xr - a[ 9];
1891 xr =-SQRT * shft9(a[25] - a[29]); a[25] += a[29]; a[29] = xr - a[25];
1892 xr =-SQRT * shft9(a[24] + a[28]); a[24] -= a[28]; a[28] = xr - a[24];
1894 xr = a[24] - a[16]; a[24] = xr;
1895 xr = a[20] - xr; a[20] = xr;
1896 xr = a[28] - xr; a[28] = xr;
1898 xr = a[25] - a[17]; a[25] = xr;
1899 xr = a[21] - xr; a[21] = xr;
1900 xr = a[29] - xr; a[29] = xr;
1902 xr = a[17] - a[1]; a[17] = xr;
1903 xr = a[ 9] - xr; a[ 9] = xr;
1904 xr = a[25] - xr; a[25] = xr;
1905 xr = a[ 5] - xr; a[ 5] = xr;
1906 xr = a[21] - xr; a[21] = xr;
1907 xr = a[13] - xr; a[13] = xr;
1908 xr = a[29] - xr; a[29] = xr;
1910 xr = a[ 1] - a[0]; a[ 1] = xr;
1911 xr = a[16] - xr; a[16] = xr;
1912 xr = a[17] - xr; a[17] = xr;
1913 xr = a[ 8] - xr; a[ 8] = xr;
1914 xr = a[ 9] - xr; a[ 9] = xr;
1915 xr = a[24] - xr; a[24] = xr;
1916 xr = a[25] - xr; a[25] = xr;
1917 xr = a[ 4] - xr; a[ 4] = xr;
1918 xr = a[ 5] - xr; a[ 5] = xr;
1919 xr = a[20] - xr; a[20] = xr;
1920 xr = a[21] - xr; a[21] = xr;
1921 xr = a[12] - xr; a[12] = xr;
1922 xr = a[13] - xr; a[13] = xr;
1923 xr = a[28] - xr; a[28] = xr;
1924 xr = a[29] - xr; a[29] = xr;
1926 xr = a[ 0]; a[ 0] += a[31]; a[31] -= xr;
1927 xr = a[ 1]; a[ 1] += a[30]; a[30] -= xr;
1928 xr = a[16]; a[16] += a[15]; a[15] -= xr;
1929 xr = a[17]; a[17] += a[14]; a[14] -= xr;
1930 xr = a[ 8]; a[ 8] += a[23]; a[23] -= xr;
1931 xr = a[ 9]; a[ 9] += a[22]; a[22] -= xr;
1932 xr = a[24]; a[24] += a[ 7]; a[ 7] -= xr;
1933 xr = a[25]; a[25] += a[ 6]; a[ 6] -= xr;
1934 xr = a[ 4]; a[ 4] += a[27]; a[27] -= xr;
1935 xr = a[ 5]; a[ 5] += a[26]; a[26] -= xr;
1936 xr = a[20]; a[20] += a[11]; a[11] -= xr;
1937 xr = a[21]; a[21] += a[10]; a[10] -= xr;
1938 xr = a[12]; a[12] += a[19]; a[19] -= xr;
1939 xr = a[13]; a[13] += a[18]; a[18] -= xr;
1940 xr = a[28]; a[28] += a[ 3]; a[ 3] -= xr;
1941 xr = a[29]; a[29] += a[ 2]; a[ 2] -= xr;
1944 void mdct_long(int *out, int *in) ICODE_ATTR;
1945 void mdct_long(int *out, int *in)
1947 int ct,st;
1948 int tc1, tc2, tc3, tc4, ts5, ts6, ts7, ts8;
1949 int ts1, ts2, ts3, ts4, tc5, tc6, tc7, tc8;
1951 /* 1,2, 5,6, 9,10, 13,14, 17 */
1952 tc1 = in[17] - in[ 9];
1953 tc3 = in[15] - in[11];
1954 tc4 = in[14] - in[12];
1955 ts5 = in[ 0] + in[ 8];
1956 ts6 = in[ 1] + in[ 7];
1957 ts7 = in[ 2] + in[ 6];
1958 ts8 = in[ 3] + in[ 5];
1960 out[17] = (ts5 + ts7 - ts8) * cx[8] - (ts6 - in[4]) * cx[8];
1961 st = (ts5 + ts7 - ts8) * cx[7] + (ts6 - in[4]) * cx[8];
1962 ct = (tc1 - tc3 - tc4) * cx[6];
1963 out[5] = ct + st;
1964 out[6] = ct - st;
1966 tc2 = (in[16] - in[10]) * cx[6];
1967 ts6 = ts6 * cx[7] + in[4] * cx[8];
1969 ct = tc1 * cx[0] + tc2 + tc3 * cx[1] + tc4 * cx[2];
1970 st = -ts5 * cx[4] + ts6 - ts7 * cx[5] + ts8 * cx[3];
1971 out[1] = ct + st;
1972 out[2] = ct - st;
1974 ct = tc1 * cx[1] - tc2 - tc3 * cx[2] + tc4 * cx[0];
1975 st = -ts5 * cx[5] + ts6 - ts7 * cx[3] + ts8 * cx[4];
1976 out[ 9] = ct + st;
1977 out[10] = ct - st;
1979 ct = tc1 * cx[2] - tc2 + tc3 * cx[0] - tc4 * cx[1];
1980 st = ts5 * cx[3] - ts6 + ts7 * cx[4] - ts8 * cx[5];
1981 out[13] = ct + st;
1982 out[14] = ct - st;
1984 ts1 = in[ 8] - in[ 0];
1985 ts3 = in[ 6] - in[ 2];
1986 ts4 = in[ 5] - in[ 3];
1987 tc5 = in[17] + in[ 9];
1988 tc6 = in[16] + in[10];
1989 tc7 = in[15] + in[11];
1990 tc8 = in[14] + in[12];
1992 out[0] = (tc5 + tc7 + tc8) * cx[8] + (tc6 + in[13]) * cx[8];
1993 ct = (tc5 + tc7 + tc8) * cx[7] - (tc6 + in[13]) * cx[8];
1994 st = (ts1 - ts3 + ts4) * cx[6];
1995 out[11] = ct + st;
1996 out[12] = ct - st;
1998 ts2 = (in[7] - in[1]) * cx[6];
1999 tc6 = in[13] * cx[8] - tc6 * cx[7];
2001 ct = tc5 * cx[3] - tc6 + tc7 * cx[4] + tc8 * cx[5];
2002 st = ts1 * cx[2] + ts2 + ts3 * cx[0] + ts4 * cx[1];
2003 out[3] = ct + st;
2004 out[4] = ct - st;
2006 ct =-tc5 * cx[5] + tc6 - tc7 * cx[3] - tc8 * cx[4];
2007 st = ts1 * cx[1] + ts2 - ts3 * cx[2] - ts4 * cx[0];
2008 out[7] = ct + st;
2009 out[8] = ct - st;
2011 ct =-tc5 * cx[4] + tc6 - tc7 * cx[5] - tc8 * cx[3];
2012 st = ts1 * cx[0] - ts2 + ts3 * cx[1] - ts4 * cx[2];
2013 out[15] = ct + st;
2014 out[16] = ct - st;
2017 static int find_bitrate_index(int type, uint16_t bitrate)
2019 int i;
2021 for(i=0;i<14;i++)
2022 if(bitrate == bitr_index[type][i])
2023 break;
2025 return i;
2028 static int find_samplerate_index(uint16_t freq, int *mp3_type)
2030 int mpg, rate;
2032 /* set default values: MPEG1 at 44100/s */
2033 *mp3_type = 1;
2035 for(mpg=0; mpg<2; mpg++)
2036 for(rate=0; rate<3; rate++)
2037 if(freq == sampr_index[mpg][rate])
2038 { *mp3_type = mpg; return rate; }
2040 return 0;
2043 void init_mp3_encoder_engine(bool stereo, int bitrate, uint16_t sample_rate)
2045 uint32_t avg_byte_per_frame;
2047 #ifdef ROCKBOX_LITTLE_ENDIAN
2048 cfg.byte_order = order_littleEndian;
2049 #else
2050 cfg.byte_order = order_bigEndian;
2051 #endif
2053 if(bitrate < 96 && stereo && sample_rate >= 32000)
2054 { /* use MPEG2 format */
2055 sample_rate >>= 1;
2056 cfg.resample = 1;
2057 cfg.granules = 1;
2059 else
2060 { /* use MPEG1 format */
2061 cfg.resample = 0;
2062 cfg.granules = 2;
2065 cfg.samplerate = sample_rate;
2066 cfg.channels = stereo ? 2 : 1;
2067 cfg.mpg.mode = stereo ? 0 : 3; /* 0=stereo, 3=mono */
2068 cfg.mpg.bitrate = stereo ? bitrate : bitrate > 160 ? 160 : bitrate;
2069 cfg.mpg.smpl_id = find_samplerate_index(cfg.samplerate, &cfg.mpg.type);
2070 cfg.mpg.bitr_id = find_bitrate_index(cfg.mpg.type, cfg.mpg.bitrate);
2071 cfg.mpg.num_bands = num_bands[stereo ? cfg.mpg.type : 2][cfg.mpg.bitr_id];
2073 scalefac = sfBand[cfg.mpg.smpl_id + 3*cfg.mpg.type];
2075 ht[ 0].table = NULL; ht[ 0].hlen = NULL; /* Apparently not used */
2076 ht[ 1].table = t1HB; ht[ 1].hlen = t1l;
2077 ht[ 2].table = t2HB; ht[ 2].hlen = t2l;
2078 ht[ 3].table = t3HB; ht[ 3].hlen = t3l;
2079 ht[ 4].table = NULL; ht[ 4].hlen = NULL; /* Apparently not used */
2080 ht[ 5].table = t5HB; ht[ 5].hlen = t5l;
2081 ht[ 6].table = t6HB; ht[ 6].hlen = t6l;
2082 ht[ 7].table = t7HB; ht[ 7].hlen = t7l;
2083 ht[ 8].table = t8HB; ht[ 8].hlen = t8l;
2084 ht[ 9].table = t9HB; ht[ 9].hlen = t9l;
2085 ht[10].table = t10HB; ht[10].hlen = t10l;
2086 ht[11].table = t11HB; ht[11].hlen = t11l;
2087 ht[12].table = t12HB; ht[12].hlen = t12l;
2088 ht[13].table = t13HB; ht[13].hlen = t13l;
2089 ht[14].table = NULL; ht[14].hlen = NULL; /* Apparently not used */
2090 ht[15].table = t15HB; ht[15].hlen = t15l;
2092 /* Figure average number of 'bytes' per frame */
2093 avg_byte_per_frame = SAMPL2 * 16000 * cfg.mpg.bitrate / (2 - cfg.mpg.type);
2094 avg_byte_per_frame = avg_byte_per_frame / cfg.samplerate;
2095 cfg.byte_per_frame = avg_byte_per_frame / 64;
2096 cfg.frac_per_frame = avg_byte_per_frame & 63;
2097 cfg.slot_lag = 0;
2098 cfg.sideinfo_len = 32 + (cfg.mpg.type ? (cfg.channels == 1 ? 136 : 256)
2099 : (cfg.channels == 1 ? 72 : 136));
2102 void set_scale_facs(int *mdct_freq)
2104 unsigned int i, is, ie, k, s;
2105 int max_freq_val, avrg_freq_val;
2107 /* calc average of first 256 frequency values */
2108 for(avrg_freq_val=i=0; i<256; i++)
2109 avrg_freq_val += mdct_freq[i];
2110 avrg_freq_val >>= 8;
2112 /* if max of current band is smaller than average, increase precision */
2113 /* last band keeps untouched (not scaled) */
2114 for(is=k=0; is<scalefac[21]; k++)
2116 max_freq_val = 0;
2118 for(i=is, ie=scalefac[k+1]; i<ie; i++)
2119 if(max_freq_val < mdct_freq[i])
2120 max_freq_val = mdct_freq[i];
2122 for(s=0; s<3; s++)
2123 if((max_freq_val<<s) > avrg_freq_val)
2124 break;
2126 band_scale_f[k] = (unsigned char)s;
2128 for(i=is; s && i<ie; i++)
2129 mdct_freq[i] <<= s;
2131 is = ie;
2135 void compress(void)
2137 int i, gr, gr_cnt;
2138 uint32_t max;
2140 while(1)
2142 if((frames & 7) == 0)
2143 { rb->lcd_clear_display();
2144 rb->lcd_putsxyf(4, 20, "Frame %d / %d", frames, wav_size/SAMPL2/8);
2145 rb->lcd_update();
2147 /* encode one mp3 frame in this loop */
2148 memset(CodedData.bbuf, 0, sizeof(CodedData.bbuf));
2150 if((cfg.slot_lag += cfg.frac_per_frame) >= 64)
2151 { /* Padding for this frame */
2152 cfg.slot_lag -= 64;
2153 cfg.mpg.padding = 1;
2155 else
2156 cfg.mpg.padding = 0;
2158 cfg.mean_bits = (8 * cfg.byte_per_frame + 8 * cfg.mpg.padding
2159 - cfg.sideinfo_len) / cfg.granules / cfg.channels
2160 - 42; // reserved for scale_facs
2162 /* shift out old samples */
2163 memcpy(mfbuf, mfbuf + 2*cfg.granules*576, 4*512);
2165 /* read new samples to iram for further processing */
2166 if(read_samples((uint32_t*)(mfbuf + 2*512), SAMP_PER_FRAME) == 0)
2167 break;
2169 /* swap bytes if neccessary */
2170 if(cfg.byte_order == order_bigEndian)
2171 for(i=0; i<SAMP_PER_FRAME; i++)
2173 uint32_t t = ((uint32_t*)mfbuf)[512 + i];
2174 t = ((t >> 8) & 0xff00ff) | ((t << 8) & 0xff00ff00);
2175 ((uint32_t*)mfbuf)[512 + i] = t;
2178 if(cfg.resample) /* downsample to half of original */
2179 for(i=2*512; i<2*512+2*SAMP_PER_FRAME; i+=4)
2181 mfbuf[i/2+512] = (short)(((int)mfbuf[i+0] + mfbuf[i+2]) >> 1);
2182 mfbuf[i/2+513] = (short)(((int)mfbuf[i+1] + mfbuf[i+3]) >> 1);
2185 if(cfg.channels == 1) /* mix left and right channels to mono */
2186 for(i=2*512; i<2*512+2*SAMP_PER_FRAME; i+=2)
2187 mfbuf[i] = mfbuf[i+1] = (short)(((int)mfbuf[i] + mfbuf[i+1]) >> 1);
2189 cfg.ResvSize = 0;
2190 gr_cnt = cfg.granules * cfg.channels;
2191 CodedData.bitpos = cfg.sideinfo_len; /* leave space for mp3 header */
2193 for(gr=0; gr<cfg.granules; gr++)
2195 short *wk = mfbuf + 2*286 + gr*1152;
2196 int ch;
2198 /* 16bit packed wav data can be windowed efficiently on coldfire */
2199 window_subband1(wk, sb_data[0][1-gr][0], sb_data[1][1-gr][0]);
2201 for(ch=0; ch<cfg.channels; ch++)
2203 int ii, k, shift;
2205 wk = mfbuf + 2*286 + gr*1152 + ch;
2207 /* 36864=4*18*16*32 */
2208 for(k=0; k<18; k++, wk+=64)
2210 window_subband2(wk, sb_data[ch][1-gr][k]);
2211 /* Compensate for inversion in the analysis filter */
2212 if(k & 1)
2214 int band;
2215 for(band=1; band<32; band+=2)
2216 sb_data[ch][1-gr][k][band] *= -1;
2220 /* Perform imdct of 18 previous + 18 current subband samples */
2221 /* for integer precision do this loop again (if neccessary) */
2222 shift = 14 - (cfg.cod_info[gr][ch].additStep >> 2);
2223 for(k=1,ii=0; ii<3 && k; ii++)
2225 int *mdct = mdct_freq;
2226 int band;
2228 cfg.cod_info[gr][ch].additStep = 4 * (14 - shift);
2229 for(band=0; band<cfg.mpg.num_bands; band++, mdct+=18)
2231 int *band0 = sb_data[ch][ gr][0] + order[band];
2232 int *band1 = sb_data[ch][1-gr][0] + order[band];
2233 int work[18];
2235 /* 9216=4*32*9*8 */
2236 for(k=-9; k<0; k++)
2238 int a = shft_n(band1[(k+9)*32], shift);
2239 int b = shft_n(band1[(8-k)*32], shift);
2240 int c = shft_n(band0[(k+9)*32], shift);
2241 int d = shft_n(band0[(8-k)*32], shift);
2243 work[k+ 9] = shft16(a * win[k+ 9][0] +
2244 b * win[k+ 9][1] +
2245 c * win[k+ 9][2] +
2246 d * win[k+ 9][3]);
2248 work[k+18] = shft16(c * win[k+18][0] +
2249 d * win[k+18][1] +
2250 a * win[k+18][2] +
2251 b * win[k+18][3]);
2254 /* 7200=4*18*100 */
2255 mdct_long(mdct, work);
2257 /* Perform aliasing reduction butterfly */
2258 if(band != 0)
2260 for(k=7; k>=0; --k)
2262 int bu, bd;
2263 bu = shft15(mdct[k]) * ca[k] +
2264 shft15(mdct[-1-k]) * cs[k];
2265 bd = shft15(mdct[k]) * cs[k] -
2266 shft15(mdct[-1-k]) * ca[k];
2267 mdct[-1-k] = bu;
2268 mdct[ k ] = bd;
2273 max = 0;
2274 for(k=0; k<576; k++)
2276 if(mdct_freq[k] < 0)
2278 mdct_sign[k] = 1; /* negative */
2279 mdct_freq[k] = shft13(-mdct_freq[k]);
2281 else
2283 mdct_sign[k] = 0; /* positive */
2284 mdct_freq[k] = shft13(mdct_freq[k]);
2287 if(max < (uint32_t)mdct_freq[k])
2288 max = (uint32_t)mdct_freq[k];
2291 cfg.cod_info[gr][ch].max_val = max;
2293 /* calc new shift for higher integer precision */
2294 for(k=0; max<(uint32_t)(0x7800>>k); k++) shift--;
2295 for( ; (max>>k)>=(uint32_t)0x10000; k++) shift++;
2296 if(shift < 0) shift = 0;
2299 cfg.cod_info[gr][ch].quantStep +=
2300 cfg.cod_info[gr][ch].additStep;
2302 set_scale_facs(mdct_freq);
2304 /* bit and noise allocation */
2305 iteration_loop(mdct_freq, &cfg.cod_info[gr][ch],
2306 gr_cnt--);
2307 /* write the frame to the bitstream */
2308 Huffmancodebits(enc_data, mdct_sign,
2309 &cfg.cod_info[gr][ch]);
2311 cfg.cod_info[gr][ch].quantStep -=
2312 cfg.cod_info[gr][ch].additStep;
2314 if(cfg.granules == 1)
2316 memcpy(sb_data[ch][0], sb_data[ch][1],
2317 sizeof(sb_data[ch][0]));
2322 enc_size = (CodedData.bitpos + 7) >> 3;
2323 /* finish this chunk by adding sideinfo header data */
2324 CodedData.bitpos = 0;
2325 encodeSideInfo( cfg.cod_info );
2327 if(cfg.byte_order != order_bigEndian)
2328 for(i=0; i<(enc_size+3)/4; i++)
2329 CodedData.bbuf[i] = myswap32(CodedData.bbuf[i]);
2331 if(enc_chunk + enc_size > (int)enc_buffer_size)
2333 /* copy iram mp3 buffer to sdram/file */
2334 rb->write(mp3file, enc_buffer, enc_chunk & ~3);
2335 memcpy(enc_buffer, enc_buffer + (enc_chunk >> 2), enc_chunk & 3);
2336 enc_chunk &= 3;
2339 memcpy(enc_buffer + enc_chunk, CodedData.bbuf, enc_size);
2340 enc_chunk += enc_size;
2341 frames++;
2343 /* write last chunks to disk */
2344 rb->write(mp3file, enc_buffer, enc_chunk);
2348 int num_file;
2349 char mp3_name[80];
2351 void get_mp3_filename(const char *wav_name)
2353 rb->strlcpy(mp3_name, wav_name, sizeof(mp3_name));
2354 rb->strlcpy(mp3_name + rb->strlen(mp3_name) - 4, ".mp3", 5);
2357 #if CONFIG_KEYPAD == IRIVER_H100_PAD || CONFIG_KEYPAD == IRIVER_H300_PAD
2358 #define MP3ENC_PREV BUTTON_UP
2359 #define MP3ENC_NEXT BUTTON_DOWN
2360 #define MP3ENC_DONE BUTTON_OFF
2361 #define MP3ENC_SELECT BUTTON_SELECT
2363 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \
2364 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
2365 #define MP3ENC_PREV BUTTON_SCROLL_BACK
2366 #define MP3ENC_NEXT BUTTON_SCROLL_FWD
2367 #define MP3ENC_DONE BUTTON_MENU
2368 #define MP3ENC_SELECT BUTTON_SELECT
2370 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
2371 #define MP3ENC_PREV BUTTON_UP
2372 #define MP3ENC_NEXT BUTTON_DOWN
2373 #define MP3ENC_DONE BUTTON_POWER
2374 #define MP3ENC_SELECT BUTTON_SELECT
2376 #elif CONFIG_KEYPAD == GIGABEAT_PAD
2377 #define MP3ENC_PREV BUTTON_UP
2378 #define MP3ENC_NEXT BUTTON_DOWN
2379 #define MP3ENC_DONE BUTTON_POWER
2380 #define MP3ENC_SELECT BUTTON_SELECT
2382 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
2383 (CONFIG_KEYPAD == SANSA_C200_PAD) || \
2384 (CONFIG_KEYPAD == SANSA_CLIP_PAD) || \
2385 (CONFIG_KEYPAD == SANSA_M200_PAD)
2386 #define MP3ENC_PREV BUTTON_UP
2387 #define MP3ENC_NEXT BUTTON_DOWN
2388 #define MP3ENC_DONE BUTTON_POWER
2389 #define MP3ENC_SELECT BUTTON_SELECT
2391 #elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
2392 #define MP3ENC_PREV BUTTON_SCROLL_BACK
2393 #define MP3ENC_NEXT BUTTON_SCROLL_FWD
2394 #define MP3ENC_DONE BUTTON_UP
2395 #define MP3ENC_SELECT BUTTON_SELECT
2397 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
2398 #define MP3ENC_PREV BUTTON_SCROLL_UP
2399 #define MP3ENC_NEXT BUTTON_SCROLL_DOWN
2400 #define MP3ENC_DONE BUTTON_POWER
2401 #define MP3ENC_SELECT BUTTON_PLAY
2403 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
2404 #define MP3ENC_PREV BUTTON_UP
2405 #define MP3ENC_NEXT BUTTON_DOWN
2406 #define MP3ENC_DONE BUTTON_BACK
2407 #define MP3ENC_SELECT BUTTON_SELECT
2409 #elif CONFIG_KEYPAD == MROBE100_PAD
2410 #define MP3ENC_PREV BUTTON_UP
2411 #define MP3ENC_NEXT BUTTON_DOWN
2412 #define MP3ENC_DONE BUTTON_POWER
2413 #define MP3ENC_SELECT BUTTON_SELECT
2415 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
2416 #define MP3ENC_PREV BUTTON_RC_VOL_UP
2417 #define MP3ENC_NEXT BUTTON_RC_VOL_DOWN
2418 #define MP3ENC_DONE BUTTON_RC_REC
2419 #define MP3ENC_SELECT BUTTON_RC_FF
2421 #elif CONFIG_KEYPAD == COWON_D2_PAD
2422 #define MP3ENC_DONE BUTTON_POWER
2424 #elif CONFIG_KEYPAD == IAUDIO67_PAD
2425 #define MP3ENC_PREV BUTTON_LEFT
2426 #define MP3ENC_NEXT BUTTON_RIGHT
2427 #define MP3ENC_DONE BUTTON_POWER
2428 #define MP3ENC_SELECT BUTTON_PLAY
2430 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
2431 #define MP3ENC_PREV BUTTON_UP
2432 #define MP3ENC_NEXT BUTTON_DOWN
2433 #define MP3ENC_DONE BUTTON_BACK
2434 #define MP3ENC_SELECT BUTTON_SELECT
2436 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
2437 #define MP3ENC_PREV BUTTON_UP
2438 #define MP3ENC_NEXT BUTTON_DOWN
2439 #define MP3ENC_DONE BUTTON_POWER
2440 #define MP3ENC_SELECT BUTTON_SELECT
2442 #elif CONFIG_KEYPAD == PHILIPS_HDD6330_PAD
2443 #define MP3ENC_PREV BUTTON_UP
2444 #define MP3ENC_NEXT BUTTON_DOWN
2445 #define MP3ENC_DONE BUTTON_POWER
2446 #define MP3ENC_SELECT BUTTON_PLAY
2448 #elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
2449 #define MP3ENC_PREV BUTTON_UP
2450 #define MP3ENC_NEXT BUTTON_DOWN
2451 #define MP3ENC_DONE BUTTON_POWER
2452 #define MP3ENC_SELECT BUTTON_PLAY
2454 #elif CONFIG_KEYPAD == ONDAVX747_PAD || \
2455 CONFIG_KEYPAD == ONDAVX777_PAD || \
2456 CONFIG_KEYPAD == MROBE500_PAD
2457 #define MP3ENC_DONE BUTTON_POWER
2459 #elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
2460 #define MP3ENC_PREV BUTTON_UP
2461 #define MP3ENC_NEXT BUTTON_DOWN
2462 #define MP3ENC_DONE BUTTON_PLAY
2463 #define MP3ENC_SELECT BUTTON_RIGHT
2465 #elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
2466 #define MP3ENC_PREV BUTTON_UP
2467 #define MP3ENC_NEXT BUTTON_DOWN
2468 #define MP3ENC_DONE BUTTON_REC
2469 #define MP3ENC_SELECT BUTTON_OK
2471 #elif CONFIG_KEYPAD == MPIO_HD200_PAD
2472 #define MP3ENC_PREV BUTTON_REW
2473 #define MP3ENC_NEXT BUTTON_FF
2474 #define MP3ENC_DONE BUTTON_PLAY
2475 #define MP3ENC_SELECT BUTTON_FUNC
2477 #elif CONFIG_KEYPAD == MPIO_HD300_PAD
2478 #define MP3ENC_PREV BUTTON_REW
2479 #define MP3ENC_NEXT BUTTON_FF
2480 #define MP3ENC_DONE BUTTON_PLAY
2481 #define MP3ENC_SELECT BUTTON_ENTER
2483 #else
2484 #error No keymap defined!
2485 #endif
2487 #ifdef HAVE_TOUCHSCREEN
2488 #ifndef MP3ENC_PREV
2489 #define MP3ENC_PREV BUTTON_MIDLEFT
2490 #endif
2491 #ifndef MP3ENC_NEXT
2492 #define MP3ENC_NEXT BUTTON_MIDRIGHT
2493 #endif
2494 #ifndef MP3ENC_DONE
2495 #define MP3ENC_DONE BUTTON_TOPLEFT
2496 #endif
2497 #ifndef MP3ENC_SELECT
2498 #define MP3ENC_SELECT BUTTON_CENTER
2499 #endif
2500 #endif
2502 enum plugin_status plugin_start(const void* parameter)
2504 int rat, srat, nrat; /* for rate selection */
2505 int cont = 1, butt;
2506 int ret;
2507 long tim = 0;
2508 static const char* bstrg[] = {
2509 "64", "80", "96", "112", "128", "160", "192", "224", "256", "320"
2511 static const int brate[] = {
2512 64, 80, 96, 112, 128, 160, 192, 224, 256, 320
2515 if (parameter == NULL)
2516 return PLUGIN_ERROR;
2518 enc_buffer = rb->plugin_get_audio_buffer(&enc_buffer_size);
2520 #ifdef CPU_COLDFIRE
2521 coldfire_set_macsr(0); /* integer mode */
2522 #endif
2524 rb->lcd_setfont(FONT_SYSFIXED);
2526 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
2527 rb->cpu_boost(true);
2528 #endif
2529 rb->button_clear_queue();
2531 nrat = 9;
2532 srat = 4; /* set 128kBit as default */
2534 while(cont && (butt = rb->button_get_w_tmo(HZ/10)) != MP3ENC_SELECT)
2536 switch(butt)
2538 case MP3ENC_DONE: cont = 0; break;
2539 case MP3ENC_PREV|BUTTON_REPEAT:
2540 case MP3ENC_PREV: if(srat > 0 ) srat--; break;
2541 case MP3ENC_NEXT|BUTTON_REPEAT:
2542 case MP3ENC_NEXT: if(srat < nrat) srat++; break;
2545 rb->lcd_clear_display();
2546 rb->lcd_putsxy(2, 2, "-- Select Bitrate --");
2548 for(rat=0; rat<=nrat; rat++)
2549 rb->lcd_putsxy(2, 12 + rat*8, bstrg[rat]);
2550 rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
2551 rb->lcd_fillrect(0, 12 + srat*8, 127, 8);
2552 rb->lcd_set_drawmode(DRMODE_SOLID);
2553 rb->lcd_update();
2556 wav_filename = parameter;
2558 if(cont)
2560 ret = wave_open();
2561 if(ret == 0)
2563 init_mp3_encoder_engine(true, brate[srat], cfg.samplerate);
2564 get_mp3_filename(wav_filename);
2565 mp3file = rb->open(mp3_name , O_WRONLY|O_CREAT|O_TRUNC, 0666);
2566 frames = 0;
2568 tim = *rb->current_tick;
2569 compress();
2570 tim = *rb->current_tick - tim;
2572 rb->close(wavfile);
2573 rb->close(mp3file);
2574 rb->reload_directory();
2576 else
2578 rb->close(wavfile);
2579 rb->lcd_putsxyf(0, 20, "WaveOpen failed %d", ret);
2580 rb->lcd_update();
2581 rb->sleep(5*HZ);
2584 rb->lcd_clear_display();
2585 rb->lcd_putsxyf(0, 30, " Conversion: %ld.%02lds ", tim/100, tim%100);
2586 tim = frames * SAMP_PER_FRAME * 100 / 44100; /* unit=.01s */
2587 rb->lcd_putsxyf(0, 20, " WAV-Length: %ld.%02lds ", tim/100, tim%100);
2588 rb->lcd_update();
2589 rb->sleep(5*HZ);
2592 rb->lcd_setfont(FONT_UI);
2593 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
2594 rb->cpu_boost(false);
2595 #endif
2596 return PLUGIN_OK;