Improve SDL port 'configure --prefix' error message
[kugel-rb.git] / apps / plugins / mp3_encoder.c
blob4094b4c34f50d3b69b5795074901d20a4bd044fe
1 /* Shine is an MP3 encoder
2 * Copyright (C) 1999-2000 Gabriel Bouvigne
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details. */
14 #include <inttypes.h>
15 #include "plugin.h"
18 #define MAX_SAMP_PER_FRAME 1152
19 #define SAMPL2 576
20 #define SBLIMIT 32
21 #define HTN 16
22 #define putlong(c, s) if(s+sz <= 32) { cc = (cc << s) | c; sz+= s; } \
23 else { putbits(cc, sz); cc = c; sz = s; }
25 enum e_byte_order { order_unknown, order_bigEndian, order_littleEndian };
27 typedef struct {
28 int type; /* 0=(MPEG2 - 22.05,24,16kHz) 1=(MPEG1 - 44.1,48,32kHz) */
29 int mode; /* 0=stereo, 1=jstereo, 2=dual, 3=mono */
30 int padding;
31 long bitr_id;
32 int smpl_id;
33 uint16_t bitrate;
34 uint8_t num_bands;
35 } mpeg_t;
37 /* Side information */
38 typedef struct {
39 uint32_t part2_3_length;
40 int count1; /* number of 0-1-quadruples */
41 uint32_t global_gain;
42 uint32_t table_select[4];
43 uint32_t address1;
44 uint32_t address2;
45 uint32_t address3;
46 long quantStep;
47 long additStep;
48 uint32_t max_val;
49 uint8_t region_0_1;
50 } side_info_t;
52 typedef struct {
53 enum e_byte_order byte_order;
54 side_info_t cod_info[2][2];
55 mpeg_t mpg;
56 long frac_per_frame;
57 long byte_per_frame;
58 long slot_lag;
59 int sideinfo_len;
60 int mean_bits;
61 int ResvSize;
62 int channels;
63 int granules;
64 int smpl_per_frm;
65 uint16_t samplerate;
66 } config_t;
68 typedef struct {
69 int bitpos; /* current bitpos for writing */
70 uint32_t bbuf[263];
71 } BF_Data;
73 struct huffcodetab {
74 const uint8_t len; /* max. index */
75 const uint8_t const *table; /* pointer to array[len][len] */
76 const uint8_t const *hlen; /* pointer to array[len][len] */
79 struct huffcodebig {
80 const uint8_t len; /* max. index */
81 const uint8_t linbits; /* number of linbits */
82 const uint16_t linmax; /* max number stored in linbits */
85 #define shft4(x) ((x + 8) >> 4)
86 #define shft9(x) ((x + 256) >> 9)
87 #define shft13(x) ((x + 4096) >> 13)
88 #define shft15(x) ((x + 16384) >> 15)
89 #define shft16(x) ((x + 32768) >> 16)
90 #define shft_n(x,n) ((x) >> n)
91 #define SQRT 724 /* sqrt(2) * 512 */
93 static short mfbuf [2*(1152+512)] IBSS_ATTR; /* 6656 Bytes */
94 static int sb_data [2][2][18][SBLIMIT] IBSS_ATTR; /* 9216 Bytes */
95 static int mdct_freq [SAMPL2] IBSS_ATTR; /* 2304 Bytes */
96 static char mdct_sign [SAMPL2] IBSS_ATTR; /* 576 Bytes */
97 static short enc_data [SAMPL2] IBSS_ATTR; /* 1152 Bytes */
98 static BF_Data CodedData IBSS_ATTR; /* 1056 Bytes */
100 static const uint16_t sfBand[6][23] ICONST_ATTR;
101 static const uint16_t const *scalefac IBSS_ATTR;
103 static const int16_t ca [8] ICONST_ATTR; /* 16 Bytes */
104 static const uint16_t cs [8] ICONST_ATTR; /* 16 Bytes */
105 static const int16_t cx [9] ICONST_ATTR; /* 18 Bytes */
106 static const int16_t win [18][4] ICONST_ATTR; /* 144 Bytes */
107 static const int16_t enwindow [15*27+24] ICONST_ATTR; /* 862 Bytes */
108 static const uint16_t int2idx [4096] ICONST_ATTR; /* 8192 Bytes */
109 static const uint8_t ht_count[2][2][16] ICONST_ATTR; /* 64 Bytes */
110 static const uint32_t tab01 [ 16] ICONST_ATTR; /* 64 Bytes */
111 static const uint32_t tab23 [ 9] ICONST_ATTR; /* 36 Bytes */
112 static const uint32_t tab56 [ 16] ICONST_ATTR; /* 64 Bytes */
113 static const uint32_t tab1315 [256] ICONST_ATTR; /* 1024 Bytes */
114 static const uint32_t tab1624 [256] ICONST_ATTR; /* 1024 Bytes */
115 static const uint32_t tab789 [ 36] ICONST_ATTR; /* 144 Bytes */
116 static const uint32_t tabABC [ 64] ICONST_ATTR; /* 256 Bytes */
117 static const uint8_t t1HB [ 4] ICONST_ATTR;
118 static const uint8_t t2HB [ 9] ICONST_ATTR;
119 static const uint8_t t3HB [ 9] ICONST_ATTR;
120 static const uint8_t t5HB [ 16] ICONST_ATTR;
121 static const uint8_t t6HB [ 16] ICONST_ATTR;
122 static const uint8_t t7HB [ 36] ICONST_ATTR;
123 static const uint8_t t8HB [ 36] ICONST_ATTR;
124 static const uint8_t t9HB [ 36] ICONST_ATTR;
125 static const uint8_t t10HB [ 64] ICONST_ATTR;
126 static const uint8_t t11HB [ 64] ICONST_ATTR;
127 static const uint8_t t12HB [ 64] ICONST_ATTR;
128 static const uint8_t t13HB [256] ICONST_ATTR;
129 static const uint8_t t15HB [256] ICONST_ATTR;
130 static const uint16_t t16HB [256] ICONST_ATTR;
131 static const uint16_t t24HB [256] ICONST_ATTR;
132 static const uint8_t t1l [ 8] ICONST_ATTR;
133 static const uint8_t t2l [ 9] ICONST_ATTR;
134 static const uint8_t t3l [ 9] ICONST_ATTR;
135 static const uint8_t t5l [ 16] ICONST_ATTR;
136 static const uint8_t t6l [ 16] ICONST_ATTR;
137 static const uint8_t t7l [ 36] ICONST_ATTR;
138 static const uint8_t t8l [ 36] ICONST_ATTR;
139 static const uint8_t t9l [ 36] ICONST_ATTR;
140 static const uint8_t t10l [ 64] ICONST_ATTR;
141 static const uint8_t t11l [ 64] ICONST_ATTR;
142 static const uint8_t t12l [ 64] ICONST_ATTR;
143 static const uint8_t t13l [256] ICONST_ATTR;
144 static const uint8_t t15l [256] ICONST_ATTR;
145 static const uint8_t t16l [256] ICONST_ATTR;
146 static const uint8_t t24l [256] ICONST_ATTR;
147 static struct huffcodetab ht [HTN] IDATA_ATTR;
149 static const uint8_t ht_count[2][2][16] =
150 { { { 1, 5, 4, 5, 6, 5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1 }, /* table0 */
151 { 1, 5, 5, 7, 5, 8, 7, 9, 5, 7, 7, 9, 7, 9, 9,10 } }, /* hleng0 */
152 { {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, /* table1 */
153 { 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 } } }; /* hleng1 */
155 static const uint8_t t1HB[4] = {1,1,1,0};
156 static const uint8_t t2HB[9] = {1,2,1,3,1,1,3,2,0};
157 static const uint8_t t3HB[9] = {3,2,1,1,1,1,3,2,0};
158 static const uint8_t t5HB[16] = {1,2,6,5,3,1,4,4,7,5,7,1,6,1,1,0};
159 static const uint8_t t6HB[16] = {7,3,5,1,6,2,3,2,5,4,4,1,3,3,2,0};
161 static const uint8_t t7HB[36] =
162 { 1, 2,10,19,16,10, 3, 3, 7,10, 5, 3,11, 4,13,17, 8, 4,
163 12,11,18,15,11, 2, 7, 6, 9,14, 3, 1, 6, 4, 5, 3, 2, 0 };
165 static const uint8_t t8HB[36] =
166 { 3, 4, 6,18,12, 5, 5, 1, 2,16, 9, 3, 7, 3, 5,14, 7, 3,
167 19,17,15,13,10, 4,13, 5, 8,11, 5, 1,12, 4, 4, 1, 1, 0 };
169 static const uint8_t t9HB[36] =
170 { 7, 5, 9,14,15, 7, 6, 4, 5, 5, 6, 7, 7, 6, 8, 8, 8, 5,
171 15, 6, 9,10, 5, 1,11, 7, 9, 6, 4, 1,14, 4, 6, 2, 6, 0 };
173 static const uint8_t t10HB[64] =
174 {1,2,10,23,35,30,12,17,3,3,8,12,18,21,12,7,11,9,15,21,32,
175 40,19,6,14,13,22,34,46,23,18,7,20,19,33,47,27,22,9,3,31,22,
176 41,26,21,20,5,3,14,13,10,11,16,6,5,1,9,8,7,8,4,4,2,0 };
178 static const uint8_t t11HB[64] =
179 {3,4,10,24,34,33,21,15,5,3,4,10,32,17,11,10,11,7,13,18,30,
180 31,20,5,25,11,19,59,27,18,12,5,35,33,31,58,30,16,7,5,28,26,
181 32,19,17,15,8,14,14,12,9,13,14,9,4,1,11,4,6,6,6,3,2,0 };
183 static const uint8_t t12HB[64] =
184 {9,6,16,33,41,39,38,26,7,5,6,9,23,16,26,11,17,7,11,14,21,
185 30,10,7,17,10,15,12,18,28,14,5,32,13,22,19,18,16,9,5,40,17,
186 31,29,17,13,4,2,27,12,11,15,10,7,4,1,27,12,8,12,6,3,1,0 };
188 static const uint8_t t13HB[256] =
189 {1,5,14,21,34,51,46,71,42,52,68,52,67,44,43,19,3,4,12,19,31,26,44,33,31,24,32,
190 24,31,35,22,14,15,13,23,36,59,49,77,65,29,40,30,40,27,33,42,16,22,20,37,61,56,
191 79,73,64,43,76,56,37,26,31,25,14,35,16,60,57,97,75,114,91,54,73,55,41,48,53,
192 23,24,58,27,50,96,76,70,93,84,77,58,79,29,74,49,41,17,47,45,78,74,115,94,90,
193 79,69,83,71,50,59,38,36,15,72,34,56,95,92,85,91,90,86,73,77,65,51,44,43,42,43,
194 20,30,44,55,78,72,87,78,61,46,54,37,30,20,16,53,25,41,37,44,59,54,81,66,76,57,
195 54,37,18,39,11,35,33,31,57,42,82,72,80,47,58,55,21,22,26,38,22,53,25,23,38,70,
196 60,51,36,55,26,34,23,27,14,9,7,34,32,28,39,49,75,30,52,48,40,52,28,18,17,9,5,
197 45,21,34,64,56,50,49,45,31,19,12,15,10,7,6,3,48,23,20,39,36,35,53,21,16,23,13,
198 10,6,1,4,2,16,15,17,27,25,20,29,11,17,12,16,8,1,1,0,1 };
200 static const uint8_t t15HB[256] =
201 {7,12,18,53,47,76,124,108,89,123,108,119,107,81,122,63,13,5,16,27,46,36,61,51,
202 42,70,52,83,65,41,59,36,19,17,15,24,41,34,59,48,40,64,50,78,62,80,56,33,29,28,
203 25,43,39,63,55,93,76,59,93,72,54,75,50,29,52,22,42,40,67,57,95,79,72,57,89,69,
204 49,66,46,27,77,37,35,66,58,52,91,74,62,48,79,63,90,62,40,38,125,32,60,56,50,
205 92,78,65,55,87,71,51,73,51,70,30,109,53,49,94,88,75,66,122,91,73,56,42,64,44,
206 21,25,90,43,41,77,73,63,56,92,77,66,47,67,48,53,36,20,71,34,67,60,58,49,88,76,
207 67,106,71,54,38,39,23,15,109,53,51,47,90,82,58,57,48,72,57,41,23,27,62,9,86,
208 42,40,37,70,64,52,43,70,55,42,25,29,18,11,11,118,68,30,55,50,46,74,65,49,39,
209 24,16,22,13,14,7,91,44,39,38,34,63,52,45,31,52,28,19,14,8,9,3,123,60,58,53,47,
210 43,32,22,37,24,17,12,15,10,2,1,71,37,34,30,28,20,17,26,21,16,10,6,8,6,2,0};
212 static const uint16_t t16HB[256] =
213 {1,5,14,44,74,63,110,93,172,149,138,242,225,195,376,17,3,4,12,20,35,62,53,47,
214 83,75,68,119,201,107,207,9,15,13,23,38,67,58,103,90,161,72,127,117,110,209,
215 206,16,45,21,39,69,64,114,99,87,158,140,252,212,199,387,365,26,75,36,68,65,
216 115,101,179,164,155,264,246,226,395,382,362,9,66,30,59,56,102,185,173,265,142,
217 253,232,400,388,378,445,16,111,54,52,100,184,178,160,133,257,244,228,217,385,
218 366,715,10,98,48,91,88,165,157,148,261,248,407,397,372,380,889,884,8,85,84,81,
219 159,156,143,260,249,427,401,392,383,727,713,708,7,154,76,73,141,131,256,245,
220 426,406,394,384,735,359,710,352,11,139,129,67,125,247,233,229,219,393,743,737,
221 720,885,882,439,4,243,120,118,115,227,223,396,746,742,736,721,712,706,223,436,
222 6,202,224,222,218,216,389,386,381,364,888,443,707,440,437,1728,4,747,211,210,
223 208,370,379,734,723,714,1735,883,877,876,3459,865,2,377,369,102,187,726,722,
224 358,711,709,866,1734,871,3458,870,434,0,12,10,7,11,10,17,11,9,13,12,10,7,5,3,
225 1,3};
227 static const uint16_t t24HB[256] =
228 {15,13,46,80,146,262,248,434,426,669,653,649,621,517,1032,88,14,12,21,38,71,
229 130,122,216,209,198,327,345,319,297,279,42,47,22,41,74,68,128,120,221,207,194,
230 182,340,315,295,541,18,81,39,75,70,134,125,116,220,204,190,178,325,311,293,
231 271,16,147,72,69,135,127,118,112,210,200,188,352,323,306,285,540,14,263,66,
232 129,126,119,114,214,202,192,180,341,317,301,281,262,12,249,123,121,117,113,
233 215,206,195,185,347,330,308,291,272,520,10,435,115,111,109,211,203,196,187,
234 353,332,313,298,283,531,381,17,427,212,208,205,201,193,186,177,169,320,303,
235 286,268,514,377,16,335,199,197,191,189,181,174,333,321,305,289,275,521,379,
236 371,11,668,184,183,179,175,344,331,314,304,290,277,530,383,373,366,10,652,346,
237 171,168,164,318,309,299,287,276,263,513,375,368,362,6,648,322,316,312,307,302,
238 292,284,269,261,512,376,370,364,359,4,620,300,296,294,288,282,273,266,515,380,
239 374,369,365,361,357,2,1033,280,278,274,267,264,259,382,378,372,367,363,360,
240 358,356,0,43,20,19,17,15,13,11,9,7,6,4,7,5,3,1,3};
242 static const uint32_t tab1315[256] =
243 { 0x010003,0x050005,0x070006,0x080008,0x090008,0x0a0009,0x0a000a,0x0b000a,
244 0x0a000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0d000c,0x0e000d,0x0e000e,
245 0x040005,0x060005,0x080007,0x090008,0x0a0009,0x0a0009,0x0b000a,0x0b000a,
246 0x0b000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0e000c,0x0e000d,0x0e000d,
247 0x070006,0x080007,0x090007,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,
248 0x0b000a,0x0c000b,0x0c000b,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d,
249 0x080007,0x090008,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0c000b,
250 0x0c000b,0x0d000b,0x0d000c,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d,
251 0x090008,0x090008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0d000b,0x0d000b,
252 0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000d,
253 0x0a0009,0x0a0009,0x0b0009,0x0c000a,0x0c000a,0x0c000a,0x0d000b,0x0d000b,
254 0x0d000b,0x0d000b,0x0e000c,0x0d000c,0x0f000d,0x0f000d,0x10000d,0x10000e,
255 0x0a000a,0x0b0009,0x0c000a,0x0c000a,0x0d000a,0x0d000b,0x0d000b,0x0d000b,
256 0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x10000e,
257 0x0b000a,0x0b000a,0x0c000a,0x0d000b,0x0d000b,0x0d000b,0x0e000b,0x0e000c,
258 0x0e000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x12000d,0x12000e,
259 0x0a000a,0x0a000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0e000c,
260 0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x11000e,0x11000e,
261 0x0b000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0d000c,0x0f000c,
262 0x0e000c,0x0f000d,0x0f000d,0x10000d,0x10000d,0x10000e,0x12000e,0x11000e,
263 0x0b000b,0x0c000b,0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000c,
264 0x0e000c,0x0f000d,0x10000d,0x0f000d,0x10000d,0x11000e,0x12000f,0x13000e,
265 0x0c000b,0x0c000b,0x0c000b,0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0e000c,
266 0x0f000d,0x0f000d,0x0f000d,0x10000d,0x11000e,0x11000e,0x11000e,0x12000f,
267 0x0c000c,0x0d000c,0x0d000b,0x0e000c,0x0e000c,0x0f000c,0x0e000d,0x0f000d,
268 0x10000d,0x10000d,0x11000d,0x11000d,0x11000e,0x12000e,0x12000f,0x12000f,
269 0x0d000c,0x0d000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x10000d,
270 0x10000d,0x10000e,0x10000e,0x11000e,0x12000e,0x11000e,0x12000f,0x12000f,
271 0x0e000d,0x0e000d,0x0e000d,0x0f000d,0x0f000d,0x0f000d,0x11000d,0x10000d,
272 0x10000e,0x13000e,0x11000e,0x11000e,0x11000f,0x13000f,0x12000e,0x12000f,
273 0x0d000d,0x0e000d,0x0f000d,0x10000d,0x10000d,0x10000d,0x11000d,0x10000e,
274 0x11000e,0x11000e,0x12000e,0x12000e,0x15000f,0x14000f,0x15000f,0x12000f };
276 static const uint32_t tab01[16] =
277 { 0x10004,0x50005,0x50005,0x70006,0x50005,0x80006,0x70006,0x90007,
278 0x50005,0x70006,0x70006,0x90007,0x70006,0x90007,0x90007,0xa0008 };
280 static const uint32_t tab23[ 9] =
281 { 0x10002,0x40003,0x70007,0x40004,0x50004,0x70007,0x60006,0x70007,0x80008 };
283 static const uint32_t tab56[16] =
284 { 0x10003,0x40004,0x70006,0x80008,0x40004,0x50004,0x80006,0x90007,
285 0x70005,0x80006,0x90007,0xa0008,0x80007,0x80007,0x90008,0xa0009 };
287 static const uint32_t tab789[36] =
288 {0x00100803,0x00401004,0x00701c06,0x00902407,0x00902409,0x00a0280a,0x00401004,
289 0x00601005,0x00801806,0x00902807,0x00902808,0x00a0280a,0x00701c05,0x00701806,
290 0x00902007,0x00a02808,0x00a02809,0x00b02c0a,0x00802407,0x00902807,0x00a02808,
291 0x00b02c09,0x00b02c09,0x00b0300a,0x00802408,0x00902408,0x00a02809,0x00b02c09,
292 0x00b0300a,0x00c0300b,0x00902809,0x00a02809,0x00b02c0a,0x00c02c0a,0x00c0340b,
293 0x00c0340b};
295 static const uint32_t tabABC[64] =
296 {0x00100804,0x00401004,0x00701806,0x00902008,0x00a02409,0x00a0280a,0x00a0240a,
297 0x00b0280a,0x00401004,0x00601405,0x00801806,0x00902007,0x00a02809,0x00b02809,
298 0x00a0240a,0x00a0280a,0x00701806,0x00801c06,0x00902007,0x00a02408,0x00b02809,
299 0x00c02c0a,0x00b02809,0x00b0280a,0x00802007,0x00902007,0x00a02408,0x00b02c08,
300 0x00c02809,0x00c0300a,0x00b0280a,0x00c02c0a,0x00902408,0x00a02808,0x00b02809,
301 0x00c02c09,0x00c02c0a,0x00c0300a,0x00c02c0a,0x00c0300b,0x00a02409,0x00b02809,
302 0x00c02c0a,0x00c0300a,0x00d0300a,0x00d0340b,0x00c0300a,0x00d0340b,0x00902409,
303 0x00a02409,0x00b02409,0x00c0280a,0x00c02c0a,0x00c0300b,0x00d0300b,0x00d0300c,
304 0x00a0240a,0x00a0240a,0x00b0280a,0x00c02c0b,0x00c0300b,0x00d0300b,0x00d0300b,
305 0x00d0300c};
307 static const uint32_t tab1624[256] =
308 {0x00010004,0x00050005,0x00070007,0x00090008,0x000a0009,0x000a000a,0x000b000a,
309 0x000b000b,0x000c000b,0x000c000c,0x000c000c,0x000d000c,0x000d000c,0x000d000c,
310 0x000e000d,0x000a000a,0x00040005,0x00060006,0x00080007,0x00090008,0x000a0009,
311 0x000b000a,0x000b000a,0x000b000b,0x000c000b,0x000c000b,0x000c000c,0x000d000c,
312 0x000e000c,0x000d000c,0x000e000c,0x000a000a,0x00070007,0x00080007,0x00090008,
313 0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000b,0x000d000b,0x000c000b,
314 0x000d000b,0x000d000c,0x000d000c,0x000e000c,0x000e000d,0x000b0009,0x00090008,
315 0x00090008,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a,0x000c000b,
316 0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c,0x000f000c,
317 0x000c0009,0x000a0009,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a,
318 0x000d000a,0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c,
319 0x000f000c,0x000f000d,0x000b0009,0x000a000a,0x000a0009,0x000b000a,0x000b000a,
320 0x000c000a,0x000d000a,0x000d000b,0x000e000b,0x000d000b,0x000e000b,0x000e000c,
321 0x000f000c,0x000f000c,0x000f000c,0x0010000c,0x000c0009,0x000b000a,0x000b000a,
322 0x000b000a,0x000c000a,0x000d000a,0x000d000b,0x000d000b,0x000d000b,0x000e000b,
323 0x000e000c,0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000d,0x000c0009,
324 0x000b000b,0x000b000a,0x000c000a,0x000c000a,0x000d000b,0x000d000b,0x000d000b,
325 0x000e000b,0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000d,
326 0x0011000d,0x000c000a,0x000b000b,0x000c000b,0x000c000b,0x000d000b,0x000d000b,
327 0x000d000b,0x000e000b,0x000e000b,0x000f000b,0x000f000c,0x000f000c,0x000f000c,
328 0x0010000c,0x0010000d,0x0010000d,0x000c000a,0x000c000b,0x000c000b,0x000c000b,
329 0x000d000b,0x000d000b,0x000e000b,0x000e000b,0x000f000c,0x000f000c,0x000f000c,
330 0x000f000c,0x0010000c,0x000f000d,0x0010000d,0x000f000d,0x000d000a,0x000c000c,
331 0x000d000b,0x000c000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000e000c,
332 0x000f000c,0x0010000c,0x0010000c,0x0010000d,0x0011000d,0x0011000d,0x0010000d,
333 0x000c000a,0x000d000c,0x000d000c,0x000d000b,0x000d000b,0x000e000b,0x000e000c,
334 0x000f000c,0x0010000c,0x0010000c,0x0010000c,0x0010000c,0x0010000d,0x0010000d,
335 0x000f000d,0x0010000d,0x000d000a,0x000d000c,0x000e000c,0x000e000c,0x000e000c,
336 0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000c,0x0010000d,
337 0x0010000d,0x0010000d,0x0010000d,0x0012000d,0x000d000a,0x000f000c,0x000e000c,
338 0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000c,0x0010000c,0x0010000d,
339 0x0012000d,0x0011000d,0x0011000d,0x0011000d,0x0013000d,0x0011000d,0x000d000a,
340 0x000e000d,0x000f000c,0x000d000c,0x000e000c,0x0010000c,0x0010000c,0x000f000c,
341 0x0010000d,0x0010000d,0x0011000d,0x0012000d,0x0011000d,0x0013000d,0x0011000d,
342 0x0010000d,0x000d000a,0x000a0009,0x000a0009,0x000a0009,0x000b0009,0x000b0009,
343 0x000c0009,0x000c0009,0x000c0009,0x000d0009,0x000d0009,0x000d0009,0x000d000a,
344 0x000d000a,0x000d000a,0x000d000a,0x000a0006};
346 static const uint8_t t1l[8] = {1,3,2,3,1,4,3,5};
347 static const uint8_t t2l[9] = {1,3,6,3,3,5,5,5,6};
348 static const uint8_t t3l[9] = {2,2,6,3,2,5,5,5,6};
349 static const uint8_t t5l[16] = {1,3,6,7,3,3,6,7,6,6,7,8,7,6,7,8};
350 static const uint8_t t6l[16] = {3,3,5,7,3,2,4,5,4,4,5,6,6,5,6,7};
352 static const uint8_t t7l[36] =
353 {1,3,6,8,8,9,3,4,6,7,7,8,6,5,7,8,8,9,7,7,8,9,9,9,7,7,8,9,9,10,8,8,9,10,10,10};
355 static const uint8_t t8l[36] =
356 {2,3,6,8,8,9,3,2,4,8,8,8,6,4,6,8,8,9,8,8,8,9,9,10,8,7,8,9,10,10,9,8,9,9,11,11};
358 static const uint8_t t9l[36] =
359 {3,3,5,6,8,9,3,3,4,5,6,8,4,4,5,6,7,8,6,5,6,7,7,8,7,6,7,7,8,9,8,7,8,8,9,9};
361 static const uint8_t t10l[64] =
362 {1,3,6,8,9,9,9,10,3,4,6,7,8,9,8,8,6,6,7,8,9,10,9,9,7,7,8,9,10,10,9,10,8,8,9,10,
363 10,10,10,10,9,9,10,10,11,11,10,11,8,8,9,10,10,10,11,11,9,8,9,10,10,11,11,11};
365 static const uint8_t t11l[64] =
366 {2,3,5,7,8,9,8,9,3,3,4,6,8,8,7,8,5,5,6,7,8,9,8,8,7,6,7,9,8,10,8,9,8,8,8,9,9,10,
367 9,10,8,8,9,10,10,11,10,11,8,7,7,8,9,10,10,10,8,7,8,9,10,10,10,10};
369 static const uint8_t t12l[64] =
370 {4,3,5,7,8,9,9,9,3,3,4,5,7,7,8,8,5,4,5,6,7,8,7,8,6,5,6,6,7,8,8,8,7,6,7,7,8,
371 8,8,9,8,7,8,8,8,9,8,9,8,7,7,8,8,9,9,10,9,8,8,9,9,9,9,10};
373 static const uint8_t t13l[256] =
374 {1,4,6,7,8,9,9,10,9,10,11,11,12,12,13,13,3,4,6,7,8,8,9,9,9,9,10,10,11,12,12,12,
375 6,6,7,8,9,9,10,10,9,10,10,11,11,12,13,13,7,7,8,9,9,10,10,10,10,11,11,11,11,12,
376 13,13,8,7,9,9,10,10,11,11,10,11,11,12,12,13,13,14,9,8,9,10,10,10,11,11,11,11,
377 12,11,13,13,14,14,9,9,10,10,11,11,11,11,11,12,12,12,13,13,14,14,10,9,10,11,11,
378 11,12,12,12,12,13,13,13,14,16,16,9,8,9,10,10,11,11,12,12,12,12,13,13,14,15,15,
379 10,9,10,10,11,11,11,13,12,13,13,14,14,14,16,15,10,10,10,11,11,12,12,13,12,13,
380 14,13,14,15,16,17,11,10,10,11,12,12,12,12,13,13,13,14,15,15,15,16,11,11,11,12,
381 12,13,12,13,14,14,15,15,15,16,16,16,12,11,12,13,13,13,14,14,14,14,14,15,16,15,
382 16,16,13,12,12,13,13,13,15,14,14,17,15,15,15,17,16,16,12,12,13,14,14,14,15,14,
383 15,15,16,16,19,18,19,16};
385 static const uint8_t t15l[256] =
386 {3,4,5,7,7,8,9,9,9,10,10,11,11,11,12,13,4,3,5,6,7,7,8,8,8,9,9,10,10,10,11,11,5,
387 5,5,6,7,7,8,8,8,9,9,10,10,11,11,11,6,6,6,7,7,8,8,9,9,9,10,10,10,11,11,11,7,6,
388 7,7,8,8,9,9,9,9,10,10,10,11,11,11,8,7,7,8,8,8,9,9,9,9,10,10,11,11,11,12,9,7,8,
389 8,8,9,9,9,9,10,10,10,11,11,12,12,9,8,8,9,9,9,9,10,10,10,10,10,11,11,11,12,9,8,
390 8,9,9,9,9,10,10,10,10,11,11,12,12,12,9,8,9,9,9,9,10,10,10,11,11,11,11,12,12,
391 12,10,9,9,9,10,10,10,10,10,11,11,11,11,12,13,12,10,9,9,9,10,10,10,10,11,11,11,
392 11,12,12,12,13,11,10,9,10,10,10,11,11,11,11,11,11,12,12,13,13,11,10,10,10,10,
393 11,11,11,11,12,12,12,12,12,13,13,12,11,11,11,11,11,11,11,12,12,12,12,13,13,12,
394 13,12,11,11,11,11,11,11,12,12,12,12,12,13,13,13,13};
396 static const uint8_t t16l[256] =
397 {1,4,6,8,9,9,10,10,11,11,11,12,12,12,13,9,3,4,6,7,8,9,9,9,10,10,10,11,12,11,12,
398 8,6,6,7,8,9,9,10,10,11,10,11,11,11,12,12,9,8,7,8,9,9,10,10,10,11,11,12,12,12,
399 13,13,10,9,8,9,9,10,10,11,11,11,12,12,12,13,13,13,9,9,8,9,9,10,11,11,12,11,12,
400 12,13,13,13,14,10,10,9,9,10,11,11,11,11,12,12,12,12,13,13,14,10,10,9,10,10,11,
401 11,11,12,12,13,13,13,13,15,15,10,10,10,10,11,11,11,12,12,13,13,13,13,14,14,14,
402 10,11,10,10,11,11,12,12,13,13,13,13,14,13,14,13,11,11,11,10,11,12,12,12,12,13,
403 14,14,14,15,15,14,10,12,11,11,11,12,12,13,14,14,14,14,14,14,13,14,11,12,12,12,
404 12,12,13,13,13,13,15,14,14,14,14,16,11,14,12,12,12,13,13,14,14,14,16,15,15,15,
405 17,15,11,13,13,11,12,14,14,13,14,14,15,16,15,17,15,14,11,9,8,8,9,9,10,10,10,
406 11,11,11,11,11,11,11,8};
408 static const uint8_t t24l[256] =
409 {4,4,6,7,8,9,9,10,10,11,11,11,11,11,12,9,4,4,5,6,7,8,8,9,9,9,10,10,10,10,10,8,
410 6,5,6,7,7,8,8,9,9,9,9,10,10,10,11,7,7,6,7,7,8,8,8,9,9,9,9,10,10,10,10,7,8,7,7,
411 8,8,8,8,9,9,9,10,10,10,10,11,7,9,7,8,8,8,8,9,9,9,9,10,10,10,10,10,7,9,8,8,8,8,
412 9,9,9,9,10,10,10,10,10,11,7,10,8,8,8,9,9,9,9,10,10,10,10,10,11,11,8,10,9,9,9,
413 9,9,9,9,9,10,10,10,10,11,11,8,10,9,9,9,9,9,9,10,10,10,10,10,11,11,11,8,11,9,9,
414 9,9,10,10,10,10,10,10,11,11,11,11,8,11,10,9,9,9,10,10,10,10,10,10,11,11,11,11,
415 8,11,10,10,10,10,10,10,10,10,10,11,11,11,11,11,8,11,10,10,10,10,10,10,10,11,
416 11,11,11,11,11,11,8,12,10,10,10,10,10,10,11,11,11,11,11,11,11,11,8,8,7,7,7,7,
417 7,7,7,7,7,7,8,8,8,8,4};
419 static struct huffcodetab ht[HTN] =
420 { { 0, NULL, NULL}, /* Apparently not used */
421 { 2, t1HB, t1l},
422 { 3, t2HB, t2l},
423 { 3, t3HB, t3l},
424 { 0, NULL, NULL}, /* Apparently not used */
425 { 4, t5HB, t5l},
426 { 4, t6HB, t6l},
427 { 6, t7HB, t7l},
428 { 6, t8HB, t8l},
429 { 6, t9HB, t9l},
430 { 8, t10HB, t10l},
431 { 8, t11HB, t11l},
432 { 8, t12HB, t12l},
433 {16, t13HB, t13l},
434 { 0, NULL, NULL}, /* Apparently not used */
435 {16, t15HB, t15l} };
437 static const struct huffcodebig ht_big[HTN] =
438 { { 16, 1, 1 },
439 { 16, 2, 3 },
440 { 16, 3, 7 },
441 { 16, 4, 15 },
442 { 16, 6, 63 },
443 { 16, 8, 255 },
444 { 16, 10, 1023 },
445 { 16, 13, 8191 },
446 { 16, 4, 15 },
447 { 16, 5, 31 },
448 { 16, 6, 63 },
449 { 16, 7, 127 },
450 { 16, 8, 255 },
451 { 16, 9, 511 },
452 { 16, 11, 2047 },
453 { 16, 13, 8191 } };
455 static const struct
457 const uint8_t region0_cnt;
458 const uint8_t region1_cnt;
459 } subdv_table[23] =
460 { {0, 0}, /* 0 bands */
461 {0, 0}, /* 1 bands */
462 {0, 0}, /* 2 bands */
463 {0, 0}, /* 3 bands */
464 {0, 0}, /* 4 bands */
465 {0, 1}, /* 5 bands */
466 {1, 1}, /* 6 bands */
467 {1, 1}, /* 7 bands */
468 {1, 2}, /* 8 bands */
469 {2, 2}, /* 9 bands */
470 {2, 3}, /* 10 bands */
471 {2, 3}, /* 11 bands */
472 {3, 4}, /* 12 bands */
473 {3, 4}, /* 13 bands */
474 {3, 4}, /* 14 bands */
475 {4, 5}, /* 15 bands */
476 {4, 5}, /* 16 bands */
477 {4, 6}, /* 17 bands */
478 {5, 6}, /* 18 bands */
479 {5, 6}, /* 19 bands */
480 {5, 7}, /* 20 bands */
481 {6, 7}, /* 21 bands */
482 {6, 7}, /* 22 bands */
485 static const uint16_t sfBand[6][23] =
487 /* Table B.2.b: 22.05 kHz */
488 {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
489 /* Table B.2.c: 24 kHz */
490 {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576},
491 /* Table B.2.a: 16 kHz */
492 {0,6,12,18,24,30,36,44,45,66,80,96,116,140,168,200,238,248,336,396,464,522,576},
493 /* Table B.8.b: 44.1 kHz */
494 {0,4, 8,12,16,20,24,30,36,44,52,62, 74, 90,110,134,162,196,238,288,342,418,576},
495 /* Table B.8.c: 48 kHz */
496 {0,4, 8,12,16,20,24,30,36,42,50,60, 72, 88,106,128,156,190,230,276,330,384,576},
497 /* Table B.8.a: 32 kHz */
498 {0,4, 8,12,16,20,24,30,36,44,54,66, 82,102,126,156,194,240,296,364,448,550,576} };
501 static const uint16_t int2idx[4096] = /* int2idx[i] = sqrt(i*sqrt(i)); */
503 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9,
504 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16,
505 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21,
506 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26,
507 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
508 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36,
509 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40,
510 41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45,
511 45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49,
512 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53,
513 53, 53, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 57, 57, 57,
514 57, 57, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 61, 61,
515 61, 61, 61, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 65,
516 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68,
517 68, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 72, 72, 72,
518 72, 72, 72, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75,
519 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 79, 79, 79,
520 79, 79, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82,
521 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 86, 86, 86,
522 86, 86, 86, 87, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89,
523 89, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 93,
524 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 96, 96, 96,
525 96, 96, 96, 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99,
526 99, 99,100,100,100,100,100,100,101,101,101,101,101,101,102,102,102,102,102,102,
527 103,103,103,103,103,103,104,104,104,104,104,104,104,105,105,105,105,105,105,106,
528 106,106,106,106,106,107,107,107,107,107,107,107,108,108,108,108,108,108,109,109,
529 109,109,109,109,110,110,110,110,110,110,110,111,111,111,111,111,111,112,112,112,
530 112,112,112,112,113,113,113,113,113,113,114,114,114,114,114,114,115,115,115,115,
531 115,115,115,116,116,116,116,116,116,117,117,117,117,117,117,117,118,118,118,118,
532 118,118,118,119,119,119,119,119,119,120,120,120,120,120,120,120,121,121,121,121,
533 121,121,122,122,122,122,122,122,122,123,123,123,123,123,123,123,124,124,124,124,
534 124,124,125,125,125,125,125,125,125,126,126,126,126,126,126,126,127,127,127,127,
535 127,127,128,128,128,128,128,128,128,129,129,129,129,129,129,129,130,130,130,130,
536 130,130,131,131,131,131,131,131,131,132,132,132,132,132,132,132,133,133,133,133,
537 133,133,133,134,134,134,134,134,134,134,135,135,135,135,135,135,136,136,136,136,
538 136,136,136,137,137,137,137,137,137,137,138,138,138,138,138,138,138,139,139,139,
539 139,139,139,139,140,140,140,140,140,140,140,141,141,141,141,141,141,141,142,142,
540 142,142,142,142,142,143,143,143,143,143,143,143,144,144,144,144,144,144,144,145,
541 145,145,145,145,145,145,146,146,146,146,146,146,146,147,147,147,147,147,147,147,
542 148,148,148,148,148,148,148,149,149,149,149,149,149,149,150,150,150,150,150,150,
543 150,151,151,151,151,151,151,151,152,152,152,152,152,152,152,153,153,153,153,153,
544 153,153,154,154,154,154,154,154,154,154,155,155,155,155,155,155,155,156,156,156,
545 156,156,156,156,157,157,157,157,157,157,157,158,158,158,158,158,158,158,159,159,
546 159,159,159,159,159,160,160,160,160,160,160,160,160,161,161,161,161,161,161,161,
547 162,162,162,162,162,162,162,163,163,163,163,163,163,163,163,164,164,164,164,164,
548 164,164,165,165,165,165,165,165,165,166,166,166,166,166,166,166,167,167,167,167,
549 167,167,167,167,168,168,168,168,168,168,168,169,169,169,169,169,169,169,169,170,
550 170,170,170,170,170,170,171,171,171,171,171,171,171,172,172,172,172,172,172,172,
551 172,173,173,173,173,173,173,173,174,174,174,174,174,174,174,174,175,175,175,175,
552 175,175,175,176,176,176,176,176,176,176,176,177,177,177,177,177,177,177,178,178,
553 178,178,178,178,178,178,179,179,179,179,179,179,179,180,180,180,180,180,180,180,
554 180,181,181,181,181,181,181,181,182,182,182,182,182,182,182,182,183,183,183,183,
555 183,183,183,184,184,184,184,184,184,184,184,185,185,185,185,185,185,185,186,186,
556 186,186,186,186,186,186,187,187,187,187,187,187,187,187,188,188,188,188,188,188,
557 188,189,189,189,189,189,189,189,189,190,190,190,190,190,190,190,190,191,191,191,
558 191,191,191,191,192,192,192,192,192,192,192,192,193,193,193,193,193,193,193,193,
559 194,194,194,194,194,194,194,195,195,195,195,195,195,195,195,196,196,196,196,196,
560 196,196,196,197,197,197,197,197,197,197,197,198,198,198,198,198,198,198,199,199,
561 199,199,199,199,199,199,200,200,200,200,200,200,200,200,201,201,201,201,201,201,
562 201,201,202,202,202,202,202,202,202,202,203,203,203,203,203,203,203,204,204,204,
563 204,204,204,204,204,205,205,205,205,205,205,205,205,206,206,206,206,206,206,206,
564 206,207,207,207,207,207,207,207,207,208,208,208,208,208,208,208,208,209,209,209,
565 209,209,209,209,209,210,210,210,210,210,210,210,210,211,211,211,211,211,211,211,
566 211,212,212,212,212,212,212,212,212,213,213,213,213,213,213,213,213,214,214,214,
567 214,214,214,214,214,215,215,215,215,215,215,215,215,216,216,216,216,216,216,216,
568 216,217,217,217,217,217,217,217,217,218,218,218,218,218,218,218,218,219,219,219,
569 219,219,219,219,219,220,220,220,220,220,220,220,220,221,221,221,221,221,221,221,
570 221,222,222,222,222,222,222,222,222,223,223,223,223,223,223,223,223,224,224,224,
571 224,224,224,224,224,225,225,225,225,225,225,225,225,226,226,226,226,226,226,226,
572 226,227,227,227,227,227,227,227,227,228,228,228,228,228,228,228,228,229,229,229,
573 229,229,229,229,229,229,230,230,230,230,230,230,230,230,231,231,231,231,231,231,
574 231,231,232,232,232,232,232,232,232,232,233,233,233,233,233,233,233,233,234,234,
575 234,234,234,234,234,234,234,235,235,235,235,235,235,235,235,236,236,236,236,236,
576 236,236,236,237,237,237,237,237,237,237,237,238,238,238,238,238,238,238,238,238,
577 239,239,239,239,239,239,239,239,240,240,240,240,240,240,240,240,241,241,241,241,
578 241,241,241,241,242,242,242,242,242,242,242,242,242,243,243,243,243,243,243,243,
579 243,244,244,244,244,244,244,244,244,245,245,245,245,245,245,245,245,245,246,246,
580 246,246,246,246,246,246,247,247,247,247,247,247,247,247,248,248,248,248,248,248,
581 248,248,248,249,249,249,249,249,249,249,249,250,250,250,250,250,250,250,250,250,
582 251,251,251,251,251,251,251,251,252,252,252,252,252,252,252,252,253,253,253,253,
583 253,253,253,253,253,254,254,254,254,254,254,254,254,255,255,255,255,255,255,255,
584 255,255,256,256,256,256,256,256,256,256,257,257,257,257,257,257,257,257,257,258,
585 258,258,258,258,258,258,258,259,259,259,259,259,259,259,259,259,260,260,260,260,
586 260,260,260,260,261,261,261,261,261,261,261,261,261,262,262,262,262,262,262,262,
587 262,263,263,263,263,263,263,263,263,263,264,264,264,264,264,264,264,264,265,265,
588 265,265,265,265,265,265,265,266,266,266,266,266,266,266,266,267,267,267,267,267,
589 267,267,267,267,268,268,268,268,268,268,268,268,268,269,269,269,269,269,269,269,
590 269,270,270,270,270,270,270,270,270,270,271,271,271,271,271,271,271,271,271,272,
591 272,272,272,272,272,272,272,273,273,273,273,273,273,273,273,273,274,274,274,274,
592 274,274,274,274,275,275,275,275,275,275,275,275,275,276,276,276,276,276,276,276,
593 276,276,277,277,277,277,277,277,277,277,277,278,278,278,278,278,278,278,278,279,
594 279,279,279,279,279,279,279,279,280,280,280,280,280,280,280,280,280,281,281,281,
595 281,281,281,281,281,282,282,282,282,282,282,282,282,282,283,283,283,283,283,283,
596 283,283,283,284,284,284,284,284,284,284,284,284,285,285,285,285,285,285,285,285,
597 286,286,286,286,286,286,286,286,286,287,287,287,287,287,287,287,287,287,288,288,
598 288,288,288,288,288,288,288,289,289,289,289,289,289,289,289,289,290,290,290,290,
599 290,290,290,290,291,291,291,291,291,291,291,291,291,292,292,292,292,292,292,292,
600 292,292,293,293,293,293,293,293,293,293,293,294,294,294,294,294,294,294,294,294,
601 295,295,295,295,295,295,295,295,295,296,296,296,296,296,296,296,296,296,297,297,
602 297,297,297,297,297,297,297,298,298,298,298,298,298,298,298,299,299,299,299,299,
603 299,299,299,299,300,300,300,300,300,300,300,300,300,301,301,301,301,301,301,301,
604 301,301,302,302,302,302,302,302,302,302,302,303,303,303,303,303,303,303,303,303,
605 304,304,304,304,304,304,304,304,304,305,305,305,305,305,305,305,305,305,306,306,
606 306,306,306,306,306,306,306,307,307,307,307,307,307,307,307,307,308,308,308,308,
607 308,308,308,308,308,309,309,309,309,309,309,309,309,309,310,310,310,310,310,310,
608 310,310,310,311,311,311,311,311,311,311,311,311,312,312,312,312,312,312,312,312,
609 312,313,313,313,313,313,313,313,313,313,314,314,314,314,314,314,314,314,314,315,
610 315,315,315,315,315,315,315,315,316,316,316,316,316,316,316,316,316,317,317,317,
611 317,317,317,317,317,317,318,318,318,318,318,318,318,318,318,318,319,319,319,319,
612 319,319,319,319,319,320,320,320,320,320,320,320,320,320,321,321,321,321,321,321,
613 321,321,321,322,322,322,322,322,322,322,322,322,323,323,323,323,323,323,323,323,
614 323,324,324,324,324,324,324,324,324,324,325,325,325,325,325,325,325,325,325,325,
615 326,326,326,326,326,326,326,326,326,327,327,327,327,327,327,327,327,327,328,328,
616 328,328,328,328,328,328,328,329,329,329,329,329,329,329,329,329,330,330,330,330,
617 330,330,330,330,330,330,331,331,331,331,331,331,331,331,331,332,332,332,332,332,
618 332,332,332,332,333,333,333,333,333,333,333,333,333,334,334,334,334,334,334,334,
619 334,334,335,335,335,335,335,335,335,335,335,335,336,336,336,336,336,336,336,336,
620 336,337,337,337,337,337,337,337,337,337,338,338,338,338,338,338,338,338,338,338,
621 339,339,339,339,339,339,339,339,339,340,340,340,340,340,340,340,340,340,341,341,
622 341,341,341,341,341,341,341,341,342,342,342,342,342,342,342,342,342,343,343,343,
623 343,343,343,343,343,343,344,344,344,344,344,344,344,344,344,344,345,345,345,345,
624 345,345,345,345,345,346,346,346,346,346,346,346,346,346,347,347,347,347,347,347,
625 347,347,347,347,348,348,348,348,348,348,348,348,348,349,349,349,349,349,349,349,
626 349,349,350,350,350,350,350,350,350,350,350,350,351,351,351,351,351,351,351,351,
627 351,352,352,352,352,352,352,352,352,352,352,353,353,353,353,353,353,353,353,353,
628 354,354,354,354,354,354,354,354,354,355,355,355,355,355,355,355,355,355,355,356,
629 356,356,356,356,356,356,356,356,357,357,357,357,357,357,357,357,357,357,358,358,
630 358,358,358,358,358,358,358,359,359,359,359,359,359,359,359,359,359,360,360,360,
631 360,360,360,360,360,360,361,361,361,361,361,361,361,361,361,361,362,362,362,362,
632 362,362,362,362,362,363,363,363,363,363,363,363,363,363,363,364,364,364,364,364,
633 364,364,364,364,365,365,365,365,365,365,365,365,365,365,366,366,366,366,366,366,
634 366,366,366,367,367,367,367,367,367,367,367,367,367,368,368,368,368,368,368,368,
635 368,368,369,369,369,369,369,369,369,369,369,369,370,370,370,370,370,370,370,370,
636 370,370,371,371,371,371,371,371,371,371,371,372,372,372,372,372,372,372,372,372,
637 372,373,373,373,373,373,373,373,373,373,374,374,374,374,374,374,374,374,374,374,
638 375,375,375,375,375,375,375,375,375,375,376,376,376,376,376,376,376,376,376,377,
639 377,377,377,377,377,377,377,377,377,378,378,378,378,378,378,378,378,378,379,379,
640 379,379,379,379,379,379,379,379,380,380,380,380,380,380,380,380,380,380,381,381,
641 381,381,381,381,381,381,381,382,382,382,382,382,382,382,382,382,382,383,383,383,
642 383,383,383,383,383,383,383,384,384,384,384,384,384,384,384,384,385,385,385,385,
643 385,385,385,385,385,385,386,386,386,386,386,386,386,386,386,386,387,387,387,387,
644 387,387,387,387,387,387,388,388,388,388,388,388,388,388,388,389,389,389,389,389,
645 389,389,389,389,389,390,390,390,390,390,390,390,390,390,390,391,391,391,391,391,
646 391,391,391,391,391,392,392,392,392,392,392,392,392,392,393,393,393,393,393,393,
647 393,393,393,393,394,394,394,394,394,394,394,394,394,394,395,395,395,395,395,395,
648 395,395,395,395,396,396,396,396,396,396,396,396,396,397,397,397,397,397,397,397,
649 397,397,397,398,398,398,398,398,398,398,398,398,398,399,399,399,399,399,399,399,
650 399,399,399,400,400,400,400,400,400,400,400,400,400,401,401,401,401,401,401,401,
651 401,401,402,402,402,402,402,402,402,402,402,402,403,403,403,403,403,403,403,403,
652 403,403,404,404,404,404,404,404,404,404,404,404,405,405,405,405,405,405,405,405,
653 405,405,406,406,406,406,406,406,406,406,406,406,407,407,407,407,407,407,407,407,
654 407,407,408,408,408,408,408,408,408,408,408,408,409,409,409,409,409,409,409,409,
655 409,410,410,410,410,410,410,410,410,410,410,411,411,411,411,411,411,411,411,411,
656 411,412,412,412,412,412,412,412,412,412,412,413,413,413,413,413,413,413,413,413,
657 413,414,414,414,414,414,414,414,414,414,414,415,415,415,415,415,415,415,415,415,
658 415,416,416,416,416,416,416,416,416,416,416,417,417,417,417,417,417,417,417,417,
659 417,418,418,418,418,418,418,418,418,418,418,419,419,419,419,419,419,419,419,419,
660 419,420,420,420,420,420,420,420,420,420,420,421,421,421,421,421,421,421,421,421,
661 421,422,422,422,422,422,422,422,422,422,422,423,423,423,423,423,423,423,423,423,
662 423,424,424,424,424,424,424,424,424,424,424,425,425,425,425,425,425,425,425,425,
663 425,426,426,426,426,426,426,426,426,426,426,427,427,427,427,427,427,427,427,427,
664 427,428,428,428,428,428,428,428,428,428,428,429,429,429,429,429,429,429,429,429,
665 429,430,430,430,430,430,430,430,430,430,430,431,431,431,431,431,431,431,431,431,
666 431,432,432,432,432,432,432,432,432,432,432,433,433,433,433,433,433,433,433,433,
667 433,434,434,434,434,434,434,434,434,434,434,435,435,435,435,435,435,435,435,435,
668 435,435,436,436,436,436,436,436,436,436,436,436,437,437,437,437,437,437,437,437,
669 437,437,438,438,438,438,438,438,438,438,438,438,439,439,439,439,439,439,439,439,
670 439,439,440,440,440,440,440,440,440,440,440,440,441,441,441,441,441,441,441,441,
671 441,441,442,442,442,442,442,442,442,442,442,442,443,443,443,443,443,443,443,443,
672 443,443,443,444,444,444,444,444,444,444,444,444,444,445,445,445,445,445,445,445,
673 445,445,445,446,446,446,446,446,446,446,446,446,446,447,447,447,447,447,447,447,
674 447,447,447,448,448,448,448,448,448,448,448,448,448,448,449,449,449,449,449,449,
675 449,449,449,449,450,450,450,450,450,450,450,450,450,450,451,451,451,451,451,451,
676 451,451,451,451,452,452,452,452,452,452,452,452,452,452,453,453,453,453,453,453,
677 453,453,453,453,453,454,454,454,454,454,454,454,454,454,454,455,455,455,455,455,
678 455,455,455,455,455,456,456,456,456,456,456,456,456,456,456,457,457,457,457,457,
679 457,457,457,457,457,457,458,458,458,458,458,458,458,458,458,458,459,459,459,459,
680 459,459,459,459,459,459,460,460,460,460,460,460,460,460,460,460,460,461,461,461,
681 461,461,461,461,461,461,461,462,462,462,462,462,462,462,462,462,462,463,463,463,
682 463,463,463,463,463,463,463,463,464,464,464,464,464,464,464,464,464,464,465,465,
683 465,465,465,465,465,465,465,465,466,466,466,466,466,466,466,466,466,466,466,467,
684 467,467,467,467,467,467,467,467,467,468,468,468,468,468,468,468,468,468,468,469,
685 469,469,469,469,469,469,469,469,469,469,470,470,470,470,470,470,470,470,470,470,
686 471,471,471,471,471,471,471,471,471,471,472,472,472,472,472,472,472,472,472,472,
687 472,473,473,473,473,473,473,473,473,473,473,474,474,474,474,474,474,474,474,474,
688 474,475,475,475,475,475,475,475,475,475,475,475,476,476,476,476,476,476,476,476,
689 476,476,477,477,477,477,477,477,477,477,477,477,477,478,478,478,478,478,478,478,
690 478,478,478,479,479,479,479,479,479,479,479,479,479,479,480,480,480,480,480,480,
691 480,480,480,480,481,481,481,481,481,481,481,481,481,481,482,482,482,482,482,482,
692 482,482,482,482,482,483,483,483,483,483,483,483,483,483,483,484,484,484,484,484,
693 484,484,484,484,484,484,485,485,485,485,485,485,485,485,485,485,486,486,486,486,
694 486,486,486,486,486,486,486,487,487,487,487,487,487,487,487,487,487,488,488,488,
695 488,488,488,488,488,488,488,488,489,489,489,489,489,489,489,489,489,489,490,490,
696 490,490,490,490,490,490,490,490,490,491,491,491,491,491,491,491,491,491,491,492,
697 492,492,492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493,493,493,
698 494,494,494,494,494,494,494,494,494,494,494,495,495,495,495,495,495,495,495,495,
699 495,496,496,496,496,496,496,496,496,496,496,496,497,497,497,497,497,497,497,497,
700 497,497,497,498,498,498,498,498,498,498,498,498,498,499,499,499,499,499,499,499,
701 499,499,499,499,500,500,500,500,500,500,500,500,500,500,501,501,501,501,501,501,
702 501,501,501,501,501,502,502,502,502,502,502,502,502,502,502,503,503,503,503,503,
703 503,503,503,503,503,503,504,504,504,504,504,504,504,504,504,504,504,505,505,505,
704 505,505,505,505,505,505,505,506,506,506,506,506,506,506,506,506,506,506,507,507,
705 507,507,507,507,507,507,507,507,507,508,508,508,508,508,508,508,508,508,508,509,
706 509,509,509,509,509,509,509,509,509,509,510,510,510,510,510,510,510,510,510,510,
707 510,511,511,511,511,511,511,511,511,511,511,512,512,512,512,512 };
709 static const uint8_t order[32] =
710 { 0, 1, 16, 17, 8, 9, 24, 25, 4, 5, 20, 21, 12, 13, 28, 29,
711 2, 3, 18, 19,10,11, 26, 27, 6, 7, 22, 23, 14, 15, 30, 31 };
713 static const uint16_t sampr_index[2][3] =
714 { { 22050, 24000, 16000 }, /* MPEG 2 */
715 { 44100, 48000, 32000 } }; /* MPEG 1 */
717 static const uint16_t bitr_index[2][15] =
718 { {0, 8,16,24,32,40,48,56, 64, 80, 96,112,128,144,160}, /* MPEG 2 */
719 {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320} }; /* MPEG 1 */
721 static const uint8_t num_bands[3][15] =
722 { {0,10,10,10,10,12,14,16, 20, 22, 24, 26, 28, 30, 32},
723 {0,10,10,10,10,10,12,14, 18, 24, 26, 28, 30, 32, 32},
724 {0,10,12,14,18,24,26,28, 30, 32, 32, 32, 32, 32, 32} };
726 static const int16_t cx[9] =
727 { 16135, 10531, 5604, 15396, -2845,-12551, 14189, 8192, 16384 };
729 static const int16_t ca[8] =
730 {-16859,-15458,-10269, -5961, -3099, -1342, -465, -121 };
732 static const uint16_t cs[8] =
733 { 28098, 28893, 31117, 32221, 32621, 32740, 32765, 32768 };
735 static const int16_t enwindow[15*27+24] =
736 { 0, 65, 593, 1766, 22228, 2115, 611, 62,
737 8, 119, 1419, 10564,-11659,-1635,-154, -9,
738 -8, -119,-1419,-10564, 11659, 1635, 154, 9, 464, 100, 91,
739 0, 69, 604, 1635, 23148, 2363, 643, 62,
740 7, 107, 1368, 10449,-12733,-1818,-180,-11,
741 -7, -107,-1368,-10449, 12733, 1818, 180, 11, 420, 200, 164,
742 0, 72, 608, 1465, 23979, 2600, 671, 63,
743 7, 94, 1305, 10265,-13818,-2004,-207,-12,
744 -7, -94,-1305,-10265, 13818, 2004, 207, 12, 380, 297, 220,
745 0, 76, 606, 1256, 24718, 2825, 693, 63,
746 6, 81, 1232, 10016,-14908,-2192,-236,-14,
747 -6, -81,-1232,-10016, 14908, 2192, 236, 14, 342, 392, 262,
748 0, 78, 597, 1007, 25359, 3033, 712, 63,
749 6, 68, 1150, 9706,-15995,-2380,-267,-15,
750 -6, -68,-1150, -9706, 15995, 2380, 267, 15, 307, 483, 289,
751 0, 80, 580, 719, 25901, 3224, 726, 62,
752 6, 54, 1060, 9343,-17072,-2565,-299,-17,
753 -6, -54,-1060, -9343, 17072, 2565, 299, 17, 274, 569, 304,
754 -1, 82, 555, 391, 26339, 3395, 735, 61,
755 5, 40, 963, 8930,-18131,-2747,-332,-19,
756 -5, -40, -963, -8930, 18131, 2747, 332, 19, 242, 650, 307,
757 -1, 83, 523, 26, 26672, 3545, 740, 60,
758 5, 27, 861, 8474,-19164,-2923,-366,-21,
759 -5, -27, -861, -8474, 19164, 2923, 366, 21, 212, 724, 300,
760 -1, 83, 482, -376, 26900, 3672, 739, 58,
761 4, 14, 756, 7981,-20163,-3092,-401,-24,
762 -4, -14, -756, -7981, 20163, 3092, 401, 24, 183, 792, 283,
763 -1, 82, 433, -812, 27022, 3776, 735, 56,
764 4, 1, 648, 7456,-21122,-3250,-435,-26,
765 -4, -1, -648, -7456, 21122, 3250, 435, 26, 155, 851, 258,
766 -1, 81, 376, -1281, 27038, 3855, 726, 54,
767 3, -11, 539, 6907,-22032,-3397,-470,-28,
768 -3, 11, -539, -6907, 22032, 3397, 470, 28, 128, 903, 226,
769 -1, 78, 312, -1778, 26951, 3910, 713, 52,
770 3, -22, 430, 6338,-22887,-3530,-503,-31,
771 -3, 22, -430, -6338, 22887, 3530, 503, 31, 102, 946, 188,
772 -2, 75, 239, -2302, 26761, 3941, 696, 49,
773 3, -33, 322, 5757,-23678,-3648,-537,-34,
774 -3, 33, -322, -5757, 23678, 3648, 537, 34, 76, 980, 145,
775 -2, 70, 160, -2848, 26472, 3948, 676, 47,
776 3, -42, 217, 5167,-24399,-3749,-568,-36,
777 -3, 42, -217, -5167, 24399, 3749, 568, 36, 50, 1004, 99,
778 -2, 65, 74, -3412, 26087, 3931, 653, 44,
779 2, -51, 115, 4577,-25045,-3830,-599,-39,
780 -2, 51, -115, -4577, 25045, 3830, 599, 39, 25, 1019, 50,
782 25610,3891,627,42,-3990,-18,58,-2,
783 21226,-21226,10604,-10604,1860,-1860,1458,-1458,576,-576,130,-130,60,-60,8,-8
786 static const int16_t win[18][4] = {
787 { -3072, -134, -146, 3352 },
788 { -2747, -362, -471, 3579 },
789 { -2387, -529, -831, 3747 },
790 { -2004, -632,-1214, 3850 },
791 { -1609, -666,-1609, 3884 },
792 { -1214, -632,-2004, 3850 },
793 { -831, -529,-2387, 3747 },
794 { -471, -362,-2747, 3579 },
795 { -146, -134,-3072, 3352 },
796 { 134,-3072,-3352, -146 },
797 { 362,-2747,-3579, -471 },
798 { 529,-2387,-3747, -831 },
799 { 632,-2004,-3850,-1214 },
800 { 666,-1609,-3884,-1609 },
801 { 632,-1214,-3850,-2004 },
802 { 529, -831,-3747,-2387 },
803 { 362, -471,-3579,-2747 },
804 { 134, -146,-3352,-3072 } };
806 static char* mp3_enc_err[] = {
807 /* 0 */ "",
808 /* 1 */ "Cannot open file.",
809 /* 2 */ "'RIFF' missing.",
810 /* 3 */ "'WAVE' missing.",
811 /* 4 */ "'fmt ' missing.",
812 /* 5 */ "Linear PCM required.",
813 /* 6 */ "16 bit per sample required.",
814 /* 7 */ "<=2 channels required.",
815 /* 8 */ "'data' missing.",
816 /* 9 */ "Samplerate not supported."
819 static const char* wav_filename;
820 static int mp3file, wavfile, wav_size, frames;
821 static void *enc_buffer;
822 static size_t enc_buffer_size;
823 static int enc_chunk = 0; /* encode chunk counter */
824 static int enc_size;
825 static config_t cfg;
826 static uint8_t band_scale_f[22];
829 /* forward declarations */
830 static int HuffmanCode( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table);
831 static int HuffmanCod1( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table);
832 static void putbits(uint32_t val, uint32_t nbit);
833 static int find_best_2( short *ix, uint32_t start, uint32_t end, const uint32_t *table,
834 uint32_t len, int *bits);
835 static int find_best_3( short *ix, uint32_t start, uint32_t end, const uint32_t *table,
836 uint32_t len, int *bits);
837 static int count_bit1 ( short *ix, uint32_t start, uint32_t end, int *bits );
838 static int count_bigv ( short *ix, uint32_t start, uint32_t end, int table0, int table1,
839 int *bits);
842 bool checkString(int fd, char *string)
844 char temp[4];
846 rb->read(fd, temp, 4);
848 /* return 1 on match, 0 on no match */
849 return !rb->memcmp(temp, string, 4);
852 int Read16BitsLowHigh(int fd)
854 char first, second;
856 rb->read(fd, &first, 1);
857 rb->read(fd, &second, 1);
859 return ((int)second << 8) | (first & 0xff);
863 int Read32BitsLowHigh(int fd)
865 int first = 0xffff & Read16BitsLowHigh(fd);
866 int second = 0xffff & Read16BitsLowHigh(fd);
868 return (second << 16) + first;
871 int wave_open(void)
873 unsigned short wFormatTag;
874 unsigned long dAvgBytesPerSec;
875 unsigned short wBlockAlign;
876 unsigned short bits_per_samp;
877 long header_size;
879 if((wavfile = rb->open(wav_filename, O_RDONLY)) < 0)
880 return -1;
882 if(!checkString(wavfile,"RIFF")) return -2;
883 Read32BitsLowHigh(wavfile); /* complete wave chunk size */
884 if(!checkString(wavfile,"WAVE")) return -3;
885 if(!checkString(wavfile,"fmt ")) return -4;
887 header_size = Read32BitsLowHigh(wavfile); /* chunk size */
888 wFormatTag = Read16BitsLowHigh(wavfile);
890 cfg.channels = Read16BitsLowHigh(wavfile);
891 cfg.samplerate = Read32BitsLowHigh(wavfile);
892 dAvgBytesPerSec = Read32BitsLowHigh(wavfile);
893 wBlockAlign = Read16BitsLowHigh(wavfile);
894 bits_per_samp = Read16BitsLowHigh(wavfile);
896 if(wFormatTag != 0x0001) return -5; /* linear PCM required */
897 if(bits_per_samp != 16) return -6; /* 16 bps required */
898 if(cfg.channels > 2) return -7; /* <=2 channels required */
899 if(!checkString(wavfile,"data")) return -8;
901 /* Sample rates != 16/22.05/24/32/44.1/48 kHz are not supported. */
902 if((cfg.samplerate != 16000) && (cfg.samplerate != 22050) &&
903 (cfg.samplerate != 24000) && (cfg.samplerate != 32000) &&
904 (cfg.samplerate != 44100) && (cfg.samplerate != 48000)) return -9;
906 header_size = 0x28;
907 wav_size = rb->filesize(wavfile);
908 rb->lseek(wavfile, header_size, SEEK_SET);
910 return 0;
913 int read_samples(uint16_t *buffer, int num_samples)
915 uint16_t tmpbuf[MAX_SAMP_PER_FRAME*2]; /* SAMP_PER_FRAME*MAX_CHANNELS */
916 int byte_per_sample = cfg.channels * 2; /* requires bits_per_sample==16 */
917 int s, samples = rb->read(wavfile, tmpbuf, byte_per_sample * num_samples) / byte_per_sample;
918 /* Pad last sample with zeros */
919 memset(tmpbuf + samples*cfg.channels, 0, (num_samples-samples)*cfg.channels);
921 if (cfg.channels==1)
923 /* interleave the mono samples to stereo as required by encoder */
924 for(s=0; s<num_samples; s++)
925 buffer[2*s] = tmpbuf[s];
927 else
929 /* interleaving is correct for stereo */
930 memcpy(buffer, tmpbuf, sizeof(tmpbuf));
933 return samples;
936 static inline uint32_t myswap32(uint32_t val)
938 const uint8_t* v = (const uint8_t*)&val;
940 return ((uint32_t)v[0]<<24) | ((uint32_t)v[1]<<16) | ((uint32_t)v[2]<<8) | v[3];
943 static void encodeSideInfo( side_info_t si[2][2] )
945 int gr, ch, header;
946 uint32_t cc=0, sz=0;
949 * MPEG header layout:
950 * AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM
951 * A (31-21) = frame sync
952 * B (20-19) = MPEG type
953 * C (18-17) = MPEG layer
954 * D (16) = protection bit
955 * E (15-12) = bitrate index
956 * F (11-10) = samplerate index
957 * G (9) = padding bit
958 * H (8) = private bit
959 * I (7-6) = channel mode
960 * J (5-4) = mode extension (jstereo only)
961 * K (3) = copyright bit
962 * L (2) = original
963 * M (1-0) = emphasis
966 header = (0xfff00000) | /* frame sync (AAAAAAAAA AAA)
967 mp3 type (upper): 1 (B) */
968 (0x01 << 17) | /* mp3 layer: 01 (CC) */
969 ( 0x1 << 16) | /* mp3 crc: 1 (D) */
970 ( 0x1 << 2); /* mp3 org: 1 (L) */
971 header |= cfg.mpg.type << 19;
972 header |= cfg.mpg.bitr_id << 12;
973 header |= cfg.mpg.smpl_id << 10;
974 header |= cfg.mpg.padding << 9;
975 header |= cfg.mpg.mode << 6;
976 /* no emphasis (bits 0-1) */
977 putbits( header, 32 );
979 if(cfg.mpg.type == 1)
980 { /* MPEG1 */
981 if(cfg.channels == 2) { putlong( 0, 20); }
982 else { putlong( 0, 18); }
984 for(gr=0; gr<cfg.granules; gr++)
985 for(ch=0; ch<cfg.channels; ch++)
987 side_info_t *gi = &si[gr][ch];
989 putlong((gi->part2_3_length+42),12 ); /* add scale_facs array size */
990 putlong( gi->address3>>1, 9 );
991 putlong( gi->global_gain, 8 );
992 putlong( 9, 4 ); /* set scale_facs compr type */
993 putlong( gi->table_select[0], 6 );
994 putlong( gi->table_select[1], 5 );
995 putlong( gi->table_select[2], 5 );
996 putlong( gi->region_0_1, 7 );
997 putlong( 1 , 2 ); /* set scale_facs to 1bit */
998 putlong( gi->table_select[3], 1 );
1001 else
1002 { /* MPEG2 */
1003 if(cfg.channels == 2) { putlong( 0, 10); }
1004 else { putlong( 0, 9); }
1006 for(ch=0; ch<cfg.channels; ch++)
1008 side_info_t *gi = &si[0][ch];
1010 putlong((gi->part2_3_length+42),12 ); /* add scale_facs array size */
1011 putlong( gi->address3>>1, 9 );
1012 putlong( gi->global_gain, 8 );
1013 putlong( 0xCA, 9 ); /* set scale_facs compr type */
1014 putlong( gi->table_select[0], 6 );
1015 putlong( gi->table_select[1], 5 );
1016 putlong( gi->table_select[2], 5 );
1017 putlong( gi->region_0_1 , 7 );
1018 putlong( 1 , 1 ); /* set scale_facs to 1bit */
1019 putlong( gi->table_select[3], 1 );
1022 /* flush remaining bits */
1023 putbits(cc, sz);
1026 /* Note the discussion of huffmancodebits() on pages 28 and 29 of the IS,
1027 as well as the definitions of the side information on pages 26 and 27. */
1028 static void Huffmancodebits( short *ix, char *xr_sign, side_info_t *gi )
1030 int region1 = gi->address1;
1031 int region2 = gi->address2;
1032 int bigvals = gi->address3;
1033 int count1 = bigvals + (gi->count1 << 2);
1034 int stuffBits = 0;
1035 int bits = 0;
1036 int i, v;
1038 for(i=v=0; i<32; i+=2)
1039 v |= band_scale_f[i>>1] << (30-i);
1040 putbits(v, 32); // store scale_facs (part1)
1042 for(v=0; i<42; i+=2)
1043 v |= band_scale_f[i>>1] << (40-i);
1044 putbits(v, 10); // store scale_facs (part2)
1046 if(region1 > 0)
1047 bits += HuffmanCode(ix, xr_sign, 0 , region1, gi->table_select[0]);
1049 if(region2 > region1)
1050 bits += HuffmanCode(ix, xr_sign, region1, region2, gi->table_select[1]);
1052 if(bigvals > region2)
1053 bits += HuffmanCode(ix, xr_sign, region2, bigvals, gi->table_select[2]);
1055 if(count1 > bigvals)
1056 bits += HuffmanCod1(ix, xr_sign, bigvals, count1, gi->table_select[3]);
1058 if((stuffBits = gi->part2_3_length - bits) > 0)
1060 int stuffWords = stuffBits >> 5;
1061 int remainBits = stuffBits & 31;
1063 if( remainBits )
1064 putbits( ~0, remainBits );
1066 while( stuffWords-- )
1067 putbits( ~0, 32 ); /* Huffman code tables leed to padding ones */
1071 int HuffmanCod1( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int tbl)
1073 uint32_t cc=0, sz=0;
1074 uint32_t i, d, p;
1075 int sumbit=0, s=0, l=0, v, w, x, y;
1076 #define sgnv xr_sign[i+0]
1077 #define sgnw xr_sign[i+1]
1078 #define sgnx xr_sign[i+2]
1079 #define sgny xr_sign[i+3]
1081 for(i=begin; i<end; i+=4)
1083 v = ix[i+0];
1084 w = ix[i+1];
1085 x = ix[i+2];
1086 y = ix[i+3];
1087 p = (v << 3) + (w << 2) + (x << 1) + y;
1089 switch(p)
1091 case 0: l=0; s = 0; break;
1092 case 1: l=1; s = sgny; break;
1093 case 2: l=1; s = sgnx; break;
1094 case 3: l=2; s = (sgnx << 1) + sgny; break;
1095 case 4: l=1; s = sgnw; break;
1096 case 5: l=2; s = (sgnw << 1) + sgny; break;
1097 case 6: l=2; s = (sgnw << 1) + sgnx; break;
1098 case 7: l=3; s = (sgnw << 2) + (sgnx << 1) + sgny; break;
1099 case 8: l=1; s = sgnv; break;
1100 case 9: l=2; s = (sgnv << 1) + sgny; break;
1101 case 10: l=2; s = (sgnv << 1) + sgnx; break;
1102 case 11: l=3; s = (sgnv << 2) + (sgnx << 1) + sgny; break;
1103 case 12: l=2; s = (sgnv << 1) + sgnw; break;
1104 case 13: l=3; s = (sgnv << 2) + (sgnw << 1) + sgny; break;
1105 case 14: l=3; s = (sgnv << 2) + (sgnw << 1) + sgnx; break;
1106 case 15: l=4; s = (sgnv << 3) + (sgnw << 2) + (sgnx << 1) + sgny; break;
1109 d = (ht_count[tbl][0][p] << l) + s;
1110 l = ht_count[tbl][1][p];
1111 putlong( d, l );
1112 sumbit += l;
1115 /* flush remaining bits */
1116 putbits(cc, sz);
1118 return sumbit;
1121 /* Implements the pseudocode of page 98 of the IS */
1122 int HuffmanCode(short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table)
1124 uint32_t cc=0, sz=0, code;
1125 uint32_t i, xl=0, yl=0, idx;
1126 int x, y, bit, sumbit=0;
1127 #define sign_x xr_sign[i+0]
1128 #define sign_y xr_sign[i+1]
1130 if(table == 0)
1131 return 0;
1133 if( table > 15 )
1134 { /* ESC-table is used */
1135 uint32_t linbits = ht_big[table-16].linbits;
1136 const uint16_t *hffcode = table < 24 ? t16HB : t24HB;
1137 const uint8_t *hlen = table < 24 ? t16l : t24l;
1139 for(i=begin; i<end; i+=2)
1141 x = ix[ i ];
1142 y = ix[i+1];
1144 if(x > 14) { xl = x - 15; x = 15; }
1145 if(y > 14) { yl = y - 15; y = 15; }
1147 idx = x * 16 + y;
1148 code = hffcode[idx];
1149 bit = hlen [idx];
1151 if(x)
1153 if(x > 14)
1155 code = (code << linbits) | xl;
1156 bit += linbits;
1159 code = (code << 1) | sign_x;
1160 bit += 1;
1163 if(y)
1165 if(y > 14)
1167 if(bit + linbits + 1 > 32)
1169 putlong( code, bit );
1170 sumbit += bit;
1171 code = bit = 0;
1174 code = (code << linbits) | yl;
1175 bit += linbits;
1178 code = (code << 1) | sign_y;
1179 bit += 1;
1182 putlong( code, bit );
1183 sumbit += bit;
1186 else
1187 { /* No ESC-words */
1188 const struct huffcodetab *h = &ht[table];
1190 for(i=begin; i<end; i+=2)
1192 x = ix[i];
1193 y = ix[i+1];
1195 idx = x * h->len + y;
1196 code = h->table[idx];
1197 bit = h->hlen [idx];
1199 if(x)
1201 code = (code << 1) | sign_x;
1202 bit += 1;
1205 if(y)
1207 code = (code << 1) | sign_y;
1208 bit += 1;
1211 putlong( code, bit );
1212 sumbit += bit;
1216 /* flush remaining bits */
1217 putbits(cc, sz);
1219 return sumbit;
1222 void putbits(uint32_t val, uint32_t nbit)
1224 int new_bitpos = CodedData.bitpos + nbit;
1225 int ptrpos = CodedData.bitpos >> 5;
1227 val = val & (0xffffffff >> (32 - nbit));
1229 /* data fit in one uint32_t */
1230 if(((new_bitpos - 1) >> 5) == ptrpos)
1231 CodedData.bbuf[ptrpos] |= val << ((32 - new_bitpos) & 31);
1232 else
1234 CodedData.bbuf[ptrpos ] |= val >> ((new_bitpos - 32) & 31);
1235 CodedData.bbuf[ptrpos+1] |= val << ((32 - new_bitpos) & 31);
1238 CodedData.bitpos = new_bitpos;
1241 /***************************************************************************/
1242 /* Choose the Huffman table that will encode ix[begin..end] with */
1243 /* the fewest bits. */
1244 /* Note: This code contains knowledge about the sizes and characteristic */
1245 /* of the Huffman tables as defined in the IS (Table B.7), and will not */
1246 /* work with any arbitrary tables. */
1247 /***************************************************************************/
1248 int choose_table( short *ix, uint32_t begin, uint32_t end, int *bits )
1250 uint32_t i;
1251 int max, table0, table1;
1253 for(i=begin,max=0; i<end; i++)
1254 if(ix[i] > max)
1255 max = ix[i];
1257 if(max < 16)
1259 /* tables without linbits */
1260 /* indx: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
1261 /* len: 0, 2, 3, 3, 0, 4, 4, 6, 6, 6, 8, 8, 8, 16, 0, 16 */
1262 switch(max)
1264 case 0: return 0;
1265 case 1: return count_bit1(ix, begin, end, bits);
1266 case 2: return 2 + find_best_2(ix, begin, end, tab23, 3, bits);
1267 case 3: return 5 + find_best_2(ix, begin, end, tab56, 4, bits);
1268 case 4:
1269 case 5: return 7 + find_best_3(ix, begin, end, tab789, 6, bits);
1270 case 6:
1271 case 7: return 10 + find_best_3(ix, begin, end, tabABC, 8, bits);
1272 default: return 13 + find_best_2(ix, begin, end, tab1315, 16, bits) * 2;
1275 else
1277 /* tables with linbits */
1278 max -= 15;
1280 for(table0=0; table0<8; table0++)
1281 if(ht_big[table0].linmax >= max)
1282 break;
1284 for(table1=8; table1<16; table1++)
1285 if(ht_big[table1].linmax >= max)
1286 break;
1288 return 16 + count_bigv(ix, begin, end, table0, table1, bits);
1292 int find_best_2(short *ix, uint32_t start, uint32_t end, const uint32_t *table,
1293 uint32_t len, int *bits)
1295 uint32_t i, sum = 0;
1297 for(i=start; i<end; i+=2)
1298 sum += table[ix[i] * len + ix[i+1]];
1300 if((sum & 0xffff) <= (sum >> 16))
1302 *bits = (sum & 0xffff);
1303 return 1;
1305 else
1307 *bits = sum >> 16;
1308 return 0;
1312 int find_best_3(short *ix, uint32_t start, uint32_t end, const uint32_t *table,
1313 uint32_t len, int *bits)
1315 uint32_t i, j, sum = 0;
1316 int sum1 = 0;
1317 int sum2 = 0;
1318 int sum3 = 0;
1320 /* avoid overflow in packed additions: 78*13 < 1024 */
1321 for(i=start; i<end; )
1323 j = i + 2*78 > end ? end : i + 2*78;
1325 for(sum=0; i<j; i+=2)
1326 sum += table[ix[i] * len + ix[i+1]];
1328 sum1 += (sum >> 20);
1329 sum2 += (sum >> 10) & 0x3ff;
1330 sum3 += (sum >> 0) & 0x3ff;
1333 i = 0;
1334 if(sum1 > sum2) { sum1 = sum2; i = 1; }
1335 if(sum1 > sum3) { sum1 = sum3; i = 2; }
1337 *bits = sum1;
1339 return i;
1342 /*************************************************************************/
1343 /* Function: Count the number of bits necessary to code the subregion. */
1344 /*************************************************************************/
1345 int count_bit1(short *ix, uint32_t start, uint32_t end, int *bits )
1347 uint32_t i, sum = 0;
1349 for(i=start; i<end; i+=2)
1350 sum += t1l[4 + ix[i] * 2 + ix[i+1]];
1352 *bits = sum;
1354 return 1; /* this is table1 */
1357 int count_bigv(short *ix, uint32_t start, uint32_t end, int table0,
1358 int table1, int *bits )
1360 uint32_t i, sum0, sum1, sum=0, bigv=0, x, y;
1362 /* ESC-table is used */
1363 for(i=start; i<end; i+=2)
1365 x = ix[i];
1366 y = ix[i+1];
1368 if(x > 14) { x = 15; bigv++; }
1369 if(y > 14) { y = 15; bigv++; }
1371 sum += tab1624[x * 16 + y];
1374 sum0 = (sum >> 16) + bigv * ht_big[table0].linbits;
1375 sum1 = (sum & 0xffff) + bigv * ht_big[table1].linbits;
1377 if(sum0 <= sum1)
1379 *bits = sum0;
1380 return table0;
1382 else
1384 *bits = sum1;
1385 return table1;
1389 /*************************************************************************/
1390 /* Function: Calculation of rzero, count1, address3 */
1391 /* (Partitions ix into big values, quadruples and zeros). */
1392 /*************************************************************************/
1393 int calc_runlen( short *ix, side_info_t *si )
1395 int p, i, sum = 0;
1397 for(i=SAMPL2; i-=2; )
1398 if(*(uint32_t*)&ix[i-2]) /* !!!! short *ix; !!!!! */
1399 break;
1401 si->count1 = 0;
1403 for( ; i>3; i-=4)
1405 int v = ix[i-1];
1406 int w = ix[i-2];
1407 int x = ix[i-3];
1408 int y = ix[i-4];
1410 if((v | w | x | y) <= 1)
1412 p = (y<<3) + (x<<2) + (w<<1) + (v);
1414 sum += tab01[p];
1416 si->count1++;
1418 else break;
1421 si->address3 = i;
1423 if((sum >> 16) < (sum & 0xffff))
1425 si->table_select[3] = 0;
1426 return sum >> 16;
1428 else
1430 si->table_select[3] = 1;
1431 return sum & 0xffff;
1436 /*************************************************************************/
1437 /* Function: Quantization of the vector xr ( -> ix) */
1438 /*************************************************************************/
1439 int quantize_int(int *xr, short *ix, side_info_t *si)
1441 unsigned int i, idx, s, frac_pow[] = { 0x10000, 0xd745, 0xb505, 0x9838 };
1443 s = frac_pow[si->quantStep & 3] >> si->quantStep / 4;
1445 /* check for possible 'out of range' values */
1446 if(((si->max_val + 256) >> 8) * s >= (65536 << 8))
1447 return 0;
1449 if(((si->max_val + 256) >> 8) * s < (4096 << 8))
1450 { /* all values fit the table size */
1451 for(i=SAMPL2; i--; )
1452 ix[i] = int2idx[(xr[i] * s + 0x8000) >> 16];
1454 else
1455 { /* check each index wether it fits the table */
1456 for(i=SAMPL2; i--; )
1458 idx = (xr[i] * s + 0x08000) >> 16;
1460 if(idx > 4095) ix[i] = int2idx[(idx + 8) >> 4] << 3;
1461 else ix[i] = int2idx[idx];
1465 return 1;
1468 /*************************************************************************/
1469 /* subdivides the bigvalue region which will use separate Huffman tables */
1470 /*************************************************************************/
1471 void subdivide(side_info_t *si)
1473 int scfb, count0, count1;
1475 if( !si->address3 )
1476 { /* no bigvalue region */
1477 si->region_0_1 = 0;
1478 si->address1 = 0;
1479 si->address2 = 0;
1481 else
1483 /* Calculate scale factor band index */
1484 for(scfb=0; scalefac[scfb] < si->address3; )
1485 scfb++;
1487 count0 = subdv_table[scfb].region0_cnt;
1488 count1 = subdv_table[scfb].region1_cnt;
1490 si->region_0_1 = (count0 << 3) | count1;
1491 si->address1 = scalefac[count0 + 1];
1492 si->address2 = scalefac[count0 + 1 + count1 + 1];
1496 /*******************************************************************/
1497 /* Count the number of bits necessary to code the bigvalues region */
1498 /*******************************************************************/
1499 int bigv_bitcount(short *ix, side_info_t *gi)
1501 int b1=0, b2=0, b3=0;
1503 /* Select huffman code tables for bigvalues regions */
1504 gi->table_select[0] = 0;
1505 gi->table_select[1] = 0;
1506 gi->table_select[2] = 0;
1508 if( gi->address1 > 0 ) /* region0 */
1509 gi->table_select[0] = choose_table(ix, 0 , gi->address1, &b1);
1511 if( gi->address2 > gi->address1 ) /* region1 */
1512 gi->table_select[1] = choose_table(ix, gi->address1, gi->address2, &b2);
1514 if( gi->address3 > gi->address2 ) /* region2 */
1515 gi->table_select[2] = choose_table(ix, gi->address2, gi->address3, &b3);
1517 return b1+b2+b3;
1520 int quantize_and_count_bits(int *xr, short *ix, side_info_t *si)
1522 int bits = 10000;
1524 if(quantize_int(xr, ix, si))
1526 bits = calc_runlen(ix, si); /* rzero,count1,address3 */
1527 subdivide(si); /* bigvalues sfb division */
1528 bits += bigv_bitcount(ix,si); /* bit count */
1531 return bits;
1534 /************************************************************************/
1535 /* The code selects the best quantStep for a particular set of scalefacs*/
1536 /************************************************************************/
1537 int inner_loop(int *xr, int max_bits, side_info_t *si)
1539 int bits;
1541 while((bits=quantize_and_count_bits(xr, enc_data, si)) < max_bits-64)
1543 if(si->quantStep == 0)
1544 break;
1546 if(si->quantStep <= 2)
1547 si->quantStep = 0;
1548 else
1549 si->quantStep -= 2;
1552 while(bits > max_bits)
1554 si->quantStep++;
1555 bits = quantize_and_count_bits(xr, enc_data, si);
1558 return bits;
1561 void iteration_loop(int *xr, side_info_t *si, int gr_cnt)
1563 int remain, tar_bits, max_bits = cfg.mean_bits;
1565 /* distribute reserved bits to remaining granules */
1566 tar_bits = max_bits + (cfg.ResvSize / gr_cnt & ~7);
1567 if(tar_bits > max_bits + max_bits/2)
1568 tar_bits = max_bits + max_bits/2;
1570 si->part2_3_length = inner_loop(xr, tar_bits, si);
1571 si->global_gain = si->quantStep + 142 - si->additStep;
1573 /* unused bits of the reservoir can be used for remaining granules */
1574 cfg.ResvSize += max_bits - si->part2_3_length;
1576 /* end: distribute the reserved bits to one or two granules */
1577 if(gr_cnt == 1)
1579 si->part2_3_length += cfg.ResvSize;
1580 /* mp3 format allows max 12bits for granule length */
1581 if(si->part2_3_length > 4092)
1583 remain = (si->part2_3_length - 4092 + 31) >> 5;
1584 si->part2_3_length -= remain << 5;
1585 si[-1].part2_3_length += remain << 5;
1587 while(remain--)
1588 putbits(~0, 32);
1594 /* returns sum_j=0^31 a[j]*cos(PI*j*(k+1/2)/32), 0<=k<32 */
1595 void window_subband1(short *wk, int sb0[SBLIMIT], int sb1[SBLIMIT]) ICODE_ATTR;
1596 void window_subband1(short *wk, int sb0[SBLIMIT], int sb1[SBLIMIT])
1598 int k, i, u, v;
1599 short *x1, *x2;
1600 short const *wp;
1602 #ifdef CPU_COLDFIRE
1603 int s0, s1, t0, t1;
1605 for(k=0; k<18; k++, wk+=64, sb0+=SBLIMIT, sb1+=SBLIMIT)
1607 wp = enwindow;
1608 x1 = wk;
1609 x2 = x1 - 124;
1611 for(i=-15; i<0; i++)
1613 asm volatile(
1614 "move.l (-224*4,%[x2]), %%d4\n" /* d4 = x2[-224] */
1615 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1616 "mac.w %%d0u, %%d4u, %%acc0\n"
1617 "mac.w %%d0u, %%d4l, (-160*4,%[x2]), %%d4, %%acc1\n"
1618 "mac.w %%d0l, %%d4u, %%acc0\n"
1619 "mac.w %%d0l, %%d4l, ( -96*4,%[x2]), %%d4, %%acc1\n"
1620 "mac.w %%d1u, %%d4u, %%acc0\n"
1621 "mac.w %%d1u, %%d4l, ( -32*4,%[x2]), %%d4, %%acc1\n"
1622 "mac.w %%d1l, %%d4u, %%acc0\n"
1623 "mac.w %%d1l, %%d4l, ( 32*4,%[x2]), %%d4, %%acc1\n"
1624 "mac.w %%d2u, %%d4u, %%acc0\n"
1625 "mac.w %%d2u, %%d4l, ( 96*4,%[x2]), %%d4, %%acc1\n"
1626 "mac.w %%d2l, %%d4u, %%acc0\n"
1627 "mac.w %%d2l, %%d4l, ( 160*4,%[x2]), %%d4, %%acc1\n"
1628 "mac.w %%d3u, %%d4u, %%acc0\n"
1629 "mac.w %%d3u, %%d4l, ( 224*4,%[x2]), %%d4, %%acc1\n"
1630 "mac.w %%d3l, %%d4u, %%acc0\n"
1631 "mac.w %%d3l, %%d4l, (-256*4,%[x1]), %%d4, %%acc1\n"
1632 "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */
1633 "mac.w %%d0u, %%d4u, %%acc0\n"
1634 "mac.w %%d0u, %%d4l, (-192*4,%[x1]), %%d4, %%acc1\n"
1635 "mac.w %%d0l, %%d4u, %%acc0\n"
1636 "mac.w %%d0l, %%d4l, (-128*4,%[x1]), %%d4, %%acc1\n"
1637 "mac.w %%d1u, %%d4u, %%acc0\n"
1638 "mac.w %%d1u, %%d4l, ( -64*4,%[x1]), %%d4, %%acc1\n"
1639 "mac.w %%d1l, %%d4u, %%acc0\n"
1640 "mac.w %%d1l, %%d4l, ( 0*4,%[x1]), %%d4, %%acc1\n"
1641 "mac.w %%d2u, %%d4u, %%acc0\n"
1642 "mac.w %%d2u, %%d4l, ( 64*4,%[x1]), %%d4, %%acc1\n"
1643 "mac.w %%d2l, %%d4u, %%acc0\n"
1644 "mac.w %%d2l, %%d4l, ( 128*4,%[x1]), %%d4, %%acc1\n"
1645 "mac.w %%d3u, %%d4u, %%acc0\n"
1646 "mac.w %%d3u, %%d4l, ( 192*4,%[x1]), %%d4, %%acc1\n"
1647 "mac.w %%d3l, %%d4u, %%acc0\n"
1648 "mac.w %%d3l, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n"
1649 "movclr.l %%acc0, %%d0\n"
1650 "move.l %%d0, %[s0]\n"
1651 "movclr.l %%acc1, %%d0\n"
1652 "move.l %%d0, %[s1]\n"
1654 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1655 "mac.w %%d0u, %%d4u, %%acc0\n"
1656 "mac.w %%d0u, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n"
1657 "mac.w %%d0l, %%d4u, %%acc0\n"
1658 "mac.w %%d0l, %%d4l, ( 96*4,%[x1]), %%d4, %%acc1\n"
1659 "mac.w %%d1u, %%d4u, %%acc0\n"
1660 "mac.w %%d1u, %%d4l, ( 32*4,%[x1]), %%d4, %%acc1\n"
1661 "mac.w %%d1l, %%d4u, %%acc0\n"
1662 "mac.w %%d1l, %%d4l, ( -32*4,%[x1]), %%d4, %%acc1\n"
1663 "mac.w %%d2u, %%d4u, %%acc0\n"
1664 "mac.w %%d2u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n"
1665 "mac.w %%d2l, %%d4u, %%acc0\n"
1666 "mac.w %%d2l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n"
1667 "mac.w %%d3u, %%d4u, %%acc0\n"
1668 "mac.w %%d3u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n"
1669 "mac.w %%d3l, %%d4u, %%acc0\n"
1670 "mac.w %%d3l, %%d4l, ( 256*4,%[x2]), %%d4, %%acc1\n"
1671 "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */
1672 "mac.w %%d0u, %%d4u, %%acc0\n"
1673 "mac.w %%d0u, %%d4l, ( 192*4,%[x2]), %%d4, %%acc1\n"
1674 "mac.w %%d0l, %%d4u, %%acc0\n"
1675 "mac.w %%d0l, %%d4l, ( 128*4,%[x2]), %%d4, %%acc1\n"
1676 "mac.w %%d1u, %%d4u, %%acc0\n"
1677 "mac.w %%d1u, %%d4l, ( 64*4,%[x2]), %%d4, %%acc1\n"
1678 "mac.w %%d1l, %%d4u, %%acc0\n"
1679 "mac.w %%d1l, %%d4l, ( 0*4,%[x2]), %%d4, %%acc1\n"
1680 "mac.w %%d2u, %%d4u, %%acc0\n"
1681 "mac.w %%d2u, %%d4l, ( -64*4,%[x2]), %%d4, %%acc1\n"
1682 "mac.w %%d2l, %%d4u, %%acc0\n"
1683 "mac.w %%d2l, %%d4l, (-128*4,%[x2]), %%d4, %%acc1\n"
1684 "mac.w %%d3u, %%d4u, %%acc0\n"
1685 "mac.w %%d3u, %%d4l, (-192*4,%[x2]), %%d4, %%acc1\n"
1686 "mac.w %%d3l, %%d4u, %%acc0\n"
1687 "mac.w %%d3l, %%d4l, %%acc1\n"
1688 "movclr.l %%acc0, %%d0\n"
1689 "move.l %%d0, %[t0]\n"
1690 "movclr.l %%acc1, %%d0\n"
1691 "move.l %%d0, %[t1]\n"
1693 : [x1] "+a" (x1), [x2] "+a" (x2), [s0] "+m" (s0), [t0] "+m" (t0),
1694 [s1] "+m" (s1), [t1] "+m" (t1)
1695 : [wp] "a" (wp) : "d0", "d1", "d2", "d3", "d4");
1697 sb0[30+i*2] = shft4(t0) + shft13(s0) * wp[24];
1698 sb0[31+i*2] = shft13(t0) * wp[25] - shft13(s0) * wp[26];
1699 sb1[30+i*2] = shft4(t1) + shft13(s1) * wp[24];
1700 sb1[31+i*2] = shft13(t1) * wp[25] - shft13(s1) * wp[26];
1701 wp += 27;
1702 x1 -= 2;
1703 x2 += 2;
1706 asm volatile(
1707 "move.l ( -32*4,%[x1]), %%d4\n" /* d4 = x1[-32] */
1708 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1710 "mac.w %%d0u, %%d4u, %%acc0\n"
1711 "mac.w %%d0u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n"
1712 "mac.w %%d0l, %%d4u, %%acc0\n"
1713 "mac.w %%d0l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n"
1714 "mac.w %%d1u, %%d4u, %%acc0\n"
1715 "mac.w %%d1u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n"
1716 "mac.w %%d1l, %%d4u, %%acc0\n"
1717 "mac.w %%d1l, %%d4l, ( 32*4,%[x1]), %%d4, %%acc1\n"
1718 "mac.w %%d2u, %%d4u, %%acc0\n"
1719 "mac.w %%d2u, %%d4l, ( 96*4,%[x1]), %%d4, %%acc1\n"
1720 "mac.w %%d2l, %%d4u, %%acc0\n"
1721 "mac.w %%d2l, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n"
1722 "mac.w %%d3u, %%d4u, %%acc0\n"
1723 "mac.w %%d3u, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n"
1724 "mac.w %%d3l, %%d4u, %%acc0\n"
1725 "mac.w %%d3l, %%d4l, ( -16*4,%[x1]), %%d4, %%acc1\n"
1726 "movclr.l %%acc0, %%d0\n"
1727 "move.l %%d0, %[s0]\n"
1728 "movclr.l %%acc1, %%d0\n"
1729 "move.l %%d0, %[s1]\n"
1731 "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */
1732 "mac.w %%d0u, %%d4u, %%acc0\n"
1733 "mac.w %%d0u, %%d4l, ( -48*4,%[x1]), %%d4, %%acc1\n"
1734 "mac.w %%d1u, %%d4u, %%acc0\n"
1735 "mac.w %%d1u, %%d4l, ( 16*4,%[x1]), %%d4, %%acc1\n"
1736 "mac.w %%d1l, %%d4u, %%acc0\n"
1737 "mac.w %%d1l, %%d4l, ( -80*4,%[x1]), %%d4, %%acc1\n"
1738 "mac.w %%d2u, %%d4u, %%acc0\n"
1739 "mac.w %%d2u, %%d4l, ( 48*4,%[x1]), %%d4, %%acc1\n"
1740 "mac.w %%d2u, %%d4u, %%acc0\n"
1741 "mac.w %%d2u, %%d4l, (-112*4,%[x1]), %%d4, %%acc1\n"
1742 "mac.w %%d3u, %%d4u, %%acc0\n"
1743 "mac.w %%d3u, %%d4l, ( 80*4,%[x1]), %%d4, %%acc1\n"
1744 "mac.w %%d3l, %%d4u, %%acc0\n"
1745 "mac.w %%d3l, %%d4l, (-144*4,%[x1]), %%d4, %%acc1\n"
1746 "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */
1747 "mac.w %%d0u, %%d4u, %%acc0\n"
1748 "mac.w %%d0u, %%d4l, ( 112*4,%[x1]), %%d4, %%acc1\n"
1749 "mac.w %%d0u, %%d4u, %%acc0\n"
1750 "mac.w %%d0u, %%d4l, (-176*4,%[x1]), %%d4, %%acc1\n"
1751 "mac.w %%d1u, %%d4u, %%acc0\n"
1752 "mac.w %%d1u, %%d4l, ( 144*4,%[x1]), %%d4, %%acc1\n"
1753 "mac.w %%d1l, %%d4u, %%acc0\n"
1754 "mac.w %%d1l, %%d4l, (-208*4,%[x1]), %%d4, %%acc1\n"
1755 "mac.w %%d2u, %%d4u, %%acc0\n"
1756 "mac.w %%d2u, %%d4l, ( 176*4,%[x1]), %%d4, %%acc1\n"
1757 "mac.w %%d2u, %%d4u, %%acc0\n"
1758 "mac.w %%d2u, %%d4l, (-240*4,%[x1]), %%d4, %%acc1\n"
1759 "mac.w %%d3u, %%d4u, %%acc0\n"
1760 "mac.w %%d3u, %%d4l, ( 208*4,%[x1]), %%d4, %%acc1\n"
1761 "mac.w %%d3l, %%d4u, %%acc0\n"
1762 "mac.w %%d3l, %%d4l, %%acc1\n"
1763 "movclr.l %%acc0, %%d0\n"
1764 "move.l %%d0, %[t0]\n"
1765 "movclr.l %%acc1, %%d0\n"
1766 "move.l %%d0, %[t1]\n"
1768 : [x1] "+a" (x1), [s0] "+m" (s0), [t0] "+m" (t0),
1769 [s1] "+m" (s1), [t1] "+m" (t1)
1770 : [wp] "a" (wp) : "d0", "d1", "d2", "d3", "d4");
1772 u = shft4(s0 - t0);
1773 v = shft4(s0 + t0);
1774 t0 = sb0[14];
1775 s0 = sb0[15] - t0;
1777 sb0[31] = v + t0; /* A0 */
1778 sb0[30] = u + s0; /* A1 */
1779 sb0[15] = u - s0; /* A2 */
1780 sb0[14] = v - t0; /* A3 */
1782 u = shft4(s1 - t1);
1783 v = shft4(s1 + t1);
1784 t1 = sb1[14];
1785 s1 = sb1[15] - t1;
1787 sb1[31] = v + t1; /* A0 */
1788 sb1[30] = u + s1; /* A1 */
1789 sb1[15] = u - s1; /* A2 */
1790 sb1[14] = v - t1; /* A3 */
1792 #else
1793 int ch, s, t, *a;
1795 for(ch=0; ch<cfg.channels; ch++)
1797 a = ch ? sb1 : sb0;
1798 for(k=0; k<18; k++, wk+=64, a+=SBLIMIT)
1800 wp = enwindow;
1801 x1 = wk;
1802 x2 = x1 - 124;
1804 /* x1[-572] .... x1[448] = 1022 */
1805 /* 18*4*16*32 */
1806 for(i=-15; i<0; i++)
1808 s = (int)x2[-224*2] * wp[ 0]; t = (int)x1[ 224*2] * wp[ 0];
1809 s += (int)x2[-160*2] * wp[ 1]; t += (int)x1[ 160*2] * wp[ 1];
1810 s += (int)x2[- 96*2] * wp[ 2]; t += (int)x1[ 96*2] * wp[ 2];
1811 s += (int)x2[- 32*2] * wp[ 3]; t += (int)x1[ 32*2] * wp[ 3];
1812 s += (int)x2[ 32*2] * wp[ 4]; t += (int)x1[- 32*2] * wp[ 4];
1813 s += (int)x2[ 96*2] * wp[ 5]; t += (int)x1[- 96*2] * wp[ 5];
1814 s += (int)x2[ 160*2] * wp[ 6]; t += (int)x1[-160*2] * wp[ 6];
1815 s += (int)x2[ 224*2] * wp[ 7]; t += (int)x1[-224*2] * wp[ 7];
1816 s += (int)x1[-256*2] * wp[ 8]; t += (int)x2[ 256*2] * wp[16];
1817 s += (int)x1[-192*2] * wp[ 9]; t += (int)x2[ 192*2] * wp[17];
1818 s += (int)x1[-128*2] * wp[10]; t += (int)x2[ 128*2] * wp[18];
1819 s += (int)x1[- 64*2] * wp[11]; t += (int)x2[ 64*2] * wp[19];
1820 s += (int)x1[ 0*2] * wp[12]; t += (int)x2[ 0*2] * wp[20];
1821 s += (int)x1[ 64*2] * wp[13]; t += (int)x2[- 64*2] * wp[21];
1822 s += (int)x1[ 128*2] * wp[14]; t += (int)x2[-128*2] * wp[22];
1823 s += (int)x1[ 192*2] * wp[15]; t += (int)x2[-192*2] * wp[23];
1825 a[30+i*2] = shft4(t) + shft13(s) * wp[24];
1826 a[31+i*2] = shft13(t) * wp[25] - shft13(s) * wp[26];
1827 wp += 27;
1828 x1 -= 2;
1829 x2 += 2;
1832 t = (int)x1[- 16*2] * wp[ 8]; s = (int)x1[ -32*2] * wp[0];
1833 t += ((int)x1[- 48*2]-x1[ 16*2]) * wp[10]; s += (int)x1[ -96*2] * wp[1];
1834 t += ((int)x1[- 80*2]+x1[ 48*2]) * wp[12]; s += (int)x1[-160*2] * wp[2];
1835 t += ((int)x1[-112*2]-x1[ 80*2]) * wp[14]; s += (int)x1[-224*2] * wp[3];
1836 t += ((int)x1[-144*2]+x1[112*2]) * wp[16]; s += (int)x1[ 32*2] * wp[4];
1837 t += ((int)x1[-176*2]-x1[144*2]) * wp[18]; s += (int)x1[ 96*2] * wp[5];
1838 t += ((int)x1[-208*2]+x1[176*2]) * wp[20]; s += (int)x1[ 160*2] * wp[6];
1839 t += ((int)x1[-240*2]-x1[208*2]) * wp[22]; s += (int)x1[ 224*2] * wp[7];
1841 u = shft4(s - t);
1842 v = shft4(s + t);
1843 t = a[14];
1844 s = a[15] - t;
1846 a[31] = v + t; /* A0 */
1847 a[30] = u + s; /* A1 */
1848 a[15] = u - s; /* A2 */
1849 a[14] = v - t; /* A3 */
1851 wk -= 18 * 64 - 1; /* rewind wk (to next channel start) */
1853 #endif
1856 void window_subband2(short *x1, int a[SBLIMIT]) ICODE_ATTR;
1857 void window_subband2(short *x1, int a[SBLIMIT])
1859 int xr;
1860 short const *wp = enwindow;
1861 short *x2 = x1 - 124;
1863 wp += 27 * 15;
1864 x1 -= 2 * 15;
1865 x2 += 2 * 15;
1867 xr = a[28] - a[0]; a[0] += a[28]; a[28] = shft9(xr) * wp[-2*27+25];
1868 xr = a[29] - a[1]; a[1] += a[29]; a[29] = shft9(xr) * wp[-2*27+25];
1869 xr = a[26] - a[2]; a[2] += a[26]; a[26] = shft9(xr) * wp[-4*27+25];
1870 xr = a[27] - a[3]; a[3] += a[27]; a[27] = shft9(xr) * wp[-4*27+25];
1871 xr = a[24] - a[4]; a[4] += a[24]; a[24] = shft9(xr) * wp[-6*27+25];
1872 xr = a[25] - a[5]; a[5] += a[25]; a[25] = shft9(xr) * wp[-6*27+25];
1873 xr = a[22] - a[6]; a[6] += a[22]; a[22] = shft9(xr) * SQRT ;
1874 xr = a[23] - a[7]; a[7] += a[23]; a[23] = shft9(xr) * SQRT - a[7];
1875 a[ 7] -= a[ 6];
1876 a[22] -= a[ 7];
1877 a[23] -= a[22];
1879 xr = a[ 6]; a[ 6] = a[31] - xr; a[31] = a[31] + xr;
1880 xr = a[ 7]; a[ 7] = a[30] - xr; a[30] = a[30] + xr;
1881 xr = a[22]; a[22] = a[15] - xr; a[15] = a[15] + xr;
1882 xr = a[23]; a[23] = a[14] - xr; a[14] = a[14] + xr;
1884 xr = a[20] - a[ 8]; a[ 8] += a[20]; a[20] = shft9(xr) * wp[-10*27+25];
1885 xr = a[21] - a[ 9]; a[ 9] += a[21]; a[21] = shft9(xr) * wp[-10*27+25];
1886 xr = a[18] - a[10]; a[10] += a[18]; a[18] = shft9(xr) * wp[-12*27+25];
1887 xr = a[19] - a[11]; a[11] += a[19]; a[19] = shft9(xr) * wp[-12*27+25];
1888 xr = a[16] - a[12]; a[12] += a[16]; a[16] = shft9(xr) * wp[-14*27+25];
1889 xr = a[17] - a[13]; a[13] += a[17]; a[17] = shft9(xr) * wp[-14*27+25];
1890 xr =-a[20] + a[24]; a[20] += a[24]; a[24] = shft9(xr) * wp[-12*27+25];
1891 xr =-a[21] + a[25]; a[21] += a[25]; a[25] = shft9(xr) * wp[-12*27+25];
1892 xr = a[ 4] - a[ 8]; a[ 4] += a[ 8]; a[ 8] = shft9(xr) * wp[-12*27+25];
1893 xr = a[ 5] - a[ 9]; a[ 5] += a[ 9]; a[ 9] = shft9(xr) * wp[-12*27+25];
1894 xr = a[ 0] - a[12]; a[ 0] += a[12]; a[12] = shft9(xr) * wp[ -4*27+25];
1895 xr = a[ 1] - a[13]; a[ 1] += a[13]; a[13] = shft9(xr) * wp[ -4*27+25];
1896 xr = a[16] - a[28]; a[16] += a[28]; a[28] = shft9(xr) * wp[ -4*27+25];
1897 xr =-a[17] + a[29]; a[17] += a[29]; a[29] = shft9(xr) * wp[ -4*27+25];
1899 xr = SQRT * shft9(a[ 2] - a[10]); a[ 2] += a[10]; a[10] = xr;
1900 xr = SQRT * shft9(a[ 3] - a[11]); a[ 3] += a[11]; a[11] = xr;
1901 xr = SQRT * shft9(a[26] - a[18]); a[18] += a[26]; a[26] = xr - a[18];
1902 xr = SQRT * shft9(a[27] - a[19]); a[19] += a[27]; a[27] = xr - a[19];
1904 xr = a[ 2]; a[19] -= a[ 3]; a[ 3] -= xr; a[ 2] = a[31] - xr; a[31] += xr;
1905 xr = a[ 3]; a[11] -= a[19]; a[18] -= xr; a[ 3] = a[30] - xr; a[30] += xr;
1906 xr = a[18]; a[27] -= a[11]; a[19] -= xr; a[18] = a[15] - xr; a[15] += xr;
1908 xr = a[19]; a[10] -= xr; a[19] = a[14] - xr; a[14] += xr;
1909 xr = a[10]; a[11] -= xr; a[10] = a[23] - xr; a[23] += xr;
1910 xr = a[11]; a[26] -= xr; a[11] = a[22] - xr; a[22] += xr;
1911 xr = a[26]; a[27] -= xr; a[26] = a[ 7] - xr; a[ 7] += xr;
1913 xr = a[27]; a[27] = a[6] - xr; a[6] += xr;
1915 xr = SQRT * shft9(a[ 0] - a[ 4]); a[ 0] += a[ 4]; a[ 4] = xr;
1916 xr = SQRT * shft9(a[ 1] - a[ 5]); a[ 1] += a[ 5]; a[ 5] = xr;
1917 xr = SQRT * shft9(a[16] - a[20]); a[16] += a[20]; a[20] = xr;
1918 xr = SQRT * shft9(a[17] - a[21]); a[17] += a[21]; a[21] = xr;
1919 xr =-SQRT * shft9(a[ 8] - a[12]); a[ 8] += a[12]; a[12] = xr - a[ 8];
1920 xr =-SQRT * shft9(a[ 9] - a[13]); a[ 9] += a[13]; a[13] = xr - a[ 9];
1921 xr =-SQRT * shft9(a[25] - a[29]); a[25] += a[29]; a[29] = xr - a[25];
1922 xr =-SQRT * shft9(a[24] + a[28]); a[24] -= a[28]; a[28] = xr - a[24];
1924 xr = a[24] - a[16]; a[24] = xr;
1925 xr = a[20] - xr; a[20] = xr;
1926 xr = a[28] - xr; a[28] = xr;
1928 xr = a[25] - a[17]; a[25] = xr;
1929 xr = a[21] - xr; a[21] = xr;
1930 xr = a[29] - xr; a[29] = xr;
1932 xr = a[17] - a[1]; a[17] = xr;
1933 xr = a[ 9] - xr; a[ 9] = xr;
1934 xr = a[25] - xr; a[25] = xr;
1935 xr = a[ 5] - xr; a[ 5] = xr;
1936 xr = a[21] - xr; a[21] = xr;
1937 xr = a[13] - xr; a[13] = xr;
1938 xr = a[29] - xr; a[29] = xr;
1940 xr = a[ 1] - a[0]; a[ 1] = xr;
1941 xr = a[16] - xr; a[16] = xr;
1942 xr = a[17] - xr; a[17] = xr;
1943 xr = a[ 8] - xr; a[ 8] = xr;
1944 xr = a[ 9] - xr; a[ 9] = xr;
1945 xr = a[24] - xr; a[24] = xr;
1946 xr = a[25] - xr; a[25] = xr;
1947 xr = a[ 4] - xr; a[ 4] = xr;
1948 xr = a[ 5] - xr; a[ 5] = xr;
1949 xr = a[20] - xr; a[20] = xr;
1950 xr = a[21] - xr; a[21] = xr;
1951 xr = a[12] - xr; a[12] = xr;
1952 xr = a[13] - xr; a[13] = xr;
1953 xr = a[28] - xr; a[28] = xr;
1954 xr = a[29] - xr; a[29] = xr;
1956 xr = a[ 0]; a[ 0] += a[31]; a[31] -= xr;
1957 xr = a[ 1]; a[ 1] += a[30]; a[30] -= xr;
1958 xr = a[16]; a[16] += a[15]; a[15] -= xr;
1959 xr = a[17]; a[17] += a[14]; a[14] -= xr;
1960 xr = a[ 8]; a[ 8] += a[23]; a[23] -= xr;
1961 xr = a[ 9]; a[ 9] += a[22]; a[22] -= xr;
1962 xr = a[24]; a[24] += a[ 7]; a[ 7] -= xr;
1963 xr = a[25]; a[25] += a[ 6]; a[ 6] -= xr;
1964 xr = a[ 4]; a[ 4] += a[27]; a[27] -= xr;
1965 xr = a[ 5]; a[ 5] += a[26]; a[26] -= xr;
1966 xr = a[20]; a[20] += a[11]; a[11] -= xr;
1967 xr = a[21]; a[21] += a[10]; a[10] -= xr;
1968 xr = a[12]; a[12] += a[19]; a[19] -= xr;
1969 xr = a[13]; a[13] += a[18]; a[18] -= xr;
1970 xr = a[28]; a[28] += a[ 3]; a[ 3] -= xr;
1971 xr = a[29]; a[29] += a[ 2]; a[ 2] -= xr;
1974 void mdct_long(int *out, int *in) ICODE_ATTR;
1975 void mdct_long(int *out, int *in)
1977 int ct,st;
1978 int tc1, tc2, tc3, tc4, ts5, ts6, ts7, ts8;
1979 int ts1, ts2, ts3, ts4, tc5, tc6, tc7, tc8;
1981 /* 1,2, 5,6, 9,10, 13,14, 17 */
1982 tc1 = in[17] - in[ 9];
1983 tc3 = in[15] - in[11];
1984 tc4 = in[14] - in[12];
1985 ts5 = in[ 0] + in[ 8];
1986 ts6 = in[ 1] + in[ 7];
1987 ts7 = in[ 2] + in[ 6];
1988 ts8 = in[ 3] + in[ 5];
1990 out[17] = (ts5 + ts7 - ts8) * cx[8] - (ts6 - in[4]) * cx[8];
1991 st = (ts5 + ts7 - ts8) * cx[7] + (ts6 - in[4]) * cx[8];
1992 ct = (tc1 - tc3 - tc4) * cx[6];
1993 out[5] = ct + st;
1994 out[6] = ct - st;
1996 tc2 = (in[16] - in[10]) * cx[6];
1997 ts6 = ts6 * cx[7] + in[4] * cx[8];
1999 ct = tc1 * cx[0] + tc2 + tc3 * cx[1] + tc4 * cx[2];
2000 st = -ts5 * cx[4] + ts6 - ts7 * cx[5] + ts8 * cx[3];
2001 out[1] = ct + st;
2002 out[2] = ct - st;
2004 ct = tc1 * cx[1] - tc2 - tc3 * cx[2] + tc4 * cx[0];
2005 st = -ts5 * cx[5] + ts6 - ts7 * cx[3] + ts8 * cx[4];
2006 out[ 9] = ct + st;
2007 out[10] = ct - st;
2009 ct = tc1 * cx[2] - tc2 + tc3 * cx[0] - tc4 * cx[1];
2010 st = ts5 * cx[3] - ts6 + ts7 * cx[4] - ts8 * cx[5];
2011 out[13] = ct + st;
2012 out[14] = ct - st;
2014 ts1 = in[ 8] - in[ 0];
2015 ts3 = in[ 6] - in[ 2];
2016 ts4 = in[ 5] - in[ 3];
2017 tc5 = in[17] + in[ 9];
2018 tc6 = in[16] + in[10];
2019 tc7 = in[15] + in[11];
2020 tc8 = in[14] + in[12];
2022 out[0] = (tc5 + tc7 + tc8) * cx[8] + (tc6 + in[13]) * cx[8];
2023 ct = (tc5 + tc7 + tc8) * cx[7] - (tc6 + in[13]) * cx[8];
2024 st = (ts1 - ts3 + ts4) * cx[6];
2025 out[11] = ct + st;
2026 out[12] = ct - st;
2028 ts2 = (in[7] - in[1]) * cx[6];
2029 tc6 = in[13] * cx[8] - tc6 * cx[7];
2031 ct = tc5 * cx[3] - tc6 + tc7 * cx[4] + tc8 * cx[5];
2032 st = ts1 * cx[2] + ts2 + ts3 * cx[0] + ts4 * cx[1];
2033 out[3] = ct + st;
2034 out[4] = ct - st;
2036 ct =-tc5 * cx[5] + tc6 - tc7 * cx[3] - tc8 * cx[4];
2037 st = ts1 * cx[1] + ts2 - ts3 * cx[2] - ts4 * cx[0];
2038 out[7] = ct + st;
2039 out[8] = ct - st;
2041 ct =-tc5 * cx[4] + tc6 - tc7 * cx[5] - tc8 * cx[3];
2042 st = ts1 * cx[0] - ts2 + ts3 * cx[1] - ts4 * cx[2];
2043 out[15] = ct + st;
2044 out[16] = ct - st;
2047 static int find_bitrate_index(int type, uint16_t bitrate)
2049 int i;
2051 for(i=0;i<14;i++)
2052 if(bitrate == bitr_index[type][i])
2053 break;
2055 return i;
2058 static int find_samplerate_index(uint16_t freq, int *mp3_type)
2060 int mpg, rate;
2062 /* set default values: MPEG1 at 44100/s */
2063 *mp3_type = 1;
2065 for(mpg=0; mpg<2; mpg++)
2066 for(rate=0; rate<3; rate++)
2067 if(freq == sampr_index[mpg][rate])
2068 { *mp3_type = mpg; return rate; }
2070 return 0;
2073 void init_mp3_encoder_engine(bool stereo, int bitrate, uint16_t sample_rate)
2075 uint32_t avg_byte_per_frame;
2077 #ifdef ROCKBOX_LITTLE_ENDIAN
2078 cfg.byte_order = order_littleEndian;
2079 #else
2080 cfg.byte_order = order_bigEndian;
2081 #endif
2083 cfg.samplerate = sample_rate;
2084 cfg.channels = stereo ? 2 : 1;
2085 cfg.mpg.mode = stereo ? 0 : 3; /* 0=stereo, 3=mono */
2086 cfg.mpg.bitrate = stereo ? bitrate : bitrate > 160 ? 160 : bitrate;
2087 cfg.mpg.smpl_id = find_samplerate_index(cfg.samplerate, &cfg.mpg.type);
2088 cfg.mpg.bitr_id = find_bitrate_index(cfg.mpg.type, cfg.mpg.bitrate);
2089 cfg.mpg.num_bands = num_bands[stereo ? cfg.mpg.type : 2][cfg.mpg.bitr_id];
2091 if(0 == cfg.mpg.type)
2092 { /* use MPEG2 format */
2093 cfg.smpl_per_frm = MAX_SAMP_PER_FRAME/2;
2094 cfg.granules = 1;
2096 else
2097 { /* use MPEG1 format */
2098 cfg.smpl_per_frm = MAX_SAMP_PER_FRAME;
2099 cfg.granules = 2;
2102 scalefac = sfBand[cfg.mpg.smpl_id + 3*cfg.mpg.type];
2104 ht[ 0].table = NULL; ht[ 0].hlen = NULL; /* Apparently not used */
2105 ht[ 1].table = t1HB; ht[ 1].hlen = t1l;
2106 ht[ 2].table = t2HB; ht[ 2].hlen = t2l;
2107 ht[ 3].table = t3HB; ht[ 3].hlen = t3l;
2108 ht[ 4].table = NULL; ht[ 4].hlen = NULL; /* Apparently not used */
2109 ht[ 5].table = t5HB; ht[ 5].hlen = t5l;
2110 ht[ 6].table = t6HB; ht[ 6].hlen = t6l;
2111 ht[ 7].table = t7HB; ht[ 7].hlen = t7l;
2112 ht[ 8].table = t8HB; ht[ 8].hlen = t8l;
2113 ht[ 9].table = t9HB; ht[ 9].hlen = t9l;
2114 ht[10].table = t10HB; ht[10].hlen = t10l;
2115 ht[11].table = t11HB; ht[11].hlen = t11l;
2116 ht[12].table = t12HB; ht[12].hlen = t12l;
2117 ht[13].table = t13HB; ht[13].hlen = t13l;
2118 ht[14].table = NULL; ht[14].hlen = NULL; /* Apparently not used */
2119 ht[15].table = t15HB; ht[15].hlen = t15l;
2121 /* Figure average number of 'bytes' per frame */
2122 avg_byte_per_frame = SAMPL2 * 16000 * cfg.mpg.bitrate / (2 - cfg.mpg.type);
2123 avg_byte_per_frame = avg_byte_per_frame / cfg.samplerate;
2124 cfg.byte_per_frame = avg_byte_per_frame / 64;
2125 cfg.frac_per_frame = avg_byte_per_frame & 63;
2126 cfg.slot_lag = 0;
2127 cfg.sideinfo_len = 32 + (cfg.mpg.type ? (cfg.channels == 1 ? 136 : 256)
2128 : (cfg.channels == 1 ? 72 : 136));
2131 void set_scale_facs(int *mdct_freq)
2133 unsigned int i, is, ie, k, s;
2134 int max_freq_val, avrg_freq_val;
2136 /* calc average of first 256 frequency values */
2137 for(avrg_freq_val=i=0; i<256; i++)
2138 avrg_freq_val += mdct_freq[i];
2139 avrg_freq_val >>= 8;
2141 /* if max of current band is smaller than average, increase precision */
2142 /* last band keeps untouched (not scaled) */
2143 for(is=k=0; is<scalefac[21]; k++)
2145 max_freq_val = 0;
2147 for(i=is, ie=scalefac[k+1]; i<ie; i++)
2148 if(max_freq_val < mdct_freq[i])
2149 max_freq_val = mdct_freq[i];
2151 for(s=0; s<3; s++)
2152 if((max_freq_val<<s) > avrg_freq_val)
2153 break;
2155 band_scale_f[k] = (unsigned char)s;
2157 for(i=is; s && i<ie; i++)
2158 mdct_freq[i] <<= s;
2160 is = ie;
2164 void compress(void)
2166 int i, gr, gr_cnt;
2167 uint32_t max;
2169 while(1)
2171 if((frames & 7) == 0)
2172 { rb->lcd_clear_display();
2173 rb->lcd_putsxyf(4, 20, "Frame %d / %d", frames,
2174 wav_size/cfg.smpl_per_frm/cfg.channels/2);
2175 rb->lcd_update();
2177 /* encode one mp3 frame in this loop */
2178 memset(CodedData.bbuf, 0, sizeof(CodedData.bbuf));
2180 if((cfg.slot_lag += cfg.frac_per_frame) >= 64)
2181 { /* Padding for this frame */
2182 cfg.slot_lag -= 64;
2183 cfg.mpg.padding = 1;
2185 else
2186 cfg.mpg.padding = 0;
2188 cfg.mean_bits = (8 * cfg.byte_per_frame + 8 * cfg.mpg.padding
2189 - cfg.sideinfo_len) / cfg.granules / cfg.channels
2190 - 42; // reserved for scale_facs
2192 /* shift out old samples */
2193 memcpy(mfbuf, mfbuf + 2*cfg.granules*576, 4*512);
2195 /* read new samples to iram for further processing */
2196 if(read_samples((mfbuf + 2*512), cfg.smpl_per_frm) == 0)
2197 break;
2199 /* swap bytes if neccessary */
2200 if(cfg.byte_order == order_bigEndian)
2201 for(i=0; i<cfg.smpl_per_frm; i++)
2203 uint32_t t = ((uint32_t*)mfbuf)[512 + i];
2204 t = ((t >> 8) & 0xff00ff) | ((t << 8) & 0xff00ff00);
2205 ((uint32_t*)mfbuf)[512 + i] = t;
2208 cfg.ResvSize = 0;
2209 gr_cnt = cfg.granules * cfg.channels;
2210 CodedData.bitpos = cfg.sideinfo_len; /* leave space for mp3 header */
2212 for(gr=0; gr<cfg.granules; gr++)
2214 short *wk = mfbuf + 2*286 + gr*1152;
2215 int ch;
2217 /* 16bit packed wav data can be windowed efficiently on coldfire */
2218 window_subband1(wk, sb_data[0][1-gr][0], sb_data[1][1-gr][0]);
2220 for(ch=0; ch<cfg.channels; ch++)
2222 int ii, k, shift;
2224 wk = mfbuf + 2*286 + gr*1152 + ch;
2226 /* 36864=4*18*16*32 */
2227 for(k=0; k<18; k++, wk+=64)
2229 window_subband2(wk, sb_data[ch][1-gr][k]);
2230 /* Compensate for inversion in the analysis filter */
2231 if(k & 1)
2233 int band;
2234 for(band=1; band<32; band+=2)
2235 sb_data[ch][1-gr][k][band] *= -1;
2239 /* Perform imdct of 18 previous + 18 current subband samples */
2240 /* for integer precision do this loop again (if neccessary) */
2241 shift = 14 - (cfg.cod_info[gr][ch].additStep >> 2);
2242 for(k=1,ii=0; ii<3 && k; ii++)
2244 int *mdct = mdct_freq;
2245 int band;
2247 cfg.cod_info[gr][ch].additStep = 4 * (14 - shift);
2248 for(band=0; band<cfg.mpg.num_bands; band++, mdct+=18)
2250 int *band0 = sb_data[ch][ gr][0] + order[band];
2251 int *band1 = sb_data[ch][1-gr][0] + order[band];
2252 int work[18];
2254 /* 9216=4*32*9*8 */
2255 for(k=-9; k<0; k++)
2257 int a = shft_n(band1[(k+9)*32], shift);
2258 int b = shft_n(band1[(8-k)*32], shift);
2259 int c = shft_n(band0[(k+9)*32], shift);
2260 int d = shft_n(band0[(8-k)*32], shift);
2262 work[k+ 9] = shft16(a * win[k+ 9][0] +
2263 b * win[k+ 9][1] +
2264 c * win[k+ 9][2] +
2265 d * win[k+ 9][3]);
2267 work[k+18] = shft16(c * win[k+18][0] +
2268 d * win[k+18][1] +
2269 a * win[k+18][2] +
2270 b * win[k+18][3]);
2273 /* 7200=4*18*100 */
2274 mdct_long(mdct, work);
2276 /* Perform aliasing reduction butterfly */
2277 if(band != 0)
2279 for(k=7; k>=0; --k)
2281 int bu, bd;
2282 bu = shft15(mdct[k]) * ca[k] +
2283 shft15(mdct[-1-k]) * cs[k];
2284 bd = shft15(mdct[k]) * cs[k] -
2285 shft15(mdct[-1-k]) * ca[k];
2286 mdct[-1-k] = bu;
2287 mdct[ k ] = bd;
2292 max = 0;
2293 for(k=0; k<576; k++)
2295 if(mdct_freq[k] < 0)
2297 mdct_sign[k] = 1; /* negative */
2298 mdct_freq[k] = shft13(-mdct_freq[k]);
2300 else
2302 mdct_sign[k] = 0; /* positive */
2303 mdct_freq[k] = shft13(mdct_freq[k]);
2306 if(max < (uint32_t)mdct_freq[k])
2307 max = (uint32_t)mdct_freq[k];
2310 cfg.cod_info[gr][ch].max_val = max;
2312 /* calc new shift for higher integer precision */
2313 for(k=0; max<(uint32_t)(0x7800>>k); k++) shift--;
2314 for( ; (max>>k)>=(uint32_t)0x10000; k++) shift++;
2315 if(shift < 0) shift = 0;
2318 cfg.cod_info[gr][ch].quantStep +=
2319 cfg.cod_info[gr][ch].additStep;
2321 set_scale_facs(mdct_freq);
2323 /* bit and noise allocation */
2324 iteration_loop(mdct_freq, &cfg.cod_info[gr][ch],
2325 gr_cnt--);
2326 /* write the frame to the bitstream */
2327 Huffmancodebits(enc_data, mdct_sign,
2328 &cfg.cod_info[gr][ch]);
2330 cfg.cod_info[gr][ch].quantStep -=
2331 cfg.cod_info[gr][ch].additStep;
2333 if(cfg.granules == 1)
2335 memcpy(sb_data[ch][0], sb_data[ch][1],
2336 sizeof(sb_data[ch][0]));
2341 enc_size = (CodedData.bitpos + 7) >> 3;
2342 /* finish this chunk by adding sideinfo header data */
2343 CodedData.bitpos = 0;
2344 encodeSideInfo( cfg.cod_info );
2346 if(cfg.byte_order != order_bigEndian)
2347 for(i=0; i<(enc_size+3)/4; i++)
2348 CodedData.bbuf[i] = myswap32(CodedData.bbuf[i]);
2350 if(enc_chunk + enc_size > (int)enc_buffer_size)
2352 /* copy iram mp3 buffer to sdram/file */
2353 rb->write(mp3file, enc_buffer, enc_chunk & ~3);
2354 memcpy(enc_buffer, enc_buffer + (enc_chunk >> 2), enc_chunk & 3);
2355 enc_chunk &= 3;
2358 memcpy(enc_buffer + enc_chunk, CodedData.bbuf, enc_size);
2359 enc_chunk += enc_size;
2360 frames++;
2362 /* write last chunks to disk */
2363 rb->write(mp3file, enc_buffer, enc_chunk);
2367 int num_file;
2368 char mp3_name[80];
2370 void get_mp3_filename(const char *wav_name)
2372 rb->strlcpy(mp3_name, wav_name, sizeof(mp3_name));
2373 rb->strlcpy(mp3_name + rb->strlen(mp3_name) - 4, ".mp3", 5);
2376 #if CONFIG_KEYPAD == IRIVER_H100_PAD || CONFIG_KEYPAD == IRIVER_H300_PAD
2377 #define MP3ENC_PREV BUTTON_UP
2378 #define MP3ENC_NEXT BUTTON_DOWN
2379 #define MP3ENC_DONE BUTTON_OFF
2380 #define MP3ENC_SELECT BUTTON_SELECT
2382 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \
2383 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
2384 #define MP3ENC_PREV BUTTON_SCROLL_BACK
2385 #define MP3ENC_NEXT BUTTON_SCROLL_FWD
2386 #define MP3ENC_DONE BUTTON_MENU
2387 #define MP3ENC_SELECT BUTTON_SELECT
2389 #elif CONFIG_KEYPAD == IAUDIO_X5M5_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 == GIGABEAT_PAD
2396 #define MP3ENC_PREV BUTTON_UP
2397 #define MP3ENC_NEXT BUTTON_DOWN
2398 #define MP3ENC_DONE BUTTON_POWER
2399 #define MP3ENC_SELECT BUTTON_SELECT
2401 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
2402 (CONFIG_KEYPAD == SANSA_C200_PAD) || \
2403 (CONFIG_KEYPAD == SANSA_CLIP_PAD) || \
2404 (CONFIG_KEYPAD == SANSA_M200_PAD)
2405 #define MP3ENC_PREV BUTTON_UP
2406 #define MP3ENC_NEXT BUTTON_DOWN
2407 #define MP3ENC_DONE BUTTON_POWER
2408 #define MP3ENC_SELECT BUTTON_SELECT
2410 #elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
2411 #define MP3ENC_PREV BUTTON_SCROLL_BACK
2412 #define MP3ENC_NEXT BUTTON_SCROLL_FWD
2413 #define MP3ENC_DONE BUTTON_UP
2414 #define MP3ENC_SELECT BUTTON_SELECT
2416 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
2417 #define MP3ENC_PREV BUTTON_SCROLL_UP
2418 #define MP3ENC_NEXT BUTTON_SCROLL_DOWN
2419 #define MP3ENC_DONE BUTTON_POWER
2420 #define MP3ENC_SELECT BUTTON_PLAY
2422 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
2423 #define MP3ENC_PREV BUTTON_UP
2424 #define MP3ENC_NEXT BUTTON_DOWN
2425 #define MP3ENC_DONE BUTTON_BACK
2426 #define MP3ENC_SELECT BUTTON_SELECT
2428 #elif CONFIG_KEYPAD == MROBE100_PAD
2429 #define MP3ENC_PREV BUTTON_UP
2430 #define MP3ENC_NEXT BUTTON_DOWN
2431 #define MP3ENC_DONE BUTTON_POWER
2432 #define MP3ENC_SELECT BUTTON_SELECT
2434 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
2435 #define MP3ENC_PREV BUTTON_RC_VOL_UP
2436 #define MP3ENC_NEXT BUTTON_RC_VOL_DOWN
2437 #define MP3ENC_DONE BUTTON_RC_REC
2438 #define MP3ENC_SELECT BUTTON_RC_FF
2440 #elif CONFIG_KEYPAD == COWON_D2_PAD
2441 #define MP3ENC_DONE BUTTON_POWER
2443 #elif CONFIG_KEYPAD == IAUDIO67_PAD
2444 #define MP3ENC_PREV BUTTON_LEFT
2445 #define MP3ENC_NEXT BUTTON_RIGHT
2446 #define MP3ENC_DONE BUTTON_POWER
2447 #define MP3ENC_SELECT BUTTON_PLAY
2449 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
2450 #define MP3ENC_PREV BUTTON_UP
2451 #define MP3ENC_NEXT BUTTON_DOWN
2452 #define MP3ENC_DONE BUTTON_BACK
2453 #define MP3ENC_SELECT BUTTON_SELECT
2455 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
2456 #define MP3ENC_PREV BUTTON_UP
2457 #define MP3ENC_NEXT BUTTON_DOWN
2458 #define MP3ENC_DONE BUTTON_POWER
2459 #define MP3ENC_SELECT BUTTON_SELECT
2461 #elif CONFIG_KEYPAD == PHILIPS_HDD6330_PAD
2462 #define MP3ENC_PREV BUTTON_UP
2463 #define MP3ENC_NEXT BUTTON_DOWN
2464 #define MP3ENC_DONE BUTTON_POWER
2465 #define MP3ENC_SELECT BUTTON_PLAY
2467 #elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
2468 #define MP3ENC_PREV BUTTON_UP
2469 #define MP3ENC_NEXT BUTTON_DOWN
2470 #define MP3ENC_DONE BUTTON_POWER
2471 #define MP3ENC_SELECT BUTTON_PLAY
2473 #elif CONFIG_KEYPAD == ONDAVX747_PAD || \
2474 CONFIG_KEYPAD == ONDAVX777_PAD || \
2475 CONFIG_KEYPAD == MROBE500_PAD
2476 #define MP3ENC_DONE BUTTON_POWER
2478 #elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
2479 #define MP3ENC_PREV BUTTON_UP
2480 #define MP3ENC_NEXT BUTTON_DOWN
2481 #define MP3ENC_DONE BUTTON_PLAY
2482 #define MP3ENC_SELECT BUTTON_RIGHT
2484 #elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
2485 #define MP3ENC_PREV BUTTON_UP
2486 #define MP3ENC_NEXT BUTTON_DOWN
2487 #define MP3ENC_DONE BUTTON_REC
2488 #define MP3ENC_SELECT BUTTON_OK
2490 #elif CONFIG_KEYPAD == MPIO_HD200_PAD
2491 #define MP3ENC_PREV BUTTON_REW
2492 #define MP3ENC_NEXT BUTTON_FF
2493 #define MP3ENC_DONE BUTTON_PLAY
2494 #define MP3ENC_SELECT BUTTON_FUNC
2496 #elif CONFIG_KEYPAD == MPIO_HD300_PAD
2497 #define MP3ENC_PREV BUTTON_REW
2498 #define MP3ENC_NEXT BUTTON_FF
2499 #define MP3ENC_DONE BUTTON_PLAY
2500 #define MP3ENC_SELECT BUTTON_ENTER
2502 #else
2503 #error No keymap defined!
2504 #endif
2506 #ifdef HAVE_TOUCHSCREEN
2507 #ifndef MP3ENC_PREV
2508 #define MP3ENC_PREV BUTTON_MIDLEFT
2509 #endif
2510 #ifndef MP3ENC_NEXT
2511 #define MP3ENC_NEXT BUTTON_MIDRIGHT
2512 #endif
2513 #ifndef MP3ENC_DONE
2514 #define MP3ENC_DONE BUTTON_TOPLEFT
2515 #endif
2516 #ifndef MP3ENC_SELECT
2517 #define MP3ENC_SELECT BUTTON_CENTER
2518 #endif
2519 #endif
2521 enum plugin_status plugin_start(const void* parameter)
2523 int rat, srat, nrat; /* for rate selection */
2524 int cont = 1, butt;
2525 int ret;
2526 long tim = 0;
2527 static const char* bstrg[] = {
2528 "64", "80", "96", "112", "128", "160", "192", "224", "256", "320"
2530 static const int brate[] = {
2531 64, 80, 96, 112, 128, 160, 192, 224, 256, 320
2534 if (parameter == NULL)
2535 return PLUGIN_ERROR;
2537 enc_buffer = rb->plugin_get_audio_buffer(&enc_buffer_size);
2539 #ifdef CPU_COLDFIRE
2540 coldfire_set_macsr(0); /* integer mode */
2541 #endif
2543 rb->lcd_setfont(FONT_SYSFIXED);
2545 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
2546 rb->cpu_boost(true);
2547 #endif
2548 rb->button_clear_queue();
2550 nrat = 9;
2551 srat = 4; /* set 128kBit as default */
2553 while(cont && (butt = rb->button_get_w_tmo(HZ/10)) != MP3ENC_SELECT)
2555 switch(butt)
2557 case MP3ENC_DONE: cont = 0; break;
2558 case MP3ENC_PREV|BUTTON_REPEAT:
2559 case MP3ENC_PREV: if(srat > 0 ) srat--; break;
2560 case MP3ENC_NEXT|BUTTON_REPEAT:
2561 case MP3ENC_NEXT: if(srat < nrat) srat++; break;
2564 rb->lcd_clear_display();
2565 rb->lcd_putsxy(2, 2, "-- Select Bitrate --");
2567 for(rat=0; rat<=nrat; rat++)
2568 rb->lcd_putsxy(2, 12 + rat*8, bstrg[rat]);
2569 rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
2570 rb->lcd_fillrect(0, 12 + srat*8, 127, 8);
2571 rb->lcd_set_drawmode(DRMODE_SOLID);
2572 rb->lcd_update();
2575 wav_filename = parameter;
2577 if(cont)
2579 ret = wave_open();
2580 if(ret == 0)
2582 init_mp3_encoder_engine((cfg.channels==2), brate[srat], cfg.samplerate);
2583 get_mp3_filename(wav_filename);
2584 mp3file = rb->open(mp3_name , O_WRONLY|O_CREAT|O_TRUNC, 0666);
2585 frames = 0;
2587 tim = *rb->current_tick;
2588 compress();
2589 tim = *rb->current_tick - tim;
2591 rb->close(wavfile);
2592 rb->close(mp3file);
2593 rb->reload_directory();
2595 else
2597 rb->close(wavfile);
2598 rb->lcd_clear_display();
2599 rb->lcd_putsxyf(0, 20, "WaveOpen failed %d", ret);
2600 rb->lcd_putsxyf(0, 30, "%s", mp3_enc_err[-ret]);
2601 rb->lcd_update();
2602 rb->sleep(5*HZ);
2605 rb->lcd_clear_display();
2606 rb->lcd_putsxyf(0, 30, " Conversion: %ld.%02lds ", tim/100, tim%100);
2607 tim = frames * cfg.smpl_per_frm * 100 / cfg.samplerate; /* unit=.01s */
2608 rb->lcd_putsxyf(0, 20, " WAV-Length: %ld.%02lds ", tim/100, tim%100);
2609 rb->lcd_update();
2610 rb->sleep(5*HZ);
2613 rb->lcd_setfont(FONT_UI);
2614 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
2615 rb->cpu_boost(false);
2616 #endif
2617 return PLUGIN_OK;