add_savefile: remove callback parameter
[vlc/asuraparaju-public.git] / modules / codec / shine / shine.c
blobfcc5b2645d194b0c10de6adf90ed7d9bd0ec4ae4
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 #define IBSS_ATTR
37 #ifdef WORDS_BIGENDIAN
38 #define ROCKBOX_BIG_ENDIAN
39 #else
40 #define ROCKBOX_LITTLE_ENDIAN
41 #endif
43 #include <stdbool.h>
44 #include <stdlib.h>
45 #include <inttypes.h>
46 #include <string.h>
47 #include <limits.h>
48 #include <assert.h>
50 #include "../wmafixed/bswap.h"
51 #include "enc_base.h"
53 #define ENC_PADDING_FRAMES1 2
54 #define ENC_PADDING_FRAMES2 4
55 #define ENC_DELAY_SAMP 576
56 #define ENC_DELAY_SIZE (ENC_DELAY_SAMP*4)
57 #define SAMP_PER_FRAME1 1152
58 #define SAMP_PER_FRAME2 576
59 #define PCM_CHUNK_SIZE1 (SAMP_PER_FRAME1*4)
60 #define PCM_CHUNK_SIZE2 (SAMP_PER_FRAME2*4)
61 #define SAMPL2 576
62 #define SBLIMIT 32
63 #define HTN 16
65 #define putlong(c, s) if(s+sz <= 32) { cc = (cc << s) | c; sz+= s; } \
66 else { putbits(cc, sz); cc = c; sz = s; }
68 typedef struct {
69 int type; /* 0=(MPEG2 - 22.05,24,16kHz) 1=(MPEG1 - 44.1,48,32kHz) */
70 int mode; /* 0=stereo, 1=jstereo, 2=dual, 3=mono */
71 int bitrate;
72 int padding;
73 int num_bands;
74 long bitr_id;
75 int smpl_id;
76 } mpeg_t;
78 /* Side information */
79 typedef struct {
80 uint32_t part2_3_length;
81 int count1; /* number of 0-1-quadruples */
82 uint32_t global_gain;
83 uint32_t table_select[4];
84 uint32_t region_0_1;
85 uint32_t address1;
86 uint32_t address2;
87 uint32_t address3;
88 long quantStep;
89 long additStep;
90 uint32_t max_val;
91 } side_info_t;
93 typedef struct {
94 side_info_t cod_info[2][2];
95 mpeg_t mpg;
96 long frac_per_frame;
97 long byte_per_frame;
98 long slot_lag;
99 int sideinfo_len;
100 int mean_bits;
101 int ResvSize;
102 int channels;
103 int granules;
104 long samplerate;
105 } config_t;
107 typedef struct {
108 int bitpos; /* current bitpos for writing */
109 uint32_t bbuf[263];
110 } BF_Data;
112 struct huffcodetab {
113 int len; /* max. index */
114 const uint8_t *table; /* pointer to array[len][len] */
115 const uint8_t *hlen; /* pointer to array[len][len] */
118 struct huffcodebig {
119 int len; /* max. index */
120 int linbits; /* number of linbits */
121 int linmax; /* max number stored in linbits */
124 #define shft4(x) ((x + 8) >> 4)
125 #define shft9(x) ((x + 256) >> 9)
126 #define shft13(x) ((x + 4096) >> 13)
127 #define shft15(x) ((x + 16384) >> 15)
128 #define shft16(x) ((x + 32768) >> 16)
129 #define shft_n(x,n) ((x) >> n)
130 #define SQRT 724 /* sqrt(2) * 512 */
132 static short mfbuf [2*(1152+512)] IBSS_ATTR; /* 3328 Bytes */
133 static int sb_data [2][2][18][SBLIMIT] IBSS_ATTR; /* 13824 Bytes */
134 static int mdct_freq [SAMPL2] IBSS_ATTR; /* 2304 Bytes */
135 static char mdct_sign [SAMPL2] IBSS_ATTR; /* 576 Bytes */
136 static short enc_data [SAMPL2] IBSS_ATTR; /* 1152 Bytes */
137 static uint32_t scalefac [23] IBSS_ATTR; /* 92 Bytes */
138 static BF_Data CodedData IBSS_ATTR; /* 1056 Bytes */
139 static int ca [8] IBSS_ATTR; /* 32 Bytes */
140 static int cs [8] IBSS_ATTR; /* 32 Bytes */
141 static int cx [9] IBSS_ATTR; /* 36 Bytes */
142 static int win [18][4] IBSS_ATTR; /* 288 Bytes */
143 static short enwindow [15*27+24] IBSS_ATTR; /* 862 Bytes */
144 static short int2idx [4096] IBSS_ATTR; /* 8192 Bytes */
145 static uint8_t ht_count [2][2][16] IBSS_ATTR; /* 64 Bytes */
146 static uint32_t tab01 [ 16] IBSS_ATTR; /* 64 Bytes */
147 static uint32_t tab23 [ 9] IBSS_ATTR; /* 36 Bytes */
148 static uint32_t tab56 [ 16] IBSS_ATTR; /* 64 Bytes */
149 static uint32_t tab1315 [256] IBSS_ATTR; /* 1024 Bytes */
150 static uint32_t tab1624 [256] IBSS_ATTR; /* 1024 Bytes */
151 static uint32_t tab789 [ 36] IBSS_ATTR; /* 144 Bytes */
152 static uint32_t tabABC [ 64] IBSS_ATTR; /* 256 Bytes */
153 static uint8_t t1HB [ 4] IBSS_ATTR;
154 static uint8_t t2HB [ 9] IBSS_ATTR;
155 static uint8_t t3HB [ 9] IBSS_ATTR;
156 static uint8_t t5HB [ 16] IBSS_ATTR;
157 static uint8_t t6HB [ 16] IBSS_ATTR;
158 static uint8_t t7HB [ 36] IBSS_ATTR;
159 static uint8_t t8HB [ 36] IBSS_ATTR;
160 static uint8_t t9HB [ 36] IBSS_ATTR;
161 static uint8_t t10HB [ 64] IBSS_ATTR;
162 static uint8_t t11HB [ 64] IBSS_ATTR;
163 static uint8_t t12HB [ 64] IBSS_ATTR;
164 static uint8_t t13HB [256] IBSS_ATTR;
165 static uint8_t t15HB [256] IBSS_ATTR;
166 static uint16_t t16HB [256] IBSS_ATTR;
167 static uint16_t t24HB [256] IBSS_ATTR;
168 static uint8_t t1l [ 8] IBSS_ATTR;
169 static uint8_t t2l [ 9] IBSS_ATTR;
170 static uint8_t t3l [ 9] IBSS_ATTR;
171 static uint8_t t5l [ 16] IBSS_ATTR;
172 static uint8_t t6l [ 16] IBSS_ATTR;
173 static uint8_t t7l [ 36] IBSS_ATTR;
174 static uint8_t t8l [ 36] IBSS_ATTR;
175 static uint8_t t9l [ 36] IBSS_ATTR;
176 static uint8_t t10l [ 64] IBSS_ATTR;
177 static uint8_t t11l [ 64] IBSS_ATTR;
178 static uint8_t t12l [ 64] IBSS_ATTR;
179 static uint8_t t13l [256] IBSS_ATTR;
180 static uint8_t t15l [256] IBSS_ATTR;
181 static uint8_t t16l [256] IBSS_ATTR;
182 static uint8_t t24l [256] IBSS_ATTR;
183 static struct huffcodetab ht [HTN] IBSS_ATTR;
185 static unsigned pcm_chunk_size IBSS_ATTR;
186 static unsigned samp_per_frame IBSS_ATTR;
188 static config_t cfg IBSS_ATTR;
189 //static char *res_buffer;
190 static int32_t err IBSS_ATTR;
191 static uint8_t band_scale_f[22];
193 static const uint8_t ht_count_const[2][2][16] =
194 { { { 1, 5, 4, 5, 6, 5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1 }, /* table0 */
195 { 1, 5, 5, 7, 5, 8, 7, 9, 5, 7, 7, 9, 7, 9, 9,10 } }, /* hleng0 */
196 { {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, /* table1 */
197 { 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 } } }; /* hleng1 */
199 static const uint8_t t1HB_const[4] = {1,1,1,0};
200 static const uint8_t t2HB_const[9] = {1,2,1,3,1,1,3,2,0};
201 static const uint8_t t3HB_const[9] = {3,2,1,1,1,1,3,2,0};
202 static const uint8_t t5HB_const[16] = {1,2,6,5,3,1,4,4,7,5,7,1,6,1,1,0};
203 static const uint8_t t6HB_const[16] = {7,3,5,1,6,2,3,2,5,4,4,1,3,3,2,0};
205 static const uint8_t t7HB_const[36] =
206 { 1, 2,10,19,16,10, 3, 3, 7,10, 5, 3,11, 4,13,17, 8, 4,
207 12,11,18,15,11, 2, 7, 6, 9,14, 3, 1, 6, 4, 5, 3, 2, 0 };
209 static const uint8_t t8HB_const[36] =
210 { 3, 4, 6,18,12, 5, 5, 1, 2,16, 9, 3, 7, 3, 5,14, 7, 3,
211 19,17,15,13,10, 4,13, 5, 8,11, 5, 1,12, 4, 4, 1, 1, 0 };
213 static const uint8_t t9HB_const[36] =
214 { 7, 5, 9,14,15, 7, 6, 4, 5, 5, 6, 7, 7, 6, 8, 8, 8, 5,
215 15, 6, 9,10, 5, 1,11, 7, 9, 6, 4, 1,14, 4, 6, 2, 6, 0 };
217 static const uint8_t t10HB_const[64] =
218 {1,2,10,23,35,30,12,17,3,3,8,12,18,21,12,7,11,9,15,21,32,
219 40,19,6,14,13,22,34,46,23,18,7,20,19,33,47,27,22,9,3,31,22,
220 41,26,21,20,5,3,14,13,10,11,16,6,5,1,9,8,7,8,4,4,2,0 };
222 static const uint8_t t11HB_const[64] =
223 {3,4,10,24,34,33,21,15,5,3,4,10,32,17,11,10,11,7,13,18,30,
224 31,20,5,25,11,19,59,27,18,12,5,35,33,31,58,30,16,7,5,28,26,
225 32,19,17,15,8,14,14,12,9,13,14,9,4,1,11,4,6,6,6,3,2,0 };
227 static const uint8_t t12HB_const[64] =
228 {9,6,16,33,41,39,38,26,7,5,6,9,23,16,26,11,17,7,11,14,21,
229 30,10,7,17,10,15,12,18,28,14,5,32,13,22,19,18,16,9,5,40,17,
230 31,29,17,13,4,2,27,12,11,15,10,7,4,1,27,12,8,12,6,3,1,0 };
232 static const uint8_t t13HB_const[256] =
233 {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,
234 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,
235 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,
236 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,
237 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,
238 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,
239 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,
240 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,
241 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,
242 10,6,1,4,2,16,15,17,27,25,20,29,11,17,12,16,8,1,1,0,1 };
244 static const uint8_t t15HB_const[256] =
245 {7,12,18,53,47,76,124,108,89,123,108,119,107,81,122,63,13,5,16,27,46,36,61,51,
246 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,
247 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,
248 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,
249 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,
250 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,
251 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,
252 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,
253 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,
254 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};
256 static const uint16_t t16HB_const[256] =
257 {1,5,14,44,74,63,110,93,172,149,138,242,225,195,376,17,3,4,12,20,35,62,53,47,
258 83,75,68,119,201,107,207,9,15,13,23,38,67,58,103,90,161,72,127,117,110,209,
259 206,16,45,21,39,69,64,114,99,87,158,140,252,212,199,387,365,26,75,36,68,65,
260 115,101,179,164,155,264,246,226,395,382,362,9,66,30,59,56,102,185,173,265,142,
261 253,232,400,388,378,445,16,111,54,52,100,184,178,160,133,257,244,228,217,385,
262 366,715,10,98,48,91,88,165,157,148,261,248,407,397,372,380,889,884,8,85,84,81,
263 159,156,143,260,249,427,401,392,383,727,713,708,7,154,76,73,141,131,256,245,
264 426,406,394,384,735,359,710,352,11,139,129,67,125,247,233,229,219,393,743,737,
265 720,885,882,439,4,243,120,118,115,227,223,396,746,742,736,721,712,706,223,436,
266 6,202,224,222,218,216,389,386,381,364,888,443,707,440,437,1728,4,747,211,210,
267 208,370,379,734,723,714,1735,883,877,876,3459,865,2,377,369,102,187,726,722,
268 358,711,709,866,1734,871,3458,870,434,0,12,10,7,11,10,17,11,9,13,12,10,7,5,3,
269 1,3};
271 static const uint16_t t24HB_const[256] =
272 {15,13,46,80,146,262,248,434,426,669,653,649,621,517,1032,88,14,12,21,38,71,
273 130,122,216,209,198,327,345,319,297,279,42,47,22,41,74,68,128,120,221,207,194,
274 182,340,315,295,541,18,81,39,75,70,134,125,116,220,204,190,178,325,311,293,
275 271,16,147,72,69,135,127,118,112,210,200,188,352,323,306,285,540,14,263,66,
276 129,126,119,114,214,202,192,180,341,317,301,281,262,12,249,123,121,117,113,
277 215,206,195,185,347,330,308,291,272,520,10,435,115,111,109,211,203,196,187,
278 353,332,313,298,283,531,381,17,427,212,208,205,201,193,186,177,169,320,303,
279 286,268,514,377,16,335,199,197,191,189,181,174,333,321,305,289,275,521,379,
280 371,11,668,184,183,179,175,344,331,314,304,290,277,530,383,373,366,10,652,346,
281 171,168,164,318,309,299,287,276,263,513,375,368,362,6,648,322,316,312,307,302,
282 292,284,269,261,512,376,370,364,359,4,620,300,296,294,288,282,273,266,515,380,
283 374,369,365,361,357,2,1033,280,278,274,267,264,259,382,378,372,367,363,360,
284 358,356,0,43,20,19,17,15,13,11,9,7,6,4,7,5,3,1,3};
286 static const uint32_t tab1315_const[256] =
287 { 0x010003,0x050005,0x070006,0x080008,0x090008,0x0a0009,0x0a000a,0x0b000a,
288 0x0a000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0d000c,0x0e000d,0x0e000e,
289 0x040005,0x060005,0x080007,0x090008,0x0a0009,0x0a0009,0x0b000a,0x0b000a,
290 0x0b000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0e000c,0x0e000d,0x0e000d,
291 0x070006,0x080007,0x090007,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,
292 0x0b000a,0x0c000b,0x0c000b,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d,
293 0x080007,0x090008,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0c000b,
294 0x0c000b,0x0d000b,0x0d000c,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d,
295 0x090008,0x090008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0d000b,0x0d000b,
296 0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000d,
297 0x0a0009,0x0a0009,0x0b0009,0x0c000a,0x0c000a,0x0c000a,0x0d000b,0x0d000b,
298 0x0d000b,0x0d000b,0x0e000c,0x0d000c,0x0f000d,0x0f000d,0x10000d,0x10000e,
299 0x0a000a,0x0b0009,0x0c000a,0x0c000a,0x0d000a,0x0d000b,0x0d000b,0x0d000b,
300 0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x10000e,
301 0x0b000a,0x0b000a,0x0c000a,0x0d000b,0x0d000b,0x0d000b,0x0e000b,0x0e000c,
302 0x0e000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x12000d,0x12000e,
303 0x0a000a,0x0a000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0e000c,
304 0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x11000e,0x11000e,
305 0x0b000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0d000c,0x0f000c,
306 0x0e000c,0x0f000d,0x0f000d,0x10000d,0x10000d,0x10000e,0x12000e,0x11000e,
307 0x0b000b,0x0c000b,0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000c,
308 0x0e000c,0x0f000d,0x10000d,0x0f000d,0x10000d,0x11000e,0x12000f,0x13000e,
309 0x0c000b,0x0c000b,0x0c000b,0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0e000c,
310 0x0f000d,0x0f000d,0x0f000d,0x10000d,0x11000e,0x11000e,0x11000e,0x12000f,
311 0x0c000c,0x0d000c,0x0d000b,0x0e000c,0x0e000c,0x0f000c,0x0e000d,0x0f000d,
312 0x10000d,0x10000d,0x11000d,0x11000d,0x11000e,0x12000e,0x12000f,0x12000f,
313 0x0d000c,0x0d000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x10000d,
314 0x10000d,0x10000e,0x10000e,0x11000e,0x12000e,0x11000e,0x12000f,0x12000f,
315 0x0e000d,0x0e000d,0x0e000d,0x0f000d,0x0f000d,0x0f000d,0x11000d,0x10000d,
316 0x10000e,0x13000e,0x11000e,0x11000e,0x11000f,0x13000f,0x12000e,0x12000f,
317 0x0d000d,0x0e000d,0x0f000d,0x10000d,0x10000d,0x10000d,0x11000d,0x10000e,
318 0x11000e,0x11000e,0x12000e,0x12000e,0x15000f,0x14000f,0x15000f,0x12000f };
320 static const uint32_t tab01_const[16] =
321 { 0x10004,0x50005,0x50005,0x70006,0x50005,0x80006,0x70006,0x90007,
322 0x50005,0x70006,0x70006,0x90007,0x70006,0x90007,0x90007,0xa0008 };
324 static const uint32_t tab23_const[ 9] =
325 { 0x10002,0x40003,0x70007,0x40004,0x50004,0x70007,0x60006,0x70007,0x80008 };
327 static const uint32_t tab56_const[16] =
328 { 0x10003,0x40004,0x70006,0x80008,0x40004,0x50004,0x80006,0x90007,
329 0x70005,0x80006,0x90007,0xa0008,0x80007,0x80007,0x90008,0xa0009 };
331 static const uint32_t tab789_const[36] =
332 {0x00100803,0x00401004,0x00701c06,0x00902407,0x00902409,0x00a0280a,0x00401004,
333 0x00601005,0x00801806,0x00902807,0x00902808,0x00a0280a,0x00701c05,0x00701806,
334 0x00902007,0x00a02808,0x00a02809,0x00b02c0a,0x00802407,0x00902807,0x00a02808,
335 0x00b02c09,0x00b02c09,0x00b0300a,0x00802408,0x00902408,0x00a02809,0x00b02c09,
336 0x00b0300a,0x00c0300b,0x00902809,0x00a02809,0x00b02c0a,0x00c02c0a,0x00c0340b,
337 0x00c0340b};
339 static const uint32_t tabABC_const[64] =
340 {0x00100804,0x00401004,0x00701806,0x00902008,0x00a02409,0x00a0280a,0x00a0240a,
341 0x00b0280a,0x00401004,0x00601405,0x00801806,0x00902007,0x00a02809,0x00b02809,
342 0x00a0240a,0x00a0280a,0x00701806,0x00801c06,0x00902007,0x00a02408,0x00b02809,
343 0x00c02c0a,0x00b02809,0x00b0280a,0x00802007,0x00902007,0x00a02408,0x00b02c08,
344 0x00c02809,0x00c0300a,0x00b0280a,0x00c02c0a,0x00902408,0x00a02808,0x00b02809,
345 0x00c02c09,0x00c02c0a,0x00c0300a,0x00c02c0a,0x00c0300b,0x00a02409,0x00b02809,
346 0x00c02c0a,0x00c0300a,0x00d0300a,0x00d0340b,0x00c0300a,0x00d0340b,0x00902409,
347 0x00a02409,0x00b02409,0x00c0280a,0x00c02c0a,0x00c0300b,0x00d0300b,0x00d0300c,
348 0x00a0240a,0x00a0240a,0x00b0280a,0x00c02c0b,0x00c0300b,0x00d0300b,0x00d0300b,
349 0x00d0300c};
351 static const uint32_t tab1624_const[256] =
352 {0x00010004,0x00050005,0x00070007,0x00090008,0x000a0009,0x000a000a,0x000b000a,
353 0x000b000b,0x000c000b,0x000c000c,0x000c000c,0x000d000c,0x000d000c,0x000d000c,
354 0x000e000d,0x000a000a,0x00040005,0x00060006,0x00080007,0x00090008,0x000a0009,
355 0x000b000a,0x000b000a,0x000b000b,0x000c000b,0x000c000b,0x000c000c,0x000d000c,
356 0x000e000c,0x000d000c,0x000e000c,0x000a000a,0x00070007,0x00080007,0x00090008,
357 0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000b,0x000d000b,0x000c000b,
358 0x000d000b,0x000d000c,0x000d000c,0x000e000c,0x000e000d,0x000b0009,0x00090008,
359 0x00090008,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a,0x000c000b,
360 0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c,0x000f000c,
361 0x000c0009,0x000a0009,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a,
362 0x000d000a,0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c,
363 0x000f000c,0x000f000d,0x000b0009,0x000a000a,0x000a0009,0x000b000a,0x000b000a,
364 0x000c000a,0x000d000a,0x000d000b,0x000e000b,0x000d000b,0x000e000b,0x000e000c,
365 0x000f000c,0x000f000c,0x000f000c,0x0010000c,0x000c0009,0x000b000a,0x000b000a,
366 0x000b000a,0x000c000a,0x000d000a,0x000d000b,0x000d000b,0x000d000b,0x000e000b,
367 0x000e000c,0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000d,0x000c0009,
368 0x000b000b,0x000b000a,0x000c000a,0x000c000a,0x000d000b,0x000d000b,0x000d000b,
369 0x000e000b,0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000d,
370 0x0011000d,0x000c000a,0x000b000b,0x000c000b,0x000c000b,0x000d000b,0x000d000b,
371 0x000d000b,0x000e000b,0x000e000b,0x000f000b,0x000f000c,0x000f000c,0x000f000c,
372 0x0010000c,0x0010000d,0x0010000d,0x000c000a,0x000c000b,0x000c000b,0x000c000b,
373 0x000d000b,0x000d000b,0x000e000b,0x000e000b,0x000f000c,0x000f000c,0x000f000c,
374 0x000f000c,0x0010000c,0x000f000d,0x0010000d,0x000f000d,0x000d000a,0x000c000c,
375 0x000d000b,0x000c000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000e000c,
376 0x000f000c,0x0010000c,0x0010000c,0x0010000d,0x0011000d,0x0011000d,0x0010000d,
377 0x000c000a,0x000d000c,0x000d000c,0x000d000b,0x000d000b,0x000e000b,0x000e000c,
378 0x000f000c,0x0010000c,0x0010000c,0x0010000c,0x0010000c,0x0010000d,0x0010000d,
379 0x000f000d,0x0010000d,0x000d000a,0x000d000c,0x000e000c,0x000e000c,0x000e000c,
380 0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000c,0x0010000d,
381 0x0010000d,0x0010000d,0x0010000d,0x0012000d,0x000d000a,0x000f000c,0x000e000c,
382 0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000c,0x0010000c,0x0010000d,
383 0x0012000d,0x0011000d,0x0011000d,0x0011000d,0x0013000d,0x0011000d,0x000d000a,
384 0x000e000d,0x000f000c,0x000d000c,0x000e000c,0x0010000c,0x0010000c,0x000f000c,
385 0x0010000d,0x0010000d,0x0011000d,0x0012000d,0x0011000d,0x0013000d,0x0011000d,
386 0x0010000d,0x000d000a,0x000a0009,0x000a0009,0x000a0009,0x000b0009,0x000b0009,
387 0x000c0009,0x000c0009,0x000c0009,0x000d0009,0x000d0009,0x000d0009,0x000d000a,
388 0x000d000a,0x000d000a,0x000d000a,0x000a0006};
390 static const uint8_t t1l_const[8] = {1,3,2,3,1,4,3,5};
391 static const uint8_t t2l_const[9] = {1,3,6,3,3,5,5,5,6};
392 static const uint8_t t3l_const[9] = {2,2,6,3,2,5,5,5,6};
393 static const uint8_t t5l_const[16] = {1,3,6,7,3,3,6,7,6,6,7,8,7,6,7,8};
394 static const uint8_t t6l_const[16] = {3,3,5,7,3,2,4,5,4,4,5,6,6,5,6,7};
396 static const uint8_t t7l_const[36] =
397 {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};
399 static const uint8_t t8l_const[36] =
400 {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};
402 static const uint8_t t9l_const[36] =
403 {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};
405 static const uint8_t t10l_const[64] =
406 {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,
407 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};
409 static const uint8_t t11l_const[64] =
410 {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,
411 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};
413 static const uint8_t t12l_const[64] =
414 {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,
415 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};
417 static const uint8_t t13l_const[256] =
418 {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,
419 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,
420 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,
421 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,
422 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,
423 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,
424 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,
425 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,
426 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,
427 15,15,16,16,19,18,19,16};
429 static const uint8_t t15l_const[256] =
430 {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,
431 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,
432 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,
433 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,
434 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,
435 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,
436 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,
437 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,
438 13,12,11,11,11,11,11,11,12,12,12,12,12,13,13,13,13};
440 static const uint8_t t16l_const[256] =
441 {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,
442 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,
443 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,
444 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,
445 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,
446 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,
447 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,
448 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,
449 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,
450 11,11,11,11,11,11,11,8};
452 static const uint8_t t24l_const[256] =
453 {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,
454 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,
455 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,
456 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,
457 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,
458 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,
459 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,
460 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,
461 7,7,7,7,7,7,8,8,8,8,4};
463 static const struct huffcodetab ht_const[HTN] =
464 { { 0, NULL, NULL}, /* Apparently not used */
465 { 2, t1HB, t1l},
466 { 3, t2HB, t2l},
467 { 3, t3HB, t3l},
468 { 0, NULL, NULL}, /* Apparently not used */
469 { 4, t5HB, t5l},
470 { 4, t6HB, t6l},
471 { 6, t7HB, t7l},
472 { 6, t8HB, t8l},
473 { 6, t9HB, t9l},
474 { 8, t10HB, t10l},
475 { 8, t11HB, t11l},
476 { 8, t12HB, t12l},
477 {16, t13HB, t13l},
478 { 0, NULL, NULL}, /* Apparently not used */
479 {16, t15HB, t15l} };
481 static const struct huffcodebig ht_big[HTN] =
482 { { 16, 1, 1 },
483 { 16, 2, 3 },
484 { 16, 3, 7 },
485 { 16, 4, 15 },
486 { 16, 6, 63 },
487 { 16, 8, 255 },
488 { 16, 10, 1023 },
489 { 16, 13, 8191 },
490 { 16, 4, 15 },
491 { 16, 5, 31 },
492 { 16, 6, 63 },
493 { 16, 7, 127 },
494 { 16, 8, 255 },
495 { 16, 9, 511 },
496 { 16, 11, 2047 },
497 { 16, 13, 8191 } };
499 static const struct
501 uint32_t region0_cnt;
502 uint32_t region1_cnt;
503 } subdv_table[23] =
504 { {0, 0}, /* 0 bands */
505 {0, 0}, /* 1 bands */
506 {0, 0}, /* 2 bands */
507 {0, 0}, /* 3 bands */
508 {0, 0}, /* 4 bands */
509 {0, 1}, /* 5 bands */
510 {1, 1}, /* 6 bands */
511 {1, 1}, /* 7 bands */
512 {1, 2}, /* 8 bands */
513 {2, 2}, /* 9 bands */
514 {2, 3}, /* 10 bands */
515 {2, 3}, /* 11 bands */
516 {3, 4}, /* 12 bands */
517 {3, 4}, /* 13 bands */
518 {3, 4}, /* 14 bands */
519 {4, 5}, /* 15 bands */
520 {4, 5}, /* 16 bands */
521 {4, 6}, /* 17 bands */
522 {5, 6}, /* 18 bands */
523 {5, 6}, /* 19 bands */
524 {5, 7}, /* 20 bands */
525 {6, 7}, /* 21 bands */
526 {6, 7}, /* 22 bands */
529 static const uint32_t sfBand[6][23] =
531 /* Table B.2.b: 22.05 kHz */
532 {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
533 /* Table B.2.c: 24 kHz */
534 {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576},
535 /* Table B.2.a: 16 kHz */
536 {0,6,12,18,24,30,36,44,45,66,80,96,116,140,168,200,238,248,336,396,464,522,576},
537 /* Table B.8.b: 44.1 kHz */
538 {0,4, 8,12,16,20,24,30,36,44,52,62, 74, 90,110,134,162,196,238,288,342,418,576},
539 /* Table B.8.c: 48 kHz */
540 {0,4, 8,12,16,20,24,30,36,42,50,60, 72, 88,106,128,156,190,230,276,330,384,576},
541 /* Table B.8.a: 32 kHz */
542 {0,4, 8,12,16,20,24,30,36,44,54,66, 82,102,126,156,194,240,296,364,448,550,576} };
545 static const short int2idx_const[4096] = /* int2idx[i] = sqrt(i*sqrt(i)); */
547 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9,
548 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16,
549 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21,
550 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26,
551 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
552 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36,
553 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40,
554 41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45,
555 45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49,
556 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53,
557 53, 53, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 57, 57, 57,
558 57, 57, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 61, 61,
559 61, 61, 61, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 65,
560 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68,
561 68, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 72, 72, 72,
562 72, 72, 72, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75,
563 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 79, 79, 79,
564 79, 79, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82,
565 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 86, 86, 86,
566 86, 86, 86, 87, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89,
567 89, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 93,
568 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 96, 96, 96,
569 96, 96, 96, 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99,
570 99, 99,100,100,100,100,100,100,101,101,101,101,101,101,102,102,102,102,102,102,
571 103,103,103,103,103,103,104,104,104,104,104,104,104,105,105,105,105,105,105,106,
572 106,106,106,106,106,107,107,107,107,107,107,107,108,108,108,108,108,108,109,109,
573 109,109,109,109,110,110,110,110,110,110,110,111,111,111,111,111,111,112,112,112,
574 112,112,112,112,113,113,113,113,113,113,114,114,114,114,114,114,115,115,115,115,
575 115,115,115,116,116,116,116,116,116,117,117,117,117,117,117,117,118,118,118,118,
576 118,118,118,119,119,119,119,119,119,120,120,120,120,120,120,120,121,121,121,121,
577 121,121,122,122,122,122,122,122,122,123,123,123,123,123,123,123,124,124,124,124,
578 124,124,125,125,125,125,125,125,125,126,126,126,126,126,126,126,127,127,127,127,
579 127,127,128,128,128,128,128,128,128,129,129,129,129,129,129,129,130,130,130,130,
580 130,130,131,131,131,131,131,131,131,132,132,132,132,132,132,132,133,133,133,133,
581 133,133,133,134,134,134,134,134,134,134,135,135,135,135,135,135,136,136,136,136,
582 136,136,136,137,137,137,137,137,137,137,138,138,138,138,138,138,138,139,139,139,
583 139,139,139,139,140,140,140,140,140,140,140,141,141,141,141,141,141,141,142,142,
584 142,142,142,142,142,143,143,143,143,143,143,143,144,144,144,144,144,144,144,145,
585 145,145,145,145,145,145,146,146,146,146,146,146,146,147,147,147,147,147,147,147,
586 148,148,148,148,148,148,148,149,149,149,149,149,149,149,150,150,150,150,150,150,
587 150,151,151,151,151,151,151,151,152,152,152,152,152,152,152,153,153,153,153,153,
588 153,153,154,154,154,154,154,154,154,154,155,155,155,155,155,155,155,156,156,156,
589 156,156,156,156,157,157,157,157,157,157,157,158,158,158,158,158,158,158,159,159,
590 159,159,159,159,159,160,160,160,160,160,160,160,160,161,161,161,161,161,161,161,
591 162,162,162,162,162,162,162,163,163,163,163,163,163,163,163,164,164,164,164,164,
592 164,164,165,165,165,165,165,165,165,166,166,166,166,166,166,166,167,167,167,167,
593 167,167,167,167,168,168,168,168,168,168,168,169,169,169,169,169,169,169,169,170,
594 170,170,170,170,170,170,171,171,171,171,171,171,171,172,172,172,172,172,172,172,
595 172,173,173,173,173,173,173,173,174,174,174,174,174,174,174,174,175,175,175,175,
596 175,175,175,176,176,176,176,176,176,176,176,177,177,177,177,177,177,177,178,178,
597 178,178,178,178,178,178,179,179,179,179,179,179,179,180,180,180,180,180,180,180,
598 180,181,181,181,181,181,181,181,182,182,182,182,182,182,182,182,183,183,183,183,
599 183,183,183,184,184,184,184,184,184,184,184,185,185,185,185,185,185,185,186,186,
600 186,186,186,186,186,186,187,187,187,187,187,187,187,187,188,188,188,188,188,188,
601 188,189,189,189,189,189,189,189,189,190,190,190,190,190,190,190,190,191,191,191,
602 191,191,191,191,192,192,192,192,192,192,192,192,193,193,193,193,193,193,193,193,
603 194,194,194,194,194,194,194,195,195,195,195,195,195,195,195,196,196,196,196,196,
604 196,196,196,197,197,197,197,197,197,197,197,198,198,198,198,198,198,198,199,199,
605 199,199,199,199,199,199,200,200,200,200,200,200,200,200,201,201,201,201,201,201,
606 201,201,202,202,202,202,202,202,202,202,203,203,203,203,203,203,203,204,204,204,
607 204,204,204,204,204,205,205,205,205,205,205,205,205,206,206,206,206,206,206,206,
608 206,207,207,207,207,207,207,207,207,208,208,208,208,208,208,208,208,209,209,209,
609 209,209,209,209,209,210,210,210,210,210,210,210,210,211,211,211,211,211,211,211,
610 211,212,212,212,212,212,212,212,212,213,213,213,213,213,213,213,213,214,214,214,
611 214,214,214,214,214,215,215,215,215,215,215,215,215,216,216,216,216,216,216,216,
612 216,217,217,217,217,217,217,217,217,218,218,218,218,218,218,218,218,219,219,219,
613 219,219,219,219,219,220,220,220,220,220,220,220,220,221,221,221,221,221,221,221,
614 221,222,222,222,222,222,222,222,222,223,223,223,223,223,223,223,223,224,224,224,
615 224,224,224,224,224,225,225,225,225,225,225,225,225,226,226,226,226,226,226,226,
616 226,227,227,227,227,227,227,227,227,228,228,228,228,228,228,228,228,229,229,229,
617 229,229,229,229,229,229,230,230,230,230,230,230,230,230,231,231,231,231,231,231,
618 231,231,232,232,232,232,232,232,232,232,233,233,233,233,233,233,233,233,234,234,
619 234,234,234,234,234,234,234,235,235,235,235,235,235,235,235,236,236,236,236,236,
620 236,236,236,237,237,237,237,237,237,237,237,238,238,238,238,238,238,238,238,238,
621 239,239,239,239,239,239,239,239,240,240,240,240,240,240,240,240,241,241,241,241,
622 241,241,241,241,242,242,242,242,242,242,242,242,242,243,243,243,243,243,243,243,
623 243,244,244,244,244,244,244,244,244,245,245,245,245,245,245,245,245,245,246,246,
624 246,246,246,246,246,246,247,247,247,247,247,247,247,247,248,248,248,248,248,248,
625 248,248,248,249,249,249,249,249,249,249,249,250,250,250,250,250,250,250,250,250,
626 251,251,251,251,251,251,251,251,252,252,252,252,252,252,252,252,253,253,253,253,
627 253,253,253,253,253,254,254,254,254,254,254,254,254,255,255,255,255,255,255,255,
628 255,255,256,256,256,256,256,256,256,256,257,257,257,257,257,257,257,257,257,258,
629 258,258,258,258,258,258,258,259,259,259,259,259,259,259,259,259,260,260,260,260,
630 260,260,260,260,261,261,261,261,261,261,261,261,261,262,262,262,262,262,262,262,
631 262,263,263,263,263,263,263,263,263,263,264,264,264,264,264,264,264,264,265,265,
632 265,265,265,265,265,265,265,266,266,266,266,266,266,266,266,267,267,267,267,267,
633 267,267,267,267,268,268,268,268,268,268,268,268,268,269,269,269,269,269,269,269,
634 269,270,270,270,270,270,270,270,270,270,271,271,271,271,271,271,271,271,271,272,
635 272,272,272,272,272,272,272,273,273,273,273,273,273,273,273,273,274,274,274,274,
636 274,274,274,274,275,275,275,275,275,275,275,275,275,276,276,276,276,276,276,276,
637 276,276,277,277,277,277,277,277,277,277,277,278,278,278,278,278,278,278,278,279,
638 279,279,279,279,279,279,279,279,280,280,280,280,280,280,280,280,280,281,281,281,
639 281,281,281,281,281,282,282,282,282,282,282,282,282,282,283,283,283,283,283,283,
640 283,283,283,284,284,284,284,284,284,284,284,284,285,285,285,285,285,285,285,285,
641 286,286,286,286,286,286,286,286,286,287,287,287,287,287,287,287,287,287,288,288,
642 288,288,288,288,288,288,288,289,289,289,289,289,289,289,289,289,290,290,290,290,
643 290,290,290,290,291,291,291,291,291,291,291,291,291,292,292,292,292,292,292,292,
644 292,292,293,293,293,293,293,293,293,293,293,294,294,294,294,294,294,294,294,294,
645 295,295,295,295,295,295,295,295,295,296,296,296,296,296,296,296,296,296,297,297,
646 297,297,297,297,297,297,297,298,298,298,298,298,298,298,298,299,299,299,299,299,
647 299,299,299,299,300,300,300,300,300,300,300,300,300,301,301,301,301,301,301,301,
648 301,301,302,302,302,302,302,302,302,302,302,303,303,303,303,303,303,303,303,303,
649 304,304,304,304,304,304,304,304,304,305,305,305,305,305,305,305,305,305,306,306,
650 306,306,306,306,306,306,306,307,307,307,307,307,307,307,307,307,308,308,308,308,
651 308,308,308,308,308,309,309,309,309,309,309,309,309,309,310,310,310,310,310,310,
652 310,310,310,311,311,311,311,311,311,311,311,311,312,312,312,312,312,312,312,312,
653 312,313,313,313,313,313,313,313,313,313,314,314,314,314,314,314,314,314,314,315,
654 315,315,315,315,315,315,315,315,316,316,316,316,316,316,316,316,316,317,317,317,
655 317,317,317,317,317,317,318,318,318,318,318,318,318,318,318,318,319,319,319,319,
656 319,319,319,319,319,320,320,320,320,320,320,320,320,320,321,321,321,321,321,321,
657 321,321,321,322,322,322,322,322,322,322,322,322,323,323,323,323,323,323,323,323,
658 323,324,324,324,324,324,324,324,324,324,325,325,325,325,325,325,325,325,325,325,
659 326,326,326,326,326,326,326,326,326,327,327,327,327,327,327,327,327,327,328,328,
660 328,328,328,328,328,328,328,329,329,329,329,329,329,329,329,329,330,330,330,330,
661 330,330,330,330,330,330,331,331,331,331,331,331,331,331,331,332,332,332,332,332,
662 332,332,332,332,333,333,333,333,333,333,333,333,333,334,334,334,334,334,334,334,
663 334,334,335,335,335,335,335,335,335,335,335,335,336,336,336,336,336,336,336,336,
664 336,337,337,337,337,337,337,337,337,337,338,338,338,338,338,338,338,338,338,338,
665 339,339,339,339,339,339,339,339,339,340,340,340,340,340,340,340,340,340,341,341,
666 341,341,341,341,341,341,341,341,342,342,342,342,342,342,342,342,342,343,343,343,
667 343,343,343,343,343,343,344,344,344,344,344,344,344,344,344,344,345,345,345,345,
668 345,345,345,345,345,346,346,346,346,346,346,346,346,346,347,347,347,347,347,347,
669 347,347,347,347,348,348,348,348,348,348,348,348,348,349,349,349,349,349,349,349,
670 349,349,350,350,350,350,350,350,350,350,350,350,351,351,351,351,351,351,351,351,
671 351,352,352,352,352,352,352,352,352,352,352,353,353,353,353,353,353,353,353,353,
672 354,354,354,354,354,354,354,354,354,355,355,355,355,355,355,355,355,355,355,356,
673 356,356,356,356,356,356,356,356,357,357,357,357,357,357,357,357,357,357,358,358,
674 358,358,358,358,358,358,358,359,359,359,359,359,359,359,359,359,359,360,360,360,
675 360,360,360,360,360,360,361,361,361,361,361,361,361,361,361,361,362,362,362,362,
676 362,362,362,362,362,363,363,363,363,363,363,363,363,363,363,364,364,364,364,364,
677 364,364,364,364,365,365,365,365,365,365,365,365,365,365,366,366,366,366,366,366,
678 366,366,366,367,367,367,367,367,367,367,367,367,367,368,368,368,368,368,368,368,
679 368,368,369,369,369,369,369,369,369,369,369,369,370,370,370,370,370,370,370,370,
680 370,370,371,371,371,371,371,371,371,371,371,372,372,372,372,372,372,372,372,372,
681 372,373,373,373,373,373,373,373,373,373,374,374,374,374,374,374,374,374,374,374,
682 375,375,375,375,375,375,375,375,375,375,376,376,376,376,376,376,376,376,376,377,
683 377,377,377,377,377,377,377,377,377,378,378,378,378,378,378,378,378,378,379,379,
684 379,379,379,379,379,379,379,379,380,380,380,380,380,380,380,380,380,380,381,381,
685 381,381,381,381,381,381,381,382,382,382,382,382,382,382,382,382,382,383,383,383,
686 383,383,383,383,383,383,383,384,384,384,384,384,384,384,384,384,385,385,385,385,
687 385,385,385,385,385,385,386,386,386,386,386,386,386,386,386,386,387,387,387,387,
688 387,387,387,387,387,387,388,388,388,388,388,388,388,388,388,389,389,389,389,389,
689 389,389,389,389,389,390,390,390,390,390,390,390,390,390,390,391,391,391,391,391,
690 391,391,391,391,391,392,392,392,392,392,392,392,392,392,393,393,393,393,393,393,
691 393,393,393,393,394,394,394,394,394,394,394,394,394,394,395,395,395,395,395,395,
692 395,395,395,395,396,396,396,396,396,396,396,396,396,397,397,397,397,397,397,397,
693 397,397,397,398,398,398,398,398,398,398,398,398,398,399,399,399,399,399,399,399,
694 399,399,399,400,400,400,400,400,400,400,400,400,400,401,401,401,401,401,401,401,
695 401,401,402,402,402,402,402,402,402,402,402,402,403,403,403,403,403,403,403,403,
696 403,403,404,404,404,404,404,404,404,404,404,404,405,405,405,405,405,405,405,405,
697 405,405,406,406,406,406,406,406,406,406,406,406,407,407,407,407,407,407,407,407,
698 407,407,408,408,408,408,408,408,408,408,408,408,409,409,409,409,409,409,409,409,
699 409,410,410,410,410,410,410,410,410,410,410,411,411,411,411,411,411,411,411,411,
700 411,412,412,412,412,412,412,412,412,412,412,413,413,413,413,413,413,413,413,413,
701 413,414,414,414,414,414,414,414,414,414,414,415,415,415,415,415,415,415,415,415,
702 415,416,416,416,416,416,416,416,416,416,416,417,417,417,417,417,417,417,417,417,
703 417,418,418,418,418,418,418,418,418,418,418,419,419,419,419,419,419,419,419,419,
704 419,420,420,420,420,420,420,420,420,420,420,421,421,421,421,421,421,421,421,421,
705 421,422,422,422,422,422,422,422,422,422,422,423,423,423,423,423,423,423,423,423,
706 423,424,424,424,424,424,424,424,424,424,424,425,425,425,425,425,425,425,425,425,
707 425,426,426,426,426,426,426,426,426,426,426,427,427,427,427,427,427,427,427,427,
708 427,428,428,428,428,428,428,428,428,428,428,429,429,429,429,429,429,429,429,429,
709 429,430,430,430,430,430,430,430,430,430,430,431,431,431,431,431,431,431,431,431,
710 431,432,432,432,432,432,432,432,432,432,432,433,433,433,433,433,433,433,433,433,
711 433,434,434,434,434,434,434,434,434,434,434,435,435,435,435,435,435,435,435,435,
712 435,435,436,436,436,436,436,436,436,436,436,436,437,437,437,437,437,437,437,437,
713 437,437,438,438,438,438,438,438,438,438,438,438,439,439,439,439,439,439,439,439,
714 439,439,440,440,440,440,440,440,440,440,440,440,441,441,441,441,441,441,441,441,
715 441,441,442,442,442,442,442,442,442,442,442,442,443,443,443,443,443,443,443,443,
716 443,443,443,444,444,444,444,444,444,444,444,444,444,445,445,445,445,445,445,445,
717 445,445,445,446,446,446,446,446,446,446,446,446,446,447,447,447,447,447,447,447,
718 447,447,447,448,448,448,448,448,448,448,448,448,448,448,449,449,449,449,449,449,
719 449,449,449,449,450,450,450,450,450,450,450,450,450,450,451,451,451,451,451,451,
720 451,451,451,451,452,452,452,452,452,452,452,452,452,452,453,453,453,453,453,453,
721 453,453,453,453,453,454,454,454,454,454,454,454,454,454,454,455,455,455,455,455,
722 455,455,455,455,455,456,456,456,456,456,456,456,456,456,456,457,457,457,457,457,
723 457,457,457,457,457,457,458,458,458,458,458,458,458,458,458,458,459,459,459,459,
724 459,459,459,459,459,459,460,460,460,460,460,460,460,460,460,460,460,461,461,461,
725 461,461,461,461,461,461,461,462,462,462,462,462,462,462,462,462,462,463,463,463,
726 463,463,463,463,463,463,463,463,464,464,464,464,464,464,464,464,464,464,465,465,
727 465,465,465,465,465,465,465,465,466,466,466,466,466,466,466,466,466,466,466,467,
728 467,467,467,467,467,467,467,467,467,468,468,468,468,468,468,468,468,468,468,469,
729 469,469,469,469,469,469,469,469,469,469,470,470,470,470,470,470,470,470,470,470,
730 471,471,471,471,471,471,471,471,471,471,472,472,472,472,472,472,472,472,472,472,
731 472,473,473,473,473,473,473,473,473,473,473,474,474,474,474,474,474,474,474,474,
732 474,475,475,475,475,475,475,475,475,475,475,475,476,476,476,476,476,476,476,476,
733 476,476,477,477,477,477,477,477,477,477,477,477,477,478,478,478,478,478,478,478,
734 478,478,478,479,479,479,479,479,479,479,479,479,479,479,480,480,480,480,480,480,
735 480,480,480,480,481,481,481,481,481,481,481,481,481,481,482,482,482,482,482,482,
736 482,482,482,482,482,483,483,483,483,483,483,483,483,483,483,484,484,484,484,484,
737 484,484,484,484,484,484,485,485,485,485,485,485,485,485,485,485,486,486,486,486,
738 486,486,486,486,486,486,486,487,487,487,487,487,487,487,487,487,487,488,488,488,
739 488,488,488,488,488,488,488,488,489,489,489,489,489,489,489,489,489,489,490,490,
740 490,490,490,490,490,490,490,490,490,491,491,491,491,491,491,491,491,491,491,492,
741 492,492,492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493,493,493,
742 494,494,494,494,494,494,494,494,494,494,494,495,495,495,495,495,495,495,495,495,
743 495,496,496,496,496,496,496,496,496,496,496,496,497,497,497,497,497,497,497,497,
744 497,497,497,498,498,498,498,498,498,498,498,498,498,499,499,499,499,499,499,499,
745 499,499,499,499,500,500,500,500,500,500,500,500,500,500,501,501,501,501,501,501,
746 501,501,501,501,501,502,502,502,502,502,502,502,502,502,502,503,503,503,503,503,
747 503,503,503,503,503,503,504,504,504,504,504,504,504,504,504,504,504,505,505,505,
748 505,505,505,505,505,505,505,506,506,506,506,506,506,506,506,506,506,506,507,507,
749 507,507,507,507,507,507,507,507,507,508,508,508,508,508,508,508,508,508,508,509,
750 509,509,509,509,509,509,509,509,509,509,510,510,510,510,510,510,510,510,510,510,
751 510,511,511,511,511,511,511,511,511,511,511,512,512,512,512,512 };
753 static const int order[32] =
754 { 0, 1, 16, 17, 8, 9, 24, 25, 4, 5, 20, 21, 12, 13, 28, 29,
755 2, 3, 18, 19,10,11, 26, 27, 6, 7, 22, 23, 14, 15, 30, 31 };
757 static const unsigned long sampr_index[2][3] =
758 { { 22050, 24000, 16000 }, /* MPEG 2 */
759 { 44100, 48000, 32000 } }; /* MPEG 1 */
761 static const long bitr_index[2][15] =
762 { {0, 8,16,24,32,40,48,56, 64, 80, 96,112,128,144,160}, /* MPEG 2 */
763 {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320} }; /* MPEG 1 */
765 static const int num_bands[3][15] =
766 { {0,10,10,10,10,12,14,16, 20, 22, 24, 26, 28, 30, 32},
767 {0,10,10,10,10,10,12,14, 18, 24, 26, 28, 30, 32, 32},
768 {0,10,12,14,18,24,26,28, 30, 32, 32, 32, 32, 32, 32} };
770 static const int cx_const[9] =
771 { 16135, 10531, 5604, 15396, -2845,-12551, 14189, 8192, 16384 };
773 static const int ca_const[8] =
774 {-16859,-15458,-10269, -5961, -3099, -1342, -465, -121 };
776 static const int cs_const[8] =
777 { 28098, 28893, 31117, 32221, 32621, 32740, 32765, 32768 };
779 static const short enwindow_const[15*27+24] =
780 { 0, 65, 593, 1766, 22228, 2115, 611, 62,
781 8, 119, 1419, 10564,-11659,-1635,-154, -9,
782 -8, -119,-1419,-10564, 11659, 1635, 154, 9, 464, 100, 91,
783 0, 69, 604, 1635, 23148, 2363, 643, 62,
784 7, 107, 1368, 10449,-12733,-1818,-180,-11,
785 -7, -107,-1368,-10449, 12733, 1818, 180, 11, 420, 200, 164,
786 0, 72, 608, 1465, 23979, 2600, 671, 63,
787 7, 94, 1305, 10265,-13818,-2004,-207,-12,
788 -7, -94,-1305,-10265, 13818, 2004, 207, 12, 380, 297, 220,
789 0, 76, 606, 1256, 24718, 2825, 693, 63,
790 6, 81, 1232, 10016,-14908,-2192,-236,-14,
791 -6, -81,-1232,-10016, 14908, 2192, 236, 14, 342, 392, 262,
792 0, 78, 597, 1007, 25359, 3033, 712, 63,
793 6, 68, 1150, 9706,-15995,-2380,-267,-15,
794 -6, -68,-1150, -9706, 15995, 2380, 267, 15, 307, 483, 289,
795 0, 80, 580, 719, 25901, 3224, 726, 62,
796 6, 54, 1060, 9343,-17072,-2565,-299,-17,
797 -6, -54,-1060, -9343, 17072, 2565, 299, 17, 274, 569, 304,
798 -1, 82, 555, 391, 26339, 3395, 735, 61,
799 5, 40, 963, 8930,-18131,-2747,-332,-19,
800 -5, -40, -963, -8930, 18131, 2747, 332, 19, 242, 650, 307,
801 -1, 83, 523, 26, 26672, 3545, 740, 60,
802 5, 27, 861, 8474,-19164,-2923,-366,-21,
803 -5, -27, -861, -8474, 19164, 2923, 366, 21, 212, 724, 300,
804 -1, 83, 482, -376, 26900, 3672, 739, 58,
805 4, 14, 756, 7981,-20163,-3092,-401,-24,
806 -4, -14, -756, -7981, 20163, 3092, 401, 24, 183, 792, 283,
807 -1, 82, 433, -812, 27022, 3776, 735, 56,
808 4, 1, 648, 7456,-21122,-3250,-435,-26,
809 -4, -1, -648, -7456, 21122, 3250, 435, 26, 155, 851, 258,
810 -1, 81, 376, -1281, 27038, 3855, 726, 54,
811 3, -11, 539, 6907,-22032,-3397,-470,-28,
812 -3, 11, -539, -6907, 22032, 3397, 470, 28, 128, 903, 226,
813 -1, 78, 312, -1778, 26951, 3910, 713, 52,
814 3, -22, 430, 6338,-22887,-3530,-503,-31,
815 -3, 22, -430, -6338, 22887, 3530, 503, 31, 102, 946, 188,
816 -2, 75, 239, -2302, 26761, 3941, 696, 49,
817 3, -33, 322, 5757,-23678,-3648,-537,-34,
818 -3, 33, -322, -5757, 23678, 3648, 537, 34, 76, 980, 145,
819 -2, 70, 160, -2848, 26472, 3948, 676, 47,
820 3, -42, 217, 5167,-24399,-3749,-568,-36,
821 -3, 42, -217, -5167, 24399, 3749, 568, 36, 50, 1004, 99,
822 -2, 65, 74, -3412, 26087, 3931, 653, 44,
823 2, -51, 115, 4577,-25045,-3830,-599,-39,
824 -2, 51, -115, -4577, 25045, 3830, 599, 39, 25, 1019, 50,
826 25610,3891,627,42,-3990,-18,58,-2,
827 21226,-21226,10604,-10604,1860,-1860,1458,-1458,576,-576,130,-130,60,-60,8,-8
830 static const int win_const[18][4] = {
831 { -3072, -134, -146, 3352 },
832 { -2747, -362, -471, 3579 },
833 { -2387, -529, -831, 3747 },
834 { -2004, -632,-1214, 3850 },
835 { -1609, -666,-1609, 3884 },
836 { -1214, -632,-2004, 3850 },
837 { -831, -529,-2387, 3747 },
838 { -471, -362,-2747, 3579 },
839 { -146, -134,-3072, 3352 },
840 { 134,-3072,-3352, -146 },
841 { 362,-2747,-3579, -471 },
842 { 529,-2387,-3747, -831 },
843 { 632,-2004,-3850,-1214 },
844 { 666,-1609,-3884,-1609 },
845 { 632,-1214,-3850,-2004 },
846 { 529, -831,-3747,-2387 },
847 { 362, -471,-3579,-2747 },
848 { 134, -146,-3352,-3072 } };
850 /* forward declarations */
851 static int HuffmanCode( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table);
852 static int HuffmanCod1( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table);
853 static void putbits(uint32_t val, uint32_t nbit);
854 static int find_best_2( short *ix, uint32_t start, uint32_t end, const uint32_t *table,
855 uint32_t len, int *bits);
856 static int find_best_3( short *ix, uint32_t start, uint32_t end, const uint32_t *table,
857 uint32_t len, int *bits);
858 static int count_bit1 ( short *ix, uint32_t start, uint32_t end, int *bits );
859 static int count_bigv ( short *ix, uint32_t start, uint32_t end, int table0, int table1,
860 int *bits);
862 /* implementations */
863 static void encodeSideInfo( side_info_t si[2][2] )
865 int gr, ch, header;
866 uint32_t cc=0, sz=0;
869 * MPEG header layout:
870 * AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM
871 * A (31-21) = frame sync
872 * B (20-19) = MPEG type
873 * C (18-17) = MPEG layer
874 * D (16) = protection bit
875 * E (15-12) = bitrate index
876 * F (11-10) = samplerate index
877 * G (9) = padding bit
878 * H (8) = private bit
879 * I (7-6) = channel mode
880 * J (5-4) = mode extension (jstereo only)
881 * K (3) = copyright bit
882 * L (2) = original
883 * M (1-0) = emphasis
886 header = (0xfff00000) | /* frame sync (AAAAAAAAA AAA)
887 mp3 type (upper): 1 (B) */
888 (0x01 << 17) | /* mp3 layer: 01 (CC) */
889 ( 0x1 << 16) | /* mp3 crc: 1 (D) */
890 ( 0x1 << 2); /* mp3 org: 1 (L) */
891 header |= cfg.mpg.type << 19;
892 header |= cfg.mpg.bitr_id << 12;
893 header |= cfg.mpg.smpl_id << 10;
894 header |= cfg.mpg.padding << 9;
895 header |= cfg.mpg.mode << 6;
896 /* no emphasis (bits 0-1) */
897 putbits( header, 32 );
899 if(cfg.mpg.type == 1)
900 { /* MPEG1 */
901 if(cfg.channels == 2) { putlong( 0, 20); }
902 else { putlong( 0, 18); }
904 for(gr=0; gr<cfg.granules; gr++)
905 for(ch=0; ch<cfg.channels; ch++)
907 side_info_t *gi = &si[gr][ch];
909 putlong((gi->part2_3_length+42),12 ); /* add scale_facs array size */
910 putlong( gi->address3>>1, 9 );
911 putlong( gi->global_gain, 8 );
912 putlong( 9, 4 ); /* set scale_facs compr type */
913 putlong( gi->table_select[0], 6 );
914 putlong( gi->table_select[1], 5 );
915 putlong( gi->table_select[2], 5 );
916 putlong( gi->region_0_1, 7 );
917 putlong( 1 , 2 ); /* set scale_facs to 1bit */
918 putlong( gi->table_select[3], 1 );
921 else
922 { /* MPEG2 */
923 if(cfg.channels == 2) { putlong( 0, 10); }
924 else { putlong( 0, 9); }
926 for(ch=0; ch<cfg.channels; ch++)
928 side_info_t *gi = &si[0][ch];
930 putlong((gi->part2_3_length+42),12 ); /* add scale_facs array size */
931 putlong( gi->address3>>1, 9 );
932 putlong( gi->global_gain, 8 );
933 putlong( 0xCA, 9 ); /* set scale_facs compr type */
934 putlong( gi->table_select[0], 6 );
935 putlong( gi->table_select[1], 5 );
936 putlong( gi->table_select[2], 5 );
937 putlong( gi->region_0_1 , 7 );
938 putlong( 1 , 1 ); /* set scale_facs to 1bit */
939 putlong( gi->table_select[3], 1 );
942 /* flush remaining bits */
943 putbits(cc, sz);
946 /* Note the discussion of huffmancodebits() on pages 28 and 29 of the IS,
947 as well as the definitions of the side information on pages 26 and 27. */
948 static void Huffmancodebits( short *ix, char *xr_sign, side_info_t *gi )
950 int region1 = gi->address1;
951 int region2 = gi->address2;
952 int bigvals = gi->address3;
953 int count1 = bigvals + (gi->count1 << 2);
954 int stuffBits = 0;
955 int bits = 0;
956 int i, v;
958 for(i=v=0; i<32; i+=2)
959 v |= band_scale_f[i>>1] << (30-i);
960 putbits(v, 32); // store scale_facs (part1)
962 for(v=0; i<42; i+=2)
963 v |= band_scale_f[i>>1] << (40-i);
964 putbits(v, 10); // store scale_facs (part2)
966 if(region1 > 0)
967 bits += HuffmanCode(ix, xr_sign, 0 , region1, gi->table_select[0]);
969 if(region2 > region1)
970 bits += HuffmanCode(ix, xr_sign, region1, region2, gi->table_select[1]);
972 if(bigvals > region2)
973 bits += HuffmanCode(ix, xr_sign, region2, bigvals, gi->table_select[2]);
975 if(count1 > bigvals)
976 bits += HuffmanCod1(ix, xr_sign, bigvals, count1, gi->table_select[3]);
978 if((stuffBits = gi->part2_3_length - bits) > 0)
980 int stuffWords = stuffBits >> 5;
981 int remainBits = stuffBits & 31;
983 if( remainBits )
984 putbits( ~0, remainBits );
986 while( stuffWords-- )
987 putbits( ~0, 32 ); /* Huffman code tables leed to padding ones */
991 int HuffmanCod1( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int tbl)
993 uint32_t cc=0, sz=0;
994 uint32_t i, d, p;
995 int sumbit=0, s=0, l=0, v, w, x, y;
996 #define sgnv xr_sign[i+0]
997 #define sgnw xr_sign[i+1]
998 #define sgnx xr_sign[i+2]
999 #define sgny xr_sign[i+3]
1001 for(i=begin; i<end; i+=4)
1003 v = ix[i+0];
1004 w = ix[i+1];
1005 x = ix[i+2];
1006 y = ix[i+3];
1007 p = (v << 3) + (w << 2) + (x << 1) + y;
1009 switch(p)
1011 case 0: l=0; s = 0; break;
1012 case 1: l=1; s = sgny; break;
1013 case 2: l=1; s = sgnx; break;
1014 case 3: l=2; s = (sgnx << 1) + sgny; break;
1015 case 4: l=1; s = sgnw; break;
1016 case 5: l=2; s = (sgnw << 1) + sgny; break;
1017 case 6: l=2; s = (sgnw << 1) + sgnx; break;
1018 case 7: l=3; s = (sgnw << 2) + (sgnx << 1) + sgny; break;
1019 case 8: l=1; s = sgnv; break;
1020 case 9: l=2; s = (sgnv << 1) + sgny; break;
1021 case 10: l=2; s = (sgnv << 1) + sgnx; break;
1022 case 11: l=3; s = (sgnv << 2) + (sgnx << 1) + sgny; break;
1023 case 12: l=2; s = (sgnv << 1) + sgnw; break;
1024 case 13: l=3; s = (sgnv << 2) + (sgnw << 1) + sgny; break;
1025 case 14: l=3; s = (sgnv << 2) + (sgnw << 1) + sgnx; break;
1026 case 15: l=4; s = (sgnv << 3) + (sgnw << 2) + (sgnx << 1) + sgny; break;
1029 d = (ht_count[tbl][0][p] << l) + s;
1030 l = ht_count[tbl][1][p];
1031 putlong( d, l );
1032 sumbit += l;
1035 /* flush remaining bits */
1036 putbits(cc, sz);
1038 return sumbit;
1041 /* Implements the pseudocode of page 98 of the IS */
1042 int HuffmanCode(short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table)
1044 uint32_t cc=0, sz=0, code;
1045 uint32_t i, xl=0, yl=0, idx;
1046 int x, y, bit, sumbit=0;
1047 #define sign_x xr_sign[i+0]
1048 #define sign_y xr_sign[i+1]
1050 if(table == 0)
1051 return 0;
1053 if( table > 15 )
1054 { /* ESC-table is used */
1055 uint32_t linbits = ht_big[table-16].linbits;
1056 uint16_t *hffcode = table < 24 ? t16HB : t24HB;
1057 uint8_t *hlen = table < 24 ? t16l : t24l;
1059 for(i=begin; i<end; i+=2)
1061 x = ix[ i ];
1062 y = ix[i+1];
1064 if(x > 14) { xl = x - 15; x = 15; }
1065 if(y > 14) { yl = y - 15; y = 15; }
1067 idx = x * 16 + y;
1068 code = hffcode[idx];
1069 bit = hlen [idx];
1071 if(x)
1073 if(x > 14)
1075 code = (code << linbits) | xl;
1076 bit += linbits;
1079 code = (code << 1) | sign_x;
1080 bit += 1;
1083 if(y)
1085 if(y > 14)
1087 if(bit + linbits + 1 > 32)
1089 putlong( code, bit );
1090 sumbit += bit;
1091 code = bit = 0;
1094 code = (code << linbits) | yl;
1095 bit += linbits;
1098 code = (code << 1) | sign_y;
1099 bit += 1;
1102 putlong( code, bit );
1103 sumbit += bit;
1106 else
1107 { /* No ESC-words */
1108 const struct huffcodetab *h = &ht[table];
1110 for(i=begin; i<end; i+=2)
1112 x = ix[i];
1113 y = ix[i+1];
1115 idx = x * h->len + y;
1116 code = h->table[idx];
1117 bit = h->hlen [idx];
1119 if(x)
1121 code = (code << 1) | sign_x;
1122 bit += 1;
1125 if(y)
1127 code = (code << 1) | sign_y;
1128 bit += 1;
1131 putlong( code, bit );
1132 sumbit += bit;
1136 /* flush remaining bits */
1137 putbits(cc, sz);
1139 return sumbit;
1142 void putbits(uint32_t val, uint32_t nbit)
1144 int new_bitpos = CodedData.bitpos + nbit;
1145 int ptrpos = CodedData.bitpos >> 5;
1147 val = val & (0xffffffff >> (32 - nbit));
1149 /* data fit in one uint32_t */
1150 if(((new_bitpos - 1) >> 5) == ptrpos)
1151 CodedData.bbuf[ptrpos] |= val << ((32 - new_bitpos) & 31);
1152 else
1154 CodedData.bbuf[ptrpos ] |= val >> ((new_bitpos - 32) & 31);
1155 CodedData.bbuf[ptrpos+1] |= val << ((32 - new_bitpos) & 31);
1158 CodedData.bitpos = new_bitpos;
1161 /***************************************************************************/
1162 /* Choose the Huffman table that will encode ix[begin..end] with */
1163 /* the fewest bits. */
1164 /* Note: This code contains knowledge about the sizes and characteristic */
1165 /* of the Huffman tables as defined in the IS (Table B.7), and will not */
1166 /* work with any arbitrary tables. */
1167 /***************************************************************************/
1168 static int choose_table( short *ix, uint32_t begin, uint32_t end, int *bits )
1170 uint32_t i;
1171 int max, table0, table1;
1173 for(i=begin,max=0; i<end; i++)
1174 if(ix[i] > max)
1175 max = ix[i];
1177 if(max < 16)
1179 /* tables without linbits */
1180 /* indx: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
1181 /* len: 0, 2, 3, 3, 0, 4, 4, 6, 6, 6, 8, 8, 8, 16, 0, 16 */
1182 switch(max)
1184 case 0: return 0;
1185 case 1: return count_bit1(ix, begin, end, bits);
1186 case 2: return 2 + find_best_2(ix, begin, end, tab23, 3, bits);
1187 case 3: return 5 + find_best_2(ix, begin, end, tab56, 4, bits);
1188 case 4:
1189 case 5: return 7 + find_best_3(ix, begin, end, tab789, 6, bits);
1190 case 6:
1191 case 7: return 10 + find_best_3(ix, begin, end, tabABC, 8, bits);
1192 default: return 13 + find_best_2(ix, begin, end, tab1315, 16, bits) * 2;
1195 else
1197 /* tables with linbits */
1198 max -= 15;
1200 for(table0=0; table0<8; table0++)
1201 if(ht_big[table0].linmax >= max)
1202 break;
1204 for(table1=8; table1<16; table1++)
1205 if(ht_big[table1].linmax >= max)
1206 break;
1208 return 16 + count_bigv(ix, begin, end, table0, table1, bits);
1212 int find_best_2(short *ix, uint32_t start, uint32_t end, const uint32_t *table,
1213 uint32_t len, int *bits)
1215 uint32_t i, sum = 0;
1217 for(i=start; i<end; i+=2)
1218 sum += table[ix[i] * len + ix[i+1]];
1220 if((sum & 0xffff) <= (sum >> 16))
1222 *bits = (sum & 0xffff);
1223 return 1;
1225 else
1227 *bits = sum >> 16;
1228 return 0;
1232 int find_best_3(short *ix, uint32_t start, uint32_t end, const uint32_t *table,
1233 uint32_t len, int *bits)
1235 uint32_t i, j, sum = 0;
1236 int sum1 = 0;
1237 int sum2 = 0;
1238 int sum3 = 0;
1240 /* avoid overflow in packed additions: 78*13 < 1024 */
1241 for(i=start; i<end; )
1243 j = i + 2*78 > end ? end : i + 2*78;
1245 for(sum=0; i<j; i+=2)
1246 sum += table[ix[i] * len + ix[i+1]];
1248 sum1 += (sum >> 20);
1249 sum2 += (sum >> 10) & 0x3ff;
1250 sum3 += (sum >> 0) & 0x3ff;
1253 i = 0;
1254 if(sum1 > sum2) { sum1 = sum2; i = 1; }
1255 if(sum1 > sum3) { sum1 = sum3; i = 2; }
1257 *bits = sum1;
1259 return i;
1262 /*************************************************************************/
1263 /* Function: Count the number of bits necessary to code the subregion. */
1264 /*************************************************************************/
1265 int count_bit1(short *ix, uint32_t start, uint32_t end, int *bits )
1267 uint32_t i, sum = 0;
1269 for(i=start; i<end; i+=2)
1270 sum += t1l[4 + ix[i] * 2 + ix[i+1]];
1272 *bits = sum;
1274 return 1; /* this is table1 */
1277 int count_bigv(short *ix, uint32_t start, uint32_t end, int table0,
1278 int table1, int *bits )
1280 uint32_t i, sum0, sum1, sum=0, bigv=0, x, y;
1282 /* ESC-table is used */
1283 for(i=start; i<end; i+=2)
1285 x = ix[i];
1286 y = ix[i+1];
1288 if(x > 14) { x = 15; bigv++; }
1289 if(y > 14) { y = 15; bigv++; }
1291 sum += tab1624[x * 16 + y];
1294 sum0 = (sum >> 16) + bigv * ht_big[table0].linbits;
1295 sum1 = (sum & 0xffff) + bigv * ht_big[table1].linbits;
1297 if(sum0 <= sum1)
1299 *bits = sum0;
1300 return table0;
1302 else
1304 *bits = sum1;
1305 return table1;
1309 /*************************************************************************/
1310 /* Function: Calculation of rzero, count1, address3 */
1311 /* (Partitions ix into big values, quadruples and zeros). */
1312 /*************************************************************************/
1313 static int calc_runlen( short *ix, side_info_t *si )
1315 int p, i, sum = 0;
1317 for(i=SAMPL2; i-=2; )
1318 if(*(uint32_t*)&ix[i-2]) /* !!!! short *ix; !!!!! */
1319 break;
1321 si->count1 = 0;
1323 for( ; i>3; i-=4)
1325 int v = ix[i-1];
1326 int w = ix[i-2];
1327 int x = ix[i-3];
1328 int y = ix[i-4];
1330 if((v | w | x | y) <= 1)
1332 p = (y<<3) + (x<<2) + (w<<1) + (v);
1334 sum += tab01[p];
1336 si->count1++;
1338 else break;
1341 si->address3 = i;
1343 if((sum >> 16) < (sum & 0xffff))
1345 si->table_select[3] = 0;
1346 return sum >> 16;
1348 else
1350 si->table_select[3] = 1;
1351 return sum & 0xffff;
1356 /*************************************************************************/
1357 /* Function: Quantization of the vector xr ( -> ix) */
1358 /*************************************************************************/
1359 static int quantize_int(int *xr, short *ix, side_info_t *si)
1361 unsigned int i, idx, s, frac_pow[] = { 0x10000, 0xd745, 0xb505, 0x9838 };
1363 s = frac_pow[si->quantStep & 3] >> si->quantStep / 4;
1365 /* check for possible 'out of range' values */
1366 if(((si->max_val + 256) >> 8) * s >= (65536 << 8))
1367 return 0;
1369 if(((si->max_val + 256) >> 8) * s < (4096 << 8))
1370 { /* all values fit the table size */
1371 for(i=SAMPL2; i--; )
1372 ix[i] = int2idx[(xr[i] * s + 0x8000) >> 16];
1374 else
1375 { /* check each index wether it fits the table */
1376 for(i=SAMPL2; i--; )
1378 idx = (xr[i] * s + 0x08000) >> 16;
1380 if(idx > 4095) ix[i] = int2idx[(idx + 8) >> 4] << 3;
1381 else ix[i] = int2idx[idx];
1385 return 1;
1388 /*************************************************************************/
1389 /* subdivides the bigvalue region which will use separate Huffman tables */
1390 /*************************************************************************/
1391 static void subdivide(side_info_t *si)
1393 int scfb, count0, count1;
1395 if( !si->address3 )
1396 { /* no bigvalue region */
1397 si->region_0_1 = 0;
1398 si->address1 = 0;
1399 si->address2 = 0;
1401 else
1403 /* Calculate scale factor band index */
1404 for(scfb=0; scalefac[scfb] < si->address3; )
1405 scfb++;
1407 count0 = subdv_table[scfb].region0_cnt;
1408 count1 = subdv_table[scfb].region1_cnt;
1410 si->region_0_1 = (count0 << 3) | count1;
1411 si->address1 = scalefac[count0 + 1];
1412 si->address2 = scalefac[count0 + 1 + count1 + 1];
1416 /*******************************************************************/
1417 /* Count the number of bits necessary to code the bigvalues region */
1418 /*******************************************************************/
1419 static int bigv_bitcount(short *ix, side_info_t *gi)
1421 int b1=0, b2=0, b3=0;
1423 /* Select huffman code tables for bigvalues regions */
1424 gi->table_select[0] = 0;
1425 gi->table_select[1] = 0;
1426 gi->table_select[2] = 0;
1428 if( gi->address1 > 0 ) /* region0 */
1429 gi->table_select[0] = choose_table(ix, 0 , gi->address1, &b1);
1431 if( gi->address2 > gi->address1 ) /* region1 */
1432 gi->table_select[1] = choose_table(ix, gi->address1, gi->address2, &b2);
1434 if( gi->address3 > gi->address2 ) /* region2 */
1435 gi->table_select[2] = choose_table(ix, gi->address2, gi->address3, &b3);
1437 return b1+b2+b3;
1440 static int quantize_and_count_bits(int *xr, short *ix, side_info_t *si)
1442 int bits = 10000;
1444 if(quantize_int(xr, ix, si))
1446 bits = calc_runlen(ix, si); /* rzero,count1,address3 */
1447 subdivide(si); /* bigvalues sfb division */
1448 bits += bigv_bitcount(ix,si); /* bit count */
1451 return bits;
1454 /************************************************************************/
1455 /* The code selects the best quantStep for a particular set of scalefacs*/
1456 /************************************************************************/
1457 static int inner_loop(int *xr, int max_bits, side_info_t *si)
1459 int bits;
1461 while((bits=quantize_and_count_bits(xr, enc_data, si)) < max_bits-64)
1463 if(si->quantStep == 0)
1464 break;
1466 if(si->quantStep <= 2)
1467 si->quantStep = 0;
1468 else
1469 si->quantStep -= 2;
1472 while(bits > max_bits)
1474 si->quantStep++;
1475 bits = quantize_and_count_bits(xr, enc_data, si);
1478 return bits;
1481 static void iteration_loop(int *xr, side_info_t *si, int gr_cnt)
1483 int remain, tar_bits, max_bits = cfg.mean_bits;
1485 /* distribute reserved bits to remaining granules */
1486 tar_bits = max_bits + (cfg.ResvSize / gr_cnt & ~7);
1487 if(tar_bits > max_bits + max_bits/2)
1488 tar_bits = max_bits + max_bits/2;
1490 si->part2_3_length = inner_loop(xr, tar_bits, si);
1491 si->global_gain = si->quantStep + 142 - si->additStep;
1493 /* unused bits of the reservoir can be used for remaining granules */
1494 cfg.ResvSize += max_bits - si->part2_3_length;
1496 /* end: distribute the reserved bits to one or two granules */
1497 if(gr_cnt == 1)
1499 si->part2_3_length += cfg.ResvSize;
1500 /* mp3 format allows max 12bits for granule length */
1501 if(si->part2_3_length > 4092)
1503 remain = (si->part2_3_length - 4092 + 31) >> 5;
1504 si->part2_3_length -= remain << 5;
1505 si[-1].part2_3_length += remain << 5;
1507 while(remain--)
1508 putbits(~0, 32);
1513 /* returns sum_j=0^31 a[j]*cos(PI*j*(k+1/2)/32), 0<=k<32 */
1514 static void window_subband1(short *wk, int sb0[SBLIMIT], int sb1[SBLIMIT])
1516 int k, i, u, v;
1517 short *wp, *x1, *x2;
1519 #ifdef CPU_COLDFIRE
1520 int s0, s1, t0, t1;
1522 for(k=0; k<18; k++, wk+=64, sb0+=SBLIMIT, sb1+=SBLIMIT)
1524 wp = enwindow;
1525 x1 = wk;
1526 x2 = x1 - 124;
1528 for(i=-15; i<0; i++)
1530 asm volatile(
1531 "move.l (-224*4,%[x2]), %%d4\n" /* d4 = x2[-224] */
1532 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1533 "mac.w %%d0u, %%d4u, %%acc0\n"
1534 "mac.w %%d0u, %%d4l, (-160*4,%[x2]), %%d4, %%acc1\n"
1535 "mac.w %%d0l, %%d4u, %%acc0\n"
1536 "mac.w %%d0l, %%d4l, ( -96*4,%[x2]), %%d4, %%acc1\n"
1537 "mac.w %%d1u, %%d4u, %%acc0\n"
1538 "mac.w %%d1u, %%d4l, ( -32*4,%[x2]), %%d4, %%acc1\n"
1539 "mac.w %%d1l, %%d4u, %%acc0\n"
1540 "mac.w %%d1l, %%d4l, ( 32*4,%[x2]), %%d4, %%acc1\n"
1541 "mac.w %%d2u, %%d4u, %%acc0\n"
1542 "mac.w %%d2u, %%d4l, ( 96*4,%[x2]), %%d4, %%acc1\n"
1543 "mac.w %%d2l, %%d4u, %%acc0\n"
1544 "mac.w %%d2l, %%d4l, ( 160*4,%[x2]), %%d4, %%acc1\n"
1545 "mac.w %%d3u, %%d4u, %%acc0\n"
1546 "mac.w %%d3u, %%d4l, ( 224*4,%[x2]), %%d4, %%acc1\n"
1547 "mac.w %%d3l, %%d4u, %%acc0\n"
1548 "mac.w %%d3l, %%d4l, (-256*4,%[x1]), %%d4, %%acc1\n"
1549 "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */
1550 "mac.w %%d0u, %%d4u, %%acc0\n"
1551 "mac.w %%d0u, %%d4l, (-192*4,%[x1]), %%d4, %%acc1\n"
1552 "mac.w %%d0l, %%d4u, %%acc0\n"
1553 "mac.w %%d0l, %%d4l, (-128*4,%[x1]), %%d4, %%acc1\n"
1554 "mac.w %%d1u, %%d4u, %%acc0\n"
1555 "mac.w %%d1u, %%d4l, ( -64*4,%[x1]), %%d4, %%acc1\n"
1556 "mac.w %%d1l, %%d4u, %%acc0\n"
1557 "mac.w %%d1l, %%d4l, ( 0*4,%[x1]), %%d4, %%acc1\n"
1558 "mac.w %%d2u, %%d4u, %%acc0\n"
1559 "mac.w %%d2u, %%d4l, ( 64*4,%[x1]), %%d4, %%acc1\n"
1560 "mac.w %%d2l, %%d4u, %%acc0\n"
1561 "mac.w %%d2l, %%d4l, ( 128*4,%[x1]), %%d4, %%acc1\n"
1562 "mac.w %%d3u, %%d4u, %%acc0\n"
1563 "mac.w %%d3u, %%d4l, ( 192*4,%[x1]), %%d4, %%acc1\n"
1564 "mac.w %%d3l, %%d4u, %%acc0\n"
1565 "mac.w %%d3l, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n"
1566 "movclr.l %%acc0, %%d0\n"
1567 "move.l %%d0, %[s0]\n"
1568 "movclr.l %%acc1, %%d0\n"
1569 "move.l %%d0, %[s1]\n"
1571 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1572 "mac.w %%d0u, %%d4u, %%acc0\n"
1573 "mac.w %%d0u, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n"
1574 "mac.w %%d0l, %%d4u, %%acc0\n"
1575 "mac.w %%d0l, %%d4l, ( 96*4,%[x1]), %%d4, %%acc1\n"
1576 "mac.w %%d1u, %%d4u, %%acc0\n"
1577 "mac.w %%d1u, %%d4l, ( 32*4,%[x1]), %%d4, %%acc1\n"
1578 "mac.w %%d1l, %%d4u, %%acc0\n"
1579 "mac.w %%d1l, %%d4l, ( -32*4,%[x1]), %%d4, %%acc1\n"
1580 "mac.w %%d2u, %%d4u, %%acc0\n"
1581 "mac.w %%d2u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n"
1582 "mac.w %%d2l, %%d4u, %%acc0\n"
1583 "mac.w %%d2l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n"
1584 "mac.w %%d3u, %%d4u, %%acc0\n"
1585 "mac.w %%d3u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n"
1586 "mac.w %%d3l, %%d4u, %%acc0\n"
1587 "mac.w %%d3l, %%d4l, ( 256*4,%[x2]), %%d4, %%acc1\n"
1588 "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */
1589 "mac.w %%d0u, %%d4u, %%acc0\n"
1590 "mac.w %%d0u, %%d4l, ( 192*4,%[x2]), %%d4, %%acc1\n"
1591 "mac.w %%d0l, %%d4u, %%acc0\n"
1592 "mac.w %%d0l, %%d4l, ( 128*4,%[x2]), %%d4, %%acc1\n"
1593 "mac.w %%d1u, %%d4u, %%acc0\n"
1594 "mac.w %%d1u, %%d4l, ( 64*4,%[x2]), %%d4, %%acc1\n"
1595 "mac.w %%d1l, %%d4u, %%acc0\n"
1596 "mac.w %%d1l, %%d4l, ( 0*4,%[x2]), %%d4, %%acc1\n"
1597 "mac.w %%d2u, %%d4u, %%acc0\n"
1598 "mac.w %%d2u, %%d4l, ( -64*4,%[x2]), %%d4, %%acc1\n"
1599 "mac.w %%d2l, %%d4u, %%acc0\n"
1600 "mac.w %%d2l, %%d4l, (-128*4,%[x2]), %%d4, %%acc1\n"
1601 "mac.w %%d3u, %%d4u, %%acc0\n"
1602 "mac.w %%d3u, %%d4l, (-192*4,%[x2]), %%d4, %%acc1\n"
1603 "mac.w %%d3l, %%d4u, %%acc0\n"
1604 "mac.w %%d3l, %%d4l, %%acc1\n"
1605 "movclr.l %%acc0, %%d0\n"
1606 "move.l %%d0, %[t0]\n"
1607 "movclr.l %%acc1, %%d0\n"
1608 "move.l %%d0, %[t1]\n"
1610 : [x1] "+a" (x1), [x2] "+a" (x2), [s0] "+m" (s0), [t0] "+m" (t0),
1611 [s1] "+m" (s1), [t1] "+m" (t1)
1612 : [wp] "a" (wp) : "d0", "d1", "d2", "d3", "d4");
1614 sb0[30+i*2] = shft4(t0) + shft13(s0) * wp[24];
1615 sb0[31+i*2] = shft13(t0) * wp[25] - shft13(s0) * wp[26];
1616 sb1[30+i*2] = shft4(t1) + shft13(s1) * wp[24];
1617 sb1[31+i*2] = shft13(t1) * wp[25] - shft13(s1) * wp[26];
1618 wp += 27;
1619 x1 -= 2;
1620 x2 += 2;
1623 asm volatile(
1624 "move.l ( -32*4,%[x1]), %%d4\n" /* d4 = x1[-32] */
1625 "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
1627 "mac.w %%d0u, %%d4u, %%acc0\n"
1628 "mac.w %%d0u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n"
1629 "mac.w %%d0l, %%d4u, %%acc0\n"
1630 "mac.w %%d0l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n"
1631 "mac.w %%d1u, %%d4u, %%acc0\n"
1632 "mac.w %%d1u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n"
1633 "mac.w %%d1l, %%d4u, %%acc0\n"
1634 "mac.w %%d1l, %%d4l, ( 32*4,%[x1]), %%d4, %%acc1\n"
1635 "mac.w %%d2u, %%d4u, %%acc0\n"
1636 "mac.w %%d2u, %%d4l, ( 96*4,%[x1]), %%d4, %%acc1\n"
1637 "mac.w %%d2l, %%d4u, %%acc0\n"
1638 "mac.w %%d2l, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n"
1639 "mac.w %%d3u, %%d4u, %%acc0\n"
1640 "mac.w %%d3u, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n"
1641 "mac.w %%d3l, %%d4u, %%acc0\n"
1642 "mac.w %%d3l, %%d4l, ( -16*4,%[x1]), %%d4, %%acc1\n"
1643 "movclr.l %%acc0, %%d0\n"
1644 "move.l %%d0, %[s0]\n"
1645 "movclr.l %%acc1, %%d0\n"
1646 "move.l %%d0, %[s1]\n"
1648 "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */
1649 "mac.w %%d0u, %%d4u, %%acc0\n"
1650 "mac.w %%d0u, %%d4l, ( -48*4,%[x1]), %%d4, %%acc1\n"
1651 "mac.w %%d1u, %%d4u, %%acc0\n"
1652 "mac.w %%d1u, %%d4l, ( 16*4,%[x1]), %%d4, %%acc1\n"
1653 "mac.w %%d1l, %%d4u, %%acc0\n"
1654 "mac.w %%d1l, %%d4l, ( -80*4,%[x1]), %%d4, %%acc1\n"
1655 "mac.w %%d2u, %%d4u, %%acc0\n"
1656 "mac.w %%d2u, %%d4l, ( 48*4,%[x1]), %%d4, %%acc1\n"
1657 "mac.w %%d2u, %%d4u, %%acc0\n"
1658 "mac.w %%d2u, %%d4l, (-112*4,%[x1]), %%d4, %%acc1\n"
1659 "mac.w %%d3u, %%d4u, %%acc0\n"
1660 "mac.w %%d3u, %%d4l, ( 80*4,%[x1]), %%d4, %%acc1\n"
1661 "mac.w %%d3l, %%d4u, %%acc0\n"
1662 "mac.w %%d3l, %%d4l, (-144*4,%[x1]), %%d4, %%acc1\n"
1663 "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */
1664 "mac.w %%d0u, %%d4u, %%acc0\n"
1665 "mac.w %%d0u, %%d4l, ( 112*4,%[x1]), %%d4, %%acc1\n"
1666 "mac.w %%d0u, %%d4u, %%acc0\n"
1667 "mac.w %%d0u, %%d4l, (-176*4,%[x1]), %%d4, %%acc1\n"
1668 "mac.w %%d1u, %%d4u, %%acc0\n"
1669 "mac.w %%d1u, %%d4l, ( 144*4,%[x1]), %%d4, %%acc1\n"
1670 "mac.w %%d1l, %%d4u, %%acc0\n"
1671 "mac.w %%d1l, %%d4l, (-208*4,%[x1]), %%d4, %%acc1\n"
1672 "mac.w %%d2u, %%d4u, %%acc0\n"
1673 "mac.w %%d2u, %%d4l, ( 176*4,%[x1]), %%d4, %%acc1\n"
1674 "mac.w %%d2u, %%d4u, %%acc0\n"
1675 "mac.w %%d2u, %%d4l, (-240*4,%[x1]), %%d4, %%acc1\n"
1676 "mac.w %%d3u, %%d4u, %%acc0\n"
1677 "mac.w %%d3u, %%d4l, ( 208*4,%[x1]), %%d4, %%acc1\n"
1678 "mac.w %%d3l, %%d4u, %%acc0\n"
1679 "mac.w %%d3l, %%d4l, %%acc1\n"
1680 "movclr.l %%acc0, %%d0\n"
1681 "move.l %%d0, %[t0]\n"
1682 "movclr.l %%acc1, %%d0\n"
1683 "move.l %%d0, %[t1]\n"
1685 : [x1] "+a" (x1), [s0] "+m" (s0), [t0] "+m" (t0),
1686 [s1] "+m" (s1), [t1] "+m" (t1)
1687 : [wp] "a" (wp) : "d0", "d1", "d2", "d3", "d4");
1689 u = shft4(s0 - t0);
1690 v = shft4(s0 + t0);
1691 t0 = sb0[14];
1692 s0 = sb0[15] - t0;
1694 sb0[31] = v + t0; /* A0 */
1695 sb0[30] = u + s0; /* A1 */
1696 sb0[15] = u - s0; /* A2 */
1697 sb0[14] = v - t0; /* A3 */
1699 u = shft4(s1 - t1);
1700 v = shft4(s1 + t1);
1701 t1 = sb1[14];
1702 s1 = sb1[15] - t1;
1704 sb1[31] = v + t1; /* A0 */
1705 sb1[30] = u + s1; /* A1 */
1706 sb1[15] = u - s1; /* A2 */
1707 sb1[14] = v - t1; /* A3 */
1709 #else
1710 int ch, s, t, *a;
1712 for(ch=0; ch<cfg.channels; ch++)
1714 a = ch ? sb1 : sb0;
1715 for(k=0; k<18; k++, wk+=64, a+=SBLIMIT)
1717 wp = enwindow;
1718 x1 = wk;
1719 x2 = x1 - 124;
1721 /* x1[-572] .... x1[448] = 1022 */
1722 /* 18*4*16*32 */
1723 for(i=-15; i<0; i++)
1725 s = (int)x2[-224*2] * wp[ 0]; t = (int)x1[ 224*2] * wp[ 0];
1726 s += (int)x2[-160*2] * wp[ 1]; t += (int)x1[ 160*2] * wp[ 1];
1727 s += (int)x2[- 96*2] * wp[ 2]; t += (int)x1[ 96*2] * wp[ 2];
1728 s += (int)x2[- 32*2] * wp[ 3]; t += (int)x1[ 32*2] * wp[ 3];
1729 s += (int)x2[ 32*2] * wp[ 4]; t += (int)x1[- 32*2] * wp[ 4];
1730 s += (int)x2[ 96*2] * wp[ 5]; t += (int)x1[- 96*2] * wp[ 5];
1731 s += (int)x2[ 160*2] * wp[ 6]; t += (int)x1[-160*2] * wp[ 6];
1732 s += (int)x2[ 224*2] * wp[ 7]; t += (int)x1[-224*2] * wp[ 7];
1733 s += (int)x1[-256*2] * wp[ 8]; t += (int)x2[ 256*2] * wp[16];
1734 s += (int)x1[-192*2] * wp[ 9]; t += (int)x2[ 192*2] * wp[17];
1735 s += (int)x1[-128*2] * wp[10]; t += (int)x2[ 128*2] * wp[18];
1736 s += (int)x1[- 64*2] * wp[11]; t += (int)x2[ 64*2] * wp[19];
1737 s += (int)x1[ 0*2] * wp[12]; t += (int)x2[ 0*2] * wp[20];
1738 s += (int)x1[ 64*2] * wp[13]; t += (int)x2[- 64*2] * wp[21];
1739 s += (int)x1[ 128*2] * wp[14]; t += (int)x2[-128*2] * wp[22];
1740 s += (int)x1[ 192*2] * wp[15]; t += (int)x2[-192*2] * wp[23];
1742 a[30+i*2] = shft4(t) + shft13(s) * wp[24];
1743 a[31+i*2] = shft13(t) * wp[25] - shft13(s) * wp[26];
1744 wp += 27;
1745 x1 -= 2;
1746 x2 += 2;
1749 t = (int)x1[- 16*2] * wp[ 8]; s = (int)x1[ -32*2] * wp[0];
1750 t += ((int)x1[- 48*2]-x1[ 16*2]) * wp[10]; s += (int)x1[ -96*2] * wp[1];
1751 t += ((int)x1[- 80*2]+x1[ 48*2]) * wp[12]; s += (int)x1[-160*2] * wp[2];
1752 t += ((int)x1[-112*2]-x1[ 80*2]) * wp[14]; s += (int)x1[-224*2] * wp[3];
1753 t += ((int)x1[-144*2]+x1[112*2]) * wp[16]; s += (int)x1[ 32*2] * wp[4];
1754 t += ((int)x1[-176*2]-x1[144*2]) * wp[18]; s += (int)x1[ 96*2] * wp[5];
1755 t += ((int)x1[-208*2]+x1[176*2]) * wp[20]; s += (int)x1[ 160*2] * wp[6];
1756 t += ((int)x1[-240*2]-x1[208*2]) * wp[22]; s += (int)x1[ 224*2] * wp[7];
1758 u = shft4(s - t);
1759 v = shft4(s + t);
1760 t = a[14];
1761 s = a[15] - t;
1763 a[31] = v + t; /* A0 */
1764 a[30] = u + s; /* A1 */
1765 a[15] = u - s; /* A2 */
1766 a[14] = v - t; /* A3 */
1768 wk -= 18 * 64 - 1; /* rewind wk (to next channel start) */
1770 #endif
1773 static void window_subband2(short *x1, int a[SBLIMIT])
1775 int xr;
1776 short *wp = enwindow;
1777 short *x2 = x1 - 124;
1779 wp += 27 * 15;
1780 x1 -= 2 * 15;
1781 x2 += 2 * 15;
1783 xr = a[28] - a[0]; a[0] += a[28]; a[28] = shft9(xr) * wp[-2*27+25];
1784 xr = a[29] - a[1]; a[1] += a[29]; a[29] = shft9(xr) * wp[-2*27+25];
1785 xr = a[26] - a[2]; a[2] += a[26]; a[26] = shft9(xr) * wp[-4*27+25];
1786 xr = a[27] - a[3]; a[3] += a[27]; a[27] = shft9(xr) * wp[-4*27+25];
1787 xr = a[24] - a[4]; a[4] += a[24]; a[24] = shft9(xr) * wp[-6*27+25];
1788 xr = a[25] - a[5]; a[5] += a[25]; a[25] = shft9(xr) * wp[-6*27+25];
1789 xr = a[22] - a[6]; a[6] += a[22]; a[22] = shft9(xr) * SQRT ;
1790 xr = a[23] - a[7]; a[7] += a[23]; a[23] = shft9(xr) * SQRT - a[7];
1791 a[ 7] -= a[ 6];
1792 a[22] -= a[ 7];
1793 a[23] -= a[22];
1795 xr = a[ 6]; a[ 6] = a[31] - xr; a[31] = a[31] + xr;
1796 xr = a[ 7]; a[ 7] = a[30] - xr; a[30] = a[30] + xr;
1797 xr = a[22]; a[22] = a[15] - xr; a[15] = a[15] + xr;
1798 xr = a[23]; a[23] = a[14] - xr; a[14] = a[14] + xr;
1800 xr = a[20] - a[ 8]; a[ 8] += a[20]; a[20] = shft9(xr) * wp[-10*27+25];
1801 xr = a[21] - a[ 9]; a[ 9] += a[21]; a[21] = shft9(xr) * wp[-10*27+25];
1802 xr = a[18] - a[10]; a[10] += a[18]; a[18] = shft9(xr) * wp[-12*27+25];
1803 xr = a[19] - a[11]; a[11] += a[19]; a[19] = shft9(xr) * wp[-12*27+25];
1804 xr = a[16] - a[12]; a[12] += a[16]; a[16] = shft9(xr) * wp[-14*27+25];
1805 xr = a[17] - a[13]; a[13] += a[17]; a[17] = shft9(xr) * wp[-14*27+25];
1806 xr =-a[20] + a[24]; a[20] += a[24]; a[24] = shft9(xr) * wp[-12*27+25];
1807 xr =-a[21] + a[25]; a[21] += a[25]; a[25] = shft9(xr) * wp[-12*27+25];
1808 xr = a[ 4] - a[ 8]; a[ 4] += a[ 8]; a[ 8] = shft9(xr) * wp[-12*27+25];
1809 xr = a[ 5] - a[ 9]; a[ 5] += a[ 9]; a[ 9] = shft9(xr) * wp[-12*27+25];
1810 xr = a[ 0] - a[12]; a[ 0] += a[12]; a[12] = shft9(xr) * wp[ -4*27+25];
1811 xr = a[ 1] - a[13]; a[ 1] += a[13]; a[13] = shft9(xr) * wp[ -4*27+25];
1812 xr = a[16] - a[28]; a[16] += a[28]; a[28] = shft9(xr) * wp[ -4*27+25];
1813 xr =-a[17] + a[29]; a[17] += a[29]; a[29] = shft9(xr) * wp[ -4*27+25];
1815 xr = SQRT * shft9(a[ 2] - a[10]); a[ 2] += a[10]; a[10] = xr;
1816 xr = SQRT * shft9(a[ 3] - a[11]); a[ 3] += a[11]; a[11] = xr;
1817 xr = SQRT * shft9(a[26] - a[18]); a[18] += a[26]; a[26] = xr - a[18];
1818 xr = SQRT * shft9(a[27] - a[19]); a[19] += a[27]; a[27] = xr - a[19];
1820 xr = a[ 2]; a[19] -= a[ 3]; a[ 3] -= xr; a[ 2] = a[31] - xr; a[31] += xr;
1821 xr = a[ 3]; a[11] -= a[19]; a[18] -= xr; a[ 3] = a[30] - xr; a[30] += xr;
1822 xr = a[18]; a[27] -= a[11]; a[19] -= xr; a[18] = a[15] - xr; a[15] += xr;
1824 xr = a[19]; a[10] -= xr; a[19] = a[14] - xr; a[14] += xr;
1825 xr = a[10]; a[11] -= xr; a[10] = a[23] - xr; a[23] += xr;
1826 xr = a[11]; a[26] -= xr; a[11] = a[22] - xr; a[22] += xr;
1827 xr = a[26]; a[27] -= xr; a[26] = a[ 7] - xr; a[ 7] += xr;
1829 xr = a[27]; a[27] = a[6] - xr; a[6] += xr;
1831 xr = SQRT * shft9(a[ 0] - a[ 4]); a[ 0] += a[ 4]; a[ 4] = xr;
1832 xr = SQRT * shft9(a[ 1] - a[ 5]); a[ 1] += a[ 5]; a[ 5] = xr;
1833 xr = SQRT * shft9(a[16] - a[20]); a[16] += a[20]; a[20] = xr;
1834 xr = SQRT * shft9(a[17] - a[21]); a[17] += a[21]; a[21] = xr;
1835 xr =-SQRT * shft9(a[ 8] - a[12]); a[ 8] += a[12]; a[12] = xr - a[ 8];
1836 xr =-SQRT * shft9(a[ 9] - a[13]); a[ 9] += a[13]; a[13] = xr - a[ 9];
1837 xr =-SQRT * shft9(a[25] - a[29]); a[25] += a[29]; a[29] = xr - a[25];
1838 xr =-SQRT * shft9(a[24] + a[28]); a[24] -= a[28]; a[28] = xr - a[24];
1840 xr = a[24] - a[16]; a[24] = xr;
1841 xr = a[20] - xr; a[20] = xr;
1842 xr = a[28] - xr; a[28] = xr;
1844 xr = a[25] - a[17]; a[25] = xr;
1845 xr = a[21] - xr; a[21] = xr;
1846 xr = a[29] - xr; a[29] = xr;
1848 xr = a[17] - a[1]; a[17] = xr;
1849 xr = a[ 9] - xr; a[ 9] = xr;
1850 xr = a[25] - xr; a[25] = xr;
1851 xr = a[ 5] - xr; a[ 5] = xr;
1852 xr = a[21] - xr; a[21] = xr;
1853 xr = a[13] - xr; a[13] = xr;
1854 xr = a[29] - xr; a[29] = xr;
1856 xr = a[ 1] - a[0]; a[ 1] = xr;
1857 xr = a[16] - xr; a[16] = xr;
1858 xr = a[17] - xr; a[17] = xr;
1859 xr = a[ 8] - xr; a[ 8] = xr;
1860 xr = a[ 9] - xr; a[ 9] = xr;
1861 xr = a[24] - xr; a[24] = xr;
1862 xr = a[25] - xr; a[25] = xr;
1863 xr = a[ 4] - xr; a[ 4] = xr;
1864 xr = a[ 5] - xr; a[ 5] = xr;
1865 xr = a[20] - xr; a[20] = xr;
1866 xr = a[21] - xr; a[21] = xr;
1867 xr = a[12] - xr; a[12] = xr;
1868 xr = a[13] - xr; a[13] = xr;
1869 xr = a[28] - xr; a[28] = xr;
1870 xr = a[29] - xr; a[29] = xr;
1872 xr = a[ 0]; a[ 0] += a[31]; a[31] -= xr;
1873 xr = a[ 1]; a[ 1] += a[30]; a[30] -= xr;
1874 xr = a[16]; a[16] += a[15]; a[15] -= xr;
1875 xr = a[17]; a[17] += a[14]; a[14] -= xr;
1876 xr = a[ 8]; a[ 8] += a[23]; a[23] -= xr;
1877 xr = a[ 9]; a[ 9] += a[22]; a[22] -= xr;
1878 xr = a[24]; a[24] += a[ 7]; a[ 7] -= xr;
1879 xr = a[25]; a[25] += a[ 6]; a[ 6] -= xr;
1880 xr = a[ 4]; a[ 4] += a[27]; a[27] -= xr;
1881 xr = a[ 5]; a[ 5] += a[26]; a[26] -= xr;
1882 xr = a[20]; a[20] += a[11]; a[11] -= xr;
1883 xr = a[21]; a[21] += a[10]; a[10] -= xr;
1884 xr = a[12]; a[12] += a[19]; a[19] -= xr;
1885 xr = a[13]; a[13] += a[18]; a[18] -= xr;
1886 xr = a[28]; a[28] += a[ 3]; a[ 3] -= xr;
1887 xr = a[29]; a[29] += a[ 2]; a[ 2] -= xr;
1890 static void mdct_long(int *out, int *in)
1892 int ct,st;
1893 int tc1, tc2, tc3, tc4, ts5, ts6, ts7, ts8;
1894 int ts1, ts2, ts3, ts4, tc5, tc6, tc7, tc8;
1896 /* 1,2, 5,6, 9,10, 13,14, 17 */
1897 tc1 = in[17] - in[ 9];
1898 tc3 = in[15] - in[11];
1899 tc4 = in[14] - in[12];
1900 ts5 = in[ 0] + in[ 8];
1901 ts6 = in[ 1] + in[ 7];
1902 ts7 = in[ 2] + in[ 6];
1903 ts8 = in[ 3] + in[ 5];
1905 out[17] = (ts5 + ts7 - ts8) * cx[8] - (ts6 - in[4]) * cx[8];
1906 st = (ts5 + ts7 - ts8) * cx[7] + (ts6 - in[4]) * cx[8];
1907 ct = (tc1 - tc3 - tc4) * cx[6];
1908 out[5] = ct + st;
1909 out[6] = ct - st;
1911 tc2 = (in[16] - in[10]) * cx[6];
1912 ts6 = ts6 * cx[7] + in[4] * cx[8];
1914 ct = tc1 * cx[0] + tc2 + tc3 * cx[1] + tc4 * cx[2];
1915 st = -ts5 * cx[4] + ts6 - ts7 * cx[5] + ts8 * cx[3];
1916 out[1] = ct + st;
1917 out[2] = ct - st;
1919 ct = tc1 * cx[1] - tc2 - tc3 * cx[2] + tc4 * cx[0];
1920 st = -ts5 * cx[5] + ts6 - ts7 * cx[3] + ts8 * cx[4];
1921 out[ 9] = ct + st;
1922 out[10] = ct - st;
1924 ct = tc1 * cx[2] - tc2 + tc3 * cx[0] - tc4 * cx[1];
1925 st = ts5 * cx[3] - ts6 + ts7 * cx[4] - ts8 * cx[5];
1926 out[13] = ct + st;
1927 out[14] = ct - st;
1929 ts1 = in[ 8] - in[ 0];
1930 ts3 = in[ 6] - in[ 2];
1931 ts4 = in[ 5] - in[ 3];
1932 tc5 = in[17] + in[ 9];
1933 tc6 = in[16] + in[10];
1934 tc7 = in[15] + in[11];
1935 tc8 = in[14] + in[12];
1937 out[0] = (tc5 + tc7 + tc8) * cx[8] + (tc6 + in[13]) * cx[8];
1938 ct = (tc5 + tc7 + tc8) * cx[7] - (tc6 + in[13]) * cx[8];
1939 st = (ts1 - ts3 + ts4) * cx[6];
1940 out[11] = ct + st;
1941 out[12] = ct - st;
1943 ts2 = (in[7] - in[1]) * cx[6];
1944 tc6 = in[13] * cx[8] - tc6 * cx[7];
1946 ct = tc5 * cx[3] - tc6 + tc7 * cx[4] + tc8 * cx[5];
1947 st = ts1 * cx[2] + ts2 + ts3 * cx[0] + ts4 * cx[1];
1948 out[3] = ct + st;
1949 out[4] = ct - st;
1951 ct =-tc5 * cx[5] + tc6 - tc7 * cx[3] - tc8 * cx[4];
1952 st = ts1 * cx[1] + ts2 - ts3 * cx[2] - ts4 * cx[0];
1953 out[7] = ct + st;
1954 out[8] = ct - st;
1956 ct =-tc5 * cx[4] + tc6 - tc7 * cx[5] - tc8 * cx[3];
1957 st = ts1 * cx[0] - ts2 + ts3 * cx[1] - ts4 * cx[2];
1958 out[15] = ct + st;
1959 out[16] = ct - st;
1962 static int find_bitrate_index(int type, int bitrate /*, bool stereo */)
1964 int i;
1966 for(i=0;i<14;i++)
1967 if(bitrate == bitr_index[type][i])
1968 break;
1969 return i;
1972 static int find_samplerate_index(unsigned long freq, int *mp3_type)
1974 int mpeg = freq >= (32000+24000)/2 ? 1 : 0;
1976 unsigned long dmin = ULONG_MAX;
1977 int idmin = -1, i;
1979 for (i = 0; i < 3; i++)
1981 unsigned long diff;
1983 if (sampr_index[mpeg][i] == freq)
1985 idmin = i;
1986 break;
1989 if ((long)sampr_index[mpeg][i] < (long)freq)
1990 diff = freq - sampr_index[mpeg][i];
1991 else
1992 diff = sampr_index[mpeg][i] - freq;
1994 if (diff < dmin)
1996 dmin = diff;
1997 idmin = i;
2001 *mp3_type = mpeg;
2002 return idmin;
2005 static bool init_mp3_encoder_engine(int sample_rate, int num_channels, int bitrate)
2007 const bool stereo = num_channels > 1;
2008 uint32_t avg_byte_per_frame;
2010 cfg.channels = stereo ? 2 : 1;
2011 cfg.mpg.mode = stereo ? 0 : 3; /* 0=stereo, 3=mono */
2012 cfg.mpg.smpl_id = find_samplerate_index(sample_rate, &cfg.mpg.type);
2013 cfg.samplerate = sampr_index[cfg.mpg.type][cfg.mpg.smpl_id];
2014 cfg.mpg.bitr_id = find_bitrate_index(cfg.mpg.type, bitrate /*, stereo */);
2015 cfg.mpg.bitrate = bitr_index[cfg.mpg.type][cfg.mpg.bitr_id];
2016 cfg.mpg.num_bands = num_bands[stereo ? cfg.mpg.type : 2][cfg.mpg.bitr_id];
2018 if (cfg.mpg.type == 1)
2020 cfg.granules = 2;
2021 pcm_chunk_size = PCM_CHUNK_SIZE1;
2022 samp_per_frame = SAMP_PER_FRAME1;
2024 else
2026 cfg.granules = 1;
2027 pcm_chunk_size = PCM_CHUNK_SIZE2;
2028 samp_per_frame = SAMP_PER_FRAME2;
2031 memcpy(scalefac, sfBand[cfg.mpg.smpl_id + 3*cfg.mpg.type], sizeof(scalefac));
2032 memset(mfbuf , 0 , sizeof(mfbuf ));
2033 memset(mdct_freq , 0 , sizeof(mdct_freq ));
2034 memset(enc_data , 0 , sizeof(enc_data ));
2035 memset(sb_data , 0 , sizeof(sb_data ));
2036 memset(&CodedData, 0 , sizeof(CodedData ));
2037 memcpy(ca , ca_const , sizeof(ca ));
2038 memcpy(cs , cs_const , sizeof(cs ));
2039 memcpy(cx , cx_const , sizeof(cx ));
2040 memcpy(win , win_const , sizeof(win ));
2041 memcpy(enwindow , enwindow_const , sizeof(enwindow ));
2042 memcpy(int2idx , int2idx_const , sizeof(int2idx ));
2043 memcpy(ht_count , ht_count_const , sizeof(ht_count ));
2044 memcpy( tab01 , tab01_const , sizeof(tab01 ));
2045 memcpy( tab23 , tab23_const , sizeof(tab23 ));
2046 memcpy( tab56 , tab56_const , sizeof(tab56 ));
2047 memcpy( tab1315 , tab1315_const , sizeof(tab1315 ));
2048 memcpy( tab1624 , tab1624_const , sizeof(tab1624 ));
2049 memcpy( tab789 , tab789_const , sizeof(tab789 ));
2050 memcpy( tabABC , tabABC_const , sizeof(tabABC ));
2051 memcpy( t1HB , t1HB_const , sizeof(t1HB ));
2052 memcpy( t2HB , t2HB_const , sizeof(t2HB ));
2053 memcpy( t3HB , t3HB_const , sizeof(t3HB ));
2054 memcpy( t5HB , t5HB_const , sizeof(t5HB ));
2055 memcpy( t6HB , t6HB_const , sizeof(t6HB ));
2056 memcpy( t7HB , t7HB_const , sizeof(t7HB ));
2057 memcpy( t8HB , t8HB_const , sizeof(t8HB ));
2058 memcpy( t9HB , t9HB_const , sizeof(t9HB ));
2059 memcpy(t10HB , t10HB_const , sizeof(t10HB ));
2060 memcpy(t11HB , t11HB_const , sizeof(t11HB ));
2061 memcpy(t12HB , t12HB_const , sizeof(t12HB ));
2062 memcpy(t13HB , t13HB_const , sizeof(t13HB ));
2063 memcpy(t15HB , t15HB_const , sizeof(t15HB ));
2064 memcpy(t16HB , t16HB_const , sizeof(t16HB ));
2065 memcpy(t24HB , t24HB_const , sizeof(t24HB ));
2066 memcpy( t1l , t1l_const , sizeof(t1l ));
2067 memcpy( t2l , t2l_const , sizeof(t2l ));
2068 memcpy( t3l , t3l_const , sizeof(t3l ));
2069 memcpy( t5l , t5l_const , sizeof(t5l ));
2070 memcpy( t6l , t6l_const , sizeof(t6l ));
2071 memcpy( t7l , t7l_const , sizeof(t7l ));
2072 memcpy( t8l , t8l_const , sizeof(t8l ));
2073 memcpy( t9l , t9l_const , sizeof(t9l ));
2074 memcpy(t10l , t10l_const , sizeof(t10l ));
2075 memcpy(t11l , t11l_const , sizeof(t11l ));
2076 memcpy(t12l , t12l_const , sizeof(t12l ));
2077 memcpy(t13l , t13l_const , sizeof(t13l ));
2078 memcpy(t15l , t15l_const , sizeof(t15l ));
2079 memcpy(t16l , t16l_const , sizeof(t16l ));
2080 memcpy(t24l , t24l_const , sizeof(t24l ));
2081 memcpy(ht , ht_const , sizeof(ht ));
2083 ht[ 0].table = NULL; ht[ 0].hlen = NULL; /* Apparently not used */
2084 ht[ 1].table = t1HB; ht[ 1].hlen = t1l;
2085 ht[ 2].table = t2HB; ht[ 2].hlen = t2l;
2086 ht[ 3].table = t3HB; ht[ 3].hlen = t3l;
2087 ht[ 4].table = NULL; ht[ 4].hlen = NULL; /* Apparently not used */
2088 ht[ 5].table = t5HB; ht[ 5].hlen = t5l;
2089 ht[ 6].table = t6HB; ht[ 6].hlen = t6l;
2090 ht[ 7].table = t7HB; ht[ 7].hlen = t7l;
2091 ht[ 8].table = t8HB; ht[ 8].hlen = t8l;
2092 ht[ 9].table = t9HB; ht[ 9].hlen = t9l;
2093 ht[10].table = t10HB; ht[10].hlen = t10l;
2094 ht[11].table = t11HB; ht[11].hlen = t11l;
2095 ht[12].table = t12HB; ht[12].hlen = t12l;
2096 ht[13].table = t13HB; ht[13].hlen = t13l;
2097 ht[14].table = NULL; ht[14].hlen = NULL; /* Apparently not used */
2098 ht[15].table = t15HB; ht[15].hlen = t15l;
2100 /* Figure average number of 'bytes' per frame */
2101 avg_byte_per_frame = SAMPL2 * 16000 * cfg.mpg.bitrate / (2 - cfg.mpg.type);
2102 avg_byte_per_frame = avg_byte_per_frame / cfg.samplerate;
2103 cfg.byte_per_frame = avg_byte_per_frame / 64;
2104 cfg.frac_per_frame = avg_byte_per_frame & 63;
2105 cfg.slot_lag = 0;
2106 cfg.sideinfo_len = 32 + (cfg.mpg.type ? (cfg.channels == 1 ? 136 : 256)
2107 : (cfg.channels == 1 ? 72 : 136));
2109 return true;
2112 static inline void to_mono(uint32_t **samp)
2114 int32_t lr = **samp;
2115 int32_t m = (int16_t)lr + (lr >> 16) + err;
2116 err = m & 1;
2117 m >>= 1;
2118 *(*samp)++ = (m << 16) | (uint16_t)m;
2119 } /* to_mono */
2121 static void to_mono_mm(void)
2123 /* |llllllllllllllll|rrrrrrrrrrrrrrrr| =>
2124 * |mmmmmmmmmmmmmmmm|mmmmmmmmmmmmmmmm|
2126 uint32_t *samp = (uint32_t *)&mfbuf[2*512];
2127 uint32_t *samp_end = samp + samp_per_frame;
2131 to_mono(&samp);
2132 to_mono(&samp);
2133 to_mono(&samp);
2134 to_mono(&samp);
2135 to_mono(&samp);
2136 to_mono(&samp);
2137 to_mono(&samp);
2138 to_mono(&samp);
2140 while (samp < samp_end);
2141 } /* to_mono_mm */
2143 #ifdef ROCKBOX_LITTLE_ENDIAN
2145 /* Swaps a frame to big endian */
2146 static inline void byte_swap_frame32(uint32_t *dst, uint32_t *src,
2147 size_t size)
2149 assert(dst); assert(src);
2150 uint32_t *src_end = SKIPBYTES(src, size);
2154 #define swap32 bswap_32
2155 *dst++ = swap32(*src); src++;
2156 *dst++ = swap32(*src); src++;
2157 *dst++ = swap32(*src); src++;
2158 *dst++ = swap32(*src); src++;
2159 *dst++ = swap32(*src); src++;
2160 *dst++ = swap32(*src); src++;
2161 *dst++ = swap32(*src); src++;
2162 *dst++ = swap32(*src); src++;
2164 while(src < src_end);
2165 } /* byte_swap_frame32 */
2166 #endif /* ROCKBOX_LITTLE_ENDIAN */
2168 static void set_scale_facs(int *mdct_freq)
2170 unsigned int i, is, ie, k, s;
2171 int max_freq_val, avrg_freq_val;
2173 /* calc average of first 256 frequency values */
2174 for(avrg_freq_val=i=0; i<256; i++)
2175 avrg_freq_val += mdct_freq[i];
2176 avrg_freq_val >>= 8;
2178 /* if max of current band is smaller than average, increase precision */
2179 /* last band keeps untouched (not scaled) */
2180 for(is=k=0; is<scalefac[21]; k++)
2182 max_freq_val = 0;
2184 for(i=is, ie=scalefac[k+1]; i<ie; i++)
2185 if(max_freq_val < mdct_freq[i])
2186 max_freq_val = mdct_freq[i];
2188 for(s=0; s<3; s++)
2189 if((max_freq_val<<s) > avrg_freq_val)
2190 break;
2192 band_scale_f[k] = (unsigned char)s;
2194 for(i=is; s && i<ie; i++)
2195 mdct_freq[i] <<= s;
2197 is = ie;
2201 static void encode_frame(char *buffer, struct enc_chunk_hdr *chunk)
2203 int gr, gr_cnt;
2204 uint32_t max;
2205 /* encode one mp3 frame in this loop */
2206 CodedData.bitpos = 0;
2207 memset(CodedData.bbuf, 0, sizeof(CodedData.bbuf));
2209 if((cfg.slot_lag += cfg.frac_per_frame) >= 64)
2210 { /* Padding for this frame */
2211 cfg.slot_lag -= 64;
2212 cfg.mpg.padding = 1;
2214 else
2215 cfg.mpg.padding = 0;
2217 cfg.mean_bits = (8 * cfg.byte_per_frame + 8 * cfg.mpg.padding
2218 - cfg.sideinfo_len) / cfg.granules / cfg.channels
2219 - 42; // reserved for scale_facs
2221 /* shift out old samples */
2222 memcpy(mfbuf, mfbuf + 2*cfg.granules*576, 4*512);
2224 if (chunk->flags & CHUNKF_START_FILE)
2226 /* prefix silent samples for encoder delay */
2227 memset(mfbuf + 2*512, 0, ENC_DELAY_SIZE);
2228 /* read new samples to iram for further processing */
2229 memcpy(mfbuf + 2*512 + ENC_DELAY_SIZE/2,
2230 buffer, pcm_chunk_size - ENC_DELAY_SIZE);
2231 chunk->num_pcm = samp_per_frame - ENC_DELAY_SAMP;
2233 else
2235 /* read new samples to iram for further processing */
2236 memcpy(mfbuf + 2*512, buffer, pcm_chunk_size);
2237 chunk->num_pcm = samp_per_frame;
2240 if (cfg.channels == 1)
2241 to_mono_mm();
2243 cfg.ResvSize = 0;
2244 gr_cnt = cfg.granules * cfg.channels;
2245 CodedData.bitpos = cfg.sideinfo_len; /* leave space for mp3 header */
2247 for(gr=0; gr<cfg.granules; gr++)
2249 short *wk = mfbuf + 2*286 + gr*1152;
2250 int ch;
2252 /* 16bit packed wav data can be windowed efficiently on coldfire */
2253 window_subband1(wk, sb_data[0][1-gr][0], sb_data[1][1-gr][0]);
2255 for(ch=0; ch<cfg.channels; ch++)
2257 int ii, k, shift;
2259 wk = mfbuf + 2*286 + gr*1152 + ch;
2261 /* 36864=4*18*16*32 */
2262 for(k=0; k<18; k++, wk+=64)
2264 window_subband2(wk, sb_data[ch][1-gr][k]);
2265 /* Compensate for inversion in the analysis filter */
2266 if(k & 1)
2268 int band;
2269 for(band=1; band<32; band+=2)
2270 sb_data[ch][1-gr][k][band] *= -1;
2274 /* Perform imdct of 18 previous + 18 current subband samples */
2275 /* for integer precision do this loop again (if neccessary) */
2276 shift = 14 - (cfg.cod_info[gr][ch].additStep >> 2);
2277 for(k=1,ii=0; ii<3 && k; ii++)
2279 int *mdct = mdct_freq;
2280 int band;
2282 cfg.cod_info[gr][ch].additStep = 4 * (14 - shift);
2284 for(band=0; band<cfg.mpg.num_bands; band++, mdct+=18)
2286 int *band0 = sb_data[ch][ gr][0] + order[band];
2287 int *band1 = sb_data[ch][1-gr][0] + order[band];
2288 int work[18];
2290 /* 9216=4*32*9*8 */
2291 for(k=-9; k<0; k++)
2293 int a = shft_n(band1[(k+9)*32], shift);
2294 int b = shft_n(band1[(8-k)*32], shift);
2295 int c = shft_n(band0[(k+9)*32], shift);
2296 int d = shft_n(band0[(8-k)*32], shift);
2298 work[k+ 9] = shft16(a * win[k+ 9][0] +
2299 b * win[k+ 9][1] +
2300 c * win[k+ 9][2] +
2301 d * win[k+ 9][3]);
2303 work[k+18] = shft16(c * win[k+18][0] +
2304 d * win[k+18][1] +
2305 a * win[k+18][2] +
2306 b * win[k+18][3]);
2309 /* 7200=4*18*100 */
2310 mdct_long(mdct, work);
2312 /* Perform aliasing reduction butterfly */
2313 if(band != 0)
2315 for(k=7; k>=0; --k)
2317 int bu, bd;
2318 bu = shft15(mdct[k]) * ca[k] +
2319 shft15(mdct[-1-k]) * cs[k];
2320 bd = shft15(mdct[k]) * cs[k] -
2321 shft15(mdct[-1-k]) * ca[k];
2322 mdct[-1-k] = bu;
2323 mdct[ k ] = bd;
2328 max = 0;
2329 for(k=0; k<576; k++)
2331 if(mdct_freq[k] < 0)
2333 mdct_sign[k] = 1; /* negative */
2334 mdct_freq[k] = shft13(-mdct_freq[k]);
2336 else
2338 mdct_sign[k] = 0; /* positive */
2339 mdct_freq[k] = shft13(mdct_freq[k]);
2342 if(max < (uint32_t)mdct_freq[k])
2343 max = (uint32_t)mdct_freq[k];
2345 cfg.cod_info[gr][ch].max_val = max;
2347 /* calc new shift for higher integer precision */
2348 for(k=0; max<(uint32_t)(0x7800>>k); k++) shift--;
2349 for( ; (max>>k)>=(uint32_t)0x10000; k++) shift++;
2350 if(shift < 0) shift = 0;
2353 cfg.cod_info[gr][ch].quantStep +=
2354 cfg.cod_info[gr][ch].additStep;
2356 set_scale_facs(mdct_freq);
2358 /* bit and noise allocation */
2359 iteration_loop(mdct_freq, &cfg.cod_info[gr][ch],
2360 gr_cnt--);
2362 /* write the frame to the bitstream */
2363 Huffmancodebits(enc_data, mdct_sign,
2364 &cfg.cod_info[gr][ch]);
2366 cfg.cod_info[gr][ch].quantStep -=
2367 cfg.cod_info[gr][ch].additStep;
2369 if(cfg.granules == 1)
2371 memcpy(sb_data[ch][0], sb_data[ch][1],
2372 sizeof(sb_data[ch][0]));
2376 chunk->enc_size = cfg.byte_per_frame + cfg.mpg.padding;
2378 /* finish this chunk by adding sideinfo header data */
2379 CodedData.bitpos = 0;
2380 encodeSideInfo( cfg.cod_info );
2382 #ifdef ROCKBOX_BIG_ENDIAN
2383 /* copy chunk to enc_buffer */
2384 memcpy(chunk->enc_data, CodedData.bbuf, chunk->enc_size);
2385 #else
2386 /* swap frame to big endian */
2387 byte_swap_frame32((uint32_t *)chunk->enc_data, CodedData.bbuf, chunk->enc_size);
2388 #endif
2389 } /* encode_frame */