1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2006 Antonius Hellmann
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
22 // Shine is an MP3 encoder
23 // Copyright (C) 1999-2000 Gabriel Bouvigne
25 // This library is free software; you can redistribute it and/or
26 // modify it under the terms of the GNU Library General Public
27 // License as published by the Free Software Foundation; either
28 // version 2 of the License, or (at your option) any later version.
30 // This library is distributed in the hope that it will be useful,
31 // but WITHOUT ANY WARRANTY; without even the implied warranty of
32 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
33 // Library General Public License for more details.
40 #define ENC_PADDING_FRAMES1 2
41 #define ENC_PADDING_FRAMES2 4
42 #define ENC_DELAY_SAMP 576
43 #define ENC_DELAY_SIZE (ENC_DELAY_SAMP*4)
44 #define SAMP_PER_FRAME1 1152
45 #define SAMP_PER_FRAME2 576
46 #define PCM_CHUNK_SIZE1 (SAMP_PER_FRAME1*4)
47 #define PCM_CHUNK_SIZE2 (SAMP_PER_FRAME2*4)
51 #define memcpy ci->memcpy
52 #define memset ci->memset
53 #define putlong(c, s) if(s+sz <= 32) { cc = (cc << s) | c; sz+= s; } \
54 else { putbits(cc, sz); cc = c; sz = s; }
57 int type
; /* 0=(MPEG2 - 22.05,24,16kHz) 1=(MPEG1 - 44.1,48,32kHz) */
58 int mode
; /* 0=stereo, 1=jstereo, 2=dual, 3=mono */
66 /* Side information */
68 uint32_t part2_3_length
;
69 int count1
; /* number of 0-1-quadruples */
71 uint32_t table_select
[4];
82 side_info_t cod_info
[2][2];
97 int bitpos
; /* current bitpos for writing */
102 int len
; /* max. index */
103 const uint8_t *table
; /* pointer to array[len][len] */
104 const uint8_t *hlen
; /* pointer to array[len][len] */
108 int len
; /* max. index */
109 int linbits
; /* number of linbits */
110 int linmax
; /* max number stored in linbits */
113 #define shft4(x) ((x + 8) >> 4)
114 #define shft9(x) ((x + 256) >> 9)
115 #define shft13(x) ((x + 4096) >> 13)
116 #define shft15(x) ((x + 16384) >> 15)
117 #define shft16(x) ((x + 32768) >> 16)
118 #define shft_n(x,n) ((x) >> n)
119 #define SQRT 724 /* sqrt(2) * 512 */
121 static short mfbuf
[2*(1152+512)] IBSS_ATTR
; /* 3328 Bytes */
122 static int sb_data
[2][2][18][SBLIMIT
] IBSS_ATTR
; /* 13824 Bytes */
123 static int mdct_freq
[SAMPL2
] IBSS_ATTR
; /* 2304 Bytes */
124 static char mdct_sign
[SAMPL2
] IBSS_ATTR
; /* 576 Bytes */
125 static short enc_data
[SAMPL2
] IBSS_ATTR
; /* 1152 Bytes */
126 static uint32_t scalefac
[23] IBSS_ATTR
; /* 92 Bytes */
127 static BF_Data CodedData IBSS_ATTR
; /* 1056 Bytes */
128 static int ca
[8] IBSS_ATTR
; /* 32 Bytes */
129 static int cs
[8] IBSS_ATTR
; /* 32 Bytes */
130 static int cx
[9] IBSS_ATTR
; /* 36 Bytes */
131 static int win
[18][4] IBSS_ATTR
; /* 288 Bytes */
132 static short enwindow
[15*27+24] IBSS_ATTR
; /* 862 Bytes */
133 static short int2idx
[4096] IBSS_ATTR
; /* 8192 Bytes */
134 static uint8_t ht_count
[2][2][16] IBSS_ATTR
; /* 64 Bytes */
135 static uint32_t tab01
[ 16] IBSS_ATTR
; /* 64 Bytes */
136 static uint32_t tab23
[ 9] IBSS_ATTR
; /* 36 Bytes */
137 static uint32_t tab56
[ 16] IBSS_ATTR
; /* 64 Bytes */
138 static uint32_t tab1315
[256] IBSS_ATTR
; /* 1024 Bytes */
139 static uint32_t tab1624
[256] IBSS_ATTR
; /* 1024 Bytes */
140 static uint32_t tab789
[ 36] IBSS_ATTR
; /* 144 Bytes */
141 static uint32_t tabABC
[ 64] IBSS_ATTR
; /* 256 Bytes */
142 static uint8_t t1HB
[ 4] IBSS_ATTR
;
143 static uint8_t t2HB
[ 9] IBSS_ATTR
;
144 static uint8_t t3HB
[ 9] IBSS_ATTR
;
145 static uint8_t t5HB
[ 16] IBSS_ATTR
;
146 static uint8_t t6HB
[ 16] IBSS_ATTR
;
147 static uint8_t t7HB
[ 36] IBSS_ATTR
;
148 static uint8_t t8HB
[ 36] IBSS_ATTR
;
149 static uint8_t t9HB
[ 36] IBSS_ATTR
;
150 static uint8_t t10HB
[ 64] IBSS_ATTR
;
151 static uint8_t t11HB
[ 64] IBSS_ATTR
;
152 static uint8_t t12HB
[ 64] IBSS_ATTR
;
153 static uint8_t t13HB
[256] IBSS_ATTR
;
154 static uint8_t t15HB
[256] IBSS_ATTR
;
155 static uint16_t t16HB
[256] IBSS_ATTR
;
156 static uint16_t t24HB
[256] IBSS_ATTR
;
157 static uint8_t t1l
[ 8] IBSS_ATTR
;
158 static uint8_t t2l
[ 9] IBSS_ATTR
;
159 static uint8_t t3l
[ 9] IBSS_ATTR
;
160 static uint8_t t5l
[ 16] IBSS_ATTR
;
161 static uint8_t t6l
[ 16] IBSS_ATTR
;
162 static uint8_t t7l
[ 36] IBSS_ATTR
;
163 static uint8_t t8l
[ 36] IBSS_ATTR
;
164 static uint8_t t9l
[ 36] IBSS_ATTR
;
165 static uint8_t t10l
[ 64] IBSS_ATTR
;
166 static uint8_t t11l
[ 64] IBSS_ATTR
;
167 static uint8_t t12l
[ 64] IBSS_ATTR
;
168 static uint8_t t13l
[256] IBSS_ATTR
;
169 static uint8_t t15l
[256] IBSS_ATTR
;
170 static uint8_t t16l
[256] IBSS_ATTR
;
171 static uint8_t t24l
[256] IBSS_ATTR
;
172 static struct huffcodetab ht
[HTN
] IBSS_ATTR
;
174 static unsigned pcm_chunk_size IBSS_ATTR
;
175 static unsigned samp_per_frame IBSS_ATTR
;
177 static config_t cfg IBSS_ATTR
;
178 static char *res_buffer
;
179 static int32_t err IBSS_ATTR
;
180 static uint8_t band_scale_f
[22];
182 static const uint8_t ht_count_const
[2][2][16] =
183 { { { 1, 5, 4, 5, 6, 5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1 }, /* table0 */
184 { 1, 5, 5, 7, 5, 8, 7, 9, 5, 7, 7, 9, 7, 9, 9,10 } }, /* hleng0 */
185 { {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, /* table1 */
186 { 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 } } }; /* hleng1 */
188 static const uint8_t t1HB_const
[4] = {1,1,1,0};
189 static const uint8_t t2HB_const
[9] = {1,2,1,3,1,1,3,2,0};
190 static const uint8_t t3HB_const
[9] = {3,2,1,1,1,1,3,2,0};
191 static const uint8_t t5HB_const
[16] = {1,2,6,5,3,1,4,4,7,5,7,1,6,1,1,0};
192 static const uint8_t t6HB_const
[16] = {7,3,5,1,6,2,3,2,5,4,4,1,3,3,2,0};
194 static const uint8_t t7HB_const
[36] =
195 { 1, 2,10,19,16,10, 3, 3, 7,10, 5, 3,11, 4,13,17, 8, 4,
196 12,11,18,15,11, 2, 7, 6, 9,14, 3, 1, 6, 4, 5, 3, 2, 0 };
198 static const uint8_t t8HB_const
[36] =
199 { 3, 4, 6,18,12, 5, 5, 1, 2,16, 9, 3, 7, 3, 5,14, 7, 3,
200 19,17,15,13,10, 4,13, 5, 8,11, 5, 1,12, 4, 4, 1, 1, 0 };
202 static const uint8_t t9HB_const
[36] =
203 { 7, 5, 9,14,15, 7, 6, 4, 5, 5, 6, 7, 7, 6, 8, 8, 8, 5,
204 15, 6, 9,10, 5, 1,11, 7, 9, 6, 4, 1,14, 4, 6, 2, 6, 0 };
206 static const uint8_t t10HB_const
[64] =
207 {1,2,10,23,35,30,12,17,3,3,8,12,18,21,12,7,11,9,15,21,32,
208 40,19,6,14,13,22,34,46,23,18,7,20,19,33,47,27,22,9,3,31,22,
209 41,26,21,20,5,3,14,13,10,11,16,6,5,1,9,8,7,8,4,4,2,0 };
211 static const uint8_t t11HB_const
[64] =
212 {3,4,10,24,34,33,21,15,5,3,4,10,32,17,11,10,11,7,13,18,30,
213 31,20,5,25,11,19,59,27,18,12,5,35,33,31,58,30,16,7,5,28,26,
214 32,19,17,15,8,14,14,12,9,13,14,9,4,1,11,4,6,6,6,3,2,0 };
216 static const uint8_t t12HB_const
[64] =
217 {9,6,16,33,41,39,38,26,7,5,6,9,23,16,26,11,17,7,11,14,21,
218 30,10,7,17,10,15,12,18,28,14,5,32,13,22,19,18,16,9,5,40,17,
219 31,29,17,13,4,2,27,12,11,15,10,7,4,1,27,12,8,12,6,3,1,0 };
221 static const uint8_t t13HB_const
[256] =
222 {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,
223 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,
224 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,
225 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,
226 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,
227 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,
228 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,
229 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,
230 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,
231 10,6,1,4,2,16,15,17,27,25,20,29,11,17,12,16,8,1,1,0,1 };
233 static const uint8_t t15HB_const
[256] =
234 {7,12,18,53,47,76,124,108,89,123,108,119,107,81,122,63,13,5,16,27,46,36,61,51,
235 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,
236 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,
237 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,
238 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,
239 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,
240 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,
241 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,
242 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,
243 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};
245 static const uint16_t t16HB_const
[256] =
246 {1,5,14,44,74,63,110,93,172,149,138,242,225,195,376,17,3,4,12,20,35,62,53,47,
247 83,75,68,119,201,107,207,9,15,13,23,38,67,58,103,90,161,72,127,117,110,209,
248 206,16,45,21,39,69,64,114,99,87,158,140,252,212,199,387,365,26,75,36,68,65,
249 115,101,179,164,155,264,246,226,395,382,362,9,66,30,59,56,102,185,173,265,142,
250 253,232,400,388,378,445,16,111,54,52,100,184,178,160,133,257,244,228,217,385,
251 366,715,10,98,48,91,88,165,157,148,261,248,407,397,372,380,889,884,8,85,84,81,
252 159,156,143,260,249,427,401,392,383,727,713,708,7,154,76,73,141,131,256,245,
253 426,406,394,384,735,359,710,352,11,139,129,67,125,247,233,229,219,393,743,737,
254 720,885,882,439,4,243,120,118,115,227,223,396,746,742,736,721,712,706,223,436,
255 6,202,224,222,218,216,389,386,381,364,888,443,707,440,437,1728,4,747,211,210,
256 208,370,379,734,723,714,1735,883,877,876,3459,865,2,377,369,102,187,726,722,
257 358,711,709,866,1734,871,3458,870,434,0,12,10,7,11,10,17,11,9,13,12,10,7,5,3,
260 static const uint16_t t24HB_const
[256] =
261 {15,13,46,80,146,262,248,434,426,669,653,649,621,517,1032,88,14,12,21,38,71,
262 130,122,216,209,198,327,345,319,297,279,42,47,22,41,74,68,128,120,221,207,194,
263 182,340,315,295,541,18,81,39,75,70,134,125,116,220,204,190,178,325,311,293,
264 271,16,147,72,69,135,127,118,112,210,200,188,352,323,306,285,540,14,263,66,
265 129,126,119,114,214,202,192,180,341,317,301,281,262,12,249,123,121,117,113,
266 215,206,195,185,347,330,308,291,272,520,10,435,115,111,109,211,203,196,187,
267 353,332,313,298,283,531,381,17,427,212,208,205,201,193,186,177,169,320,303,
268 286,268,514,377,16,335,199,197,191,189,181,174,333,321,305,289,275,521,379,
269 371,11,668,184,183,179,175,344,331,314,304,290,277,530,383,373,366,10,652,346,
270 171,168,164,318,309,299,287,276,263,513,375,368,362,6,648,322,316,312,307,302,
271 292,284,269,261,512,376,370,364,359,4,620,300,296,294,288,282,273,266,515,380,
272 374,369,365,361,357,2,1033,280,278,274,267,264,259,382,378,372,367,363,360,
273 358,356,0,43,20,19,17,15,13,11,9,7,6,4,7,5,3,1,3};
275 static const uint32_t tab1315_const
[256] =
276 { 0x010003,0x050005,0x070006,0x080008,0x090008,0x0a0009,0x0a000a,0x0b000a,
277 0x0a000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0d000c,0x0e000d,0x0e000e,
278 0x040005,0x060005,0x080007,0x090008,0x0a0009,0x0a0009,0x0b000a,0x0b000a,
279 0x0b000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0e000c,0x0e000d,0x0e000d,
280 0x070006,0x080007,0x090007,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,
281 0x0b000a,0x0c000b,0x0c000b,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d,
282 0x080007,0x090008,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0c000b,
283 0x0c000b,0x0d000b,0x0d000c,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d,
284 0x090008,0x090008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0d000b,0x0d000b,
285 0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000d,
286 0x0a0009,0x0a0009,0x0b0009,0x0c000a,0x0c000a,0x0c000a,0x0d000b,0x0d000b,
287 0x0d000b,0x0d000b,0x0e000c,0x0d000c,0x0f000d,0x0f000d,0x10000d,0x10000e,
288 0x0a000a,0x0b0009,0x0c000a,0x0c000a,0x0d000a,0x0d000b,0x0d000b,0x0d000b,
289 0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x10000e,
290 0x0b000a,0x0b000a,0x0c000a,0x0d000b,0x0d000b,0x0d000b,0x0e000b,0x0e000c,
291 0x0e000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x12000d,0x12000e,
292 0x0a000a,0x0a000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0e000c,
293 0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x11000e,0x11000e,
294 0x0b000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0d000c,0x0f000c,
295 0x0e000c,0x0f000d,0x0f000d,0x10000d,0x10000d,0x10000e,0x12000e,0x11000e,
296 0x0b000b,0x0c000b,0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000c,
297 0x0e000c,0x0f000d,0x10000d,0x0f000d,0x10000d,0x11000e,0x12000f,0x13000e,
298 0x0c000b,0x0c000b,0x0c000b,0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0e000c,
299 0x0f000d,0x0f000d,0x0f000d,0x10000d,0x11000e,0x11000e,0x11000e,0x12000f,
300 0x0c000c,0x0d000c,0x0d000b,0x0e000c,0x0e000c,0x0f000c,0x0e000d,0x0f000d,
301 0x10000d,0x10000d,0x11000d,0x11000d,0x11000e,0x12000e,0x12000f,0x12000f,
302 0x0d000c,0x0d000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x10000d,
303 0x10000d,0x10000e,0x10000e,0x11000e,0x12000e,0x11000e,0x12000f,0x12000f,
304 0x0e000d,0x0e000d,0x0e000d,0x0f000d,0x0f000d,0x0f000d,0x11000d,0x10000d,
305 0x10000e,0x13000e,0x11000e,0x11000e,0x11000f,0x13000f,0x12000e,0x12000f,
306 0x0d000d,0x0e000d,0x0f000d,0x10000d,0x10000d,0x10000d,0x11000d,0x10000e,
307 0x11000e,0x11000e,0x12000e,0x12000e,0x15000f,0x14000f,0x15000f,0x12000f };
309 static const uint32_t tab01_const
[16] =
310 { 0x10004,0x50005,0x50005,0x70006,0x50005,0x80006,0x70006,0x90007,
311 0x50005,0x70006,0x70006,0x90007,0x70006,0x90007,0x90007,0xa0008 };
313 static const uint32_t tab23_const
[ 9] =
314 { 0x10002,0x40003,0x70007,0x40004,0x50004,0x70007,0x60006,0x70007,0x80008 };
316 static const uint32_t tab56_const
[16] =
317 { 0x10003,0x40004,0x70006,0x80008,0x40004,0x50004,0x80006,0x90007,
318 0x70005,0x80006,0x90007,0xa0008,0x80007,0x80007,0x90008,0xa0009 };
320 static const uint32_t tab789_const
[36] =
321 {0x00100803,0x00401004,0x00701c06,0x00902407,0x00902409,0x00a0280a,0x00401004,
322 0x00601005,0x00801806,0x00902807,0x00902808,0x00a0280a,0x00701c05,0x00701806,
323 0x00902007,0x00a02808,0x00a02809,0x00b02c0a,0x00802407,0x00902807,0x00a02808,
324 0x00b02c09,0x00b02c09,0x00b0300a,0x00802408,0x00902408,0x00a02809,0x00b02c09,
325 0x00b0300a,0x00c0300b,0x00902809,0x00a02809,0x00b02c0a,0x00c02c0a,0x00c0340b,
328 static const uint32_t tabABC_const
[64] =
329 {0x00100804,0x00401004,0x00701806,0x00902008,0x00a02409,0x00a0280a,0x00a0240a,
330 0x00b0280a,0x00401004,0x00601405,0x00801806,0x00902007,0x00a02809,0x00b02809,
331 0x00a0240a,0x00a0280a,0x00701806,0x00801c06,0x00902007,0x00a02408,0x00b02809,
332 0x00c02c0a,0x00b02809,0x00b0280a,0x00802007,0x00902007,0x00a02408,0x00b02c08,
333 0x00c02809,0x00c0300a,0x00b0280a,0x00c02c0a,0x00902408,0x00a02808,0x00b02809,
334 0x00c02c09,0x00c02c0a,0x00c0300a,0x00c02c0a,0x00c0300b,0x00a02409,0x00b02809,
335 0x00c02c0a,0x00c0300a,0x00d0300a,0x00d0340b,0x00c0300a,0x00d0340b,0x00902409,
336 0x00a02409,0x00b02409,0x00c0280a,0x00c02c0a,0x00c0300b,0x00d0300b,0x00d0300c,
337 0x00a0240a,0x00a0240a,0x00b0280a,0x00c02c0b,0x00c0300b,0x00d0300b,0x00d0300b,
340 static const uint32_t tab1624_const
[256] =
341 {0x00010004,0x00050005,0x00070007,0x00090008,0x000a0009,0x000a000a,0x000b000a,
342 0x000b000b,0x000c000b,0x000c000c,0x000c000c,0x000d000c,0x000d000c,0x000d000c,
343 0x000e000d,0x000a000a,0x00040005,0x00060006,0x00080007,0x00090008,0x000a0009,
344 0x000b000a,0x000b000a,0x000b000b,0x000c000b,0x000c000b,0x000c000c,0x000d000c,
345 0x000e000c,0x000d000c,0x000e000c,0x000a000a,0x00070007,0x00080007,0x00090008,
346 0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000b,0x000d000b,0x000c000b,
347 0x000d000b,0x000d000c,0x000d000c,0x000e000c,0x000e000d,0x000b0009,0x00090008,
348 0x00090008,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a,0x000c000b,
349 0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c,0x000f000c,
350 0x000c0009,0x000a0009,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a,
351 0x000d000a,0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c,
352 0x000f000c,0x000f000d,0x000b0009,0x000a000a,0x000a0009,0x000b000a,0x000b000a,
353 0x000c000a,0x000d000a,0x000d000b,0x000e000b,0x000d000b,0x000e000b,0x000e000c,
354 0x000f000c,0x000f000c,0x000f000c,0x0010000c,0x000c0009,0x000b000a,0x000b000a,
355 0x000b000a,0x000c000a,0x000d000a,0x000d000b,0x000d000b,0x000d000b,0x000e000b,
356 0x000e000c,0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000d,0x000c0009,
357 0x000b000b,0x000b000a,0x000c000a,0x000c000a,0x000d000b,0x000d000b,0x000d000b,
358 0x000e000b,0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000d,
359 0x0011000d,0x000c000a,0x000b000b,0x000c000b,0x000c000b,0x000d000b,0x000d000b,
360 0x000d000b,0x000e000b,0x000e000b,0x000f000b,0x000f000c,0x000f000c,0x000f000c,
361 0x0010000c,0x0010000d,0x0010000d,0x000c000a,0x000c000b,0x000c000b,0x000c000b,
362 0x000d000b,0x000d000b,0x000e000b,0x000e000b,0x000f000c,0x000f000c,0x000f000c,
363 0x000f000c,0x0010000c,0x000f000d,0x0010000d,0x000f000d,0x000d000a,0x000c000c,
364 0x000d000b,0x000c000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000e000c,
365 0x000f000c,0x0010000c,0x0010000c,0x0010000d,0x0011000d,0x0011000d,0x0010000d,
366 0x000c000a,0x000d000c,0x000d000c,0x000d000b,0x000d000b,0x000e000b,0x000e000c,
367 0x000f000c,0x0010000c,0x0010000c,0x0010000c,0x0010000c,0x0010000d,0x0010000d,
368 0x000f000d,0x0010000d,0x000d000a,0x000d000c,0x000e000c,0x000e000c,0x000e000c,
369 0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000c,0x0010000d,
370 0x0010000d,0x0010000d,0x0010000d,0x0012000d,0x000d000a,0x000f000c,0x000e000c,
371 0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000c,0x0010000c,0x0010000d,
372 0x0012000d,0x0011000d,0x0011000d,0x0011000d,0x0013000d,0x0011000d,0x000d000a,
373 0x000e000d,0x000f000c,0x000d000c,0x000e000c,0x0010000c,0x0010000c,0x000f000c,
374 0x0010000d,0x0010000d,0x0011000d,0x0012000d,0x0011000d,0x0013000d,0x0011000d,
375 0x0010000d,0x000d000a,0x000a0009,0x000a0009,0x000a0009,0x000b0009,0x000b0009,
376 0x000c0009,0x000c0009,0x000c0009,0x000d0009,0x000d0009,0x000d0009,0x000d000a,
377 0x000d000a,0x000d000a,0x000d000a,0x000a0006};
379 static const uint8_t t1l_const
[8] = {1,3,2,3,1,4,3,5};
380 static const uint8_t t2l_const
[9] = {1,3,6,3,3,5,5,5,6};
381 static const uint8_t t3l_const
[9] = {2,2,6,3,2,5,5,5,6};
382 static const uint8_t t5l_const
[16] = {1,3,6,7,3,3,6,7,6,6,7,8,7,6,7,8};
383 static const uint8_t t6l_const
[16] = {3,3,5,7,3,2,4,5,4,4,5,6,6,5,6,7};
385 static const uint8_t t7l_const
[36] =
386 {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};
388 static const uint8_t t8l_const
[36] =
389 {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};
391 static const uint8_t t9l_const
[36] =
392 {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};
394 static const uint8_t t10l_const
[64] =
395 {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,
396 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};
398 static const uint8_t t11l_const
[64] =
399 {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,
400 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};
402 static const uint8_t t12l_const
[64] =
403 {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,
404 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};
406 static const uint8_t t13l_const
[256] =
407 {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,
408 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,
409 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,
410 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,
411 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,
412 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,
413 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,
414 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,
415 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,
416 15,15,16,16,19,18,19,16};
418 static const uint8_t t15l_const
[256] =
419 {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,
420 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,
421 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,
422 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,
423 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,
424 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,
425 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,
426 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,
427 13,12,11,11,11,11,11,11,12,12,12,12,12,13,13,13,13};
429 static const uint8_t t16l_const
[256] =
430 {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,
431 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,
432 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,
433 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,
434 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,
435 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,
436 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,
437 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,
438 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,
439 11,11,11,11,11,11,11,8};
441 static const uint8_t t24l_const
[256] =
442 {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,
443 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,
444 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,
445 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,
446 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,
447 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,
448 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,
449 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,
450 7,7,7,7,7,7,8,8,8,8,4};
452 static const struct huffcodetab ht_const
[HTN
] =
453 { { 0, NULL
, NULL
}, /* Apparently not used */
457 { 0, NULL
, NULL
}, /* Apparently not used */
467 { 0, NULL
, NULL
}, /* Apparently not used */
470 static const struct huffcodebig ht_big
[HTN
] =
490 uint32_t region0_cnt
;
491 uint32_t region1_cnt
;
493 { {0, 0}, /* 0 bands */
494 {0, 0}, /* 1 bands */
495 {0, 0}, /* 2 bands */
496 {0, 0}, /* 3 bands */
497 {0, 0}, /* 4 bands */
498 {0, 1}, /* 5 bands */
499 {1, 1}, /* 6 bands */
500 {1, 1}, /* 7 bands */
501 {1, 2}, /* 8 bands */
502 {2, 2}, /* 9 bands */
503 {2, 3}, /* 10 bands */
504 {2, 3}, /* 11 bands */
505 {3, 4}, /* 12 bands */
506 {3, 4}, /* 13 bands */
507 {3, 4}, /* 14 bands */
508 {4, 5}, /* 15 bands */
509 {4, 5}, /* 16 bands */
510 {4, 6}, /* 17 bands */
511 {5, 6}, /* 18 bands */
512 {5, 6}, /* 19 bands */
513 {5, 7}, /* 20 bands */
514 {6, 7}, /* 21 bands */
515 {6, 7}, /* 22 bands */
518 static const uint32_t sfBand
[6][23] =
520 /* Table B.2.b: 22.05 kHz */
521 {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
522 /* Table B.2.c: 24 kHz */
523 {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576},
524 /* Table B.2.a: 16 kHz */
525 {0,6,12,18,24,30,36,44,45,66,80,96,116,140,168,200,238,248,336,396,464,522,576},
526 /* Table B.8.b: 44.1 kHz */
527 {0,4, 8,12,16,20,24,30,36,44,52,62, 74, 90,110,134,162,196,238,288,342,418,576},
528 /* Table B.8.c: 48 kHz */
529 {0,4, 8,12,16,20,24,30,36,42,50,60, 72, 88,106,128,156,190,230,276,330,384,576},
530 /* Table B.8.a: 32 kHz */
531 {0,4, 8,12,16,20,24,30,36,44,54,66, 82,102,126,156,194,240,296,364,448,550,576} };
534 static const short int2idx_const
[4096] = /* int2idx[i] = sqrt(i*sqrt(i)); */
536 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9,
537 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16,
538 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21,
539 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26,
540 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
541 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36,
542 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40,
543 41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45,
544 45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49,
545 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53,
546 53, 53, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 57, 57, 57,
547 57, 57, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 61, 61,
548 61, 61, 61, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 65,
549 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68,
550 68, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 72, 72, 72,
551 72, 72, 72, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75,
552 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 79, 79, 79,
553 79, 79, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82,
554 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 86, 86, 86,
555 86, 86, 86, 87, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89,
556 89, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 93,
557 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 96, 96, 96,
558 96, 96, 96, 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99,
559 99, 99,100,100,100,100,100,100,101,101,101,101,101,101,102,102,102,102,102,102,
560 103,103,103,103,103,103,104,104,104,104,104,104,104,105,105,105,105,105,105,106,
561 106,106,106,106,106,107,107,107,107,107,107,107,108,108,108,108,108,108,109,109,
562 109,109,109,109,110,110,110,110,110,110,110,111,111,111,111,111,111,112,112,112,
563 112,112,112,112,113,113,113,113,113,113,114,114,114,114,114,114,115,115,115,115,
564 115,115,115,116,116,116,116,116,116,117,117,117,117,117,117,117,118,118,118,118,
565 118,118,118,119,119,119,119,119,119,120,120,120,120,120,120,120,121,121,121,121,
566 121,121,122,122,122,122,122,122,122,123,123,123,123,123,123,123,124,124,124,124,
567 124,124,125,125,125,125,125,125,125,126,126,126,126,126,126,126,127,127,127,127,
568 127,127,128,128,128,128,128,128,128,129,129,129,129,129,129,129,130,130,130,130,
569 130,130,131,131,131,131,131,131,131,132,132,132,132,132,132,132,133,133,133,133,
570 133,133,133,134,134,134,134,134,134,134,135,135,135,135,135,135,136,136,136,136,
571 136,136,136,137,137,137,137,137,137,137,138,138,138,138,138,138,138,139,139,139,
572 139,139,139,139,140,140,140,140,140,140,140,141,141,141,141,141,141,141,142,142,
573 142,142,142,142,142,143,143,143,143,143,143,143,144,144,144,144,144,144,144,145,
574 145,145,145,145,145,145,146,146,146,146,146,146,146,147,147,147,147,147,147,147,
575 148,148,148,148,148,148,148,149,149,149,149,149,149,149,150,150,150,150,150,150,
576 150,151,151,151,151,151,151,151,152,152,152,152,152,152,152,153,153,153,153,153,
577 153,153,154,154,154,154,154,154,154,154,155,155,155,155,155,155,155,156,156,156,
578 156,156,156,156,157,157,157,157,157,157,157,158,158,158,158,158,158,158,159,159,
579 159,159,159,159,159,160,160,160,160,160,160,160,160,161,161,161,161,161,161,161,
580 162,162,162,162,162,162,162,163,163,163,163,163,163,163,163,164,164,164,164,164,
581 164,164,165,165,165,165,165,165,165,166,166,166,166,166,166,166,167,167,167,167,
582 167,167,167,167,168,168,168,168,168,168,168,169,169,169,169,169,169,169,169,170,
583 170,170,170,170,170,170,171,171,171,171,171,171,171,172,172,172,172,172,172,172,
584 172,173,173,173,173,173,173,173,174,174,174,174,174,174,174,174,175,175,175,175,
585 175,175,175,176,176,176,176,176,176,176,176,177,177,177,177,177,177,177,178,178,
586 178,178,178,178,178,178,179,179,179,179,179,179,179,180,180,180,180,180,180,180,
587 180,181,181,181,181,181,181,181,182,182,182,182,182,182,182,182,183,183,183,183,
588 183,183,183,184,184,184,184,184,184,184,184,185,185,185,185,185,185,185,186,186,
589 186,186,186,186,186,186,187,187,187,187,187,187,187,187,188,188,188,188,188,188,
590 188,189,189,189,189,189,189,189,189,190,190,190,190,190,190,190,190,191,191,191,
591 191,191,191,191,192,192,192,192,192,192,192,192,193,193,193,193,193,193,193,193,
592 194,194,194,194,194,194,194,195,195,195,195,195,195,195,195,196,196,196,196,196,
593 196,196,196,197,197,197,197,197,197,197,197,198,198,198,198,198,198,198,199,199,
594 199,199,199,199,199,199,200,200,200,200,200,200,200,200,201,201,201,201,201,201,
595 201,201,202,202,202,202,202,202,202,202,203,203,203,203,203,203,203,204,204,204,
596 204,204,204,204,204,205,205,205,205,205,205,205,205,206,206,206,206,206,206,206,
597 206,207,207,207,207,207,207,207,207,208,208,208,208,208,208,208,208,209,209,209,
598 209,209,209,209,209,210,210,210,210,210,210,210,210,211,211,211,211,211,211,211,
599 211,212,212,212,212,212,212,212,212,213,213,213,213,213,213,213,213,214,214,214,
600 214,214,214,214,214,215,215,215,215,215,215,215,215,216,216,216,216,216,216,216,
601 216,217,217,217,217,217,217,217,217,218,218,218,218,218,218,218,218,219,219,219,
602 219,219,219,219,219,220,220,220,220,220,220,220,220,221,221,221,221,221,221,221,
603 221,222,222,222,222,222,222,222,222,223,223,223,223,223,223,223,223,224,224,224,
604 224,224,224,224,224,225,225,225,225,225,225,225,225,226,226,226,226,226,226,226,
605 226,227,227,227,227,227,227,227,227,228,228,228,228,228,228,228,228,229,229,229,
606 229,229,229,229,229,229,230,230,230,230,230,230,230,230,231,231,231,231,231,231,
607 231,231,232,232,232,232,232,232,232,232,233,233,233,233,233,233,233,233,234,234,
608 234,234,234,234,234,234,234,235,235,235,235,235,235,235,235,236,236,236,236,236,
609 236,236,236,237,237,237,237,237,237,237,237,238,238,238,238,238,238,238,238,238,
610 239,239,239,239,239,239,239,239,240,240,240,240,240,240,240,240,241,241,241,241,
611 241,241,241,241,242,242,242,242,242,242,242,242,242,243,243,243,243,243,243,243,
612 243,244,244,244,244,244,244,244,244,245,245,245,245,245,245,245,245,245,246,246,
613 246,246,246,246,246,246,247,247,247,247,247,247,247,247,248,248,248,248,248,248,
614 248,248,248,249,249,249,249,249,249,249,249,250,250,250,250,250,250,250,250,250,
615 251,251,251,251,251,251,251,251,252,252,252,252,252,252,252,252,253,253,253,253,
616 253,253,253,253,253,254,254,254,254,254,254,254,254,255,255,255,255,255,255,255,
617 255,255,256,256,256,256,256,256,256,256,257,257,257,257,257,257,257,257,257,258,
618 258,258,258,258,258,258,258,259,259,259,259,259,259,259,259,259,260,260,260,260,
619 260,260,260,260,261,261,261,261,261,261,261,261,261,262,262,262,262,262,262,262,
620 262,263,263,263,263,263,263,263,263,263,264,264,264,264,264,264,264,264,265,265,
621 265,265,265,265,265,265,265,266,266,266,266,266,266,266,266,267,267,267,267,267,
622 267,267,267,267,268,268,268,268,268,268,268,268,268,269,269,269,269,269,269,269,
623 269,270,270,270,270,270,270,270,270,270,271,271,271,271,271,271,271,271,271,272,
624 272,272,272,272,272,272,272,273,273,273,273,273,273,273,273,273,274,274,274,274,
625 274,274,274,274,275,275,275,275,275,275,275,275,275,276,276,276,276,276,276,276,
626 276,276,277,277,277,277,277,277,277,277,277,278,278,278,278,278,278,278,278,279,
627 279,279,279,279,279,279,279,279,280,280,280,280,280,280,280,280,280,281,281,281,
628 281,281,281,281,281,282,282,282,282,282,282,282,282,282,283,283,283,283,283,283,
629 283,283,283,284,284,284,284,284,284,284,284,284,285,285,285,285,285,285,285,285,
630 286,286,286,286,286,286,286,286,286,287,287,287,287,287,287,287,287,287,288,288,
631 288,288,288,288,288,288,288,289,289,289,289,289,289,289,289,289,290,290,290,290,
632 290,290,290,290,291,291,291,291,291,291,291,291,291,292,292,292,292,292,292,292,
633 292,292,293,293,293,293,293,293,293,293,293,294,294,294,294,294,294,294,294,294,
634 295,295,295,295,295,295,295,295,295,296,296,296,296,296,296,296,296,296,297,297,
635 297,297,297,297,297,297,297,298,298,298,298,298,298,298,298,299,299,299,299,299,
636 299,299,299,299,300,300,300,300,300,300,300,300,300,301,301,301,301,301,301,301,
637 301,301,302,302,302,302,302,302,302,302,302,303,303,303,303,303,303,303,303,303,
638 304,304,304,304,304,304,304,304,304,305,305,305,305,305,305,305,305,305,306,306,
639 306,306,306,306,306,306,306,307,307,307,307,307,307,307,307,307,308,308,308,308,
640 308,308,308,308,308,309,309,309,309,309,309,309,309,309,310,310,310,310,310,310,
641 310,310,310,311,311,311,311,311,311,311,311,311,312,312,312,312,312,312,312,312,
642 312,313,313,313,313,313,313,313,313,313,314,314,314,314,314,314,314,314,314,315,
643 315,315,315,315,315,315,315,315,316,316,316,316,316,316,316,316,316,317,317,317,
644 317,317,317,317,317,317,318,318,318,318,318,318,318,318,318,318,319,319,319,319,
645 319,319,319,319,319,320,320,320,320,320,320,320,320,320,321,321,321,321,321,321,
646 321,321,321,322,322,322,322,322,322,322,322,322,323,323,323,323,323,323,323,323,
647 323,324,324,324,324,324,324,324,324,324,325,325,325,325,325,325,325,325,325,325,
648 326,326,326,326,326,326,326,326,326,327,327,327,327,327,327,327,327,327,328,328,
649 328,328,328,328,328,328,328,329,329,329,329,329,329,329,329,329,330,330,330,330,
650 330,330,330,330,330,330,331,331,331,331,331,331,331,331,331,332,332,332,332,332,
651 332,332,332,332,333,333,333,333,333,333,333,333,333,334,334,334,334,334,334,334,
652 334,334,335,335,335,335,335,335,335,335,335,335,336,336,336,336,336,336,336,336,
653 336,337,337,337,337,337,337,337,337,337,338,338,338,338,338,338,338,338,338,338,
654 339,339,339,339,339,339,339,339,339,340,340,340,340,340,340,340,340,340,341,341,
655 341,341,341,341,341,341,341,341,342,342,342,342,342,342,342,342,342,343,343,343,
656 343,343,343,343,343,343,344,344,344,344,344,344,344,344,344,344,345,345,345,345,
657 345,345,345,345,345,346,346,346,346,346,346,346,346,346,347,347,347,347,347,347,
658 347,347,347,347,348,348,348,348,348,348,348,348,348,349,349,349,349,349,349,349,
659 349,349,350,350,350,350,350,350,350,350,350,350,351,351,351,351,351,351,351,351,
660 351,352,352,352,352,352,352,352,352,352,352,353,353,353,353,353,353,353,353,353,
661 354,354,354,354,354,354,354,354,354,355,355,355,355,355,355,355,355,355,355,356,
662 356,356,356,356,356,356,356,356,357,357,357,357,357,357,357,357,357,357,358,358,
663 358,358,358,358,358,358,358,359,359,359,359,359,359,359,359,359,359,360,360,360,
664 360,360,360,360,360,360,361,361,361,361,361,361,361,361,361,361,362,362,362,362,
665 362,362,362,362,362,363,363,363,363,363,363,363,363,363,363,364,364,364,364,364,
666 364,364,364,364,365,365,365,365,365,365,365,365,365,365,366,366,366,366,366,366,
667 366,366,366,367,367,367,367,367,367,367,367,367,367,368,368,368,368,368,368,368,
668 368,368,369,369,369,369,369,369,369,369,369,369,370,370,370,370,370,370,370,370,
669 370,370,371,371,371,371,371,371,371,371,371,372,372,372,372,372,372,372,372,372,
670 372,373,373,373,373,373,373,373,373,373,374,374,374,374,374,374,374,374,374,374,
671 375,375,375,375,375,375,375,375,375,375,376,376,376,376,376,376,376,376,376,377,
672 377,377,377,377,377,377,377,377,377,378,378,378,378,378,378,378,378,378,379,379,
673 379,379,379,379,379,379,379,379,380,380,380,380,380,380,380,380,380,380,381,381,
674 381,381,381,381,381,381,381,382,382,382,382,382,382,382,382,382,382,383,383,383,
675 383,383,383,383,383,383,383,384,384,384,384,384,384,384,384,384,385,385,385,385,
676 385,385,385,385,385,385,386,386,386,386,386,386,386,386,386,386,387,387,387,387,
677 387,387,387,387,387,387,388,388,388,388,388,388,388,388,388,389,389,389,389,389,
678 389,389,389,389,389,390,390,390,390,390,390,390,390,390,390,391,391,391,391,391,
679 391,391,391,391,391,392,392,392,392,392,392,392,392,392,393,393,393,393,393,393,
680 393,393,393,393,394,394,394,394,394,394,394,394,394,394,395,395,395,395,395,395,
681 395,395,395,395,396,396,396,396,396,396,396,396,396,397,397,397,397,397,397,397,
682 397,397,397,398,398,398,398,398,398,398,398,398,398,399,399,399,399,399,399,399,
683 399,399,399,400,400,400,400,400,400,400,400,400,400,401,401,401,401,401,401,401,
684 401,401,402,402,402,402,402,402,402,402,402,402,403,403,403,403,403,403,403,403,
685 403,403,404,404,404,404,404,404,404,404,404,404,405,405,405,405,405,405,405,405,
686 405,405,406,406,406,406,406,406,406,406,406,406,407,407,407,407,407,407,407,407,
687 407,407,408,408,408,408,408,408,408,408,408,408,409,409,409,409,409,409,409,409,
688 409,410,410,410,410,410,410,410,410,410,410,411,411,411,411,411,411,411,411,411,
689 411,412,412,412,412,412,412,412,412,412,412,413,413,413,413,413,413,413,413,413,
690 413,414,414,414,414,414,414,414,414,414,414,415,415,415,415,415,415,415,415,415,
691 415,416,416,416,416,416,416,416,416,416,416,417,417,417,417,417,417,417,417,417,
692 417,418,418,418,418,418,418,418,418,418,418,419,419,419,419,419,419,419,419,419,
693 419,420,420,420,420,420,420,420,420,420,420,421,421,421,421,421,421,421,421,421,
694 421,422,422,422,422,422,422,422,422,422,422,423,423,423,423,423,423,423,423,423,
695 423,424,424,424,424,424,424,424,424,424,424,425,425,425,425,425,425,425,425,425,
696 425,426,426,426,426,426,426,426,426,426,426,427,427,427,427,427,427,427,427,427,
697 427,428,428,428,428,428,428,428,428,428,428,429,429,429,429,429,429,429,429,429,
698 429,430,430,430,430,430,430,430,430,430,430,431,431,431,431,431,431,431,431,431,
699 431,432,432,432,432,432,432,432,432,432,432,433,433,433,433,433,433,433,433,433,
700 433,434,434,434,434,434,434,434,434,434,434,435,435,435,435,435,435,435,435,435,
701 435,435,436,436,436,436,436,436,436,436,436,436,437,437,437,437,437,437,437,437,
702 437,437,438,438,438,438,438,438,438,438,438,438,439,439,439,439,439,439,439,439,
703 439,439,440,440,440,440,440,440,440,440,440,440,441,441,441,441,441,441,441,441,
704 441,441,442,442,442,442,442,442,442,442,442,442,443,443,443,443,443,443,443,443,
705 443,443,443,444,444,444,444,444,444,444,444,444,444,445,445,445,445,445,445,445,
706 445,445,445,446,446,446,446,446,446,446,446,446,446,447,447,447,447,447,447,447,
707 447,447,447,448,448,448,448,448,448,448,448,448,448,448,449,449,449,449,449,449,
708 449,449,449,449,450,450,450,450,450,450,450,450,450,450,451,451,451,451,451,451,
709 451,451,451,451,452,452,452,452,452,452,452,452,452,452,453,453,453,453,453,453,
710 453,453,453,453,453,454,454,454,454,454,454,454,454,454,454,455,455,455,455,455,
711 455,455,455,455,455,456,456,456,456,456,456,456,456,456,456,457,457,457,457,457,
712 457,457,457,457,457,457,458,458,458,458,458,458,458,458,458,458,459,459,459,459,
713 459,459,459,459,459,459,460,460,460,460,460,460,460,460,460,460,460,461,461,461,
714 461,461,461,461,461,461,461,462,462,462,462,462,462,462,462,462,462,463,463,463,
715 463,463,463,463,463,463,463,463,464,464,464,464,464,464,464,464,464,464,465,465,
716 465,465,465,465,465,465,465,465,466,466,466,466,466,466,466,466,466,466,466,467,
717 467,467,467,467,467,467,467,467,467,468,468,468,468,468,468,468,468,468,468,469,
718 469,469,469,469,469,469,469,469,469,469,470,470,470,470,470,470,470,470,470,470,
719 471,471,471,471,471,471,471,471,471,471,472,472,472,472,472,472,472,472,472,472,
720 472,473,473,473,473,473,473,473,473,473,473,474,474,474,474,474,474,474,474,474,
721 474,475,475,475,475,475,475,475,475,475,475,475,476,476,476,476,476,476,476,476,
722 476,476,477,477,477,477,477,477,477,477,477,477,477,478,478,478,478,478,478,478,
723 478,478,478,479,479,479,479,479,479,479,479,479,479,479,480,480,480,480,480,480,
724 480,480,480,480,481,481,481,481,481,481,481,481,481,481,482,482,482,482,482,482,
725 482,482,482,482,482,483,483,483,483,483,483,483,483,483,483,484,484,484,484,484,
726 484,484,484,484,484,484,485,485,485,485,485,485,485,485,485,485,486,486,486,486,
727 486,486,486,486,486,486,486,487,487,487,487,487,487,487,487,487,487,488,488,488,
728 488,488,488,488,488,488,488,488,489,489,489,489,489,489,489,489,489,489,490,490,
729 490,490,490,490,490,490,490,490,490,491,491,491,491,491,491,491,491,491,491,492,
730 492,492,492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493,493,493,
731 494,494,494,494,494,494,494,494,494,494,494,495,495,495,495,495,495,495,495,495,
732 495,496,496,496,496,496,496,496,496,496,496,496,497,497,497,497,497,497,497,497,
733 497,497,497,498,498,498,498,498,498,498,498,498,498,499,499,499,499,499,499,499,
734 499,499,499,499,500,500,500,500,500,500,500,500,500,500,501,501,501,501,501,501,
735 501,501,501,501,501,502,502,502,502,502,502,502,502,502,502,503,503,503,503,503,
736 503,503,503,503,503,503,504,504,504,504,504,504,504,504,504,504,504,505,505,505,
737 505,505,505,505,505,505,505,506,506,506,506,506,506,506,506,506,506,506,507,507,
738 507,507,507,507,507,507,507,507,507,508,508,508,508,508,508,508,508,508,508,509,
739 509,509,509,509,509,509,509,509,509,509,510,510,510,510,510,510,510,510,510,510,
740 510,511,511,511,511,511,511,511,511,511,511,512,512,512,512,512 };
742 static const int order
[32] =
743 { 0, 1, 16, 17, 8, 9, 24, 25, 4, 5, 20, 21, 12, 13, 28, 29,
744 2, 3, 18, 19,10,11, 26, 27, 6, 7, 22, 23, 14, 15, 30, 31 };
746 static const long sampr_index
[2][3] =
747 { { 22050, 24000, 16000 }, /* MPEG 2 */
748 { 44100, 48000, 32000 } }; /* MPEG 1 */
750 static const long bitr_index
[2][15] =
751 { {0, 8,16,24,32,40,48,56, 64, 80, 96,112,128,144,160}, /* MPEG 2 */
752 {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320} }; /* MPEG 1 */
754 static const int num_bands
[3][15] =
755 { {0,10,10,10,10,12,14,16, 20, 22, 24, 26, 28, 30, 32},
756 {0,10,10,10,10,10,12,14, 18, 24, 26, 28, 30, 32, 32},
757 {0,10,12,14,18,24,26,28, 30, 32, 32, 32, 32, 32, 32} };
759 static const int cx_const
[9] =
760 { 16135, 10531, 5604, 15396, -2845,-12551, 14189, 8192, 16384 };
762 static const int ca_const
[8] =
763 {-16859,-15458,-10269, -5961, -3099, -1342, -465, -121 };
765 static const int cs_const
[8] =
766 { 28098, 28893, 31117, 32221, 32621, 32740, 32765, 32768 };
768 static const short enwindow_const
[15*27+24] =
769 { 0, 65, 593, 1766, 22228, 2115, 611, 62,
770 8, 119, 1419, 10564,-11659,-1635,-154, -9,
771 -8, -119,-1419,-10564, 11659, 1635, 154, 9, 464, 100, 91,
772 0, 69, 604, 1635, 23148, 2363, 643, 62,
773 7, 107, 1368, 10449,-12733,-1818,-180,-11,
774 -7, -107,-1368,-10449, 12733, 1818, 180, 11, 420, 200, 164,
775 0, 72, 608, 1465, 23979, 2600, 671, 63,
776 7, 94, 1305, 10265,-13818,-2004,-207,-12,
777 -7, -94,-1305,-10265, 13818, 2004, 207, 12, 380, 297, 220,
778 0, 76, 606, 1256, 24718, 2825, 693, 63,
779 6, 81, 1232, 10016,-14908,-2192,-236,-14,
780 -6, -81,-1232,-10016, 14908, 2192, 236, 14, 342, 392, 262,
781 0, 78, 597, 1007, 25359, 3033, 712, 63,
782 6, 68, 1150, 9706,-15995,-2380,-267,-15,
783 -6, -68,-1150, -9706, 15995, 2380, 267, 15, 307, 483, 289,
784 0, 80, 580, 719, 25901, 3224, 726, 62,
785 6, 54, 1060, 9343,-17072,-2565,-299,-17,
786 -6, -54,-1060, -9343, 17072, 2565, 299, 17, 274, 569, 304,
787 -1, 82, 555, 391, 26339, 3395, 735, 61,
788 5, 40, 963, 8930,-18131,-2747,-332,-19,
789 -5, -40, -963, -8930, 18131, 2747, 332, 19, 242, 650, 307,
790 -1, 83, 523, 26, 26672, 3545, 740, 60,
791 5, 27, 861, 8474,-19164,-2923,-366,-21,
792 -5, -27, -861, -8474, 19164, 2923, 366, 21, 212, 724, 300,
793 -1, 83, 482, -376, 26900, 3672, 739, 58,
794 4, 14, 756, 7981,-20163,-3092,-401,-24,
795 -4, -14, -756, -7981, 20163, 3092, 401, 24, 183, 792, 283,
796 -1, 82, 433, -812, 27022, 3776, 735, 56,
797 4, 1, 648, 7456,-21122,-3250,-435,-26,
798 -4, -1, -648, -7456, 21122, 3250, 435, 26, 155, 851, 258,
799 -1, 81, 376, -1281, 27038, 3855, 726, 54,
800 3, -11, 539, 6907,-22032,-3397,-470,-28,
801 -3, 11, -539, -6907, 22032, 3397, 470, 28, 128, 903, 226,
802 -1, 78, 312, -1778, 26951, 3910, 713, 52,
803 3, -22, 430, 6338,-22887,-3530,-503,-31,
804 -3, 22, -430, -6338, 22887, 3530, 503, 31, 102, 946, 188,
805 -2, 75, 239, -2302, 26761, 3941, 696, 49,
806 3, -33, 322, 5757,-23678,-3648,-537,-34,
807 -3, 33, -322, -5757, 23678, 3648, 537, 34, 76, 980, 145,
808 -2, 70, 160, -2848, 26472, 3948, 676, 47,
809 3, -42, 217, 5167,-24399,-3749,-568,-36,
810 -3, 42, -217, -5167, 24399, 3749, 568, 36, 50, 1004, 99,
811 -2, 65, 74, -3412, 26087, 3931, 653, 44,
812 2, -51, 115, 4577,-25045,-3830,-599,-39,
813 -2, 51, -115, -4577, 25045, 3830, 599, 39, 25, 1019, 50,
815 25610,3891,627,42,-3990,-18,58,-2,
816 21226,-21226,10604,-10604,1860,-1860,1458,-1458,576,-576,130,-130,60,-60,8,-8
819 static const int win_const
[18][4] = {
820 { -3072, -134, -146, 3352 },
821 { -2747, -362, -471, 3579 },
822 { -2387, -529, -831, 3747 },
823 { -2004, -632,-1214, 3850 },
824 { -1609, -666,-1609, 3884 },
825 { -1214, -632,-2004, 3850 },
826 { -831, -529,-2387, 3747 },
827 { -471, -362,-2747, 3579 },
828 { -146, -134,-3072, 3352 },
829 { 134,-3072,-3352, -146 },
830 { 362,-2747,-3579, -471 },
831 { 529,-2387,-3747, -831 },
832 { 632,-2004,-3850,-1214 },
833 { 666,-1609,-3884,-1609 },
834 { 632,-1214,-3850,-2004 },
835 { 529, -831,-3747,-2387 },
836 { 362, -471,-3579,-2747 },
837 { 134, -146,-3352,-3072 } };
839 /* forward declarations */
840 static int HuffmanCode( short *ix
, char *xr_sign
, uint32_t begin
, uint32_t end
, int table
);
841 static int HuffmanCod1( short *ix
, char *xr_sign
, uint32_t begin
, uint32_t end
, int table
);
842 static void putbits(uint32_t val
, uint32_t nbit
);
843 static int find_best_2( short *ix
, uint32_t start
, uint32_t end
, const uint32_t *table
,
844 uint32_t len
, int *bits
);
845 static int find_best_3( short *ix
, uint32_t start
, uint32_t end
, const uint32_t *table
,
846 uint32_t len
, int *bits
);
847 static int count_bit1 ( short *ix
, uint32_t start
, uint32_t end
, int *bits
);
848 static int count_bigv ( short *ix
, uint32_t start
, uint32_t end
, int table0
, int table1
,
852 static void encodeSideInfo( side_info_t si
[2][2] )
858 * MPEG header layout:
859 * AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM
860 * A (31-21) = frame sync
861 * B (20-19) = MPEG type
862 * C (18-17) = MPEG layer
863 * D (16) = protection bit
864 * E (15-12) = bitrate index
865 * F (11-10) = samplerate index
866 * G (9) = padding bit
867 * H (8) = private bit
868 * I (7-6) = channel mode
869 * J (5-4) = mode extension (jstereo only)
870 * K (3) = copyright bit
875 header
= (0xfff00000) | /* frame sync (AAAAAAAAA AAA)
876 mp3 type (upper): 1 (B) */
877 (0x01 << 17) | /* mp3 layer: 01 (CC) */
878 ( 0x1 << 16) | /* mp3 crc: 1 (D) */
879 ( 0x1 << 2); /* mp3 org: 1 (L) */
880 header
|= cfg
.mpg
.type
<< 19;
881 header
|= cfg
.mpg
.bitr_id
<< 12;
882 header
|= cfg
.mpg
.smpl_id
<< 10;
883 header
|= cfg
.mpg
.padding
<< 9;
884 header
|= cfg
.mpg
.mode
<< 6;
885 /* no emphasis (bits 0-1) */
886 putbits( header
, 32 );
888 if(cfg
.mpg
.type
== 1)
890 if(cfg
.channels
== 2) { putlong( 0, 20); }
891 else { putlong( 0, 18); }
893 for(gr
=0; gr
<cfg
.granules
; gr
++)
894 for(ch
=0; ch
<cfg
.channels
; ch
++)
896 side_info_t
*gi
= &si
[gr
][ch
];
898 putlong((gi
->part2_3_length
+42),12 ); /* add scale_facs array size */
899 putlong( gi
->address3
>>1, 9 );
900 putlong( gi
->global_gain
, 8 );
901 putlong( 9, 4 ); /* set scale_facs compr type */
902 putlong( gi
->table_select
[0], 6 );
903 putlong( gi
->table_select
[1], 5 );
904 putlong( gi
->table_select
[2], 5 );
905 putlong( gi
->region_0_1
, 7 );
906 putlong( 1 , 2 ); /* set scale_facs to 1bit */
907 putlong( gi
->table_select
[3], 1 );
912 if(cfg
.channels
== 2) { putlong( 0, 10); }
913 else { putlong( 0, 9); }
915 for(ch
=0; ch
<cfg
.channels
; ch
++)
917 side_info_t
*gi
= &si
[0][ch
];
919 putlong((gi
->part2_3_length
+42),12 ); /* add scale_facs array size */
920 putlong( gi
->address3
>>1, 9 );
921 putlong( gi
->global_gain
, 8 );
922 putlong( 0xCA, 9 ); /* set scale_facs compr type */
923 putlong( gi
->table_select
[0], 6 );
924 putlong( gi
->table_select
[1], 5 );
925 putlong( gi
->table_select
[2], 5 );
926 putlong( gi
->region_0_1
, 7 );
927 putlong( 1 , 1 ); /* set scale_facs to 1bit */
928 putlong( gi
->table_select
[3], 1 );
931 /* flush remaining bits */
935 /* Note the discussion of huffmancodebits() on pages 28 and 29 of the IS,
936 as well as the definitions of the side information on pages 26 and 27. */
937 static void Huffmancodebits( short *ix
, char *xr_sign
, side_info_t
*gi
)
939 int region1
= gi
->address1
;
940 int region2
= gi
->address2
;
941 int bigvals
= gi
->address3
;
942 int count1
= bigvals
+ (gi
->count1
<< 2);
947 for(i
=v
=0; i
<32; i
+=2)
948 v
|= band_scale_f
[i
>>1] << (30-i
);
949 putbits(v
, 32); // store scale_facs (part1)
952 v
|= band_scale_f
[i
>>1] << (40-i
);
953 putbits(v
, 10); // store scale_facs (part2)
956 bits
+= HuffmanCode(ix
, xr_sign
, 0 , region1
, gi
->table_select
[0]);
958 if(region2
> region1
)
959 bits
+= HuffmanCode(ix
, xr_sign
, region1
, region2
, gi
->table_select
[1]);
961 if(bigvals
> region2
)
962 bits
+= HuffmanCode(ix
, xr_sign
, region2
, bigvals
, gi
->table_select
[2]);
965 bits
+= HuffmanCod1(ix
, xr_sign
, bigvals
, count1
, gi
->table_select
[3]);
967 if((stuffBits
= gi
->part2_3_length
- bits
) > 0)
969 int stuffWords
= stuffBits
>> 5;
970 int remainBits
= stuffBits
& 31;
973 putbits( ~0, remainBits
);
975 while( stuffWords
-- )
976 putbits( ~0, 32 ); /* Huffman code tables leed to padding ones */
980 int HuffmanCod1( short *ix
, char *xr_sign
, uint32_t begin
, uint32_t end
, int tbl
)
984 int sumbit
=0, s
=0, l
=0, v
, w
, x
, y
;
985 #define sgnv xr_sign[i+0]
986 #define sgnw xr_sign[i+1]
987 #define sgnx xr_sign[i+2]
988 #define sgny xr_sign[i+3]
990 for(i
=begin
; i
<end
; i
+=4)
996 p
= (v
<< 3) + (w
<< 2) + (x
<< 1) + y
;
1000 case 0: l
=0; s
= 0; break;
1001 case 1: l
=1; s
= sgny
; break;
1002 case 2: l
=1; s
= sgnx
; break;
1003 case 3: l
=2; s
= (sgnx
<< 1) + sgny
; break;
1004 case 4: l
=1; s
= sgnw
; break;
1005 case 5: l
=2; s
= (sgnw
<< 1) + sgny
; break;
1006 case 6: l
=2; s
= (sgnw
<< 1) + sgnx
; break;
1007 case 7: l
=3; s
= (sgnw
<< 2) + (sgnx
<< 1) + sgny
; break;
1008 case 8: l
=1; s
= sgnv
; break;
1009 case 9: l
=2; s
= (sgnv
<< 1) + sgny
; break;
1010 case 10: l
=2; s
= (sgnv
<< 1) + sgnx
; break;
1011 case 11: l
=3; s
= (sgnv
<< 2) + (sgnx
<< 1) + sgny
; break;
1012 case 12: l
=2; s
= (sgnv
<< 1) + sgnw
; break;
1013 case 13: l
=3; s
= (sgnv
<< 2) + (sgnw
<< 1) + sgny
; break;
1014 case 14: l
=3; s
= (sgnv
<< 2) + (sgnw
<< 1) + sgnx
; break;
1015 case 15: l
=4; s
= (sgnv
<< 3) + (sgnw
<< 2) + (sgnx
<< 1) + sgny
; break;
1018 d
= (ht_count
[tbl
][0][p
] << l
) + s
;
1019 l
= ht_count
[tbl
][1][p
];
1024 /* flush remaining bits */
1030 /* Implements the pseudocode of page 98 of the IS */
1031 int HuffmanCode(short *ix
, char *xr_sign
, uint32_t begin
, uint32_t end
, int table
)
1033 uint32_t cc
=0, sz
=0, code
;
1034 uint32_t i
, xl
=0, yl
=0, idx
;
1035 int x
, y
, bit
, sumbit
=0;
1036 #define sign_x xr_sign[i+0]
1037 #define sign_y xr_sign[i+1]
1043 { /* ESC-table is used */
1044 uint32_t linbits
= ht_big
[table
-16].linbits
;
1045 uint16_t *hffcode
= table
< 24 ? t16HB
: t24HB
;
1046 uint8_t *hlen
= table
< 24 ? t16l
: t24l
;
1048 for(i
=begin
; i
<end
; i
+=2)
1053 if(x
> 14) { xl
= x
- 15; x
= 15; }
1054 if(y
> 14) { yl
= y
- 15; y
= 15; }
1057 code
= hffcode
[idx
];
1064 code
= (code
<< linbits
) | xl
;
1068 code
= (code
<< 1) | sign_x
;
1076 if(bit
+ linbits
+ 1 > 32)
1078 putlong( code
, bit
);
1083 code
= (code
<< linbits
) | yl
;
1087 code
= (code
<< 1) | sign_y
;
1091 putlong( code
, bit
);
1096 { /* No ESC-words */
1097 const struct huffcodetab
*h
= &ht
[table
];
1099 for(i
=begin
; i
<end
; i
+=2)
1104 idx
= x
* h
->len
+ y
;
1105 code
= h
->table
[idx
];
1106 bit
= h
->hlen
[idx
];
1110 code
= (code
<< 1) | sign_x
;
1116 code
= (code
<< 1) | sign_y
;
1120 putlong( code
, bit
);
1125 /* flush remaining bits */
1131 void putbits(uint32_t val
, uint32_t nbit
)
1133 int new_bitpos
= CodedData
.bitpos
+ nbit
;
1134 int ptrpos
= CodedData
.bitpos
>> 5;
1136 val
= val
& (0xffffffff >> (32 - nbit
));
1138 /* data fit in one uint32_t */
1139 if(((new_bitpos
- 1) >> 5) == ptrpos
)
1140 CodedData
.bbuf
[ptrpos
] |= val
<< ((32 - new_bitpos
) & 31);
1143 CodedData
.bbuf
[ptrpos
] |= val
>> ((new_bitpos
- 32) & 31);
1144 CodedData
.bbuf
[ptrpos
+1] |= val
<< ((32 - new_bitpos
) & 31);
1147 CodedData
.bitpos
= new_bitpos
;
1150 /***************************************************************************/
1151 /* Choose the Huffman table that will encode ix[begin..end] with */
1152 /* the fewest bits. */
1153 /* Note: This code contains knowledge about the sizes and characteristic */
1154 /* of the Huffman tables as defined in the IS (Table B.7), and will not */
1155 /* work with any arbitrary tables. */
1156 /***************************************************************************/
1157 static int choose_table( short *ix
, uint32_t begin
, uint32_t end
, int *bits
)
1160 int max
, table0
, table1
;
1162 for(i
=begin
,max
=0; i
<end
; i
++)
1168 /* tables without linbits */
1169 /* indx: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
1170 /* len: 0, 2, 3, 3, 0, 4, 4, 6, 6, 6, 8, 8, 8, 16, 0, 16 */
1174 case 1: return count_bit1(ix
, begin
, end
, bits
);
1175 case 2: return 2 + find_best_2(ix
, begin
, end
, tab23
, 3, bits
);
1176 case 3: return 5 + find_best_2(ix
, begin
, end
, tab56
, 4, bits
);
1178 case 5: return 7 + find_best_3(ix
, begin
, end
, tab789
, 6, bits
);
1180 case 7: return 10 + find_best_3(ix
, begin
, end
, tabABC
, 8, bits
);
1181 default: return 13 + find_best_2(ix
, begin
, end
, tab1315
, 16, bits
) * 2;
1186 /* tables with linbits */
1189 for(table0
=0; table0
<8; table0
++)
1190 if(ht_big
[table0
].linmax
>= max
)
1193 for(table1
=8; table1
<16; table1
++)
1194 if(ht_big
[table1
].linmax
>= max
)
1197 return 16 + count_bigv(ix
, begin
, end
, table0
, table1
, bits
);
1201 int find_best_2(short *ix
, uint32_t start
, uint32_t end
, const uint32_t *table
,
1202 uint32_t len
, int *bits
)
1204 uint32_t i
, sum
= 0;
1206 for(i
=start
; i
<end
; i
+=2)
1207 sum
+= table
[ix
[i
] * len
+ ix
[i
+1]];
1209 if((sum
& 0xffff) <= (sum
>> 16))
1211 *bits
= (sum
& 0xffff);
1221 int find_best_3(short *ix
, uint32_t start
, uint32_t end
, const uint32_t *table
,
1222 uint32_t len
, int *bits
)
1224 uint32_t i
, j
, sum
= 0;
1229 /* avoid overflow in packed additions: 78*13 < 1024 */
1230 for(i
=start
; i
<end
; )
1232 j
= i
+ 2*78 > end
? end
: i
+ 2*78;
1234 for(sum
=0; i
<j
; i
+=2)
1235 sum
+= table
[ix
[i
] * len
+ ix
[i
+1]];
1237 sum1
+= (sum
>> 20);
1238 sum2
+= (sum
>> 10) & 0x3ff;
1239 sum3
+= (sum
>> 0) & 0x3ff;
1243 if(sum1
> sum2
) { sum1
= sum2
; i
= 1; }
1244 if(sum1
> sum3
) { sum1
= sum3
; i
= 2; }
1251 /*************************************************************************/
1252 /* Function: Count the number of bits necessary to code the subregion. */
1253 /*************************************************************************/
1254 int count_bit1(short *ix
, uint32_t start
, uint32_t end
, int *bits
)
1256 uint32_t i
, sum
= 0;
1258 for(i
=start
; i
<end
; i
+=2)
1259 sum
+= t1l
[4 + ix
[i
] * 2 + ix
[i
+1]];
1263 return 1; /* this is table1 */
1266 int count_bigv(short *ix
, uint32_t start
, uint32_t end
, int table0
,
1267 int table1
, int *bits
)
1269 uint32_t i
, sum0
, sum1
, sum
=0, bigv
=0, x
, y
;
1271 /* ESC-table is used */
1272 for(i
=start
; i
<end
; i
+=2)
1277 if(x
> 14) { x
= 15; bigv
++; }
1278 if(y
> 14) { y
= 15; bigv
++; }
1280 sum
+= tab1624
[x
* 16 + y
];
1283 sum0
= (sum
>> 16) + bigv
* ht_big
[table0
].linbits
;
1284 sum1
= (sum
& 0xffff) + bigv
* ht_big
[table1
].linbits
;
1298 /*************************************************************************/
1299 /* Function: Calculation of rzero, count1, address3 */
1300 /* (Partitions ix into big values, quadruples and zeros). */
1301 /*************************************************************************/
1302 static int calc_runlen( short *ix
, side_info_t
*si
)
1306 for(i
=SAMPL2
; i
-=2; )
1307 if(*(uint32_t*)&ix
[i
-2]) /* !!!! short *ix; !!!!! */
1319 if((v
| w
| x
| y
) <= 1)
1321 p
= (y
<<3) + (x
<<2) + (w
<<1) + (v
);
1332 if((sum
>> 16) < (sum
& 0xffff))
1334 si
->table_select
[3] = 0;
1339 si
->table_select
[3] = 1;
1340 return sum
& 0xffff;
1345 /*************************************************************************/
1346 /* Function: Quantization of the vector xr ( -> ix) */
1347 /*************************************************************************/
1348 static int quantize_int(int *xr
, short *ix
, side_info_t
*si
)
1350 unsigned int i
, idx
, s
, frac_pow
[] = { 0x10000, 0xd745, 0xb505, 0x9838 };
1352 s
= frac_pow
[si
->quantStep
& 3] >> si
->quantStep
/ 4;
1354 /* check for possible 'out of range' values */
1355 if(((si
->max_val
+ 256) >> 8) * s
>= (65536 << 8))
1358 if(((si
->max_val
+ 256) >> 8) * s
< (4096 << 8))
1359 { /* all values fit the table size */
1360 for(i
=SAMPL2
; i
--; )
1361 ix
[i
] = int2idx
[(xr
[i
] * s
+ 0x8000) >> 16];
1364 { /* check each index wether it fits the table */
1365 for(i
=SAMPL2
; i
--; )
1367 idx
= (xr
[i
] * s
+ 0x08000) >> 16;
1369 if(idx
> 4095) ix
[i
] = int2idx
[(idx
+ 8) >> 4] << 3;
1370 else ix
[i
] = int2idx
[idx
];
1377 /*************************************************************************/
1378 /* subdivides the bigvalue region which will use separate Huffman tables */
1379 /*************************************************************************/
1380 static void subdivide(side_info_t
*si
)
1382 int scfb
, count0
, count1
;
1385 { /* no bigvalue region */
1392 /* Calculate scale factor band index */
1393 for(scfb
=0; scalefac
[scfb
] < si
->address3
; )
1396 count0
= subdv_table
[scfb
].region0_cnt
;
1397 count1
= subdv_table
[scfb
].region1_cnt
;
1399 si
->region_0_1
= (count0
<< 3) | count1
;
1400 si
->address1
= scalefac
[count0
+ 1];
1401 si
->address2
= scalefac
[count0
+ 1 + count1
+ 1];
1405 /*******************************************************************/
1406 /* Count the number of bits necessary to code the bigvalues region */
1407 /*******************************************************************/
1408 static int bigv_bitcount(short *ix
, side_info_t
*gi
)
1410 int b1
=0, b2
=0, b3
=0;
1412 /* Select huffman code tables for bigvalues regions */
1413 gi
->table_select
[0] = 0;
1414 gi
->table_select
[1] = 0;
1415 gi
->table_select
[2] = 0;
1417 if( gi
->address1
> 0 ) /* region0 */
1418 gi
->table_select
[0] = choose_table(ix
, 0 , gi
->address1
, &b1
);
1420 if( gi
->address2
> gi
->address1
) /* region1 */
1421 gi
->table_select
[1] = choose_table(ix
, gi
->address1
, gi
->address2
, &b2
);
1423 if( gi
->address3
> gi
->address2
) /* region2 */
1424 gi
->table_select
[2] = choose_table(ix
, gi
->address2
, gi
->address3
, &b3
);
1429 static int quantize_and_count_bits(int *xr
, short *ix
, side_info_t
*si
)
1433 if(quantize_int(xr
, ix
, si
))
1435 bits
= calc_runlen(ix
, si
); /* rzero,count1,address3 */
1436 subdivide(si
); /* bigvalues sfb division */
1437 bits
+= bigv_bitcount(ix
,si
); /* bit count */
1443 /************************************************************************/
1444 /* The code selects the best quantStep for a particular set of scalefacs*/
1445 /************************************************************************/
1446 static int inner_loop(int *xr
, int max_bits
, side_info_t
*si
)
1450 while((bits
=quantize_and_count_bits(xr
, enc_data
, si
)) < max_bits
-64)
1452 if(si
->quantStep
== 0)
1455 if(si
->quantStep
<= 2)
1461 while(bits
> max_bits
)
1464 bits
= quantize_and_count_bits(xr
, enc_data
, si
);
1470 static void iteration_loop(int *xr
, side_info_t
*si
, int gr_cnt
)
1472 int remain
, tar_bits
, max_bits
= cfg
.mean_bits
;
1474 /* distribute reserved bits to remaining granules */
1475 tar_bits
= max_bits
+ (cfg
.ResvSize
/ gr_cnt
& ~7);
1476 if(tar_bits
> max_bits
+ max_bits
/2)
1477 tar_bits
= max_bits
+ max_bits
/2;
1479 si
->part2_3_length
= inner_loop(xr
, tar_bits
, si
);
1480 si
->global_gain
= si
->quantStep
+ 142 - si
->additStep
;
1482 /* unused bits of the reservoir can be used for remaining granules */
1483 cfg
.ResvSize
+= max_bits
- si
->part2_3_length
;
1485 /* end: distribute the reserved bits to one or two granules */
1488 si
->part2_3_length
+= cfg
.ResvSize
;
1489 /* mp3 format allows max 12bits for granule length */
1490 if(si
->part2_3_length
> 4092)
1492 remain
= (si
->part2_3_length
- 4092 + 31) >> 5;
1493 si
->part2_3_length
-= remain
<< 5;
1494 si
[-1].part2_3_length
+= remain
<< 5;
1503 /* returns sum_j=0^31 a[j]*cos(PI*j*(k+1/2)/32), 0<=k<32 */
1504 void window_subband1(short *wk
, int sb0
[SBLIMIT
], int sb1
[SBLIMIT
]) ICODE_ATTR
;
1505 void window_subband1(short *wk
, int sb0
[SBLIMIT
], int sb1
[SBLIMIT
])
1508 short *wp
, *x1
, *x2
;
1513 for(k
=0; k
<18; k
++, wk
+=64, sb0
+=SBLIMIT
, sb1
+=SBLIMIT
)
1519 for(i
=-15; i
<0; i
++)
1522 "move.l (-224*4,%[x2]), %%d4\n" /* d4 = x2[-224] */
1523 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1524 "mac.w %%d0u, %%d4u, %%acc0\n"
1525 "mac.w %%d0u, %%d4l, (-160*4,%[x2]), %%d4, %%acc1\n"
1526 "mac.w %%d0l, %%d4u, %%acc0\n"
1527 "mac.w %%d0l, %%d4l, ( -96*4,%[x2]), %%d4, %%acc1\n"
1528 "mac.w %%d1u, %%d4u, %%acc0\n"
1529 "mac.w %%d1u, %%d4l, ( -32*4,%[x2]), %%d4, %%acc1\n"
1530 "mac.w %%d1l, %%d4u, %%acc0\n"
1531 "mac.w %%d1l, %%d4l, ( 32*4,%[x2]), %%d4, %%acc1\n"
1532 "mac.w %%d2u, %%d4u, %%acc0\n"
1533 "mac.w %%d2u, %%d4l, ( 96*4,%[x2]), %%d4, %%acc1\n"
1534 "mac.w %%d2l, %%d4u, %%acc0\n"
1535 "mac.w %%d2l, %%d4l, ( 160*4,%[x2]), %%d4, %%acc1\n"
1536 "mac.w %%d3u, %%d4u, %%acc0\n"
1537 "mac.w %%d3u, %%d4l, ( 224*4,%[x2]), %%d4, %%acc1\n"
1538 "mac.w %%d3l, %%d4u, %%acc0\n"
1539 "mac.w %%d3l, %%d4l, (-256*4,%[x1]), %%d4, %%acc1\n"
1540 "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */
1541 "mac.w %%d0u, %%d4u, %%acc0\n"
1542 "mac.w %%d0u, %%d4l, (-192*4,%[x1]), %%d4, %%acc1\n"
1543 "mac.w %%d0l, %%d4u, %%acc0\n"
1544 "mac.w %%d0l, %%d4l, (-128*4,%[x1]), %%d4, %%acc1\n"
1545 "mac.w %%d1u, %%d4u, %%acc0\n"
1546 "mac.w %%d1u, %%d4l, ( -64*4,%[x1]), %%d4, %%acc1\n"
1547 "mac.w %%d1l, %%d4u, %%acc0\n"
1548 "mac.w %%d1l, %%d4l, ( 0*4,%[x1]), %%d4, %%acc1\n"
1549 "mac.w %%d2u, %%d4u, %%acc0\n"
1550 "mac.w %%d2u, %%d4l, ( 64*4,%[x1]), %%d4, %%acc1\n"
1551 "mac.w %%d2l, %%d4u, %%acc0\n"
1552 "mac.w %%d2l, %%d4l, ( 128*4,%[x1]), %%d4, %%acc1\n"
1553 "mac.w %%d3u, %%d4u, %%acc0\n"
1554 "mac.w %%d3u, %%d4l, ( 192*4,%[x1]), %%d4, %%acc1\n"
1555 "mac.w %%d3l, %%d4u, %%acc0\n"
1556 "mac.w %%d3l, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n"
1557 "movclr.l %%acc0, %%d0\n"
1558 "move.l %%d0, %[s0]\n"
1559 "movclr.l %%acc1, %%d0\n"
1560 "move.l %%d0, %[s1]\n"
1562 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1563 "mac.w %%d0u, %%d4u, %%acc0\n"
1564 "mac.w %%d0u, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n"
1565 "mac.w %%d0l, %%d4u, %%acc0\n"
1566 "mac.w %%d0l, %%d4l, ( 96*4,%[x1]), %%d4, %%acc1\n"
1567 "mac.w %%d1u, %%d4u, %%acc0\n"
1568 "mac.w %%d1u, %%d4l, ( 32*4,%[x1]), %%d4, %%acc1\n"
1569 "mac.w %%d1l, %%d4u, %%acc0\n"
1570 "mac.w %%d1l, %%d4l, ( -32*4,%[x1]), %%d4, %%acc1\n"
1571 "mac.w %%d2u, %%d4u, %%acc0\n"
1572 "mac.w %%d2u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n"
1573 "mac.w %%d2l, %%d4u, %%acc0\n"
1574 "mac.w %%d2l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n"
1575 "mac.w %%d3u, %%d4u, %%acc0\n"
1576 "mac.w %%d3u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n"
1577 "mac.w %%d3l, %%d4u, %%acc0\n"
1578 "mac.w %%d3l, %%d4l, ( 256*4,%[x2]), %%d4, %%acc1\n"
1579 "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */
1580 "mac.w %%d0u, %%d4u, %%acc0\n"
1581 "mac.w %%d0u, %%d4l, ( 192*4,%[x2]), %%d4, %%acc1\n"
1582 "mac.w %%d0l, %%d4u, %%acc0\n"
1583 "mac.w %%d0l, %%d4l, ( 128*4,%[x2]), %%d4, %%acc1\n"
1584 "mac.w %%d1u, %%d4u, %%acc0\n"
1585 "mac.w %%d1u, %%d4l, ( 64*4,%[x2]), %%d4, %%acc1\n"
1586 "mac.w %%d1l, %%d4u, %%acc0\n"
1587 "mac.w %%d1l, %%d4l, ( 0*4,%[x2]), %%d4, %%acc1\n"
1588 "mac.w %%d2u, %%d4u, %%acc0\n"
1589 "mac.w %%d2u, %%d4l, ( -64*4,%[x2]), %%d4, %%acc1\n"
1590 "mac.w %%d2l, %%d4u, %%acc0\n"
1591 "mac.w %%d2l, %%d4l, (-128*4,%[x2]), %%d4, %%acc1\n"
1592 "mac.w %%d3u, %%d4u, %%acc0\n"
1593 "mac.w %%d3u, %%d4l, (-192*4,%[x2]), %%d4, %%acc1\n"
1594 "mac.w %%d3l, %%d4u, %%acc0\n"
1595 "mac.w %%d3l, %%d4l, %%acc1\n"
1596 "movclr.l %%acc0, %%d0\n"
1597 "move.l %%d0, %[t0]\n"
1598 "movclr.l %%acc1, %%d0\n"
1599 "move.l %%d0, %[t1]\n"
1601 : [x1
] "+a" (x1
), [x2
] "+a" (x2
), [s0
] "+m" (s0
), [t0
] "+m" (t0
),
1602 [s1
] "+m" (s1
), [t1
] "+m" (t1
)
1603 : [wp
] "a" (wp
) : "d0", "d1", "d2", "d3", "d4");
1605 sb0
[30+i
*2] = shft4(t0
) + shft13(s0
) * wp
[24];
1606 sb0
[31+i
*2] = shft13(t0
) * wp
[25] - shft13(s0
) * wp
[26];
1607 sb1
[30+i
*2] = shft4(t1
) + shft13(s1
) * wp
[24];
1608 sb1
[31+i
*2] = shft13(t1
) * wp
[25] - shft13(s1
) * wp
[26];
1615 "move.l ( -32*4,%[x1]), %%d4\n" /* d4 = x1[-32] */
1616 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1618 "mac.w %%d0u, %%d4u, %%acc0\n"
1619 "mac.w %%d0u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n"
1620 "mac.w %%d0l, %%d4u, %%acc0\n"
1621 "mac.w %%d0l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n"
1622 "mac.w %%d1u, %%d4u, %%acc0\n"
1623 "mac.w %%d1u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n"
1624 "mac.w %%d1l, %%d4u, %%acc0\n"
1625 "mac.w %%d1l, %%d4l, ( 32*4,%[x1]), %%d4, %%acc1\n"
1626 "mac.w %%d2u, %%d4u, %%acc0\n"
1627 "mac.w %%d2u, %%d4l, ( 96*4,%[x1]), %%d4, %%acc1\n"
1628 "mac.w %%d2l, %%d4u, %%acc0\n"
1629 "mac.w %%d2l, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n"
1630 "mac.w %%d3u, %%d4u, %%acc0\n"
1631 "mac.w %%d3u, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n"
1632 "mac.w %%d3l, %%d4u, %%acc0\n"
1633 "mac.w %%d3l, %%d4l, ( -16*4,%[x1]), %%d4, %%acc1\n"
1634 "movclr.l %%acc0, %%d0\n"
1635 "move.l %%d0, %[s0]\n"
1636 "movclr.l %%acc1, %%d0\n"
1637 "move.l %%d0, %[s1]\n"
1639 "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */
1640 "mac.w %%d0u, %%d4u, %%acc0\n"
1641 "mac.w %%d0u, %%d4l, ( -48*4,%[x1]), %%d4, %%acc1\n"
1642 "mac.w %%d1u, %%d4u, %%acc0\n"
1643 "mac.w %%d1u, %%d4l, ( 16*4,%[x1]), %%d4, %%acc1\n"
1644 "mac.w %%d1l, %%d4u, %%acc0\n"
1645 "mac.w %%d1l, %%d4l, ( -80*4,%[x1]), %%d4, %%acc1\n"
1646 "mac.w %%d2u, %%d4u, %%acc0\n"
1647 "mac.w %%d2u, %%d4l, ( 48*4,%[x1]), %%d4, %%acc1\n"
1648 "mac.w %%d2u, %%d4u, %%acc0\n"
1649 "mac.w %%d2u, %%d4l, (-112*4,%[x1]), %%d4, %%acc1\n"
1650 "mac.w %%d3u, %%d4u, %%acc0\n"
1651 "mac.w %%d3u, %%d4l, ( 80*4,%[x1]), %%d4, %%acc1\n"
1652 "mac.w %%d3l, %%d4u, %%acc0\n"
1653 "mac.w %%d3l, %%d4l, (-144*4,%[x1]), %%d4, %%acc1\n"
1654 "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */
1655 "mac.w %%d0u, %%d4u, %%acc0\n"
1656 "mac.w %%d0u, %%d4l, ( 112*4,%[x1]), %%d4, %%acc1\n"
1657 "mac.w %%d0u, %%d4u, %%acc0\n"
1658 "mac.w %%d0u, %%d4l, (-176*4,%[x1]), %%d4, %%acc1\n"
1659 "mac.w %%d1u, %%d4u, %%acc0\n"
1660 "mac.w %%d1u, %%d4l, ( 144*4,%[x1]), %%d4, %%acc1\n"
1661 "mac.w %%d1l, %%d4u, %%acc0\n"
1662 "mac.w %%d1l, %%d4l, (-208*4,%[x1]), %%d4, %%acc1\n"
1663 "mac.w %%d2u, %%d4u, %%acc0\n"
1664 "mac.w %%d2u, %%d4l, ( 176*4,%[x1]), %%d4, %%acc1\n"
1665 "mac.w %%d2u, %%d4u, %%acc0\n"
1666 "mac.w %%d2u, %%d4l, (-240*4,%[x1]), %%d4, %%acc1\n"
1667 "mac.w %%d3u, %%d4u, %%acc0\n"
1668 "mac.w %%d3u, %%d4l, ( 208*4,%[x1]), %%d4, %%acc1\n"
1669 "mac.w %%d3l, %%d4u, %%acc0\n"
1670 "mac.w %%d3l, %%d4l, %%acc1\n"
1671 "movclr.l %%acc0, %%d0\n"
1672 "move.l %%d0, %[t0]\n"
1673 "movclr.l %%acc1, %%d0\n"
1674 "move.l %%d0, %[t1]\n"
1676 : [x1
] "+a" (x1
), [s0
] "+m" (s0
), [t0
] "+m" (t0
),
1677 [s1
] "+m" (s1
), [t1
] "+m" (t1
)
1678 : [wp
] "a" (wp
) : "d0", "d1", "d2", "d3", "d4");
1685 sb0
[31] = v
+ t0
; /* A0 */
1686 sb0
[30] = u
+ s0
; /* A1 */
1687 sb0
[15] = u
- s0
; /* A2 */
1688 sb0
[14] = v
- t0
; /* A3 */
1695 sb1
[31] = v
+ t1
; /* A0 */
1696 sb1
[30] = u
+ s1
; /* A1 */
1697 sb1
[15] = u
- s1
; /* A2 */
1698 sb1
[14] = v
- t1
; /* A3 */
1703 for(ch
=0; ch
<cfg
.channels
; ch
++)
1706 for(k
=0; k
<18; k
++, wk
+=64, a
+=SBLIMIT
)
1712 /* x1[-572] .... x1[448] = 1022 */
1714 for(i
=-15; i
<0; i
++)
1716 s
= (int)x2
[-224*2] * wp
[ 0]; t
= (int)x1
[ 224*2] * wp
[ 0];
1717 s
+= (int)x2
[-160*2] * wp
[ 1]; t
+= (int)x1
[ 160*2] * wp
[ 1];
1718 s
+= (int)x2
[- 96*2] * wp
[ 2]; t
+= (int)x1
[ 96*2] * wp
[ 2];
1719 s
+= (int)x2
[- 32*2] * wp
[ 3]; t
+= (int)x1
[ 32*2] * wp
[ 3];
1720 s
+= (int)x2
[ 32*2] * wp
[ 4]; t
+= (int)x1
[- 32*2] * wp
[ 4];
1721 s
+= (int)x2
[ 96*2] * wp
[ 5]; t
+= (int)x1
[- 96*2] * wp
[ 5];
1722 s
+= (int)x2
[ 160*2] * wp
[ 6]; t
+= (int)x1
[-160*2] * wp
[ 6];
1723 s
+= (int)x2
[ 224*2] * wp
[ 7]; t
+= (int)x1
[-224*2] * wp
[ 7];
1724 s
+= (int)x1
[-256*2] * wp
[ 8]; t
+= (int)x2
[ 256*2] * wp
[16];
1725 s
+= (int)x1
[-192*2] * wp
[ 9]; t
+= (int)x2
[ 192*2] * wp
[17];
1726 s
+= (int)x1
[-128*2] * wp
[10]; t
+= (int)x2
[ 128*2] * wp
[18];
1727 s
+= (int)x1
[- 64*2] * wp
[11]; t
+= (int)x2
[ 64*2] * wp
[19];
1728 s
+= (int)x1
[ 0*2] * wp
[12]; t
+= (int)x2
[ 0*2] * wp
[20];
1729 s
+= (int)x1
[ 64*2] * wp
[13]; t
+= (int)x2
[- 64*2] * wp
[21];
1730 s
+= (int)x1
[ 128*2] * wp
[14]; t
+= (int)x2
[-128*2] * wp
[22];
1731 s
+= (int)x1
[ 192*2] * wp
[15]; t
+= (int)x2
[-192*2] * wp
[23];
1733 a
[30+i
*2] = shft4(t
) + shft13(s
) * wp
[24];
1734 a
[31+i
*2] = shft13(t
) * wp
[25] - shft13(s
) * wp
[26];
1740 t
= (int)x1
[- 16*2] * wp
[ 8]; s
= (int)x1
[ -32*2] * wp
[0];
1741 t
+= ((int)x1
[- 48*2]-x1
[ 16*2]) * wp
[10]; s
+= (int)x1
[ -96*2] * wp
[1];
1742 t
+= ((int)x1
[- 80*2]+x1
[ 48*2]) * wp
[12]; s
+= (int)x1
[-160*2] * wp
[2];
1743 t
+= ((int)x1
[-112*2]-x1
[ 80*2]) * wp
[14]; s
+= (int)x1
[-224*2] * wp
[3];
1744 t
+= ((int)x1
[-144*2]+x1
[112*2]) * wp
[16]; s
+= (int)x1
[ 32*2] * wp
[4];
1745 t
+= ((int)x1
[-176*2]-x1
[144*2]) * wp
[18]; s
+= (int)x1
[ 96*2] * wp
[5];
1746 t
+= ((int)x1
[-208*2]+x1
[176*2]) * wp
[20]; s
+= (int)x1
[ 160*2] * wp
[6];
1747 t
+= ((int)x1
[-240*2]-x1
[208*2]) * wp
[22]; s
+= (int)x1
[ 224*2] * wp
[7];
1754 a
[31] = v
+ t
; /* A0 */
1755 a
[30] = u
+ s
; /* A1 */
1756 a
[15] = u
- s
; /* A2 */
1757 a
[14] = v
- t
; /* A3 */
1759 wk
-= 18 * 64 - 1; /* rewind wk (to next channel start) */
1764 void window_subband2(short *x1
, int a
[SBLIMIT
]) ICODE_ATTR
;
1765 void window_subband2(short *x1
, int a
[SBLIMIT
])
1768 short *wp
= enwindow
;
1769 short *x2
= x1
- 124;
1775 xr
= a
[28] - a
[0]; a
[0] += a
[28]; a
[28] = shft9(xr
) * wp
[-2*27+25];
1776 xr
= a
[29] - a
[1]; a
[1] += a
[29]; a
[29] = shft9(xr
) * wp
[-2*27+25];
1777 xr
= a
[26] - a
[2]; a
[2] += a
[26]; a
[26] = shft9(xr
) * wp
[-4*27+25];
1778 xr
= a
[27] - a
[3]; a
[3] += a
[27]; a
[27] = shft9(xr
) * wp
[-4*27+25];
1779 xr
= a
[24] - a
[4]; a
[4] += a
[24]; a
[24] = shft9(xr
) * wp
[-6*27+25];
1780 xr
= a
[25] - a
[5]; a
[5] += a
[25]; a
[25] = shft9(xr
) * wp
[-6*27+25];
1781 xr
= a
[22] - a
[6]; a
[6] += a
[22]; a
[22] = shft9(xr
) * SQRT
;
1782 xr
= a
[23] - a
[7]; a
[7] += a
[23]; a
[23] = shft9(xr
) * SQRT
- a
[7];
1787 xr
= a
[ 6]; a
[ 6] = a
[31] - xr
; a
[31] = a
[31] + xr
;
1788 xr
= a
[ 7]; a
[ 7] = a
[30] - xr
; a
[30] = a
[30] + xr
;
1789 xr
= a
[22]; a
[22] = a
[15] - xr
; a
[15] = a
[15] + xr
;
1790 xr
= a
[23]; a
[23] = a
[14] - xr
; a
[14] = a
[14] + xr
;
1792 xr
= a
[20] - a
[ 8]; a
[ 8] += a
[20]; a
[20] = shft9(xr
) * wp
[-10*27+25];
1793 xr
= a
[21] - a
[ 9]; a
[ 9] += a
[21]; a
[21] = shft9(xr
) * wp
[-10*27+25];
1794 xr
= a
[18] - a
[10]; a
[10] += a
[18]; a
[18] = shft9(xr
) * wp
[-12*27+25];
1795 xr
= a
[19] - a
[11]; a
[11] += a
[19]; a
[19] = shft9(xr
) * wp
[-12*27+25];
1796 xr
= a
[16] - a
[12]; a
[12] += a
[16]; a
[16] = shft9(xr
) * wp
[-14*27+25];
1797 xr
= a
[17] - a
[13]; a
[13] += a
[17]; a
[17] = shft9(xr
) * wp
[-14*27+25];
1798 xr
=-a
[20] + a
[24]; a
[20] += a
[24]; a
[24] = shft9(xr
) * wp
[-12*27+25];
1799 xr
=-a
[21] + a
[25]; a
[21] += a
[25]; a
[25] = shft9(xr
) * wp
[-12*27+25];
1800 xr
= a
[ 4] - a
[ 8]; a
[ 4] += a
[ 8]; a
[ 8] = shft9(xr
) * wp
[-12*27+25];
1801 xr
= a
[ 5] - a
[ 9]; a
[ 5] += a
[ 9]; a
[ 9] = shft9(xr
) * wp
[-12*27+25];
1802 xr
= a
[ 0] - a
[12]; a
[ 0] += a
[12]; a
[12] = shft9(xr
) * wp
[ -4*27+25];
1803 xr
= a
[ 1] - a
[13]; a
[ 1] += a
[13]; a
[13] = shft9(xr
) * wp
[ -4*27+25];
1804 xr
= a
[16] - a
[28]; a
[16] += a
[28]; a
[28] = shft9(xr
) * wp
[ -4*27+25];
1805 xr
=-a
[17] + a
[29]; a
[17] += a
[29]; a
[29] = shft9(xr
) * wp
[ -4*27+25];
1807 xr
= SQRT
* shft9(a
[ 2] - a
[10]); a
[ 2] += a
[10]; a
[10] = xr
;
1808 xr
= SQRT
* shft9(a
[ 3] - a
[11]); a
[ 3] += a
[11]; a
[11] = xr
;
1809 xr
= SQRT
* shft9(a
[26] - a
[18]); a
[18] += a
[26]; a
[26] = xr
- a
[18];
1810 xr
= SQRT
* shft9(a
[27] - a
[19]); a
[19] += a
[27]; a
[27] = xr
- a
[19];
1812 xr
= a
[ 2]; a
[19] -= a
[ 3]; a
[ 3] -= xr
; a
[ 2] = a
[31] - xr
; a
[31] += xr
;
1813 xr
= a
[ 3]; a
[11] -= a
[19]; a
[18] -= xr
; a
[ 3] = a
[30] - xr
; a
[30] += xr
;
1814 xr
= a
[18]; a
[27] -= a
[11]; a
[19] -= xr
; a
[18] = a
[15] - xr
; a
[15] += xr
;
1816 xr
= a
[19]; a
[10] -= xr
; a
[19] = a
[14] - xr
; a
[14] += xr
;
1817 xr
= a
[10]; a
[11] -= xr
; a
[10] = a
[23] - xr
; a
[23] += xr
;
1818 xr
= a
[11]; a
[26] -= xr
; a
[11] = a
[22] - xr
; a
[22] += xr
;
1819 xr
= a
[26]; a
[27] -= xr
; a
[26] = a
[ 7] - xr
; a
[ 7] += xr
;
1821 xr
= a
[27]; a
[27] = a
[6] - xr
; a
[6] += xr
;
1823 xr
= SQRT
* shft9(a
[ 0] - a
[ 4]); a
[ 0] += a
[ 4]; a
[ 4] = xr
;
1824 xr
= SQRT
* shft9(a
[ 1] - a
[ 5]); a
[ 1] += a
[ 5]; a
[ 5] = xr
;
1825 xr
= SQRT
* shft9(a
[16] - a
[20]); a
[16] += a
[20]; a
[20] = xr
;
1826 xr
= SQRT
* shft9(a
[17] - a
[21]); a
[17] += a
[21]; a
[21] = xr
;
1827 xr
=-SQRT
* shft9(a
[ 8] - a
[12]); a
[ 8] += a
[12]; a
[12] = xr
- a
[ 8];
1828 xr
=-SQRT
* shft9(a
[ 9] - a
[13]); a
[ 9] += a
[13]; a
[13] = xr
- a
[ 9];
1829 xr
=-SQRT
* shft9(a
[25] - a
[29]); a
[25] += a
[29]; a
[29] = xr
- a
[25];
1830 xr
=-SQRT
* shft9(a
[24] + a
[28]); a
[24] -= a
[28]; a
[28] = xr
- a
[24];
1832 xr
= a
[24] - a
[16]; a
[24] = xr
;
1833 xr
= a
[20] - xr
; a
[20] = xr
;
1834 xr
= a
[28] - xr
; a
[28] = xr
;
1836 xr
= a
[25] - a
[17]; a
[25] = xr
;
1837 xr
= a
[21] - xr
; a
[21] = xr
;
1838 xr
= a
[29] - xr
; a
[29] = xr
;
1840 xr
= a
[17] - a
[1]; a
[17] = xr
;
1841 xr
= a
[ 9] - xr
; a
[ 9] = xr
;
1842 xr
= a
[25] - xr
; a
[25] = xr
;
1843 xr
= a
[ 5] - xr
; a
[ 5] = xr
;
1844 xr
= a
[21] - xr
; a
[21] = xr
;
1845 xr
= a
[13] - xr
; a
[13] = xr
;
1846 xr
= a
[29] - xr
; a
[29] = xr
;
1848 xr
= a
[ 1] - a
[0]; a
[ 1] = xr
;
1849 xr
= a
[16] - xr
; a
[16] = xr
;
1850 xr
= a
[17] - xr
; a
[17] = xr
;
1851 xr
= a
[ 8] - xr
; a
[ 8] = xr
;
1852 xr
= a
[ 9] - xr
; a
[ 9] = xr
;
1853 xr
= a
[24] - xr
; a
[24] = xr
;
1854 xr
= a
[25] - xr
; a
[25] = xr
;
1855 xr
= a
[ 4] - xr
; a
[ 4] = xr
;
1856 xr
= a
[ 5] - xr
; a
[ 5] = xr
;
1857 xr
= a
[20] - xr
; a
[20] = xr
;
1858 xr
= a
[21] - xr
; a
[21] = xr
;
1859 xr
= a
[12] - xr
; a
[12] = xr
;
1860 xr
= a
[13] - xr
; a
[13] = xr
;
1861 xr
= a
[28] - xr
; a
[28] = xr
;
1862 xr
= a
[29] - xr
; a
[29] = xr
;
1864 xr
= a
[ 0]; a
[ 0] += a
[31]; a
[31] -= xr
;
1865 xr
= a
[ 1]; a
[ 1] += a
[30]; a
[30] -= xr
;
1866 xr
= a
[16]; a
[16] += a
[15]; a
[15] -= xr
;
1867 xr
= a
[17]; a
[17] += a
[14]; a
[14] -= xr
;
1868 xr
= a
[ 8]; a
[ 8] += a
[23]; a
[23] -= xr
;
1869 xr
= a
[ 9]; a
[ 9] += a
[22]; a
[22] -= xr
;
1870 xr
= a
[24]; a
[24] += a
[ 7]; a
[ 7] -= xr
;
1871 xr
= a
[25]; a
[25] += a
[ 6]; a
[ 6] -= xr
;
1872 xr
= a
[ 4]; a
[ 4] += a
[27]; a
[27] -= xr
;
1873 xr
= a
[ 5]; a
[ 5] += a
[26]; a
[26] -= xr
;
1874 xr
= a
[20]; a
[20] += a
[11]; a
[11] -= xr
;
1875 xr
= a
[21]; a
[21] += a
[10]; a
[10] -= xr
;
1876 xr
= a
[12]; a
[12] += a
[19]; a
[19] -= xr
;
1877 xr
= a
[13]; a
[13] += a
[18]; a
[18] -= xr
;
1878 xr
= a
[28]; a
[28] += a
[ 3]; a
[ 3] -= xr
;
1879 xr
= a
[29]; a
[29] += a
[ 2]; a
[ 2] -= xr
;
1882 void mdct_long(int *out
, int *in
) ICODE_ATTR
;
1883 void mdct_long(int *out
, int *in
)
1886 int tc1
, tc2
, tc3
, tc4
, ts5
, ts6
, ts7
, ts8
;
1887 int ts1
, ts2
, ts3
, ts4
, tc5
, tc6
, tc7
, tc8
;
1889 /* 1,2, 5,6, 9,10, 13,14, 17 */
1890 tc1
= in
[17] - in
[ 9];
1891 tc3
= in
[15] - in
[11];
1892 tc4
= in
[14] - in
[12];
1893 ts5
= in
[ 0] + in
[ 8];
1894 ts6
= in
[ 1] + in
[ 7];
1895 ts7
= in
[ 2] + in
[ 6];
1896 ts8
= in
[ 3] + in
[ 5];
1898 out
[17] = (ts5
+ ts7
- ts8
) * cx
[8] - (ts6
- in
[4]) * cx
[8];
1899 st
= (ts5
+ ts7
- ts8
) * cx
[7] + (ts6
- in
[4]) * cx
[8];
1900 ct
= (tc1
- tc3
- tc4
) * cx
[6];
1904 tc2
= (in
[16] - in
[10]) * cx
[6];
1905 ts6
= ts6
* cx
[7] + in
[4] * cx
[8];
1907 ct
= tc1
* cx
[0] + tc2
+ tc3
* cx
[1] + tc4
* cx
[2];
1908 st
= -ts5
* cx
[4] + ts6
- ts7
* cx
[5] + ts8
* cx
[3];
1912 ct
= tc1
* cx
[1] - tc2
- tc3
* cx
[2] + tc4
* cx
[0];
1913 st
= -ts5
* cx
[5] + ts6
- ts7
* cx
[3] + ts8
* cx
[4];
1917 ct
= tc1
* cx
[2] - tc2
+ tc3
* cx
[0] - tc4
* cx
[1];
1918 st
= ts5
* cx
[3] - ts6
+ ts7
* cx
[4] - ts8
* cx
[5];
1922 ts1
= in
[ 8] - in
[ 0];
1923 ts3
= in
[ 6] - in
[ 2];
1924 ts4
= in
[ 5] - in
[ 3];
1925 tc5
= in
[17] + in
[ 9];
1926 tc6
= in
[16] + in
[10];
1927 tc7
= in
[15] + in
[11];
1928 tc8
= in
[14] + in
[12];
1930 out
[0] = (tc5
+ tc7
+ tc8
) * cx
[8] + (tc6
+ in
[13]) * cx
[8];
1931 ct
= (tc5
+ tc7
+ tc8
) * cx
[7] - (tc6
+ in
[13]) * cx
[8];
1932 st
= (ts1
- ts3
+ ts4
) * cx
[6];
1936 ts2
= (in
[7] - in
[1]) * cx
[6];
1937 tc6
= in
[13] * cx
[8] - tc6
* cx
[7];
1939 ct
= tc5
* cx
[3] - tc6
+ tc7
* cx
[4] + tc8
* cx
[5];
1940 st
= ts1
* cx
[2] + ts2
+ ts3
* cx
[0] + ts4
* cx
[1];
1944 ct
=-tc5
* cx
[5] + tc6
- tc7
* cx
[3] - tc8
* cx
[4];
1945 st
= ts1
* cx
[1] + ts2
- ts3
* cx
[2] - ts4
* cx
[0];
1949 ct
=-tc5
* cx
[4] + tc6
- tc7
* cx
[5] - tc8
* cx
[3];
1950 st
= ts1
* cx
[0] - ts2
+ ts3
* cx
[1] - ts4
* cx
[2];
1955 static int find_bitrate_index(int type
, int bitrate
, bool stereo
)
1957 if (type
== 1 && !stereo
&& bitrate
> 160)
1960 return ci
->round_value_to_list32(bitrate
,
1961 &bitr_index
[type
][1], 14, true) + 1;
1964 static int find_samplerate_index(long freq
, int *mp3_type
)
1966 int mpeg
= freq
>= (32000+24000)/2 ? 1 : 0;
1967 int i
= ci
->round_value_to_list32(freq
, sampr_index
[mpeg
], 3, true);
1972 static bool init_mp3_encoder_engine(int sample_rate
,
1975 struct encoder_config
*enc_cfg
)
1977 const bool stereo
= num_channels
> 1;
1978 uint32_t avg_byte_per_frame
;
1980 cfg
.channels
= stereo
? 2 : 1;
1981 cfg
.rec_mono_mode
= rec_mono_mode
;
1982 cfg
.mpg
.mode
= stereo
? 0 : 3; /* 0=stereo, 3=mono */
1983 cfg
.mpg
.smpl_id
= find_samplerate_index(sample_rate
, &cfg
.mpg
.type
);
1984 cfg
.samplerate
= sampr_index
[cfg
.mpg
.type
][cfg
.mpg
.smpl_id
];
1985 cfg
.mpg
.bitr_id
= find_bitrate_index(cfg
.mpg
.type
,
1986 enc_cfg
->mp3_enc
.bitrate
,
1988 cfg
.mpg
.bitrate
= bitr_index
[cfg
.mpg
.type
][cfg
.mpg
.bitr_id
];
1989 cfg
.mpg
.num_bands
= num_bands
[stereo
? cfg
.mpg
.type
: 2][cfg
.mpg
.bitr_id
];
1991 if (cfg
.mpg
.type
== 1)
1994 pcm_chunk_size
= PCM_CHUNK_SIZE1
;
1995 samp_per_frame
= SAMP_PER_FRAME1
;
2000 pcm_chunk_size
= PCM_CHUNK_SIZE2
;
2001 samp_per_frame
= SAMP_PER_FRAME2
;
2004 memcpy(scalefac
, sfBand
[cfg
.mpg
.smpl_id
+ 3*cfg
.mpg
.type
], sizeof(scalefac
));
2005 memset(mfbuf
, 0 , sizeof(mfbuf
));
2006 memset(mdct_freq
, 0 , sizeof(mdct_freq
));
2007 memset(enc_data
, 0 , sizeof(enc_data
));
2008 memset(sb_data
, 0 , sizeof(sb_data
));
2009 memset(&CodedData
, 0 , sizeof(CodedData
));
2010 memcpy(ca
, ca_const
, sizeof(ca
));
2011 memcpy(cs
, cs_const
, sizeof(cs
));
2012 memcpy(cx
, cx_const
, sizeof(cx
));
2013 memcpy(win
, win_const
, sizeof(win
));
2014 memcpy(enwindow
, enwindow_const
, sizeof(enwindow
));
2015 memcpy(int2idx
, int2idx_const
, sizeof(int2idx
));
2016 memcpy(ht_count
, ht_count_const
, sizeof(ht_count
));
2017 memcpy( tab01
, tab01_const
, sizeof(tab01
));
2018 memcpy( tab23
, tab23_const
, sizeof(tab23
));
2019 memcpy( tab56
, tab56_const
, sizeof(tab56
));
2020 memcpy( tab1315
, tab1315_const
, sizeof(tab1315
));
2021 memcpy( tab1624
, tab1624_const
, sizeof(tab1624
));
2022 memcpy( tab789
, tab789_const
, sizeof(tab789
));
2023 memcpy( tabABC
, tabABC_const
, sizeof(tabABC
));
2024 memcpy( t1HB
, t1HB_const
, sizeof(t1HB
));
2025 memcpy( t2HB
, t2HB_const
, sizeof(t2HB
));
2026 memcpy( t3HB
, t3HB_const
, sizeof(t3HB
));
2027 memcpy( t5HB
, t5HB_const
, sizeof(t5HB
));
2028 memcpy( t6HB
, t6HB_const
, sizeof(t6HB
));
2029 memcpy( t7HB
, t7HB_const
, sizeof(t7HB
));
2030 memcpy( t8HB
, t8HB_const
, sizeof(t8HB
));
2031 memcpy( t9HB
, t9HB_const
, sizeof(t9HB
));
2032 memcpy(t10HB
, t10HB_const
, sizeof(t10HB
));
2033 memcpy(t11HB
, t11HB_const
, sizeof(t11HB
));
2034 memcpy(t12HB
, t12HB_const
, sizeof(t12HB
));
2035 memcpy(t13HB
, t13HB_const
, sizeof(t13HB
));
2036 memcpy(t15HB
, t15HB_const
, sizeof(t15HB
));
2037 memcpy(t16HB
, t16HB_const
, sizeof(t16HB
));
2038 memcpy(t24HB
, t24HB_const
, sizeof(t24HB
));
2039 memcpy( t1l
, t1l_const
, sizeof(t1l
));
2040 memcpy( t2l
, t2l_const
, sizeof(t2l
));
2041 memcpy( t3l
, t3l_const
, sizeof(t3l
));
2042 memcpy( t5l
, t5l_const
, sizeof(t5l
));
2043 memcpy( t6l
, t6l_const
, sizeof(t6l
));
2044 memcpy( t7l
, t7l_const
, sizeof(t7l
));
2045 memcpy( t8l
, t8l_const
, sizeof(t8l
));
2046 memcpy( t9l
, t9l_const
, sizeof(t9l
));
2047 memcpy(t10l
, t10l_const
, sizeof(t10l
));
2048 memcpy(t11l
, t11l_const
, sizeof(t11l
));
2049 memcpy(t12l
, t12l_const
, sizeof(t12l
));
2050 memcpy(t13l
, t13l_const
, sizeof(t13l
));
2051 memcpy(t15l
, t15l_const
, sizeof(t15l
));
2052 memcpy(t16l
, t16l_const
, sizeof(t16l
));
2053 memcpy(t24l
, t24l_const
, sizeof(t24l
));
2054 memcpy(ht
, ht_const
, sizeof(ht
));
2056 ht
[ 0].table
= NULL
; ht
[ 0].hlen
= NULL
; /* Apparently not used */
2057 ht
[ 1].table
= t1HB
; ht
[ 1].hlen
= t1l
;
2058 ht
[ 2].table
= t2HB
; ht
[ 2].hlen
= t2l
;
2059 ht
[ 3].table
= t3HB
; ht
[ 3].hlen
= t3l
;
2060 ht
[ 4].table
= NULL
; ht
[ 4].hlen
= NULL
; /* Apparently not used */
2061 ht
[ 5].table
= t5HB
; ht
[ 5].hlen
= t5l
;
2062 ht
[ 6].table
= t6HB
; ht
[ 6].hlen
= t6l
;
2063 ht
[ 7].table
= t7HB
; ht
[ 7].hlen
= t7l
;
2064 ht
[ 8].table
= t8HB
; ht
[ 8].hlen
= t8l
;
2065 ht
[ 9].table
= t9HB
; ht
[ 9].hlen
= t9l
;
2066 ht
[10].table
= t10HB
; ht
[10].hlen
= t10l
;
2067 ht
[11].table
= t11HB
; ht
[11].hlen
= t11l
;
2068 ht
[12].table
= t12HB
; ht
[12].hlen
= t12l
;
2069 ht
[13].table
= t13HB
; ht
[13].hlen
= t13l
;
2070 ht
[14].table
= NULL
; ht
[14].hlen
= NULL
; /* Apparently not used */
2071 ht
[15].table
= t15HB
; ht
[15].hlen
= t15l
;
2073 /* Figure average number of 'bytes' per frame */
2074 avg_byte_per_frame
= SAMPL2
* 16000 * cfg
.mpg
.bitrate
/ (2 - cfg
.mpg
.type
);
2075 avg_byte_per_frame
= avg_byte_per_frame
/ cfg
.samplerate
;
2076 cfg
.byte_per_frame
= avg_byte_per_frame
/ 64;
2077 cfg
.frac_per_frame
= avg_byte_per_frame
& 63;
2079 cfg
.sideinfo_len
= 32 + (cfg
.mpg
.type
? (cfg
.channels
== 1 ? 136 : 256)
2080 : (cfg
.channels
== 1 ? 72 : 136));
2085 STATICIRAM
void to_mono_mm(void) ICODE_ATTR
;
2086 STATICIRAM
void to_mono_mm(void)
2088 /* |llllllllllllllll|rrrrrrrrrrrrrrrr| =>
2089 * |mmmmmmmmmmmmmmmm|mmmmmmmmmmmmmmmm|
2091 uint16_t *samp
= &mfbuf
[2*512];
2092 uint16_t *samp_end
= samp
+ 2*samp_per_frame
;
2094 inline void to_mono(uint16_t **samp
)
2097 int16_t r
= *(*samp
+1);
2100 switch(cfg
.rec_mono_mode
)
2112 /* mono = (L+R)/2 */
2118 *(*samp
)++ = (uint16_t)m
;
2119 *(*samp
)++ = (uint16_t)m
;
2133 while (samp
< samp_end
);
2136 #ifdef ROCKBOX_LITTLE_ENDIAN
2137 /* Swaps a frame to big endian */
2138 static inline void byte_swap_frame32(uint32_t *dst
, uint32_t *src
,
2141 uint32_t *src_end
= SKIPBYTES(src
, size
);
2145 *dst
++ = swap32(*src
++);
2146 *dst
++ = swap32(*src
++);
2147 *dst
++ = swap32(*src
++);
2148 *dst
++ = swap32(*src
++);
2149 *dst
++ = swap32(*src
++);
2150 *dst
++ = swap32(*src
++);
2151 *dst
++ = swap32(*src
++);
2152 *dst
++ = swap32(*src
++);
2154 while(src
< src_end
);
2155 } /* byte_swap_frame32 */
2156 #endif /* ROCKBOX_LITTLE_ENDIAN */
2158 static void set_scale_facs(int *mdct_freq
)
2160 unsigned int i
, is
, ie
, k
, s
;
2161 int max_freq_val
, avrg_freq_val
;
2163 /* calc average of first 256 frequency values */
2164 for(avrg_freq_val
=i
=0; i
<256; i
++)
2165 avrg_freq_val
+= mdct_freq
[i
];
2166 avrg_freq_val
>>= 8;
2168 /* if max of current band is smaller than average, increase precision */
2169 /* last band keeps untouched (not scaled) */
2170 for(is
=k
=0; is
<scalefac
[21]; k
++)
2174 for(i
=is
, ie
=scalefac
[k
+1]; i
<ie
; i
++)
2175 if(max_freq_val
< mdct_freq
[i
])
2176 max_freq_val
= mdct_freq
[i
];
2179 if((max_freq_val
<<s
) > avrg_freq_val
)
2182 band_scale_f
[k
] = (unsigned char)s
;
2184 for(i
=is
; s
&& i
<ie
; i
++)
2191 STATICIRAM
void encode_frame(char *buffer
, struct enc_chunk_hdr
*chunk
)
2193 STATICIRAM
void encode_frame(char *buffer
, struct enc_chunk_hdr
*chunk
)
2198 /* encode one mp3 frame in this loop */
2199 CodedData
.bitpos
= 0;
2200 memset(CodedData
.bbuf
, 0, sizeof(CodedData
.bbuf
));
2202 if((cfg
.slot_lag
+= cfg
.frac_per_frame
) >= 64)
2203 { /* Padding for this frame */
2205 cfg
.mpg
.padding
= 1;
2208 cfg
.mpg
.padding
= 0;
2210 cfg
.mean_bits
= (8 * cfg
.byte_per_frame
+ 8 * cfg
.mpg
.padding
2211 - cfg
.sideinfo_len
) / cfg
.granules
/ cfg
.channels
2212 - 42; // reserved for scale_facs
2214 /* shift out old samples */
2215 memcpy(mfbuf
, mfbuf
+ 2*cfg
.granules
*576, 4*512);
2217 if (chunk
->flags
& CHUNKF_START_FILE
)
2219 /* prefix silent samples for encoder delay */
2220 memset(mfbuf
+ 2*512, 0, ENC_DELAY_SIZE
);
2221 /* read new samples to iram for further processing */
2222 memcpy(mfbuf
+ 2*512 + ENC_DELAY_SIZE
/2,
2223 buffer
, pcm_chunk_size
- ENC_DELAY_SIZE
);
2224 chunk
->num_pcm
= samp_per_frame
- ENC_DELAY_SAMP
;
2228 /* read new samples to iram for further processing */
2229 memcpy(mfbuf
+ 2*512, buffer
, pcm_chunk_size
);
2230 chunk
->num_pcm
= samp_per_frame
;
2233 if (cfg
.channels
== 1)
2237 gr_cnt
= cfg
.granules
* cfg
.channels
;
2238 CodedData
.bitpos
= cfg
.sideinfo_len
; /* leave space for mp3 header */
2240 for(gr
=0; gr
<cfg
.granules
; gr
++)
2242 short *wk
= mfbuf
+ 2*286 + gr
*1152;
2245 /* 16bit packed wav data can be windowed efficiently on coldfire */
2246 window_subband1(wk
, sb_data
[0][1-gr
][0], sb_data
[1][1-gr
][0]);
2248 for(ch
=0; ch
<cfg
.channels
; ch
++)
2252 wk
= mfbuf
+ 2*286 + gr
*1152 + ch
;
2254 /* 36864=4*18*16*32 */
2255 for(k
=0; k
<18; k
++, wk
+=64)
2257 window_subband2(wk
, sb_data
[ch
][1-gr
][k
]);
2258 /* Compensate for inversion in the analysis filter */
2262 for(band
=1; band
<32; band
+=2)
2263 sb_data
[ch
][1-gr
][k
][band
] *= -1;
2267 /* Perform imdct of 18 previous + 18 current subband samples */
2268 /* for integer precision do this loop again (if neccessary) */
2269 shift
= 14 - (cfg
.cod_info
[gr
][ch
].additStep
>> 2);
2270 for(k
=1,ii
=0; ii
<3 && k
; ii
++)
2272 int *mdct
= mdct_freq
;
2275 cfg
.cod_info
[gr
][ch
].additStep
= 4 * (14 - shift
);
2277 for(band
=0; band
<cfg
.mpg
.num_bands
; band
++, mdct
+=18)
2279 int *band0
= sb_data
[ch
][ gr
][0] + order
[band
];
2280 int *band1
= sb_data
[ch
][1-gr
][0] + order
[band
];
2286 int a
= shft_n(band1
[(k
+9)*32], shift
);
2287 int b
= shft_n(band1
[(8-k
)*32], shift
);
2288 int c
= shft_n(band0
[(k
+9)*32], shift
);
2289 int d
= shft_n(band0
[(8-k
)*32], shift
);
2291 work
[k
+ 9] = shft16(a
* win
[k
+ 9][0] +
2296 work
[k
+18] = shft16(c
* win
[k
+18][0] +
2303 mdct_long(mdct
, work
);
2305 /* Perform aliasing reduction butterfly */
2311 bu
= shft15(mdct
[k
]) * ca
[k
] +
2312 shft15(mdct
[-1-k
]) * cs
[k
];
2313 bd
= shft15(mdct
[k
]) * cs
[k
] -
2314 shft15(mdct
[-1-k
]) * ca
[k
];
2322 for(k
=0; k
<576; k
++)
2324 if(mdct_freq
[k
] < 0)
2326 mdct_sign
[k
] = 1; /* negative */
2327 mdct_freq
[k
] = shft13(-mdct_freq
[k
]);
2331 mdct_sign
[k
] = 0; /* positive */
2332 mdct_freq
[k
] = shft13(mdct_freq
[k
]);
2335 if(max
< (uint32_t)mdct_freq
[k
])
2336 max
= (uint32_t)mdct_freq
[k
];
2338 cfg
.cod_info
[gr
][ch
].max_val
= max
;
2340 /* calc new shift for higher integer precision */
2341 for(k
=0; max
<(uint32_t)(0x7800>>k
); k
++) shift
--;
2342 for( ; (max
>>k
)>=(uint32_t)0x10000; k
++) shift
++;
2343 if(shift
< 0) shift
= 0;
2346 cfg
.cod_info
[gr
][ch
].quantStep
+=
2347 cfg
.cod_info
[gr
][ch
].additStep
;
2349 set_scale_facs(mdct_freq
);
2351 /* bit and noise allocation */
2352 iteration_loop(mdct_freq
, &cfg
.cod_info
[gr
][ch
],
2354 /* write the frame to the bitstream */
2355 Huffmancodebits(enc_data
, mdct_sign
,
2356 &cfg
.cod_info
[gr
][ch
]);
2358 cfg
.cod_info
[gr
][ch
].quantStep
-=
2359 cfg
.cod_info
[gr
][ch
].additStep
;
2361 if(cfg
.granules
== 1)
2363 memcpy(sb_data
[ch
][0], sb_data
[ch
][1],
2364 sizeof(sb_data
[ch
][0]));
2369 chunk
->enc_size
= cfg
.byte_per_frame
+ cfg
.mpg
.padding
;
2371 /* finish this chunk by adding sideinfo header data */
2372 CodedData
.bitpos
= 0;
2373 encodeSideInfo( cfg
.cod_info
);
2375 #ifdef ROCKBOX_BIG_ENDIAN
2376 /* copy chunk to enc_buffer */
2377 memcpy(chunk
->enc_data
, CodedData
.bbuf
, chunk
->enc_size
);
2379 /* swap frame to big endian */
2380 byte_swap_frame32((uint32_t *)chunk
->enc_data
, CodedData
.bbuf
, chunk
->enc_size
);
2382 } /* encode_frame */
2384 /* called very often - inline */
2385 static inline bool is_file_data_ok(struct enc_file_event_data
*filed
)
2387 return filed
->rec_file
>= 0 && (long)filed
->chunk
->flags
>= 0;
2390 static unsigned char mp3_data
[16384] __attribute__((aligned(4)));
2391 static unsigned int mp3_data_len
; /* current data size in buffer */
2393 /* called very often - inline */
2394 static inline bool on_write_chunk(struct enc_file_event_data
*data
)
2396 if (!is_file_data_ok(data
))
2399 if (data
->chunk
->enc_data
== NULL
)
2401 #ifdef ROCKBOX_HAS_LOGF
2402 ci
->logf("mp3 enc: NULL data");
2407 /* if current chunk doesn't fit => write collected data */
2408 if (mp3_data_len
+ data
->chunk
->enc_size
> sizeof(mp3_data
))
2410 if (ci
->write(data
->rec_file
, mp3_data
,
2411 mp3_data_len
) != (ssize_t
)mp3_data_len
)
2417 memcpy(mp3_data
+mp3_data_len
, data
->chunk
->enc_data
,
2418 data
->chunk
->enc_size
);
2420 mp3_data_len
+= data
->chunk
->enc_size
;
2422 data
->num_pcm_samples
+= data
->chunk
->num_pcm
;
2424 } /* on_write_chunk */
2426 static bool on_start_file(struct enc_file_event_data
*data
)
2428 if ((data
->chunk
->flags
& CHUNKF_ERROR
) || *data
->filename
== '\0')
2431 data
->rec_file
= ci
->open(data
->filename
, O_RDWR
|O_CREAT
|O_TRUNC
, 0666);
2433 if (data
->rec_file
< 0)
2436 /* reset sample count */
2437 data
->num_pcm_samples
= 0;
2439 /* reset buffer write position */
2443 } /* on_start_file */
2445 static bool on_end_file(struct enc_file_event_data
*data
)
2447 if (data
->rec_file
< 0)
2448 return false; /* file already closed, nothing more we can do */
2450 /* write the remaining mp3_data */
2451 if (ci
->write(data
->rec_file
, mp3_data
, mp3_data_len
)
2452 != (ssize_t
)mp3_data_len
)
2455 /* reset buffer write position */
2458 /* always _try_ to write the file header, even on error */
2459 if (ci
->close(data
->rec_file
) != 0)
2462 data
->rec_file
= -1;
2467 static void on_rec_new_stream(struct enc_buffer_event_data
*data
)
2469 int num_frames
= cfg
.mpg
.type
== 1 ?
2470 ENC_PADDING_FRAMES1
: ENC_PADDING_FRAMES2
;
2472 if (data
->flags
& CHUNKF_END_FILE
)
2474 /* add silent frames to end - encoder will also be flushed for start
2475 of next file if any */
2476 memset(res_buffer
, 0, pcm_chunk_size
);
2478 /* the initial chunk given for the end is at enc_wr_index */
2479 while (num_frames
-- > 0)
2481 data
->chunk
->enc_data
= ENC_CHUNK_SKIP_HDR(data
->chunk
->enc_data
,
2484 encode_frame(res_buffer
, data
->chunk
);
2485 data
->chunk
->num_pcm
= samp_per_frame
;
2487 ci
->enc_finish_chunk();
2488 data
->chunk
= ci
->enc_get_chunk();
2491 else if (data
->flags
& CHUNKF_PRERECORD
)
2493 /* nothing to add and we cannot change prerecorded data */
2495 else if (data
->flags
& CHUNKF_START_FILE
)
2497 /* starting fresh ... be sure to flush encoder first */
2498 struct enc_chunk_hdr
*chunk
= ENC_CHUNK_HDR(res_buffer
);
2501 chunk
->enc_data
= ENC_CHUNK_SKIP_HDR(chunk
->enc_data
, chunk
);
2503 while (num_frames
-- > 0)
2505 memset(chunk
->enc_data
, 0, pcm_chunk_size
);
2506 encode_frame(chunk
->enc_data
, chunk
);
2509 } /* on_rec_new_stream */
2511 static void enc_events_callback(enum enc_events event
, void *data
)
2515 case ENC_WRITE_CHUNK
:
2516 if (on_write_chunk((struct enc_file_event_data
*)data
))
2521 case ENC_START_FILE
:
2522 if (on_start_file((struct enc_file_event_data
*)data
))
2528 if (on_end_file((struct enc_file_event_data
*)data
))
2533 case ENC_REC_NEW_STREAM
:
2534 on_rec_new_stream((struct enc_buffer_event_data
*)data
);
2541 /* Something failed above. Signal error back to core. */
2542 ((struct enc_file_event_data
*)data
)->chunk
->flags
|= CHUNKF_ERROR
;
2543 } /* enc_events_callback */
2545 static bool enc_init(void)
2547 struct enc_inputs inputs
;
2548 struct enc_parameters params
;
2550 if (ci
->enc_get_inputs
== NULL
||
2551 ci
->enc_set_parameters
== NULL
||
2552 ci
->enc_get_chunk
== NULL
||
2553 ci
->enc_finish_chunk
== NULL
||
2554 ci
->enc_get_pcm_data
== NULL
||
2555 ci
->enc_unget_pcm_data
== NULL
)
2558 ci
->enc_get_inputs(&inputs
);
2560 if (inputs
.config
->afmt
!= AFMT_MPA_L3
)
2563 init_mp3_encoder_engine(inputs
.sample_rate
, inputs
.num_channels
,
2564 inputs
.rec_mono_mode
, inputs
.config
);
2568 /* configure the buffer system */
2569 params
.afmt
= AFMT_MPA_L3
;
2570 params
.chunk_size
= cfg
.byte_per_frame
+ 1;
2571 params
.enc_sample_rate
= cfg
.samplerate
;
2572 /* need enough reserved bytes to hold one frame of pcm samples + hdr
2573 for padding and flushing */
2574 params
.reserve_bytes
= ENC_CHUNK_HDR_SIZE
+ pcm_chunk_size
;
2575 params
.events_callback
= enc_events_callback
;
2576 ci
->enc_set_parameters(¶ms
);
2578 res_buffer
= params
.reserve_buffer
;
2581 asm volatile ("move.l #0, %macsr"); /* integer mode */
2587 /* this is the codec entry point */
2588 enum codec_status
codec_main(enum codec_entry_call_reason reason
)
2590 if (reason
== CODEC_LOAD
) {
2594 else if (reason
== CODEC_UNLOAD
) {
2595 /* reset parameters to initial state */
2596 ci
->enc_set_parameters(NULL
);
2602 /* this is called for each file to process */
2603 enum codec_status
codec_run(void)
2605 /* main encoding loop */
2606 while(ci
->get_command(NULL
) != CODEC_ACTION_HALT
)
2608 char *buffer
= buffer
= ci
->enc_get_pcm_data(pcm_chunk_size
);
2609 struct enc_chunk_hdr
*chunk
;
2614 chunk
= ci
->enc_get_chunk();
2615 chunk
->enc_data
= ENC_CHUNK_SKIP_HDR(chunk
->enc_data
, chunk
);
2617 encode_frame(buffer
, chunk
);
2619 if (chunk
->num_pcm
< samp_per_frame
)
2621 ci
->enc_unget_pcm_data(pcm_chunk_size
- chunk
->num_pcm
*4);
2622 chunk
->num_pcm
= samp_per_frame
;
2625 ci
->enc_finish_chunk();