FS#11968 by Peter Lecky - Slovak language update
[maemo-rb.git] / apps / codecs / mp3_enc.c
blobe7893fd14af5c4861c6d094efc9f56d8a6a0c06a
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
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.
35 #include <inttypes.h>
36 #include "codeclib.h"
38 CODEC_ENC_HEADER
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)
48 #define SAMPL2 576
49 #define SBLIMIT 32
50 #define HTN 16
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; }
56 typedef struct {
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 */
59 int bitrate;
60 int padding;
61 int num_bands;
62 long bitr_id;
63 int smpl_id;
64 } mpeg_t;
66 /* Side information */
67 typedef struct {
68 uint32_t part2_3_length;
69 int count1; /* number of 0-1-quadruples */
70 uint32_t global_gain;
71 uint32_t table_select[4];
72 uint32_t region_0_1;
73 uint32_t address1;
74 uint32_t address2;
75 uint32_t address3;
76 long quantStep;
77 long additStep;
78 uint32_t max_val;
79 } side_info_t;
81 typedef struct {
82 side_info_t cod_info[2][2];
83 mpeg_t mpg;
84 long frac_per_frame;
85 long byte_per_frame;
86 long slot_lag;
87 int sideinfo_len;
88 int mean_bits;
89 int ResvSize;
90 int channels;
91 int rec_mono_mode;
92 int granules;
93 long samplerate;
94 } config_t;
96 typedef struct {
97 int bitpos; /* current bitpos for writing */
98 uint32_t bbuf[263];
99 } BF_Data;
101 struct huffcodetab {
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] */
107 struct huffcodebig {
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,
258 1,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,
326 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,
338 0x00d0300c};
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 */
454 { 2, t1HB, t1l},
455 { 3, t2HB, t2l},
456 { 3, t3HB, t3l},
457 { 0, NULL, NULL}, /* Apparently not used */
458 { 4, t5HB, t5l},
459 { 4, t6HB, t6l},
460 { 6, t7HB, t7l},
461 { 6, t8HB, t8l},
462 { 6, t9HB, t9l},
463 { 8, t10HB, t10l},
464 { 8, t11HB, t11l},
465 { 8, t12HB, t12l},
466 {16, t13HB, t13l},
467 { 0, NULL, NULL}, /* Apparently not used */
468 {16, t15HB, t15l} };
470 static const struct huffcodebig ht_big[HTN] =
471 { { 16, 1, 1 },
472 { 16, 2, 3 },
473 { 16, 3, 7 },
474 { 16, 4, 15 },
475 { 16, 6, 63 },
476 { 16, 8, 255 },
477 { 16, 10, 1023 },
478 { 16, 13, 8191 },
479 { 16, 4, 15 },
480 { 16, 5, 31 },
481 { 16, 6, 63 },
482 { 16, 7, 127 },
483 { 16, 8, 255 },
484 { 16, 9, 511 },
485 { 16, 11, 2047 },
486 { 16, 13, 8191 } };
488 static const struct
490 uint32_t region0_cnt;
491 uint32_t region1_cnt;
492 } subdv_table[23] =
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,
849 int *bits);
852 static void encodeSideInfo( side_info_t si[2][2] )
854 int gr, ch, header;
855 uint32_t cc=0, sz=0;
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
871 * L (2) = original
872 * M (1-0) = emphasis
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)
889 { /* MPEG1 */
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 );
910 else
911 { /* MPEG2 */
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 */
932 putbits(cc, sz);
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);
943 int stuffBits = 0;
944 int bits = 0;
945 int i, v;
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)
951 for(v=0; i<42; i+=2)
952 v |= band_scale_f[i>>1] << (40-i);
953 putbits(v, 10); // store scale_facs (part2)
955 if(region1 > 0)
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]);
964 if(count1 > bigvals)
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;
972 if( remainBits )
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)
982 uint32_t cc=0, sz=0;
983 uint32_t i, d, p;
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)
992 v = ix[i+0];
993 w = ix[i+1];
994 x = ix[i+2];
995 y = ix[i+3];
996 p = (v << 3) + (w << 2) + (x << 1) + y;
998 switch(p)
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];
1020 putlong( d, l );
1021 sumbit += l;
1024 /* flush remaining bits */
1025 putbits(cc, sz);
1027 return sumbit;
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]
1039 if(table == 0)
1040 return 0;
1042 if( table > 15 )
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)
1050 x = ix[ i ];
1051 y = ix[i+1];
1053 if(x > 14) { xl = x - 15; x = 15; }
1054 if(y > 14) { yl = y - 15; y = 15; }
1056 idx = x * 16 + y;
1057 code = hffcode[idx];
1058 bit = hlen [idx];
1060 if(x)
1062 if(x > 14)
1064 code = (code << linbits) | xl;
1065 bit += linbits;
1068 code = (code << 1) | sign_x;
1069 bit += 1;
1072 if(y)
1074 if(y > 14)
1076 if(bit + linbits + 1 > 32)
1078 putlong( code, bit );
1079 sumbit += bit;
1080 code = bit = 0;
1083 code = (code << linbits) | yl;
1084 bit += linbits;
1087 code = (code << 1) | sign_y;
1088 bit += 1;
1091 putlong( code, bit );
1092 sumbit += bit;
1095 else
1096 { /* No ESC-words */
1097 const struct huffcodetab *h = &ht[table];
1099 for(i=begin; i<end; i+=2)
1101 x = ix[i];
1102 y = ix[i+1];
1104 idx = x * h->len + y;
1105 code = h->table[idx];
1106 bit = h->hlen [idx];
1108 if(x)
1110 code = (code << 1) | sign_x;
1111 bit += 1;
1114 if(y)
1116 code = (code << 1) | sign_y;
1117 bit += 1;
1120 putlong( code, bit );
1121 sumbit += bit;
1125 /* flush remaining bits */
1126 putbits(cc, sz);
1128 return sumbit;
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);
1141 else
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 )
1159 uint32_t i;
1160 int max, table0, table1;
1162 for(i=begin,max=0; i<end; i++)
1163 if(ix[i] > max)
1164 max = ix[i];
1166 if(max < 16)
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 */
1171 switch(max)
1173 case 0: return 0;
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);
1177 case 4:
1178 case 5: return 7 + find_best_3(ix, begin, end, tab789, 6, bits);
1179 case 6:
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;
1184 else
1186 /* tables with linbits */
1187 max -= 15;
1189 for(table0=0; table0<8; table0++)
1190 if(ht_big[table0].linmax >= max)
1191 break;
1193 for(table1=8; table1<16; table1++)
1194 if(ht_big[table1].linmax >= max)
1195 break;
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);
1212 return 1;
1214 else
1216 *bits = sum >> 16;
1217 return 0;
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;
1225 int sum1 = 0;
1226 int sum2 = 0;
1227 int sum3 = 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;
1242 i = 0;
1243 if(sum1 > sum2) { sum1 = sum2; i = 1; }
1244 if(sum1 > sum3) { sum1 = sum3; i = 2; }
1246 *bits = sum1;
1248 return i;
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]];
1261 *bits = sum;
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)
1274 x = ix[i];
1275 y = ix[i+1];
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;
1286 if(sum0 <= sum1)
1288 *bits = sum0;
1289 return table0;
1291 else
1293 *bits = sum1;
1294 return table1;
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 )
1304 int p, i, sum = 0;
1306 for(i=SAMPL2; i-=2; )
1307 if(*(uint32_t*)&ix[i-2]) /* !!!! short *ix; !!!!! */
1308 break;
1310 si->count1 = 0;
1312 for( ; i>3; i-=4)
1314 int v = ix[i-1];
1315 int w = ix[i-2];
1316 int x = ix[i-3];
1317 int y = ix[i-4];
1319 if((v | w | x | y) <= 1)
1321 p = (y<<3) + (x<<2) + (w<<1) + (v);
1323 sum += tab01[p];
1325 si->count1++;
1327 else break;
1330 si->address3 = i;
1332 if((sum >> 16) < (sum & 0xffff))
1334 si->table_select[3] = 0;
1335 return sum >> 16;
1337 else
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))
1356 return 0;
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];
1363 else
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];
1374 return 1;
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;
1384 if( !si->address3 )
1385 { /* no bigvalue region */
1386 si->region_0_1 = 0;
1387 si->address1 = 0;
1388 si->address2 = 0;
1390 else
1392 /* Calculate scale factor band index */
1393 for(scfb=0; scalefac[scfb] < si->address3; )
1394 scfb++;
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);
1426 return b1+b2+b3;
1429 static int quantize_and_count_bits(int *xr, short *ix, side_info_t *si)
1431 int bits = 10000;
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 */
1440 return bits;
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)
1448 int bits;
1450 while((bits=quantize_and_count_bits(xr, enc_data, si)) < max_bits-64)
1452 if(si->quantStep == 0)
1453 break;
1455 if(si->quantStep <= 2)
1456 si->quantStep = 0;
1457 else
1458 si->quantStep -= 2;
1461 while(bits > max_bits)
1463 si->quantStep++;
1464 bits = quantize_and_count_bits(xr, enc_data, si);
1467 return bits;
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 */
1486 if(gr_cnt == 1)
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;
1496 while(remain--)
1497 putbits(~0, 32);
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])
1507 int k, i, u, v;
1508 short *wp, *x1, *x2;
1510 #ifdef CPU_COLDFIRE
1511 int s0, s1, t0, t1;
1513 for(k=0; k<18; k++, wk+=64, sb0+=SBLIMIT, sb1+=SBLIMIT)
1515 wp = enwindow;
1516 x1 = wk;
1517 x2 = x1 - 124;
1519 for(i=-15; i<0; i++)
1521 asm volatile(
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];
1609 wp += 27;
1610 x1 -= 2;
1611 x2 += 2;
1614 asm volatile(
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");
1680 u = shft4(s0 - t0);
1681 v = shft4(s0 + t0);
1682 t0 = sb0[14];
1683 s0 = sb0[15] - t0;
1685 sb0[31] = v + t0; /* A0 */
1686 sb0[30] = u + s0; /* A1 */
1687 sb0[15] = u - s0; /* A2 */
1688 sb0[14] = v - t0; /* A3 */
1690 u = shft4(s1 - t1);
1691 v = shft4(s1 + t1);
1692 t1 = sb1[14];
1693 s1 = sb1[15] - t1;
1695 sb1[31] = v + t1; /* A0 */
1696 sb1[30] = u + s1; /* A1 */
1697 sb1[15] = u - s1; /* A2 */
1698 sb1[14] = v - t1; /* A3 */
1700 #else
1701 int ch, s, t, *a;
1703 for(ch=0; ch<cfg.channels; ch++)
1705 a = ch ? sb1 : sb0;
1706 for(k=0; k<18; k++, wk+=64, a+=SBLIMIT)
1708 wp = enwindow;
1709 x1 = wk;
1710 x2 = x1 - 124;
1712 /* x1[-572] .... x1[448] = 1022 */
1713 /* 18*4*16*32 */
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];
1735 wp += 27;
1736 x1 -= 2;
1737 x2 += 2;
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];
1749 u = shft4(s - t);
1750 v = shft4(s + t);
1751 t = a[14];
1752 s = a[15] - t;
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) */
1761 #endif
1764 void window_subband2(short *x1, int a[SBLIMIT]) ICODE_ATTR;
1765 void window_subband2(short *x1, int a[SBLIMIT])
1767 int xr;
1768 short *wp = enwindow;
1769 short *x2 = x1 - 124;
1771 wp += 27 * 15;
1772 x1 -= 2 * 15;
1773 x2 += 2 * 15;
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];
1783 a[ 7] -= a[ 6];
1784 a[22] -= a[ 7];
1785 a[23] -= a[22];
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)
1885 int ct,st;
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];
1901 out[5] = ct + st;
1902 out[6] = ct - st;
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];
1909 out[1] = ct + st;
1910 out[2] = ct - st;
1912 ct = tc1 * cx[1] - tc2 - tc3 * cx[2] + tc4 * cx[0];
1913 st = -ts5 * cx[5] + ts6 - ts7 * cx[3] + ts8 * cx[4];
1914 out[ 9] = ct + st;
1915 out[10] = ct - st;
1917 ct = tc1 * cx[2] - tc2 + tc3 * cx[0] - tc4 * cx[1];
1918 st = ts5 * cx[3] - ts6 + ts7 * cx[4] - ts8 * cx[5];
1919 out[13] = ct + st;
1920 out[14] = ct - st;
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];
1933 out[11] = ct + st;
1934 out[12] = ct - st;
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];
1941 out[3] = ct + st;
1942 out[4] = ct - st;
1944 ct =-tc5 * cx[5] + tc6 - tc7 * cx[3] - tc8 * cx[4];
1945 st = ts1 * cx[1] + ts2 - ts3 * cx[2] - ts4 * cx[0];
1946 out[7] = ct + st;
1947 out[8] = ct - st;
1949 ct =-tc5 * cx[4] + tc6 - tc7 * cx[5] - tc8 * cx[3];
1950 st = ts1 * cx[0] - ts2 + ts3 * cx[1] - ts4 * cx[2];
1951 out[15] = ct + st;
1952 out[16] = ct - st;
1955 static int find_bitrate_index(int type, int bitrate, bool stereo)
1957 if (type == 1 && !stereo && bitrate > 160)
1958 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);
1968 *mp3_type = mpeg;
1969 return i;
1972 static bool init_mp3_encoder_engine(int sample_rate,
1973 int num_channels,
1974 int rec_mono_mode,
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,
1987 stereo);
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)
1993 cfg.granules = 2;
1994 pcm_chunk_size = PCM_CHUNK_SIZE1;
1995 samp_per_frame = SAMP_PER_FRAME1;
1997 else
1999 cfg.granules = 1;
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;
2078 cfg.slot_lag = 0;
2079 cfg.sideinfo_len = 32 + (cfg.mpg.type ? (cfg.channels == 1 ? 136 : 256)
2080 : (cfg.channels == 1 ? 72 : 136));
2082 return true;
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)
2096 int16_t l = **samp;
2097 int16_t r = *(*samp+1);
2098 int32_t m;
2100 switch(cfg.rec_mono_mode)
2102 case 1:
2103 /* mono = L */
2104 m = l;
2105 break;
2106 case 2:
2107 /* mono = R */
2108 m = r;
2109 break;
2110 case 0:
2111 default:
2112 /* mono = (L+R)/2 */
2113 m = l + r + err;
2114 err = m & 1;
2115 m >>= 1;
2116 break;
2118 *(*samp)++ = (uint16_t)m;
2119 *(*samp)++ = (uint16_t)m;
2120 } /* to_mono */
2124 to_mono(&samp);
2125 to_mono(&samp);
2126 to_mono(&samp);
2127 to_mono(&samp);
2128 to_mono(&samp);
2129 to_mono(&samp);
2130 to_mono(&samp);
2131 to_mono(&samp);
2133 while (samp < samp_end);
2134 } /* to_mono_mm */
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,
2139 size_t size)
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++)
2172 max_freq_val = 0;
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];
2178 for(s=0; s<3; s++)
2179 if((max_freq_val<<s) > avrg_freq_val)
2180 break;
2182 band_scale_f[k] = (unsigned char)s;
2184 for(i=is; s && i<ie; i++)
2185 mdct_freq[i] <<= s;
2187 is = ie;
2191 STATICIRAM void encode_frame(char *buffer, struct enc_chunk_hdr *chunk)
2192 ICODE_ATTR;
2193 STATICIRAM void encode_frame(char *buffer, struct enc_chunk_hdr *chunk)
2195 int gr, gr_cnt;
2196 uint32_t max;
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 */
2204 cfg.slot_lag -= 64;
2205 cfg.mpg.padding = 1;
2207 else
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;
2226 else
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)
2234 to_mono_mm();
2236 cfg.ResvSize = 0;
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;
2243 int ch;
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++)
2250 int ii, k, shift;
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 */
2259 if(k & 1)
2261 int band;
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;
2273 int band;
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];
2281 int work[18];
2283 /* 9216=4*32*9*8 */
2284 for(k=-9; k<0; k++)
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] +
2292 b * win[k+ 9][1] +
2293 c * win[k+ 9][2] +
2294 d * win[k+ 9][3]);
2296 work[k+18] = shft16(c * win[k+18][0] +
2297 d * win[k+18][1] +
2298 a * win[k+18][2] +
2299 b * win[k+18][3]);
2302 /* 7200=4*18*100 */
2303 mdct_long(mdct, work);
2305 /* Perform aliasing reduction butterfly */
2306 if(band != 0)
2308 for(k=7; k>=0; --k)
2310 int bu, bd;
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];
2315 mdct[-1-k] = bu;
2316 mdct[ k ] = bd;
2321 max = 0;
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]);
2329 else
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],
2353 gr_cnt--);
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);
2378 #else
2379 /* swap frame to big endian */
2380 byte_swap_frame32((uint32_t *)chunk->enc_data, CodedData.bbuf, chunk->enc_size);
2381 #endif
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;
2388 } /* is_event_ok */
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))
2397 return false;
2399 if (data->chunk->enc_data == NULL)
2401 #ifdef ROCKBOX_HAS_LOGF
2402 ci->logf("mp3 enc: NULL data");
2403 #endif
2404 return true;
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)
2412 return false;
2414 mp3_data_len = 0;
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;
2423 return true;
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')
2429 return false;
2431 data->rec_file = ci->open(data->filename, O_RDWR|O_CREAT|O_TRUNC, 0666);
2433 if (data->rec_file < 0)
2434 return false;
2436 /* reset sample count */
2437 data->num_pcm_samples = 0;
2439 /* reset buffer write position */
2440 mp3_data_len = 0;
2442 return true;
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)
2453 return false;
2455 /* reset buffer write position */
2456 mp3_data_len = 0;
2458 /* always _try_ to write the file header, even on error */
2459 if (ci->close(data->rec_file) != 0)
2460 return false;
2462 data->rec_file = -1;
2464 return true;
2465 } /* on_end_file */
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,
2482 data->chunk);
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);
2500 chunk->flags = 0;
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)
2513 switch (event)
2515 case ENC_WRITE_CHUNK:
2516 if (on_write_chunk((struct enc_file_event_data *)data))
2517 return;
2519 break;
2521 case ENC_START_FILE:
2522 if (on_start_file((struct enc_file_event_data *)data))
2523 return;
2525 break;
2527 case ENC_END_FILE:
2528 if (on_end_file((struct enc_file_event_data *)data))
2529 return;
2531 break;
2533 case ENC_REC_NEW_STREAM:
2534 on_rec_new_stream((struct enc_buffer_event_data *)data);
2535 return;
2537 default:
2538 return;
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 )
2556 return false;
2558 ci->enc_get_inputs(&inputs);
2560 if (inputs.config->afmt != AFMT_MPA_L3)
2561 return false;
2563 init_mp3_encoder_engine(inputs.sample_rate, inputs.num_channels,
2564 inputs.rec_mono_mode, inputs.config);
2566 err = 0;
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(&params);
2578 res_buffer = params.reserve_buffer;
2580 #ifdef CPU_COLDFIRE
2581 asm volatile ("move.l #0, %macsr"); /* integer mode */
2582 #endif
2584 return true;
2585 } /* enc_init */
2587 enum codec_status codec_main(void)
2589 /* Generic codec initialisation */
2590 if (!enc_init())
2591 return CODEC_ERROR;
2593 /* main encoding loop */
2594 while (!ci->stop_codec)
2596 char *buffer;
2598 while ((buffer = ci->enc_get_pcm_data(pcm_chunk_size)) != NULL)
2600 struct enc_chunk_hdr *chunk;
2602 if (ci->stop_codec)
2603 break;
2605 chunk = ci->enc_get_chunk();
2606 chunk->enc_data = ENC_CHUNK_SKIP_HDR(chunk->enc_data, chunk);
2608 encode_frame(buffer, chunk);
2610 if (chunk->num_pcm < samp_per_frame)
2612 ci->enc_unget_pcm_data(pcm_chunk_size - chunk->num_pcm*4);
2613 chunk->num_pcm = samp_per_frame;
2616 ci->enc_finish_chunk();
2618 ci->yield();
2621 ci->yield();
2624 /* reset parameters to initial state */
2625 ci->enc_set_parameters(NULL);
2627 return CODEC_OK;
2628 } /* codec_start */