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