diff options
author | Sean Bartell <wingedtachikoma@gmail.com> | 2011-06-25 21:32:25 -0400 |
---|---|---|
committer | Nils Wallménius <nils@rockbox.org> | 2012-04-25 22:13:20 +0200 |
commit | f40bfc9267b13b54e6379dfe7539447662879d24 (patch) | |
tree | 9b20069d5e62809ff434061ad730096836f916f2 /lib/rbcodec/codecs/mp3_enc.c | |
parent | a0009907de7a0107d49040d8a180f140e2eff299 (diff) | |
download | rockbox-f40bfc9267b13b54e6379dfe7539447662879d24.tar.gz rockbox-f40bfc9267b13b54e6379dfe7539447662879d24.zip |
Add codecs to librbcodec.
Change-Id: Id7f4717d51ed02d67cb9f9cb3c0ada4a81843f97
Reviewed-on: http://gerrit.rockbox.org/137
Reviewed-by: Nils Wallménius <nils@rockbox.org>
Tested-by: Nils Wallménius <nils@rockbox.org>
Diffstat (limited to 'lib/rbcodec/codecs/mp3_enc.c')
-rw-r--r-- | lib/rbcodec/codecs/mp3_enc.c | 2629 |
1 files changed, 2629 insertions, 0 deletions
diff --git a/lib/rbcodec/codecs/mp3_enc.c b/lib/rbcodec/codecs/mp3_enc.c new file mode 100644 index 0000000000..2f5528f74c --- /dev/null +++ b/lib/rbcodec/codecs/mp3_enc.c | |||
@@ -0,0 +1,2629 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2006 Antonius Hellmann | ||
11 | * | ||
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. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | |||
22 | // Shine is an MP3 encoder | ||
23 | // Copyright (C) 1999-2000 Gabriel Bouvigne | ||
24 | // | ||
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. | ||
29 | // | ||
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. | ||
34 | |||
35 | #include <inttypes.h> | ||
36 | #include "codeclib.h" | ||
37 | |||
38 | CODEC_ENC_HEADER | ||
39 | |||
40 | #define ENC_PADDING_FRAMES1 2 | ||
41 | #define ENC_PADDING_FRAMES2 4 | ||
42 | #define ENC_DELAY_SAMP 576 | ||
43 | #define ENC_DELAY_SIZE (ENC_DELAY_SAMP*4) | ||
44 | #define SAMP_PER_FRAME1 1152 | ||
45 | #define SAMP_PER_FRAME2 576 | ||
46 | #define PCM_CHUNK_SIZE1 (SAMP_PER_FRAME1*4) | ||
47 | #define PCM_CHUNK_SIZE2 (SAMP_PER_FRAME2*4) | ||
48 | #define SAMPL2 576 | ||
49 | #define SBLIMIT 32 | ||
50 | #define HTN 16 | ||
51 | #define memcpy ci->memcpy | ||
52 | #define memset ci->memset | ||
53 | #define putlong(c, s) if(s+sz <= 32) { cc = (cc << s) | c; sz+= s; } \ | ||
54 | else { putbits(cc, sz); cc = c; sz = s; } | ||
55 | |||
56 | typedef struct { | ||
57 | int type; /* 0=(MPEG2 - 22.05,24,16kHz) 1=(MPEG1 - 44.1,48,32kHz) */ | ||
58 | int mode; /* 0=stereo, 1=jstereo, 2=dual, 3=mono */ | ||
59 | int bitrate; | ||
60 | int padding; | ||
61 | int num_bands; | ||
62 | long bitr_id; | ||
63 | int smpl_id; | ||
64 | } mpeg_t; | ||
65 | |||
66 | /* Side information */ | ||
67 | typedef struct { | ||
68 | uint32_t part2_3_length; | ||
69 | int count1; /* number of 0-1-quadruples */ | ||
70 | uint32_t global_gain; | ||
71 | uint32_t table_select[4]; | ||
72 | uint32_t region_0_1; | ||
73 | uint32_t address1; | ||
74 | uint32_t address2; | ||
75 | uint32_t address3; | ||
76 | long quantStep; | ||
77 | long additStep; | ||
78 | uint32_t max_val; | ||
79 | } side_info_t; | ||
80 | |||
81 | typedef struct { | ||
82 | side_info_t cod_info[2][2]; | ||
83 | mpeg_t mpg; | ||
84 | long frac_per_frame; | ||
85 | long byte_per_frame; | ||
86 | long slot_lag; | ||
87 | int sideinfo_len; | ||
88 | int mean_bits; | ||
89 | int ResvSize; | ||
90 | int channels; | ||
91 | int rec_mono_mode; | ||
92 | int granules; | ||
93 | long samplerate; | ||
94 | } config_t; | ||
95 | |||
96 | typedef struct { | ||
97 | int bitpos; /* current bitpos for writing */ | ||
98 | uint32_t bbuf[263]; | ||
99 | } BF_Data; | ||
100 | |||
101 | struct huffcodetab { | ||
102 | int len; /* max. index */ | ||
103 | const uint8_t *table; /* pointer to array[len][len] */ | ||
104 | const uint8_t *hlen; /* pointer to array[len][len] */ | ||
105 | }; | ||
106 | |||
107 | struct huffcodebig { | ||
108 | int len; /* max. index */ | ||
109 | int linbits; /* number of linbits */ | ||
110 | int linmax; /* max number stored in linbits */ | ||
111 | }; | ||
112 | |||
113 | #define shft4(x) ((x + 8) >> 4) | ||
114 | #define shft9(x) ((x + 256) >> 9) | ||
115 | #define shft13(x) ((x + 4096) >> 13) | ||
116 | #define shft15(x) ((x + 16384) >> 15) | ||
117 | #define shft16(x) ((x + 32768) >> 16) | ||
118 | #define shft_n(x,n) ((x) >> n) | ||
119 | #define SQRT 724 /* sqrt(2) * 512 */ | ||
120 | |||
121 | static short mfbuf [2*(1152+512)] IBSS_ATTR; /* 3328 Bytes */ | ||
122 | static int sb_data [2][2][18][SBLIMIT] IBSS_ATTR; /* 13824 Bytes */ | ||
123 | static int mdct_freq [SAMPL2] IBSS_ATTR; /* 2304 Bytes */ | ||
124 | static char mdct_sign [SAMPL2] IBSS_ATTR; /* 576 Bytes */ | ||
125 | static short enc_data [SAMPL2] IBSS_ATTR; /* 1152 Bytes */ | ||
126 | static uint32_t scalefac [23] IBSS_ATTR; /* 92 Bytes */ | ||
127 | static BF_Data CodedData IBSS_ATTR; /* 1056 Bytes */ | ||
128 | static int ca [8] IBSS_ATTR; /* 32 Bytes */ | ||
129 | static int cs [8] IBSS_ATTR; /* 32 Bytes */ | ||
130 | static int cx [9] IBSS_ATTR; /* 36 Bytes */ | ||
131 | static int win [18][4] IBSS_ATTR; /* 288 Bytes */ | ||
132 | static short enwindow [15*27+24] IBSS_ATTR; /* 862 Bytes */ | ||
133 | static short int2idx [4096] IBSS_ATTR; /* 8192 Bytes */ | ||
134 | static uint8_t ht_count [2][2][16] IBSS_ATTR; /* 64 Bytes */ | ||
135 | static uint32_t tab01 [ 16] IBSS_ATTR; /* 64 Bytes */ | ||
136 | static uint32_t tab23 [ 9] IBSS_ATTR; /* 36 Bytes */ | ||
137 | static uint32_t tab56 [ 16] IBSS_ATTR; /* 64 Bytes */ | ||
138 | static uint32_t tab1315 [256] IBSS_ATTR; /* 1024 Bytes */ | ||
139 | static uint32_t tab1624 [256] IBSS_ATTR; /* 1024 Bytes */ | ||
140 | static uint32_t tab789 [ 36] IBSS_ATTR; /* 144 Bytes */ | ||
141 | static uint32_t tabABC [ 64] IBSS_ATTR; /* 256 Bytes */ | ||
142 | static uint8_t t1HB [ 4] IBSS_ATTR; | ||
143 | static uint8_t t2HB [ 9] IBSS_ATTR; | ||
144 | static uint8_t t3HB [ 9] IBSS_ATTR; | ||
145 | static uint8_t t5HB [ 16] IBSS_ATTR; | ||
146 | static uint8_t t6HB [ 16] IBSS_ATTR; | ||
147 | static uint8_t t7HB [ 36] IBSS_ATTR; | ||
148 | static uint8_t t8HB [ 36] IBSS_ATTR; | ||
149 | static uint8_t t9HB [ 36] IBSS_ATTR; | ||
150 | static uint8_t t10HB [ 64] IBSS_ATTR; | ||
151 | static uint8_t t11HB [ 64] IBSS_ATTR; | ||
152 | static uint8_t t12HB [ 64] IBSS_ATTR; | ||
153 | static uint8_t t13HB [256] IBSS_ATTR; | ||
154 | static uint8_t t15HB [256] IBSS_ATTR; | ||
155 | static uint16_t t16HB [256] IBSS_ATTR; | ||
156 | static uint16_t t24HB [256] IBSS_ATTR; | ||
157 | static uint8_t t1l [ 8] IBSS_ATTR; | ||
158 | static uint8_t t2l [ 9] IBSS_ATTR; | ||
159 | static uint8_t t3l [ 9] IBSS_ATTR; | ||
160 | static uint8_t t5l [ 16] IBSS_ATTR; | ||
161 | static uint8_t t6l [ 16] IBSS_ATTR; | ||
162 | static uint8_t t7l [ 36] IBSS_ATTR; | ||
163 | static uint8_t t8l [ 36] IBSS_ATTR; | ||
164 | static uint8_t t9l [ 36] IBSS_ATTR; | ||
165 | static uint8_t t10l [ 64] IBSS_ATTR; | ||
166 | static uint8_t t11l [ 64] IBSS_ATTR; | ||
167 | static uint8_t t12l [ 64] IBSS_ATTR; | ||
168 | static uint8_t t13l [256] IBSS_ATTR; | ||
169 | static uint8_t t15l [256] IBSS_ATTR; | ||
170 | static uint8_t t16l [256] IBSS_ATTR; | ||
171 | static uint8_t t24l [256] IBSS_ATTR; | ||
172 | static struct huffcodetab ht [HTN] IBSS_ATTR; | ||
173 | |||
174 | static unsigned pcm_chunk_size IBSS_ATTR; | ||
175 | static unsigned samp_per_frame IBSS_ATTR; | ||
176 | |||
177 | static config_t cfg IBSS_ATTR; | ||
178 | static char *res_buffer; | ||
179 | static int32_t err IBSS_ATTR; | ||
180 | static uint8_t band_scale_f[22]; | ||
181 | |||
182 | static const uint8_t ht_count_const[2][2][16] = | ||
183 | { { { 1, 5, 4, 5, 6, 5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1 }, /* table0 */ | ||
184 | { 1, 5, 5, 7, 5, 8, 7, 9, 5, 7, 7, 9, 7, 9, 9,10 } }, /* hleng0 */ | ||
185 | { {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, /* table1 */ | ||
186 | { 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 } } }; /* hleng1 */ | ||
187 | |||
188 | static const uint8_t t1HB_const[4] = {1,1,1,0}; | ||
189 | static const uint8_t t2HB_const[9] = {1,2,1,3,1,1,3,2,0}; | ||
190 | static const uint8_t t3HB_const[9] = {3,2,1,1,1,1,3,2,0}; | ||
191 | static const uint8_t t5HB_const[16] = {1,2,6,5,3,1,4,4,7,5,7,1,6,1,1,0}; | ||
192 | static const uint8_t t6HB_const[16] = {7,3,5,1,6,2,3,2,5,4,4,1,3,3,2,0}; | ||
193 | |||
194 | static const uint8_t t7HB_const[36] = | ||
195 | { 1, 2,10,19,16,10, 3, 3, 7,10, 5, 3,11, 4,13,17, 8, 4, | ||
196 | 12,11,18,15,11, 2, 7, 6, 9,14, 3, 1, 6, 4, 5, 3, 2, 0 }; | ||
197 | |||
198 | static const uint8_t t8HB_const[36] = | ||
199 | { 3, 4, 6,18,12, 5, 5, 1, 2,16, 9, 3, 7, 3, 5,14, 7, 3, | ||
200 | 19,17,15,13,10, 4,13, 5, 8,11, 5, 1,12, 4, 4, 1, 1, 0 }; | ||
201 | |||
202 | static const uint8_t t9HB_const[36] = | ||
203 | { 7, 5, 9,14,15, 7, 6, 4, 5, 5, 6, 7, 7, 6, 8, 8, 8, 5, | ||
204 | 15, 6, 9,10, 5, 1,11, 7, 9, 6, 4, 1,14, 4, 6, 2, 6, 0 }; | ||
205 | |||
206 | static const uint8_t t10HB_const[64] = | ||
207 | {1,2,10,23,35,30,12,17,3,3,8,12,18,21,12,7,11,9,15,21,32, | ||
208 | 40,19,6,14,13,22,34,46,23,18,7,20,19,33,47,27,22,9,3,31,22, | ||
209 | 41,26,21,20,5,3,14,13,10,11,16,6,5,1,9,8,7,8,4,4,2,0 }; | ||
210 | |||
211 | static const uint8_t t11HB_const[64] = | ||
212 | {3,4,10,24,34,33,21,15,5,3,4,10,32,17,11,10,11,7,13,18,30, | ||
213 | 31,20,5,25,11,19,59,27,18,12,5,35,33,31,58,30,16,7,5,28,26, | ||
214 | 32,19,17,15,8,14,14,12,9,13,14,9,4,1,11,4,6,6,6,3,2,0 }; | ||
215 | |||
216 | static const uint8_t t12HB_const[64] = | ||
217 | {9,6,16,33,41,39,38,26,7,5,6,9,23,16,26,11,17,7,11,14,21, | ||
218 | 30,10,7,17,10,15,12,18,28,14,5,32,13,22,19,18,16,9,5,40,17, | ||
219 | 31,29,17,13,4,2,27,12,11,15,10,7,4,1,27,12,8,12,6,3,1,0 }; | ||
220 | |||
221 | static const uint8_t t13HB_const[256] = | ||
222 | {1,5,14,21,34,51,46,71,42,52,68,52,67,44,43,19,3,4,12,19,31,26,44,33,31,24,32, | ||
223 | 24,31,35,22,14,15,13,23,36,59,49,77,65,29,40,30,40,27,33,42,16,22,20,37,61,56, | ||
224 | 79,73,64,43,76,56,37,26,31,25,14,35,16,60,57,97,75,114,91,54,73,55,41,48,53, | ||
225 | 23,24,58,27,50,96,76,70,93,84,77,58,79,29,74,49,41,17,47,45,78,74,115,94,90, | ||
226 | 79,69,83,71,50,59,38,36,15,72,34,56,95,92,85,91,90,86,73,77,65,51,44,43,42,43, | ||
227 | 20,30,44,55,78,72,87,78,61,46,54,37,30,20,16,53,25,41,37,44,59,54,81,66,76,57, | ||
228 | 54,37,18,39,11,35,33,31,57,42,82,72,80,47,58,55,21,22,26,38,22,53,25,23,38,70, | ||
229 | 60,51,36,55,26,34,23,27,14,9,7,34,32,28,39,49,75,30,52,48,40,52,28,18,17,9,5, | ||
230 | 45,21,34,64,56,50,49,45,31,19,12,15,10,7,6,3,48,23,20,39,36,35,53,21,16,23,13, | ||
231 | 10,6,1,4,2,16,15,17,27,25,20,29,11,17,12,16,8,1,1,0,1 }; | ||
232 | |||
233 | static const uint8_t t15HB_const[256] = | ||
234 | {7,12,18,53,47,76,124,108,89,123,108,119,107,81,122,63,13,5,16,27,46,36,61,51, | ||
235 | 42,70,52,83,65,41,59,36,19,17,15,24,41,34,59,48,40,64,50,78,62,80,56,33,29,28, | ||
236 | 25,43,39,63,55,93,76,59,93,72,54,75,50,29,52,22,42,40,67,57,95,79,72,57,89,69, | ||
237 | 49,66,46,27,77,37,35,66,58,52,91,74,62,48,79,63,90,62,40,38,125,32,60,56,50, | ||
238 | 92,78,65,55,87,71,51,73,51,70,30,109,53,49,94,88,75,66,122,91,73,56,42,64,44, | ||
239 | 21,25,90,43,41,77,73,63,56,92,77,66,47,67,48,53,36,20,71,34,67,60,58,49,88,76, | ||
240 | 67,106,71,54,38,39,23,15,109,53,51,47,90,82,58,57,48,72,57,41,23,27,62,9,86, | ||
241 | 42,40,37,70,64,52,43,70,55,42,25,29,18,11,11,118,68,30,55,50,46,74,65,49,39, | ||
242 | 24,16,22,13,14,7,91,44,39,38,34,63,52,45,31,52,28,19,14,8,9,3,123,60,58,53,47, | ||
243 | 43,32,22,37,24,17,12,15,10,2,1,71,37,34,30,28,20,17,26,21,16,10,6,8,6,2,0}; | ||
244 | |||
245 | static const uint16_t t16HB_const[256] = | ||
246 | {1,5,14,44,74,63,110,93,172,149,138,242,225,195,376,17,3,4,12,20,35,62,53,47, | ||
247 | 83,75,68,119,201,107,207,9,15,13,23,38,67,58,103,90,161,72,127,117,110,209, | ||
248 | 206,16,45,21,39,69,64,114,99,87,158,140,252,212,199,387,365,26,75,36,68,65, | ||
249 | 115,101,179,164,155,264,246,226,395,382,362,9,66,30,59,56,102,185,173,265,142, | ||
250 | 253,232,400,388,378,445,16,111,54,52,100,184,178,160,133,257,244,228,217,385, | ||
251 | 366,715,10,98,48,91,88,165,157,148,261,248,407,397,372,380,889,884,8,85,84,81, | ||
252 | 159,156,143,260,249,427,401,392,383,727,713,708,7,154,76,73,141,131,256,245, | ||
253 | 426,406,394,384,735,359,710,352,11,139,129,67,125,247,233,229,219,393,743,737, | ||
254 | 720,885,882,439,4,243,120,118,115,227,223,396,746,742,736,721,712,706,223,436, | ||
255 | 6,202,224,222,218,216,389,386,381,364,888,443,707,440,437,1728,4,747,211,210, | ||
256 | 208,370,379,734,723,714,1735,883,877,876,3459,865,2,377,369,102,187,726,722, | ||
257 | 358,711,709,866,1734,871,3458,870,434,0,12,10,7,11,10,17,11,9,13,12,10,7,5,3, | ||
258 | 1,3}; | ||
259 | |||
260 | static const uint16_t t24HB_const[256] = | ||
261 | {15,13,46,80,146,262,248,434,426,669,653,649,621,517,1032,88,14,12,21,38,71, | ||
262 | 130,122,216,209,198,327,345,319,297,279,42,47,22,41,74,68,128,120,221,207,194, | ||
263 | 182,340,315,295,541,18,81,39,75,70,134,125,116,220,204,190,178,325,311,293, | ||
264 | 271,16,147,72,69,135,127,118,112,210,200,188,352,323,306,285,540,14,263,66, | ||
265 | 129,126,119,114,214,202,192,180,341,317,301,281,262,12,249,123,121,117,113, | ||
266 | 215,206,195,185,347,330,308,291,272,520,10,435,115,111,109,211,203,196,187, | ||
267 | 353,332,313,298,283,531,381,17,427,212,208,205,201,193,186,177,169,320,303, | ||
268 | 286,268,514,377,16,335,199,197,191,189,181,174,333,321,305,289,275,521,379, | ||
269 | 371,11,668,184,183,179,175,344,331,314,304,290,277,530,383,373,366,10,652,346, | ||
270 | 171,168,164,318,309,299,287,276,263,513,375,368,362,6,648,322,316,312,307,302, | ||
271 | 292,284,269,261,512,376,370,364,359,4,620,300,296,294,288,282,273,266,515,380, | ||
272 | 374,369,365,361,357,2,1033,280,278,274,267,264,259,382,378,372,367,363,360, | ||
273 | 358,356,0,43,20,19,17,15,13,11,9,7,6,4,7,5,3,1,3}; | ||
274 | |||
275 | static const uint32_t tab1315_const[256] = | ||
276 | { 0x010003,0x050005,0x070006,0x080008,0x090008,0x0a0009,0x0a000a,0x0b000a, | ||
277 | 0x0a000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0d000c,0x0e000d,0x0e000e, | ||
278 | 0x040005,0x060005,0x080007,0x090008,0x0a0009,0x0a0009,0x0b000a,0x0b000a, | ||
279 | 0x0b000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0e000c,0x0e000d,0x0e000d, | ||
280 | 0x070006,0x080007,0x090007,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a, | ||
281 | 0x0b000a,0x0c000b,0x0c000b,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d, | ||
282 | 0x080007,0x090008,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0c000b, | ||
283 | 0x0c000b,0x0d000b,0x0d000c,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d, | ||
284 | 0x090008,0x090008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0d000b,0x0d000b, | ||
285 | 0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000d, | ||
286 | 0x0a0009,0x0a0009,0x0b0009,0x0c000a,0x0c000a,0x0c000a,0x0d000b,0x0d000b, | ||
287 | 0x0d000b,0x0d000b,0x0e000c,0x0d000c,0x0f000d,0x0f000d,0x10000d,0x10000e, | ||
288 | 0x0a000a,0x0b0009,0x0c000a,0x0c000a,0x0d000a,0x0d000b,0x0d000b,0x0d000b, | ||
289 | 0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x10000e, | ||
290 | 0x0b000a,0x0b000a,0x0c000a,0x0d000b,0x0d000b,0x0d000b,0x0e000b,0x0e000c, | ||
291 | 0x0e000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x12000d,0x12000e, | ||
292 | 0x0a000a,0x0a000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0e000c, | ||
293 | 0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x11000e,0x11000e, | ||
294 | 0x0b000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0d000c,0x0f000c, | ||
295 | 0x0e000c,0x0f000d,0x0f000d,0x10000d,0x10000d,0x10000e,0x12000e,0x11000e, | ||
296 | 0x0b000b,0x0c000b,0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000c, | ||
297 | 0x0e000c,0x0f000d,0x10000d,0x0f000d,0x10000d,0x11000e,0x12000f,0x13000e, | ||
298 | 0x0c000b,0x0c000b,0x0c000b,0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0e000c, | ||
299 | 0x0f000d,0x0f000d,0x0f000d,0x10000d,0x11000e,0x11000e,0x11000e,0x12000f, | ||
300 | 0x0c000c,0x0d000c,0x0d000b,0x0e000c,0x0e000c,0x0f000c,0x0e000d,0x0f000d, | ||
301 | 0x10000d,0x10000d,0x11000d,0x11000d,0x11000e,0x12000e,0x12000f,0x12000f, | ||
302 | 0x0d000c,0x0d000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x10000d, | ||
303 | 0x10000d,0x10000e,0x10000e,0x11000e,0x12000e,0x11000e,0x12000f,0x12000f, | ||
304 | 0x0e000d,0x0e000d,0x0e000d,0x0f000d,0x0f000d,0x0f000d,0x11000d,0x10000d, | ||
305 | 0x10000e,0x13000e,0x11000e,0x11000e,0x11000f,0x13000f,0x12000e,0x12000f, | ||
306 | 0x0d000d,0x0e000d,0x0f000d,0x10000d,0x10000d,0x10000d,0x11000d,0x10000e, | ||
307 | 0x11000e,0x11000e,0x12000e,0x12000e,0x15000f,0x14000f,0x15000f,0x12000f }; | ||
308 | |||
309 | static const uint32_t tab01_const[16] = | ||
310 | { 0x10004,0x50005,0x50005,0x70006,0x50005,0x80006,0x70006,0x90007, | ||
311 | 0x50005,0x70006,0x70006,0x90007,0x70006,0x90007,0x90007,0xa0008 }; | ||
312 | |||
313 | static const uint32_t tab23_const[ 9] = | ||
314 | { 0x10002,0x40003,0x70007,0x40004,0x50004,0x70007,0x60006,0x70007,0x80008 }; | ||
315 | |||
316 | static const uint32_t tab56_const[16] = | ||
317 | { 0x10003,0x40004,0x70006,0x80008,0x40004,0x50004,0x80006,0x90007, | ||
318 | 0x70005,0x80006,0x90007,0xa0008,0x80007,0x80007,0x90008,0xa0009 }; | ||
319 | |||
320 | static const uint32_t tab789_const[36] = | ||
321 | {0x00100803,0x00401004,0x00701c06,0x00902407,0x00902409,0x00a0280a,0x00401004, | ||
322 | 0x00601005,0x00801806,0x00902807,0x00902808,0x00a0280a,0x00701c05,0x00701806, | ||
323 | 0x00902007,0x00a02808,0x00a02809,0x00b02c0a,0x00802407,0x00902807,0x00a02808, | ||
324 | 0x00b02c09,0x00b02c09,0x00b0300a,0x00802408,0x00902408,0x00a02809,0x00b02c09, | ||
325 | 0x00b0300a,0x00c0300b,0x00902809,0x00a02809,0x00b02c0a,0x00c02c0a,0x00c0340b, | ||
326 | 0x00c0340b}; | ||
327 | |||
328 | static const uint32_t tabABC_const[64] = | ||
329 | {0x00100804,0x00401004,0x00701806,0x00902008,0x00a02409,0x00a0280a,0x00a0240a, | ||
330 | 0x00b0280a,0x00401004,0x00601405,0x00801806,0x00902007,0x00a02809,0x00b02809, | ||
331 | 0x00a0240a,0x00a0280a,0x00701806,0x00801c06,0x00902007,0x00a02408,0x00b02809, | ||
332 | 0x00c02c0a,0x00b02809,0x00b0280a,0x00802007,0x00902007,0x00a02408,0x00b02c08, | ||
333 | 0x00c02809,0x00c0300a,0x00b0280a,0x00c02c0a,0x00902408,0x00a02808,0x00b02809, | ||
334 | 0x00c02c09,0x00c02c0a,0x00c0300a,0x00c02c0a,0x00c0300b,0x00a02409,0x00b02809, | ||
335 | 0x00c02c0a,0x00c0300a,0x00d0300a,0x00d0340b,0x00c0300a,0x00d0340b,0x00902409, | ||
336 | 0x00a02409,0x00b02409,0x00c0280a,0x00c02c0a,0x00c0300b,0x00d0300b,0x00d0300c, | ||
337 | 0x00a0240a,0x00a0240a,0x00b0280a,0x00c02c0b,0x00c0300b,0x00d0300b,0x00d0300b, | ||
338 | 0x00d0300c}; | ||
339 | |||
340 | static const uint32_t tab1624_const[256] = | ||
341 | {0x00010004,0x00050005,0x00070007,0x00090008,0x000a0009,0x000a000a,0x000b000a, | ||
342 | 0x000b000b,0x000c000b,0x000c000c,0x000c000c,0x000d000c,0x000d000c,0x000d000c, | ||
343 | 0x000e000d,0x000a000a,0x00040005,0x00060006,0x00080007,0x00090008,0x000a0009, | ||
344 | 0x000b000a,0x000b000a,0x000b000b,0x000c000b,0x000c000b,0x000c000c,0x000d000c, | ||
345 | 0x000e000c,0x000d000c,0x000e000c,0x000a000a,0x00070007,0x00080007,0x00090008, | ||
346 | 0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000b,0x000d000b,0x000c000b, | ||
347 | 0x000d000b,0x000d000c,0x000d000c,0x000e000c,0x000e000d,0x000b0009,0x00090008, | ||
348 | 0x00090008,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a,0x000c000b, | ||
349 | 0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c,0x000f000c, | ||
350 | 0x000c0009,0x000a0009,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a, | ||
351 | 0x000d000a,0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c, | ||
352 | 0x000f000c,0x000f000d,0x000b0009,0x000a000a,0x000a0009,0x000b000a,0x000b000a, | ||
353 | 0x000c000a,0x000d000a,0x000d000b,0x000e000b,0x000d000b,0x000e000b,0x000e000c, | ||
354 | 0x000f000c,0x000f000c,0x000f000c,0x0010000c,0x000c0009,0x000b000a,0x000b000a, | ||
355 | 0x000b000a,0x000c000a,0x000d000a,0x000d000b,0x000d000b,0x000d000b,0x000e000b, | ||
356 | 0x000e000c,0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000d,0x000c0009, | ||
357 | 0x000b000b,0x000b000a,0x000c000a,0x000c000a,0x000d000b,0x000d000b,0x000d000b, | ||
358 | 0x000e000b,0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000d, | ||
359 | 0x0011000d,0x000c000a,0x000b000b,0x000c000b,0x000c000b,0x000d000b,0x000d000b, | ||
360 | 0x000d000b,0x000e000b,0x000e000b,0x000f000b,0x000f000c,0x000f000c,0x000f000c, | ||
361 | 0x0010000c,0x0010000d,0x0010000d,0x000c000a,0x000c000b,0x000c000b,0x000c000b, | ||
362 | 0x000d000b,0x000d000b,0x000e000b,0x000e000b,0x000f000c,0x000f000c,0x000f000c, | ||
363 | 0x000f000c,0x0010000c,0x000f000d,0x0010000d,0x000f000d,0x000d000a,0x000c000c, | ||
364 | 0x000d000b,0x000c000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000e000c, | ||
365 | 0x000f000c,0x0010000c,0x0010000c,0x0010000d,0x0011000d,0x0011000d,0x0010000d, | ||
366 | 0x000c000a,0x000d000c,0x000d000c,0x000d000b,0x000d000b,0x000e000b,0x000e000c, | ||
367 | 0x000f000c,0x0010000c,0x0010000c,0x0010000c,0x0010000c,0x0010000d,0x0010000d, | ||
368 | 0x000f000d,0x0010000d,0x000d000a,0x000d000c,0x000e000c,0x000e000c,0x000e000c, | ||
369 | 0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000c,0x0010000d, | ||
370 | 0x0010000d,0x0010000d,0x0010000d,0x0012000d,0x000d000a,0x000f000c,0x000e000c, | ||
371 | 0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000c,0x0010000c,0x0010000d, | ||
372 | 0x0012000d,0x0011000d,0x0011000d,0x0011000d,0x0013000d,0x0011000d,0x000d000a, | ||
373 | 0x000e000d,0x000f000c,0x000d000c,0x000e000c,0x0010000c,0x0010000c,0x000f000c, | ||
374 | 0x0010000d,0x0010000d,0x0011000d,0x0012000d,0x0011000d,0x0013000d,0x0011000d, | ||
375 | 0x0010000d,0x000d000a,0x000a0009,0x000a0009,0x000a0009,0x000b0009,0x000b0009, | ||
376 | 0x000c0009,0x000c0009,0x000c0009,0x000d0009,0x000d0009,0x000d0009,0x000d000a, | ||
377 | 0x000d000a,0x000d000a,0x000d000a,0x000a0006}; | ||
378 | |||
379 | static const uint8_t t1l_const[8] = {1,3,2,3,1,4,3,5}; | ||
380 | static const uint8_t t2l_const[9] = {1,3,6,3,3,5,5,5,6}; | ||
381 | static const uint8_t t3l_const[9] = {2,2,6,3,2,5,5,5,6}; | ||
382 | static const uint8_t t5l_const[16] = {1,3,6,7,3,3,6,7,6,6,7,8,7,6,7,8}; | ||
383 | static const uint8_t t6l_const[16] = {3,3,5,7,3,2,4,5,4,4,5,6,6,5,6,7}; | ||
384 | |||
385 | static const uint8_t t7l_const[36] = | ||
386 | {1,3,6,8,8,9,3,4,6,7,7,8,6,5,7,8,8,9,7,7,8,9,9,9,7,7,8,9,9,10,8,8,9,10,10,10}; | ||
387 | |||
388 | static const uint8_t t8l_const[36] = | ||
389 | {2,3,6,8,8,9,3,2,4,8,8,8,6,4,6,8,8,9,8,8,8,9,9,10,8,7,8,9,10,10,9,8,9,9,11,11}; | ||
390 | |||
391 | static const uint8_t t9l_const[36] = | ||
392 | {3,3,5,6,8,9,3,3,4,5,6,8,4,4,5,6,7,8,6,5,6,7,7,8,7,6,7,7,8,9,8,7,8,8,9,9}; | ||
393 | |||
394 | static const uint8_t t10l_const[64] = | ||
395 | {1,3,6,8,9,9,9,10,3,4,6,7,8,9,8,8,6,6,7,8,9,10,9,9,7,7,8,9,10,10,9,10,8,8,9,10, | ||
396 | 10,10,10,10,9,9,10,10,11,11,10,11,8,8,9,10,10,10,11,11,9,8,9,10,10,11,11,11}; | ||
397 | |||
398 | static const uint8_t t11l_const[64] = | ||
399 | {2,3,5,7,8,9,8,9,3,3,4,6,8,8,7,8,5,5,6,7,8,9,8,8,7,6,7,9,8,10,8,9,8,8,8,9,9,10, | ||
400 | 9,10,8,8,9,10,10,11,10,11,8,7,7,8,9,10,10,10,8,7,8,9,10,10,10,10}; | ||
401 | |||
402 | static const uint8_t t12l_const[64] = | ||
403 | {4,3,5,7,8,9,9,9,3,3,4,5,7,7,8,8,5,4,5,6,7,8,7,8,6,5,6,6,7,8,8,8,7,6,7,7,8, | ||
404 | 8,8,9,8,7,8,8,8,9,8,9,8,7,7,8,8,9,9,10,9,8,8,9,9,9,9,10}; | ||
405 | |||
406 | static const uint8_t t13l_const[256] = | ||
407 | {1,4,6,7,8,9,9,10,9,10,11,11,12,12,13,13,3,4,6,7,8,8,9,9,9,9,10,10,11,12,12,12, | ||
408 | 6,6,7,8,9,9,10,10,9,10,10,11,11,12,13,13,7,7,8,9,9,10,10,10,10,11,11,11,11,12, | ||
409 | 13,13,8,7,9,9,10,10,11,11,10,11,11,12,12,13,13,14,9,8,9,10,10,10,11,11,11,11, | ||
410 | 12,11,13,13,14,14,9,9,10,10,11,11,11,11,11,12,12,12,13,13,14,14,10,9,10,11,11, | ||
411 | 11,12,12,12,12,13,13,13,14,16,16,9,8,9,10,10,11,11,12,12,12,12,13,13,14,15,15, | ||
412 | 10,9,10,10,11,11,11,13,12,13,13,14,14,14,16,15,10,10,10,11,11,12,12,13,12,13, | ||
413 | 14,13,14,15,16,17,11,10,10,11,12,12,12,12,13,13,13,14,15,15,15,16,11,11,11,12, | ||
414 | 12,13,12,13,14,14,15,15,15,16,16,16,12,11,12,13,13,13,14,14,14,14,14,15,16,15, | ||
415 | 16,16,13,12,12,13,13,13,15,14,14,17,15,15,15,17,16,16,12,12,13,14,14,14,15,14, | ||
416 | 15,15,16,16,19,18,19,16}; | ||
417 | |||
418 | static const uint8_t t15l_const[256] = | ||
419 | {3,4,5,7,7,8,9,9,9,10,10,11,11,11,12,13,4,3,5,6,7,7,8,8,8,9,9,10,10,10,11,11,5, | ||
420 | 5,5,6,7,7,8,8,8,9,9,10,10,11,11,11,6,6,6,7,7,8,8,9,9,9,10,10,10,11,11,11,7,6, | ||
421 | 7,7,8,8,9,9,9,9,10,10,10,11,11,11,8,7,7,8,8,8,9,9,9,9,10,10,11,11,11,12,9,7,8, | ||
422 | 8,8,9,9,9,9,10,10,10,11,11,12,12,9,8,8,9,9,9,9,10,10,10,10,10,11,11,11,12,9,8, | ||
423 | 8,9,9,9,9,10,10,10,10,11,11,12,12,12,9,8,9,9,9,9,10,10,10,11,11,11,11,12,12, | ||
424 | 12,10,9,9,9,10,10,10,10,10,11,11,11,11,12,13,12,10,9,9,9,10,10,10,10,11,11,11, | ||
425 | 11,12,12,12,13,11,10,9,10,10,10,11,11,11,11,11,11,12,12,13,13,11,10,10,10,10, | ||
426 | 11,11,11,11,12,12,12,12,12,13,13,12,11,11,11,11,11,11,11,12,12,12,12,13,13,12, | ||
427 | 13,12,11,11,11,11,11,11,12,12,12,12,12,13,13,13,13}; | ||
428 | |||
429 | static const uint8_t t16l_const[256] = | ||
430 | {1,4,6,8,9,9,10,10,11,11,11,12,12,12,13,9,3,4,6,7,8,9,9,9,10,10,10,11,12,11,12, | ||
431 | 8,6,6,7,8,9,9,10,10,11,10,11,11,11,12,12,9,8,7,8,9,9,10,10,10,11,11,12,12,12, | ||
432 | 13,13,10,9,8,9,9,10,10,11,11,11,12,12,12,13,13,13,9,9,8,9,9,10,11,11,12,11,12, | ||
433 | 12,13,13,13,14,10,10,9,9,10,11,11,11,11,12,12,12,12,13,13,14,10,10,9,10,10,11, | ||
434 | 11,11,12,12,13,13,13,13,15,15,10,10,10,10,11,11,11,12,12,13,13,13,13,14,14,14, | ||
435 | 10,11,10,10,11,11,12,12,13,13,13,13,14,13,14,13,11,11,11,10,11,12,12,12,12,13, | ||
436 | 14,14,14,15,15,14,10,12,11,11,11,12,12,13,14,14,14,14,14,14,13,14,11,12,12,12, | ||
437 | 12,12,13,13,13,13,15,14,14,14,14,16,11,14,12,12,12,13,13,14,14,14,16,15,15,15, | ||
438 | 17,15,11,13,13,11,12,14,14,13,14,14,15,16,15,17,15,14,11,9,8,8,9,9,10,10,10, | ||
439 | 11,11,11,11,11,11,11,8}; | ||
440 | |||
441 | static const uint8_t t24l_const[256] = | ||
442 | {4,4,6,7,8,9,9,10,10,11,11,11,11,11,12,9,4,4,5,6,7,8,8,9,9,9,10,10,10,10,10,8, | ||
443 | 6,5,6,7,7,8,8,9,9,9,9,10,10,10,11,7,7,6,7,7,8,8,8,9,9,9,9,10,10,10,10,7,8,7,7, | ||
444 | 8,8,8,8,9,9,9,10,10,10,10,11,7,9,7,8,8,8,8,9,9,9,9,10,10,10,10,10,7,9,8,8,8,8, | ||
445 | 9,9,9,9,10,10,10,10,10,11,7,10,8,8,8,9,9,9,9,10,10,10,10,10,11,11,8,10,9,9,9, | ||
446 | 9,9,9,9,9,10,10,10,10,11,11,8,10,9,9,9,9,9,9,10,10,10,10,10,11,11,11,8,11,9,9, | ||
447 | 9,9,10,10,10,10,10,10,11,11,11,11,8,11,10,9,9,9,10,10,10,10,10,10,11,11,11,11, | ||
448 | 8,11,10,10,10,10,10,10,10,10,10,11,11,11,11,11,8,11,10,10,10,10,10,10,10,11, | ||
449 | 11,11,11,11,11,11,8,12,10,10,10,10,10,10,11,11,11,11,11,11,11,11,8,8,7,7,7,7, | ||
450 | 7,7,7,7,7,7,8,8,8,8,4}; | ||
451 | |||
452 | static const struct huffcodetab ht_const[HTN] = | ||
453 | { { 0, NULL, NULL}, /* Apparently not used */ | ||
454 | { 2, t1HB, t1l}, | ||
455 | { 3, t2HB, t2l}, | ||
456 | { 3, t3HB, t3l}, | ||
457 | { 0, NULL, NULL}, /* Apparently not used */ | ||
458 | { 4, t5HB, t5l}, | ||
459 | { 4, t6HB, t6l}, | ||
460 | { 6, t7HB, t7l}, | ||
461 | { 6, t8HB, t8l}, | ||
462 | { 6, t9HB, t9l}, | ||
463 | { 8, t10HB, t10l}, | ||
464 | { 8, t11HB, t11l}, | ||
465 | { 8, t12HB, t12l}, | ||
466 | {16, t13HB, t13l}, | ||
467 | { 0, NULL, NULL}, /* Apparently not used */ | ||
468 | {16, t15HB, t15l} }; | ||
469 | |||
470 | static const struct huffcodebig ht_big[HTN] = | ||
471 | { { 16, 1, 1 }, | ||
472 | { 16, 2, 3 }, | ||
473 | { 16, 3, 7 }, | ||
474 | { 16, 4, 15 }, | ||
475 | { 16, 6, 63 }, | ||
476 | { 16, 8, 255 }, | ||
477 | { 16, 10, 1023 }, | ||
478 | { 16, 13, 8191 }, | ||
479 | { 16, 4, 15 }, | ||
480 | { 16, 5, 31 }, | ||
481 | { 16, 6, 63 }, | ||
482 | { 16, 7, 127 }, | ||
483 | { 16, 8, 255 }, | ||
484 | { 16, 9, 511 }, | ||
485 | { 16, 11, 2047 }, | ||
486 | { 16, 13, 8191 } }; | ||
487 | |||
488 | static const struct | ||
489 | { | ||
490 | uint32_t region0_cnt; | ||
491 | uint32_t region1_cnt; | ||
492 | } subdv_table[23] = | ||
493 | { {0, 0}, /* 0 bands */ | ||
494 | {0, 0}, /* 1 bands */ | ||
495 | {0, 0}, /* 2 bands */ | ||
496 | {0, 0}, /* 3 bands */ | ||
497 | {0, 0}, /* 4 bands */ | ||
498 | {0, 1}, /* 5 bands */ | ||
499 | {1, 1}, /* 6 bands */ | ||
500 | {1, 1}, /* 7 bands */ | ||
501 | {1, 2}, /* 8 bands */ | ||
502 | {2, 2}, /* 9 bands */ | ||
503 | {2, 3}, /* 10 bands */ | ||
504 | {2, 3}, /* 11 bands */ | ||
505 | {3, 4}, /* 12 bands */ | ||
506 | {3, 4}, /* 13 bands */ | ||
507 | {3, 4}, /* 14 bands */ | ||
508 | {4, 5}, /* 15 bands */ | ||
509 | {4, 5}, /* 16 bands */ | ||
510 | {4, 6}, /* 17 bands */ | ||
511 | {5, 6}, /* 18 bands */ | ||
512 | {5, 6}, /* 19 bands */ | ||
513 | {5, 7}, /* 20 bands */ | ||
514 | {6, 7}, /* 21 bands */ | ||
515 | {6, 7}, /* 22 bands */ | ||
516 | }; | ||
517 | |||
518 | static const uint32_t sfBand[6][23] = | ||
519 | { | ||
520 | /* Table B.2.b: 22.05 kHz */ | ||
521 | {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, | ||
522 | /* Table B.2.c: 24 kHz */ | ||
523 | {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576}, | ||
524 | /* Table B.2.a: 16 kHz */ | ||
525 | {0,6,12,18,24,30,36,44,45,66,80,96,116,140,168,200,238,248,336,396,464,522,576}, | ||
526 | /* Table B.8.b: 44.1 kHz */ | ||
527 | {0,4, 8,12,16,20,24,30,36,44,52,62, 74, 90,110,134,162,196,238,288,342,418,576}, | ||
528 | /* Table B.8.c: 48 kHz */ | ||
529 | {0,4, 8,12,16,20,24,30,36,42,50,60, 72, 88,106,128,156,190,230,276,330,384,576}, | ||
530 | /* Table B.8.a: 32 kHz */ | ||
531 | {0,4, 8,12,16,20,24,30,36,44,54,66, 82,102,126,156,194,240,296,364,448,550,576} }; | ||
532 | |||
533 | |||
534 | static const short int2idx_const[4096] = /* int2idx[i] = sqrt(i*sqrt(i)); */ | ||
535 | { | ||
536 | 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, | ||
537 | 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, | ||
538 | 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, | ||
539 | 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, | ||
540 | 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, | ||
541 | 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, | ||
542 | 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40, | ||
543 | 41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45, | ||
544 | 45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, | ||
545 | 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, | ||
546 | 53, 53, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 57, 57, 57, | ||
547 | 57, 57, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 61, 61, | ||
548 | 61, 61, 61, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 65, | ||
549 | 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68, | ||
550 | 68, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 72, 72, 72, | ||
551 | 72, 72, 72, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, | ||
552 | 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 79, 79, 79, | ||
553 | 79, 79, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, | ||
554 | 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 86, 86, 86, | ||
555 | 86, 86, 86, 87, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, | ||
556 | 89, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 93, | ||
557 | 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 96, 96, 96, | ||
558 | 96, 96, 96, 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, | ||
559 | 99, 99,100,100,100,100,100,100,101,101,101,101,101,101,102,102,102,102,102,102, | ||
560 | 103,103,103,103,103,103,104,104,104,104,104,104,104,105,105,105,105,105,105,106, | ||
561 | 106,106,106,106,106,107,107,107,107,107,107,107,108,108,108,108,108,108,109,109, | ||
562 | 109,109,109,109,110,110,110,110,110,110,110,111,111,111,111,111,111,112,112,112, | ||
563 | 112,112,112,112,113,113,113,113,113,113,114,114,114,114,114,114,115,115,115,115, | ||
564 | 115,115,115,116,116,116,116,116,116,117,117,117,117,117,117,117,118,118,118,118, | ||
565 | 118,118,118,119,119,119,119,119,119,120,120,120,120,120,120,120,121,121,121,121, | ||
566 | 121,121,122,122,122,122,122,122,122,123,123,123,123,123,123,123,124,124,124,124, | ||
567 | 124,124,125,125,125,125,125,125,125,126,126,126,126,126,126,126,127,127,127,127, | ||
568 | 127,127,128,128,128,128,128,128,128,129,129,129,129,129,129,129,130,130,130,130, | ||
569 | 130,130,131,131,131,131,131,131,131,132,132,132,132,132,132,132,133,133,133,133, | ||
570 | 133,133,133,134,134,134,134,134,134,134,135,135,135,135,135,135,136,136,136,136, | ||
571 | 136,136,136,137,137,137,137,137,137,137,138,138,138,138,138,138,138,139,139,139, | ||
572 | 139,139,139,139,140,140,140,140,140,140,140,141,141,141,141,141,141,141,142,142, | ||
573 | 142,142,142,142,142,143,143,143,143,143,143,143,144,144,144,144,144,144,144,145, | ||
574 | 145,145,145,145,145,145,146,146,146,146,146,146,146,147,147,147,147,147,147,147, | ||
575 | 148,148,148,148,148,148,148,149,149,149,149,149,149,149,150,150,150,150,150,150, | ||
576 | 150,151,151,151,151,151,151,151,152,152,152,152,152,152,152,153,153,153,153,153, | ||
577 | 153,153,154,154,154,154,154,154,154,154,155,155,155,155,155,155,155,156,156,156, | ||
578 | 156,156,156,156,157,157,157,157,157,157,157,158,158,158,158,158,158,158,159,159, | ||
579 | 159,159,159,159,159,160,160,160,160,160,160,160,160,161,161,161,161,161,161,161, | ||
580 | 162,162,162,162,162,162,162,163,163,163,163,163,163,163,163,164,164,164,164,164, | ||
581 | 164,164,165,165,165,165,165,165,165,166,166,166,166,166,166,166,167,167,167,167, | ||
582 | 167,167,167,167,168,168,168,168,168,168,168,169,169,169,169,169,169,169,169,170, | ||
583 | 170,170,170,170,170,170,171,171,171,171,171,171,171,172,172,172,172,172,172,172, | ||
584 | 172,173,173,173,173,173,173,173,174,174,174,174,174,174,174,174,175,175,175,175, | ||
585 | 175,175,175,176,176,176,176,176,176,176,176,177,177,177,177,177,177,177,178,178, | ||
586 | 178,178,178,178,178,178,179,179,179,179,179,179,179,180,180,180,180,180,180,180, | ||
587 | 180,181,181,181,181,181,181,181,182,182,182,182,182,182,182,182,183,183,183,183, | ||
588 | 183,183,183,184,184,184,184,184,184,184,184,185,185,185,185,185,185,185,186,186, | ||
589 | 186,186,186,186,186,186,187,187,187,187,187,187,187,187,188,188,188,188,188,188, | ||
590 | 188,189,189,189,189,189,189,189,189,190,190,190,190,190,190,190,190,191,191,191, | ||
591 | 191,191,191,191,192,192,192,192,192,192,192,192,193,193,193,193,193,193,193,193, | ||
592 | 194,194,194,194,194,194,194,195,195,195,195,195,195,195,195,196,196,196,196,196, | ||
593 | 196,196,196,197,197,197,197,197,197,197,197,198,198,198,198,198,198,198,199,199, | ||
594 | 199,199,199,199,199,199,200,200,200,200,200,200,200,200,201,201,201,201,201,201, | ||
595 | 201,201,202,202,202,202,202,202,202,202,203,203,203,203,203,203,203,204,204,204, | ||
596 | 204,204,204,204,204,205,205,205,205,205,205,205,205,206,206,206,206,206,206,206, | ||
597 | 206,207,207,207,207,207,207,207,207,208,208,208,208,208,208,208,208,209,209,209, | ||
598 | 209,209,209,209,209,210,210,210,210,210,210,210,210,211,211,211,211,211,211,211, | ||
599 | 211,212,212,212,212,212,212,212,212,213,213,213,213,213,213,213,213,214,214,214, | ||
600 | 214,214,214,214,214,215,215,215,215,215,215,215,215,216,216,216,216,216,216,216, | ||
601 | 216,217,217,217,217,217,217,217,217,218,218,218,218,218,218,218,218,219,219,219, | ||
602 | 219,219,219,219,219,220,220,220,220,220,220,220,220,221,221,221,221,221,221,221, | ||
603 | 221,222,222,222,222,222,222,222,222,223,223,223,223,223,223,223,223,224,224,224, | ||
604 | 224,224,224,224,224,225,225,225,225,225,225,225,225,226,226,226,226,226,226,226, | ||
605 | 226,227,227,227,227,227,227,227,227,228,228,228,228,228,228,228,228,229,229,229, | ||
606 | 229,229,229,229,229,229,230,230,230,230,230,230,230,230,231,231,231,231,231,231, | ||
607 | 231,231,232,232,232,232,232,232,232,232,233,233,233,233,233,233,233,233,234,234, | ||
608 | 234,234,234,234,234,234,234,235,235,235,235,235,235,235,235,236,236,236,236,236, | ||
609 | 236,236,236,237,237,237,237,237,237,237,237,238,238,238,238,238,238,238,238,238, | ||
610 | 239,239,239,239,239,239,239,239,240,240,240,240,240,240,240,240,241,241,241,241, | ||
611 | 241,241,241,241,242,242,242,242,242,242,242,242,242,243,243,243,243,243,243,243, | ||
612 | 243,244,244,244,244,244,244,244,244,245,245,245,245,245,245,245,245,245,246,246, | ||
613 | 246,246,246,246,246,246,247,247,247,247,247,247,247,247,248,248,248,248,248,248, | ||
614 | 248,248,248,249,249,249,249,249,249,249,249,250,250,250,250,250,250,250,250,250, | ||
615 | 251,251,251,251,251,251,251,251,252,252,252,252,252,252,252,252,253,253,253,253, | ||
616 | 253,253,253,253,253,254,254,254,254,254,254,254,254,255,255,255,255,255,255,255, | ||
617 | 255,255,256,256,256,256,256,256,256,256,257,257,257,257,257,257,257,257,257,258, | ||
618 | 258,258,258,258,258,258,258,259,259,259,259,259,259,259,259,259,260,260,260,260, | ||
619 | 260,260,260,260,261,261,261,261,261,261,261,261,261,262,262,262,262,262,262,262, | ||
620 | 262,263,263,263,263,263,263,263,263,263,264,264,264,264,264,264,264,264,265,265, | ||
621 | 265,265,265,265,265,265,265,266,266,266,266,266,266,266,266,267,267,267,267,267, | ||
622 | 267,267,267,267,268,268,268,268,268,268,268,268,268,269,269,269,269,269,269,269, | ||
623 | 269,270,270,270,270,270,270,270,270,270,271,271,271,271,271,271,271,271,271,272, | ||
624 | 272,272,272,272,272,272,272,273,273,273,273,273,273,273,273,273,274,274,274,274, | ||
625 | 274,274,274,274,275,275,275,275,275,275,275,275,275,276,276,276,276,276,276,276, | ||
626 | 276,276,277,277,277,277,277,277,277,277,277,278,278,278,278,278,278,278,278,279, | ||
627 | 279,279,279,279,279,279,279,279,280,280,280,280,280,280,280,280,280,281,281,281, | ||
628 | 281,281,281,281,281,282,282,282,282,282,282,282,282,282,283,283,283,283,283,283, | ||
629 | 283,283,283,284,284,284,284,284,284,284,284,284,285,285,285,285,285,285,285,285, | ||
630 | 286,286,286,286,286,286,286,286,286,287,287,287,287,287,287,287,287,287,288,288, | ||
631 | 288,288,288,288,288,288,288,289,289,289,289,289,289,289,289,289,290,290,290,290, | ||
632 | 290,290,290,290,291,291,291,291,291,291,291,291,291,292,292,292,292,292,292,292, | ||
633 | 292,292,293,293,293,293,293,293,293,293,293,294,294,294,294,294,294,294,294,294, | ||
634 | 295,295,295,295,295,295,295,295,295,296,296,296,296,296,296,296,296,296,297,297, | ||
635 | 297,297,297,297,297,297,297,298,298,298,298,298,298,298,298,299,299,299,299,299, | ||
636 | 299,299,299,299,300,300,300,300,300,300,300,300,300,301,301,301,301,301,301,301, | ||
637 | 301,301,302,302,302,302,302,302,302,302,302,303,303,303,303,303,303,303,303,303, | ||
638 | 304,304,304,304,304,304,304,304,304,305,305,305,305,305,305,305,305,305,306,306, | ||
639 | 306,306,306,306,306,306,306,307,307,307,307,307,307,307,307,307,308,308,308,308, | ||
640 | 308,308,308,308,308,309,309,309,309,309,309,309,309,309,310,310,310,310,310,310, | ||
641 | 310,310,310,311,311,311,311,311,311,311,311,311,312,312,312,312,312,312,312,312, | ||
642 | 312,313,313,313,313,313,313,313,313,313,314,314,314,314,314,314,314,314,314,315, | ||
643 | 315,315,315,315,315,315,315,315,316,316,316,316,316,316,316,316,316,317,317,317, | ||
644 | 317,317,317,317,317,317,318,318,318,318,318,318,318,318,318,318,319,319,319,319, | ||
645 | 319,319,319,319,319,320,320,320,320,320,320,320,320,320,321,321,321,321,321,321, | ||
646 | 321,321,321,322,322,322,322,322,322,322,322,322,323,323,323,323,323,323,323,323, | ||
647 | 323,324,324,324,324,324,324,324,324,324,325,325,325,325,325,325,325,325,325,325, | ||
648 | 326,326,326,326,326,326,326,326,326,327,327,327,327,327,327,327,327,327,328,328, | ||
649 | 328,328,328,328,328,328,328,329,329,329,329,329,329,329,329,329,330,330,330,330, | ||
650 | 330,330,330,330,330,330,331,331,331,331,331,331,331,331,331,332,332,332,332,332, | ||
651 | 332,332,332,332,333,333,333,333,333,333,333,333,333,334,334,334,334,334,334,334, | ||
652 | 334,334,335,335,335,335,335,335,335,335,335,335,336,336,336,336,336,336,336,336, | ||
653 | 336,337,337,337,337,337,337,337,337,337,338,338,338,338,338,338,338,338,338,338, | ||
654 | 339,339,339,339,339,339,339,339,339,340,340,340,340,340,340,340,340,340,341,341, | ||
655 | 341,341,341,341,341,341,341,341,342,342,342,342,342,342,342,342,342,343,343,343, | ||
656 | 343,343,343,343,343,343,344,344,344,344,344,344,344,344,344,344,345,345,345,345, | ||
657 | 345,345,345,345,345,346,346,346,346,346,346,346,346,346,347,347,347,347,347,347, | ||
658 | 347,347,347,347,348,348,348,348,348,348,348,348,348,349,349,349,349,349,349,349, | ||
659 | 349,349,350,350,350,350,350,350,350,350,350,350,351,351,351,351,351,351,351,351, | ||
660 | 351,352,352,352,352,352,352,352,352,352,352,353,353,353,353,353,353,353,353,353, | ||
661 | 354,354,354,354,354,354,354,354,354,355,355,355,355,355,355,355,355,355,355,356, | ||
662 | 356,356,356,356,356,356,356,356,357,357,357,357,357,357,357,357,357,357,358,358, | ||
663 | 358,358,358,358,358,358,358,359,359,359,359,359,359,359,359,359,359,360,360,360, | ||
664 | 360,360,360,360,360,360,361,361,361,361,361,361,361,361,361,361,362,362,362,362, | ||
665 | 362,362,362,362,362,363,363,363,363,363,363,363,363,363,363,364,364,364,364,364, | ||
666 | 364,364,364,364,365,365,365,365,365,365,365,365,365,365,366,366,366,366,366,366, | ||
667 | 366,366,366,367,367,367,367,367,367,367,367,367,367,368,368,368,368,368,368,368, | ||
668 | 368,368,369,369,369,369,369,369,369,369,369,369,370,370,370,370,370,370,370,370, | ||
669 | 370,370,371,371,371,371,371,371,371,371,371,372,372,372,372,372,372,372,372,372, | ||
670 | 372,373,373,373,373,373,373,373,373,373,374,374,374,374,374,374,374,374,374,374, | ||
671 | 375,375,375,375,375,375,375,375,375,375,376,376,376,376,376,376,376,376,376,377, | ||
672 | 377,377,377,377,377,377,377,377,377,378,378,378,378,378,378,378,378,378,379,379, | ||
673 | 379,379,379,379,379,379,379,379,380,380,380,380,380,380,380,380,380,380,381,381, | ||
674 | 381,381,381,381,381,381,381,382,382,382,382,382,382,382,382,382,382,383,383,383, | ||
675 | 383,383,383,383,383,383,383,384,384,384,384,384,384,384,384,384,385,385,385,385, | ||
676 | 385,385,385,385,385,385,386,386,386,386,386,386,386,386,386,386,387,387,387,387, | ||
677 | 387,387,387,387,387,387,388,388,388,388,388,388,388,388,388,389,389,389,389,389, | ||
678 | 389,389,389,389,389,390,390,390,390,390,390,390,390,390,390,391,391,391,391,391, | ||
679 | 391,391,391,391,391,392,392,392,392,392,392,392,392,392,393,393,393,393,393,393, | ||
680 | 393,393,393,393,394,394,394,394,394,394,394,394,394,394,395,395,395,395,395,395, | ||
681 | 395,395,395,395,396,396,396,396,396,396,396,396,396,397,397,397,397,397,397,397, | ||
682 | 397,397,397,398,398,398,398,398,398,398,398,398,398,399,399,399,399,399,399,399, | ||
683 | 399,399,399,400,400,400,400,400,400,400,400,400,400,401,401,401,401,401,401,401, | ||
684 | 401,401,402,402,402,402,402,402,402,402,402,402,403,403,403,403,403,403,403,403, | ||
685 | 403,403,404,404,404,404,404,404,404,404,404,404,405,405,405,405,405,405,405,405, | ||
686 | 405,405,406,406,406,406,406,406,406,406,406,406,407,407,407,407,407,407,407,407, | ||
687 | 407,407,408,408,408,408,408,408,408,408,408,408,409,409,409,409,409,409,409,409, | ||
688 | 409,410,410,410,410,410,410,410,410,410,410,411,411,411,411,411,411,411,411,411, | ||
689 | 411,412,412,412,412,412,412,412,412,412,412,413,413,413,413,413,413,413,413,413, | ||
690 | 413,414,414,414,414,414,414,414,414,414,414,415,415,415,415,415,415,415,415,415, | ||
691 | 415,416,416,416,416,416,416,416,416,416,416,417,417,417,417,417,417,417,417,417, | ||
692 | 417,418,418,418,418,418,418,418,418,418,418,419,419,419,419,419,419,419,419,419, | ||
693 | 419,420,420,420,420,420,420,420,420,420,420,421,421,421,421,421,421,421,421,421, | ||
694 | 421,422,422,422,422,422,422,422,422,422,422,423,423,423,423,423,423,423,423,423, | ||
695 | 423,424,424,424,424,424,424,424,424,424,424,425,425,425,425,425,425,425,425,425, | ||
696 | 425,426,426,426,426,426,426,426,426,426,426,427,427,427,427,427,427,427,427,427, | ||
697 | 427,428,428,428,428,428,428,428,428,428,428,429,429,429,429,429,429,429,429,429, | ||
698 | 429,430,430,430,430,430,430,430,430,430,430,431,431,431,431,431,431,431,431,431, | ||
699 | 431,432,432,432,432,432,432,432,432,432,432,433,433,433,433,433,433,433,433,433, | ||
700 | 433,434,434,434,434,434,434,434,434,434,434,435,435,435,435,435,435,435,435,435, | ||
701 | 435,435,436,436,436,436,436,436,436,436,436,436,437,437,437,437,437,437,437,437, | ||
702 | 437,437,438,438,438,438,438,438,438,438,438,438,439,439,439,439,439,439,439,439, | ||
703 | 439,439,440,440,440,440,440,440,440,440,440,440,441,441,441,441,441,441,441,441, | ||
704 | 441,441,442,442,442,442,442,442,442,442,442,442,443,443,443,443,443,443,443,443, | ||
705 | 443,443,443,444,444,444,444,444,444,444,444,444,444,445,445,445,445,445,445,445, | ||
706 | 445,445,445,446,446,446,446,446,446,446,446,446,446,447,447,447,447,447,447,447, | ||
707 | 447,447,447,448,448,448,448,448,448,448,448,448,448,448,449,449,449,449,449,449, | ||
708 | 449,449,449,449,450,450,450,450,450,450,450,450,450,450,451,451,451,451,451,451, | ||
709 | 451,451,451,451,452,452,452,452,452,452,452,452,452,452,453,453,453,453,453,453, | ||
710 | 453,453,453,453,453,454,454,454,454,454,454,454,454,454,454,455,455,455,455,455, | ||
711 | 455,455,455,455,455,456,456,456,456,456,456,456,456,456,456,457,457,457,457,457, | ||
712 | 457,457,457,457,457,457,458,458,458,458,458,458,458,458,458,458,459,459,459,459, | ||
713 | 459,459,459,459,459,459,460,460,460,460,460,460,460,460,460,460,460,461,461,461, | ||
714 | 461,461,461,461,461,461,461,462,462,462,462,462,462,462,462,462,462,463,463,463, | ||
715 | 463,463,463,463,463,463,463,463,464,464,464,464,464,464,464,464,464,464,465,465, | ||
716 | 465,465,465,465,465,465,465,465,466,466,466,466,466,466,466,466,466,466,466,467, | ||
717 | 467,467,467,467,467,467,467,467,467,468,468,468,468,468,468,468,468,468,468,469, | ||
718 | 469,469,469,469,469,469,469,469,469,469,470,470,470,470,470,470,470,470,470,470, | ||
719 | 471,471,471,471,471,471,471,471,471,471,472,472,472,472,472,472,472,472,472,472, | ||
720 | 472,473,473,473,473,473,473,473,473,473,473,474,474,474,474,474,474,474,474,474, | ||
721 | 474,475,475,475,475,475,475,475,475,475,475,475,476,476,476,476,476,476,476,476, | ||
722 | 476,476,477,477,477,477,477,477,477,477,477,477,477,478,478,478,478,478,478,478, | ||
723 | 478,478,478,479,479,479,479,479,479,479,479,479,479,479,480,480,480,480,480,480, | ||
724 | 480,480,480,480,481,481,481,481,481,481,481,481,481,481,482,482,482,482,482,482, | ||
725 | 482,482,482,482,482,483,483,483,483,483,483,483,483,483,483,484,484,484,484,484, | ||
726 | 484,484,484,484,484,484,485,485,485,485,485,485,485,485,485,485,486,486,486,486, | ||
727 | 486,486,486,486,486,486,486,487,487,487,487,487,487,487,487,487,487,488,488,488, | ||
728 | 488,488,488,488,488,488,488,488,489,489,489,489,489,489,489,489,489,489,490,490, | ||
729 | 490,490,490,490,490,490,490,490,490,491,491,491,491,491,491,491,491,491,491,492, | ||
730 | 492,492,492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493,493,493, | ||
731 | 494,494,494,494,494,494,494,494,494,494,494,495,495,495,495,495,495,495,495,495, | ||
732 | 495,496,496,496,496,496,496,496,496,496,496,496,497,497,497,497,497,497,497,497, | ||
733 | 497,497,497,498,498,498,498,498,498,498,498,498,498,499,499,499,499,499,499,499, | ||
734 | 499,499,499,499,500,500,500,500,500,500,500,500,500,500,501,501,501,501,501,501, | ||
735 | 501,501,501,501,501,502,502,502,502,502,502,502,502,502,502,503,503,503,503,503, | ||
736 | 503,503,503,503,503,503,504,504,504,504,504,504,504,504,504,504,504,505,505,505, | ||
737 | 505,505,505,505,505,505,505,506,506,506,506,506,506,506,506,506,506,506,507,507, | ||
738 | 507,507,507,507,507,507,507,507,507,508,508,508,508,508,508,508,508,508,508,509, | ||
739 | 509,509,509,509,509,509,509,509,509,509,510,510,510,510,510,510,510,510,510,510, | ||
740 | 510,511,511,511,511,511,511,511,511,511,511,512,512,512,512,512 }; | ||
741 | |||
742 | static const int order[32] = | ||
743 | { 0, 1, 16, 17, 8, 9, 24, 25, 4, 5, 20, 21, 12, 13, 28, 29, | ||
744 | 2, 3, 18, 19,10,11, 26, 27, 6, 7, 22, 23, 14, 15, 30, 31 }; | ||
745 | |||
746 | static const long sampr_index[2][3] = | ||
747 | { { 22050, 24000, 16000 }, /* MPEG 2 */ | ||
748 | { 44100, 48000, 32000 } }; /* MPEG 1 */ | ||
749 | |||
750 | static const long bitr_index[2][15] = | ||
751 | { {0, 8,16,24,32,40,48,56, 64, 80, 96,112,128,144,160}, /* MPEG 2 */ | ||
752 | {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320} }; /* MPEG 1 */ | ||
753 | |||
754 | static const int num_bands[3][15] = | ||
755 | { {0,10,10,10,10,12,14,16, 20, 22, 24, 26, 28, 30, 32}, | ||
756 | {0,10,10,10,10,10,12,14, 18, 24, 26, 28, 30, 32, 32}, | ||
757 | {0,10,12,14,18,24,26,28, 30, 32, 32, 32, 32, 32, 32} }; | ||
758 | |||
759 | static const int cx_const[9] = | ||
760 | { 16135, 10531, 5604, 15396, -2845,-12551, 14189, 8192, 16384 }; | ||
761 | |||
762 | static const int ca_const[8] = | ||
763 | {-16859,-15458,-10269, -5961, -3099, -1342, -465, -121 }; | ||
764 | |||
765 | static const int cs_const[8] = | ||
766 | { 28098, 28893, 31117, 32221, 32621, 32740, 32765, 32768 }; | ||
767 | |||
768 | static const short enwindow_const[15*27+24] = | ||
769 | { 0, 65, 593, 1766, 22228, 2115, 611, 62, | ||
770 | 8, 119, 1419, 10564,-11659,-1635,-154, -9, | ||
771 | -8, -119,-1419,-10564, 11659, 1635, 154, 9, 464, 100, 91, | ||
772 | 0, 69, 604, 1635, 23148, 2363, 643, 62, | ||
773 | 7, 107, 1368, 10449,-12733,-1818,-180,-11, | ||
774 | -7, -107,-1368,-10449, 12733, 1818, 180, 11, 420, 200, 164, | ||
775 | 0, 72, 608, 1465, 23979, 2600, 671, 63, | ||
776 | 7, 94, 1305, 10265,-13818,-2004,-207,-12, | ||
777 | -7, -94,-1305,-10265, 13818, 2004, 207, 12, 380, 297, 220, | ||
778 | 0, 76, 606, 1256, 24718, 2825, 693, 63, | ||
779 | 6, 81, 1232, 10016,-14908,-2192,-236,-14, | ||
780 | -6, -81,-1232,-10016, 14908, 2192, 236, 14, 342, 392, 262, | ||
781 | 0, 78, 597, 1007, 25359, 3033, 712, 63, | ||
782 | 6, 68, 1150, 9706,-15995,-2380,-267,-15, | ||
783 | -6, -68,-1150, -9706, 15995, 2380, 267, 15, 307, 483, 289, | ||
784 | 0, 80, 580, 719, 25901, 3224, 726, 62, | ||
785 | 6, 54, 1060, 9343,-17072,-2565,-299,-17, | ||
786 | -6, -54,-1060, -9343, 17072, 2565, 299, 17, 274, 569, 304, | ||
787 | -1, 82, 555, 391, 26339, 3395, 735, 61, | ||
788 | 5, 40, 963, 8930,-18131,-2747,-332,-19, | ||
789 | -5, -40, -963, -8930, 18131, 2747, 332, 19, 242, 650, 307, | ||
790 | -1, 83, 523, 26, 26672, 3545, 740, 60, | ||
791 | 5, 27, 861, 8474,-19164,-2923,-366,-21, | ||
792 | -5, -27, -861, -8474, 19164, 2923, 366, 21, 212, 724, 300, | ||
793 | -1, 83, 482, -376, 26900, 3672, 739, 58, | ||
794 | 4, 14, 756, 7981,-20163,-3092,-401,-24, | ||
795 | -4, -14, -756, -7981, 20163, 3092, 401, 24, 183, 792, 283, | ||
796 | -1, 82, 433, -812, 27022, 3776, 735, 56, | ||
797 | 4, 1, 648, 7456,-21122,-3250,-435,-26, | ||
798 | -4, -1, -648, -7456, 21122, 3250, 435, 26, 155, 851, 258, | ||
799 | -1, 81, 376, -1281, 27038, 3855, 726, 54, | ||
800 | 3, -11, 539, 6907,-22032,-3397,-470,-28, | ||
801 | -3, 11, -539, -6907, 22032, 3397, 470, 28, 128, 903, 226, | ||
802 | -1, 78, 312, -1778, 26951, 3910, 713, 52, | ||
803 | 3, -22, 430, 6338,-22887,-3530,-503,-31, | ||
804 | -3, 22, -430, -6338, 22887, 3530, 503, 31, 102, 946, 188, | ||
805 | -2, 75, 239, -2302, 26761, 3941, 696, 49, | ||
806 | 3, -33, 322, 5757,-23678,-3648,-537,-34, | ||
807 | -3, 33, -322, -5757, 23678, 3648, 537, 34, 76, 980, 145, | ||
808 | -2, 70, 160, -2848, 26472, 3948, 676, 47, | ||
809 | 3, -42, 217, 5167,-24399,-3749,-568,-36, | ||
810 | -3, 42, -217, -5167, 24399, 3749, 568, 36, 50, 1004, 99, | ||
811 | -2, 65, 74, -3412, 26087, 3931, 653, 44, | ||
812 | 2, -51, 115, 4577,-25045,-3830,-599,-39, | ||
813 | -2, 51, -115, -4577, 25045, 3830, 599, 39, 25, 1019, 50, | ||
814 | |||
815 | 25610,3891,627,42,-3990,-18,58,-2, | ||
816 | 21226,-21226,10604,-10604,1860,-1860,1458,-1458,576,-576,130,-130,60,-60,8,-8 | ||
817 | }; | ||
818 | |||
819 | static const int win_const[18][4] = { | ||
820 | { -3072, -134, -146, 3352 }, | ||
821 | { -2747, -362, -471, 3579 }, | ||
822 | { -2387, -529, -831, 3747 }, | ||
823 | { -2004, -632,-1214, 3850 }, | ||
824 | { -1609, -666,-1609, 3884 }, | ||
825 | { -1214, -632,-2004, 3850 }, | ||
826 | { -831, -529,-2387, 3747 }, | ||
827 | { -471, -362,-2747, 3579 }, | ||
828 | { -146, -134,-3072, 3352 }, | ||
829 | { 134,-3072,-3352, -146 }, | ||
830 | { 362,-2747,-3579, -471 }, | ||
831 | { 529,-2387,-3747, -831 }, | ||
832 | { 632,-2004,-3850,-1214 }, | ||
833 | { 666,-1609,-3884,-1609 }, | ||
834 | { 632,-1214,-3850,-2004 }, | ||
835 | { 529, -831,-3747,-2387 }, | ||
836 | { 362, -471,-3579,-2747 }, | ||
837 | { 134, -146,-3352,-3072 } }; | ||
838 | |||
839 | /* forward declarations */ | ||
840 | static int HuffmanCode( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table); | ||
841 | static int HuffmanCod1( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table); | ||
842 | static void putbits(uint32_t val, uint32_t nbit); | ||
843 | static int find_best_2( short *ix, uint32_t start, uint32_t end, const uint32_t *table, | ||
844 | uint32_t len, int *bits); | ||
845 | static int find_best_3( short *ix, uint32_t start, uint32_t end, const uint32_t *table, | ||
846 | uint32_t len, int *bits); | ||
847 | static int count_bit1 ( short *ix, uint32_t start, uint32_t end, int *bits ); | ||
848 | static int count_bigv ( short *ix, uint32_t start, uint32_t end, int table0, int table1, | ||
849 | int *bits); | ||
850 | |||
851 | |||
852 | static void encodeSideInfo( side_info_t si[2][2] ) | ||
853 | { | ||
854 | int gr, ch, header; | ||
855 | uint32_t cc=0, sz=0; | ||
856 | |||
857 | /* | ||
858 | * MPEG header layout: | ||
859 | * AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM | ||
860 | * A (31-21) = frame sync | ||
861 | * B (20-19) = MPEG type | ||
862 | * C (18-17) = MPEG layer | ||
863 | * D (16) = protection bit | ||
864 | * E (15-12) = bitrate index | ||
865 | * F (11-10) = samplerate index | ||
866 | * G (9) = padding bit | ||
867 | * H (8) = private bit | ||
868 | * I (7-6) = channel mode | ||
869 | * J (5-4) = mode extension (jstereo only) | ||
870 | * K (3) = copyright bit | ||
871 | * L (2) = original | ||
872 | * M (1-0) = emphasis | ||
873 | */ | ||
874 | |||
875 | header = (0xfff00000) | /* frame sync (AAAAAAAAA AAA) | ||
876 | mp3 type (upper): 1 (B) */ | ||
877 | (0x01 << 17) | /* mp3 layer: 01 (CC) */ | ||
878 | ( 0x1 << 16) | /* mp3 crc: 1 (D) */ | ||
879 | ( 0x1 << 2); /* mp3 org: 1 (L) */ | ||
880 | header |= cfg.mpg.type << 19; | ||
881 | header |= cfg.mpg.bitr_id << 12; | ||
882 | header |= cfg.mpg.smpl_id << 10; | ||
883 | header |= cfg.mpg.padding << 9; | ||
884 | header |= cfg.mpg.mode << 6; | ||
885 | /* no emphasis (bits 0-1) */ | ||
886 | putbits( header, 32 ); | ||
887 | |||
888 | if(cfg.mpg.type == 1) | ||
889 | { /* MPEG1 */ | ||
890 | if(cfg.channels == 2) { putlong( 0, 20); } | ||
891 | else { putlong( 0, 18); } | ||
892 | |||
893 | for(gr=0; gr<cfg.granules; gr++) | ||
894 | for(ch=0; ch<cfg.channels; ch++) | ||
895 | { | ||
896 | side_info_t *gi = &si[gr][ch]; | ||
897 | |||
898 | putlong((gi->part2_3_length+42),12 ); /* add scale_facs array size */ | ||
899 | putlong( gi->address3>>1, 9 ); | ||
900 | putlong( gi->global_gain, 8 ); | ||
901 | putlong( 9, 4 ); /* set scale_facs compr type */ | ||
902 | putlong( gi->table_select[0], 6 ); | ||
903 | putlong( gi->table_select[1], 5 ); | ||
904 | putlong( gi->table_select[2], 5 ); | ||
905 | putlong( gi->region_0_1, 7 ); | ||
906 | putlong( 1 , 2 ); /* set scale_facs to 1bit */ | ||
907 | putlong( gi->table_select[3], 1 ); | ||
908 | } | ||
909 | } | ||
910 | else | ||
911 | { /* MPEG2 */ | ||
912 | if(cfg.channels == 2) { putlong( 0, 10); } | ||
913 | else { putlong( 0, 9); } | ||
914 | |||
915 | for(ch=0; ch<cfg.channels; ch++) | ||
916 | { | ||
917 | side_info_t *gi = &si[0][ch]; | ||
918 | |||
919 | putlong((gi->part2_3_length+42),12 ); /* add scale_facs array size */ | ||
920 | putlong( gi->address3>>1, 9 ); | ||
921 | putlong( gi->global_gain, 8 ); | ||
922 | putlong( 0xCA, 9 ); /* set scale_facs compr type */ | ||
923 | putlong( gi->table_select[0], 6 ); | ||
924 | putlong( gi->table_select[1], 5 ); | ||
925 | putlong( gi->table_select[2], 5 ); | ||
926 | putlong( gi->region_0_1 , 7 ); | ||
927 | putlong( 1 , 1 ); /* set scale_facs to 1bit */ | ||
928 | putlong( gi->table_select[3], 1 ); | ||
929 | } | ||
930 | } | ||
931 | /* flush remaining bits */ | ||
932 | putbits(cc, sz); | ||
933 | } | ||
934 | |||
935 | /* Note the discussion of huffmancodebits() on pages 28 and 29 of the IS, | ||
936 | as well as the definitions of the side information on pages 26 and 27. */ | ||
937 | static void Huffmancodebits( short *ix, char *xr_sign, side_info_t *gi ) | ||
938 | { | ||
939 | int region1 = gi->address1; | ||
940 | int region2 = gi->address2; | ||
941 | int bigvals = gi->address3; | ||
942 | int count1 = bigvals + (gi->count1 << 2); | ||
943 | int stuffBits = 0; | ||
944 | int bits = 0; | ||
945 | int i, v; | ||
946 | |||
947 | for(i=v=0; i<32; i+=2) | ||
948 | v |= band_scale_f[i>>1] << (30-i); | ||
949 | putbits(v, 32); // store scale_facs (part1) | ||
950 | |||
951 | for(v=0; i<42; i+=2) | ||
952 | v |= band_scale_f[i>>1] << (40-i); | ||
953 | putbits(v, 10); // store scale_facs (part2) | ||
954 | |||
955 | if(region1 > 0) | ||
956 | bits += HuffmanCode(ix, xr_sign, 0 , region1, gi->table_select[0]); | ||
957 | |||
958 | if(region2 > region1) | ||
959 | bits += HuffmanCode(ix, xr_sign, region1, region2, gi->table_select[1]); | ||
960 | |||
961 | if(bigvals > region2) | ||
962 | bits += HuffmanCode(ix, xr_sign, region2, bigvals, gi->table_select[2]); | ||
963 | |||
964 | if(count1 > bigvals) | ||
965 | bits += HuffmanCod1(ix, xr_sign, bigvals, count1, gi->table_select[3]); | ||
966 | |||
967 | if((stuffBits = gi->part2_3_length - bits) > 0) | ||
968 | { | ||
969 | int stuffWords = stuffBits >> 5; | ||
970 | int remainBits = stuffBits & 31; | ||
971 | |||
972 | if( remainBits ) | ||
973 | putbits( ~0, remainBits ); | ||
974 | |||
975 | while( stuffWords-- ) | ||
976 | putbits( ~0, 32 ); /* Huffman code tables leed to padding ones */ | ||
977 | } | ||
978 | } | ||
979 | |||
980 | int HuffmanCod1( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int tbl) | ||
981 | { | ||
982 | uint32_t cc=0, sz=0; | ||
983 | uint32_t i, d, p; | ||
984 | int sumbit=0, s=0, l=0, v, w, x, y; | ||
985 | #define sgnv xr_sign[i+0] | ||
986 | #define sgnw xr_sign[i+1] | ||
987 | #define sgnx xr_sign[i+2] | ||
988 | #define sgny xr_sign[i+3] | ||
989 | |||
990 | for(i=begin; i<end; i+=4) | ||
991 | { | ||
992 | v = ix[i+0]; | ||
993 | w = ix[i+1]; | ||
994 | x = ix[i+2]; | ||
995 | y = ix[i+3]; | ||
996 | p = (v << 3) + (w << 2) + (x << 1) + y; | ||
997 | |||
998 | switch(p) | ||
999 | { | ||
1000 | case 0: l=0; s = 0; break; | ||
1001 | case 1: l=1; s = sgny; break; | ||
1002 | case 2: l=1; s = sgnx; break; | ||
1003 | case 3: l=2; s = (sgnx << 1) + sgny; break; | ||
1004 | case 4: l=1; s = sgnw; break; | ||
1005 | case 5: l=2; s = (sgnw << 1) + sgny; break; | ||
1006 | case 6: l=2; s = (sgnw << 1) + sgnx; break; | ||
1007 | case 7: l=3; s = (sgnw << 2) + (sgnx << 1) + sgny; break; | ||
1008 | case 8: l=1; s = sgnv; break; | ||
1009 | case 9: l=2; s = (sgnv << 1) + sgny; break; | ||
1010 | case 10: l=2; s = (sgnv << 1) + sgnx; break; | ||
1011 | case 11: l=3; s = (sgnv << 2) + (sgnx << 1) + sgny; break; | ||
1012 | case 12: l=2; s = (sgnv << 1) + sgnw; break; | ||
1013 | case 13: l=3; s = (sgnv << 2) + (sgnw << 1) + sgny; break; | ||
1014 | case 14: l=3; s = (sgnv << 2) + (sgnw << 1) + sgnx; break; | ||
1015 | case 15: l=4; s = (sgnv << 3) + (sgnw << 2) + (sgnx << 1) + sgny; break; | ||
1016 | } | ||
1017 | |||
1018 | d = (ht_count[tbl][0][p] << l) + s; | ||
1019 | l = ht_count[tbl][1][p]; | ||
1020 | putlong( d, l ); | ||
1021 | sumbit += l; | ||
1022 | } | ||
1023 | |||
1024 | /* flush remaining bits */ | ||
1025 | putbits(cc, sz); | ||
1026 | |||
1027 | return sumbit; | ||
1028 | } | ||
1029 | |||
1030 | /* Implements the pseudocode of page 98 of the IS */ | ||
1031 | int HuffmanCode(short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table) | ||
1032 | { | ||
1033 | uint32_t cc=0, sz=0, code; | ||
1034 | uint32_t i, xl=0, yl=0, idx; | ||
1035 | int x, y, bit, sumbit=0; | ||
1036 | #define sign_x xr_sign[i+0] | ||
1037 | #define sign_y xr_sign[i+1] | ||
1038 | |||
1039 | if(table == 0) | ||
1040 | return 0; | ||
1041 | |||
1042 | if( table > 15 ) | ||
1043 | { /* ESC-table is used */ | ||
1044 | uint32_t linbits = ht_big[table-16].linbits; | ||
1045 | uint16_t *hffcode = table < 24 ? t16HB : t24HB; | ||
1046 | uint8_t *hlen = table < 24 ? t16l : t24l; | ||
1047 | |||
1048 | for(i=begin; i<end; i+=2) | ||
1049 | { | ||
1050 | x = ix[ i ]; | ||
1051 | y = ix[i+1]; | ||
1052 | |||
1053 | if(x > 14) { xl = x - 15; x = 15; } | ||
1054 | if(y > 14) { yl = y - 15; y = 15; } | ||
1055 | |||
1056 | idx = x * 16 + y; | ||
1057 | code = hffcode[idx]; | ||
1058 | bit = hlen [idx]; | ||
1059 | |||
1060 | if(x) | ||
1061 | { | ||
1062 | if(x > 14) | ||
1063 | { | ||
1064 | code = (code << linbits) | xl; | ||
1065 | bit += linbits; | ||
1066 | } | ||
1067 | |||
1068 | code = (code << 1) | sign_x; | ||
1069 | bit += 1; | ||
1070 | } | ||
1071 | |||
1072 | if(y) | ||
1073 | { | ||
1074 | if(y > 14) | ||
1075 | { | ||
1076 | if(bit + linbits + 1 > 32) | ||
1077 | { | ||
1078 | putlong( code, bit ); | ||
1079 | sumbit += bit; | ||
1080 | code = bit = 0; | ||
1081 | } | ||
1082 | |||
1083 | code = (code << linbits) | yl; | ||
1084 | bit += linbits; | ||
1085 | } | ||
1086 | |||
1087 | code = (code << 1) | sign_y; | ||
1088 | bit += 1; | ||
1089 | } | ||
1090 | |||
1091 | putlong( code, bit ); | ||
1092 | sumbit += bit; | ||
1093 | } | ||
1094 | } | ||
1095 | else | ||
1096 | { /* No ESC-words */ | ||
1097 | const struct huffcodetab *h = &ht[table]; | ||
1098 | |||
1099 | for(i=begin; i<end; i+=2) | ||
1100 | { | ||
1101 | x = ix[i]; | ||
1102 | y = ix[i+1]; | ||
1103 | |||
1104 | idx = x * h->len + y; | ||
1105 | code = h->table[idx]; | ||
1106 | bit = h->hlen [idx]; | ||
1107 | |||
1108 | if(x) | ||
1109 | { | ||
1110 | code = (code << 1) | sign_x; | ||
1111 | bit += 1; | ||
1112 | } | ||
1113 | |||
1114 | if(y) | ||
1115 | { | ||
1116 | code = (code << 1) | sign_y; | ||
1117 | bit += 1; | ||
1118 | } | ||
1119 | |||
1120 | putlong( code, bit ); | ||
1121 | sumbit += bit; | ||
1122 | } | ||
1123 | } | ||
1124 | |||
1125 | /* flush remaining bits */ | ||
1126 | putbits(cc, sz); | ||
1127 | |||
1128 | return sumbit; | ||
1129 | } | ||
1130 | |||
1131 | void putbits(uint32_t val, uint32_t nbit) | ||
1132 | { | ||
1133 | int new_bitpos = CodedData.bitpos + nbit; | ||
1134 | int ptrpos = CodedData.bitpos >> 5; | ||
1135 | |||
1136 | val = val & (0xffffffff >> (32 - nbit)); | ||
1137 | |||
1138 | /* data fit in one uint32_t */ | ||
1139 | if(((new_bitpos - 1) >> 5) == ptrpos) | ||
1140 | CodedData.bbuf[ptrpos] |= val << ((32 - new_bitpos) & 31); | ||
1141 | else | ||
1142 | { | ||
1143 | CodedData.bbuf[ptrpos ] |= val >> ((new_bitpos - 32) & 31); | ||
1144 | CodedData.bbuf[ptrpos+1] |= val << ((32 - new_bitpos) & 31); | ||
1145 | } | ||
1146 | |||
1147 | CodedData.bitpos = new_bitpos; | ||
1148 | } | ||
1149 | |||
1150 | /***************************************************************************/ | ||
1151 | /* Choose the Huffman table that will encode ix[begin..end] with */ | ||
1152 | /* the fewest bits. */ | ||
1153 | /* Note: This code contains knowledge about the sizes and characteristic */ | ||
1154 | /* of the Huffman tables as defined in the IS (Table B.7), and will not */ | ||
1155 | /* work with any arbitrary tables. */ | ||
1156 | /***************************************************************************/ | ||
1157 | static int choose_table( short *ix, uint32_t begin, uint32_t end, int *bits ) | ||
1158 | { | ||
1159 | uint32_t i; | ||
1160 | int max, table0, table1; | ||
1161 | |||
1162 | for(i=begin,max=0; i<end; i++) | ||
1163 | if(ix[i] > max) | ||
1164 | max = ix[i]; | ||
1165 | |||
1166 | if(max < 16) | ||
1167 | { | ||
1168 | /* tables without linbits */ | ||
1169 | /* indx: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */ | ||
1170 | /* len: 0, 2, 3, 3, 0, 4, 4, 6, 6, 6, 8, 8, 8, 16, 0, 16 */ | ||
1171 | switch(max) | ||
1172 | { | ||
1173 | case 0: return 0; | ||
1174 | case 1: return count_bit1(ix, begin, end, bits); | ||
1175 | case 2: return 2 + find_best_2(ix, begin, end, tab23, 3, bits); | ||
1176 | case 3: return 5 + find_best_2(ix, begin, end, tab56, 4, bits); | ||
1177 | case 4: | ||
1178 | case 5: return 7 + find_best_3(ix, begin, end, tab789, 6, bits); | ||
1179 | case 6: | ||
1180 | case 7: return 10 + find_best_3(ix, begin, end, tabABC, 8, bits); | ||
1181 | default: return 13 + find_best_2(ix, begin, end, tab1315, 16, bits) * 2; | ||
1182 | } | ||
1183 | } | ||
1184 | else | ||
1185 | { | ||
1186 | /* tables with linbits */ | ||
1187 | max -= 15; | ||
1188 | |||
1189 | for(table0=0; table0<8; table0++) | ||
1190 | if(ht_big[table0].linmax >= max) | ||
1191 | break; | ||
1192 | |||
1193 | for(table1=8; table1<16; table1++) | ||
1194 | if(ht_big[table1].linmax >= max) | ||
1195 | break; | ||
1196 | |||
1197 | return 16 + count_bigv(ix, begin, end, table0, table1, bits); | ||
1198 | } | ||
1199 | } | ||
1200 | |||
1201 | int find_best_2(short *ix, uint32_t start, uint32_t end, const uint32_t *table, | ||
1202 | uint32_t len, int *bits) | ||
1203 | { | ||
1204 | uint32_t i, sum = 0; | ||
1205 | |||
1206 | for(i=start; i<end; i+=2) | ||
1207 | sum += table[ix[i] * len + ix[i+1]]; | ||
1208 | |||
1209 | if((sum & 0xffff) <= (sum >> 16)) | ||
1210 | { | ||
1211 | *bits = (sum & 0xffff); | ||
1212 | return 1; | ||
1213 | } | ||
1214 | else | ||
1215 | { | ||
1216 | *bits = sum >> 16; | ||
1217 | return 0; | ||
1218 | } | ||
1219 | } | ||
1220 | |||
1221 | int find_best_3(short *ix, uint32_t start, uint32_t end, const uint32_t *table, | ||
1222 | uint32_t len, int *bits) | ||
1223 | { | ||
1224 | uint32_t i, j, sum = 0; | ||
1225 | int sum1 = 0; | ||
1226 | int sum2 = 0; | ||
1227 | int sum3 = 0; | ||
1228 | |||
1229 | /* avoid overflow in packed additions: 78*13 < 1024 */ | ||
1230 | for(i=start; i<end; ) | ||
1231 | { | ||
1232 | j = i + 2*78 > end ? end : i + 2*78; | ||
1233 | |||
1234 | for(sum=0; i<j; i+=2) | ||
1235 | sum += table[ix[i] * len + ix[i+1]]; | ||
1236 | |||
1237 | sum1 += (sum >> 20); | ||
1238 | sum2 += (sum >> 10) & 0x3ff; | ||
1239 | sum3 += (sum >> 0) & 0x3ff; | ||
1240 | } | ||
1241 | |||
1242 | i = 0; | ||
1243 | if(sum1 > sum2) { sum1 = sum2; i = 1; } | ||
1244 | if(sum1 > sum3) { sum1 = sum3; i = 2; } | ||
1245 | |||
1246 | *bits = sum1; | ||
1247 | |||
1248 | return i; | ||
1249 | } | ||
1250 | |||
1251 | /*************************************************************************/ | ||
1252 | /* Function: Count the number of bits necessary to code the subregion. */ | ||
1253 | /*************************************************************************/ | ||
1254 | int count_bit1(short *ix, uint32_t start, uint32_t end, int *bits ) | ||
1255 | { | ||
1256 | uint32_t i, sum = 0; | ||
1257 | |||
1258 | for(i=start; i<end; i+=2) | ||
1259 | sum += t1l[4 + ix[i] * 2 + ix[i+1]]; | ||
1260 | |||
1261 | *bits = sum; | ||
1262 | |||
1263 | return 1; /* this is table1 */ | ||
1264 | } | ||
1265 | |||
1266 | int count_bigv(short *ix, uint32_t start, uint32_t end, int table0, | ||
1267 | int table1, int *bits ) | ||
1268 | { | ||
1269 | uint32_t i, sum0, sum1, sum=0, bigv=0, x, y; | ||
1270 | |||
1271 | /* ESC-table is used */ | ||
1272 | for(i=start; i<end; i+=2) | ||
1273 | { | ||
1274 | x = ix[i]; | ||
1275 | y = ix[i+1]; | ||
1276 | |||
1277 | if(x > 14) { x = 15; bigv++; } | ||
1278 | if(y > 14) { y = 15; bigv++; } | ||
1279 | |||
1280 | sum += tab1624[x * 16 + y]; | ||
1281 | } | ||
1282 | |||
1283 | sum0 = (sum >> 16) + bigv * ht_big[table0].linbits; | ||
1284 | sum1 = (sum & 0xffff) + bigv * ht_big[table1].linbits; | ||
1285 | |||
1286 | if(sum0 <= sum1) | ||
1287 | { | ||
1288 | *bits = sum0; | ||
1289 | return table0; | ||
1290 | } | ||
1291 | else | ||
1292 | { | ||
1293 | *bits = sum1; | ||
1294 | return table1; | ||
1295 | } | ||
1296 | } | ||
1297 | |||
1298 | /*************************************************************************/ | ||
1299 | /* Function: Calculation of rzero, count1, address3 */ | ||
1300 | /* (Partitions ix into big values, quadruples and zeros). */ | ||
1301 | /*************************************************************************/ | ||
1302 | static int calc_runlen( short *ix, side_info_t *si ) | ||
1303 | { | ||
1304 | int p, i, sum = 0; | ||
1305 | |||
1306 | for(i=SAMPL2; i-=2; ) | ||
1307 | if(*(uint32_t*)&ix[i-2]) /* !!!! short *ix; !!!!! */ | ||
1308 | break; | ||
1309 | |||
1310 | si->count1 = 0; | ||
1311 | |||
1312 | for( ; i>3; i-=4) | ||
1313 | { | ||
1314 | int v = ix[i-1]; | ||
1315 | int w = ix[i-2]; | ||
1316 | int x = ix[i-3]; | ||
1317 | int y = ix[i-4]; | ||
1318 | |||
1319 | if((v | w | x | y) <= 1) | ||
1320 | { | ||
1321 | p = (y<<3) + (x<<2) + (w<<1) + (v); | ||
1322 | |||
1323 | sum += tab01[p]; | ||
1324 | |||
1325 | si->count1++; | ||
1326 | } | ||
1327 | else break; | ||
1328 | } | ||
1329 | |||
1330 | si->address3 = i; | ||
1331 | |||
1332 | if((sum >> 16) < (sum & 0xffff)) | ||
1333 | { | ||
1334 | si->table_select[3] = 0; | ||
1335 | return sum >> 16; | ||
1336 | } | ||
1337 | else | ||
1338 | { | ||
1339 | si->table_select[3] = 1; | ||
1340 | return sum & 0xffff; | ||
1341 | } | ||
1342 | } | ||
1343 | |||
1344 | |||
1345 | /*************************************************************************/ | ||
1346 | /* Function: Quantization of the vector xr ( -> ix) */ | ||
1347 | /*************************************************************************/ | ||
1348 | static int quantize_int(int *xr, short *ix, side_info_t *si) | ||
1349 | { | ||
1350 | unsigned int i, idx, s, frac_pow[] = { 0x10000, 0xd745, 0xb505, 0x9838 }; | ||
1351 | |||
1352 | s = frac_pow[si->quantStep & 3] >> si->quantStep / 4; | ||
1353 | |||
1354 | /* check for possible 'out of range' values */ | ||
1355 | if(((si->max_val + 256) >> 8) * s >= (65536 << 8)) | ||
1356 | return 0; | ||
1357 | |||
1358 | if(((si->max_val + 256) >> 8) * s < (4096 << 8)) | ||
1359 | { /* all values fit the table size */ | ||
1360 | for(i=SAMPL2; i--; ) | ||
1361 | ix[i] = int2idx[(xr[i] * s + 0x8000) >> 16]; | ||
1362 | } | ||
1363 | else | ||
1364 | { /* check each index wether it fits the table */ | ||
1365 | for(i=SAMPL2; i--; ) | ||
1366 | { | ||
1367 | idx = (xr[i] * s + 0x08000) >> 16; | ||
1368 | |||
1369 | if(idx > 4095) ix[i] = int2idx[(idx + 8) >> 4] << 3; | ||
1370 | else ix[i] = int2idx[idx]; | ||
1371 | } | ||
1372 | } | ||
1373 | |||
1374 | return 1; | ||
1375 | } | ||
1376 | |||
1377 | /*************************************************************************/ | ||
1378 | /* subdivides the bigvalue region which will use separate Huffman tables */ | ||
1379 | /*************************************************************************/ | ||
1380 | static void subdivide(side_info_t *si) | ||
1381 | { | ||
1382 | int scfb, count0, count1; | ||
1383 | |||
1384 | if( !si->address3 ) | ||
1385 | { /* no bigvalue region */ | ||
1386 | si->region_0_1 = 0; | ||
1387 | si->address1 = 0; | ||
1388 | si->address2 = 0; | ||
1389 | } | ||
1390 | else | ||
1391 | { | ||
1392 | /* Calculate scale factor band index */ | ||
1393 | for(scfb=0; scalefac[scfb] < si->address3; ) | ||
1394 | scfb++; | ||
1395 | |||
1396 | count0 = subdv_table[scfb].region0_cnt; | ||
1397 | count1 = subdv_table[scfb].region1_cnt; | ||
1398 | |||
1399 | si->region_0_1 = (count0 << 3) | count1; | ||
1400 | si->address1 = scalefac[count0 + 1]; | ||
1401 | si->address2 = scalefac[count0 + 1 + count1 + 1]; | ||
1402 | } | ||
1403 | } | ||
1404 | |||
1405 | /*******************************************************************/ | ||
1406 | /* Count the number of bits necessary to code the bigvalues region */ | ||
1407 | /*******************************************************************/ | ||
1408 | static int bigv_bitcount(short *ix, side_info_t *gi) | ||
1409 | { | ||
1410 | int b1=0, b2=0, b3=0; | ||
1411 | |||
1412 | /* Select huffman code tables for bigvalues regions */ | ||
1413 | gi->table_select[0] = 0; | ||
1414 | gi->table_select[1] = 0; | ||
1415 | gi->table_select[2] = 0; | ||
1416 | |||
1417 | if( gi->address1 > 0 ) /* region0 */ | ||
1418 | gi->table_select[0] = choose_table(ix, 0 , gi->address1, &b1); | ||
1419 | |||
1420 | if( gi->address2 > gi->address1 ) /* region1 */ | ||
1421 | gi->table_select[1] = choose_table(ix, gi->address1, gi->address2, &b2); | ||
1422 | |||
1423 | if( gi->address3 > gi->address2 ) /* region2 */ | ||
1424 | gi->table_select[2] = choose_table(ix, gi->address2, gi->address3, &b3); | ||
1425 | |||
1426 | return b1+b2+b3; | ||
1427 | } | ||
1428 | |||
1429 | static int quantize_and_count_bits(int *xr, short *ix, side_info_t *si) | ||
1430 | { | ||
1431 | int bits = 10000; | ||
1432 | |||
1433 | if(quantize_int(xr, ix, si)) | ||
1434 | { | ||
1435 | bits = calc_runlen(ix, si); /* rzero,count1,address3 */ | ||
1436 | subdivide(si); /* bigvalues sfb division */ | ||
1437 | bits += bigv_bitcount(ix,si); /* bit count */ | ||
1438 | } | ||
1439 | |||
1440 | return bits; | ||
1441 | } | ||
1442 | |||
1443 | /************************************************************************/ | ||
1444 | /* The code selects the best quantStep for a particular set of scalefacs*/ | ||
1445 | /************************************************************************/ | ||
1446 | static int inner_loop(int *xr, int max_bits, side_info_t *si) | ||
1447 | { | ||
1448 | int bits; | ||
1449 | |||
1450 | while((bits=quantize_and_count_bits(xr, enc_data, si)) < max_bits-64) | ||
1451 | { | ||
1452 | if(si->quantStep == 0) | ||
1453 | break; | ||
1454 | |||
1455 | if(si->quantStep <= 2) | ||
1456 | si->quantStep = 0; | ||
1457 | else | ||
1458 | si->quantStep -= 2; | ||
1459 | } | ||
1460 | |||
1461 | while(bits > max_bits) | ||
1462 | { | ||
1463 | si->quantStep++; | ||
1464 | bits = quantize_and_count_bits(xr, enc_data, si); | ||
1465 | } | ||
1466 | |||
1467 | return bits; | ||
1468 | } | ||
1469 | |||
1470 | static void iteration_loop(int *xr, side_info_t *si, int gr_cnt) | ||
1471 | { | ||
1472 | int remain, tar_bits, max_bits = cfg.mean_bits; | ||
1473 | |||
1474 | /* distribute reserved bits to remaining granules */ | ||
1475 | tar_bits = max_bits + (cfg.ResvSize / gr_cnt & ~7); | ||
1476 | if(tar_bits > max_bits + max_bits/2) | ||
1477 | tar_bits = max_bits + max_bits/2; | ||
1478 | |||
1479 | si->part2_3_length = inner_loop(xr, tar_bits, si); | ||
1480 | si->global_gain = si->quantStep + 142 - si->additStep; | ||
1481 | |||
1482 | /* unused bits of the reservoir can be used for remaining granules */ | ||
1483 | cfg.ResvSize += max_bits - si->part2_3_length; | ||
1484 | |||
1485 | /* end: distribute the reserved bits to one or two granules */ | ||
1486 | if(gr_cnt == 1) | ||
1487 | { | ||
1488 | si->part2_3_length += cfg.ResvSize; | ||
1489 | /* mp3 format allows max 12bits for granule length */ | ||
1490 | if(si->part2_3_length > 4092) | ||
1491 | { | ||
1492 | remain = (si->part2_3_length - 4092 + 31) >> 5; | ||
1493 | si->part2_3_length -= remain << 5; | ||
1494 | si[-1].part2_3_length += remain << 5; | ||
1495 | |||
1496 | while(remain--) | ||
1497 | putbits(~0, 32); | ||
1498 | } | ||
1499 | } | ||
1500 | } | ||
1501 | |||
1502 | |||
1503 | /* returns sum_j=0^31 a[j]*cos(PI*j*(k+1/2)/32), 0<=k<32 */ | ||
1504 | void window_subband1(short *wk, int sb0[SBLIMIT], int sb1[SBLIMIT]) ICODE_ATTR; | ||
1505 | void window_subband1(short *wk, int sb0[SBLIMIT], int sb1[SBLIMIT]) | ||
1506 | { | ||
1507 | int k, i, u, v; | ||
1508 | short *wp, *x1, *x2; | ||
1509 | |||
1510 | #ifdef CPU_COLDFIRE | ||
1511 | int s0, s1, t0, t1; | ||
1512 | |||
1513 | for(k=0; k<18; k++, wk+=64, sb0+=SBLIMIT, sb1+=SBLIMIT) | ||
1514 | { | ||
1515 | wp = enwindow; | ||
1516 | x1 = wk; | ||
1517 | x2 = x1 - 124; | ||
1518 | |||
1519 | for(i=-15; i<0; i++) | ||
1520 | { | ||
1521 | asm volatile( | ||
1522 | "move.l (-224*4,%[x2]), %%d4\n" /* d4 = x2[-224] */ | ||
1523 | "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */ | ||
1524 | "mac.w %%d0u, %%d4u, %%acc0\n" | ||
1525 | "mac.w %%d0u, %%d4l, (-160*4,%[x2]), %%d4, %%acc1\n" | ||
1526 | "mac.w %%d0l, %%d4u, %%acc0\n" | ||
1527 | "mac.w %%d0l, %%d4l, ( -96*4,%[x2]), %%d4, %%acc1\n" | ||
1528 | "mac.w %%d1u, %%d4u, %%acc0\n" | ||
1529 | "mac.w %%d1u, %%d4l, ( -32*4,%[x2]), %%d4, %%acc1\n" | ||
1530 | "mac.w %%d1l, %%d4u, %%acc0\n" | ||
1531 | "mac.w %%d1l, %%d4l, ( 32*4,%[x2]), %%d4, %%acc1\n" | ||
1532 | "mac.w %%d2u, %%d4u, %%acc0\n" | ||
1533 | "mac.w %%d2u, %%d4l, ( 96*4,%[x2]), %%d4, %%acc1\n" | ||
1534 | "mac.w %%d2l, %%d4u, %%acc0\n" | ||
1535 | "mac.w %%d2l, %%d4l, ( 160*4,%[x2]), %%d4, %%acc1\n" | ||
1536 | "mac.w %%d3u, %%d4u, %%acc0\n" | ||
1537 | "mac.w %%d3u, %%d4l, ( 224*4,%[x2]), %%d4, %%acc1\n" | ||
1538 | "mac.w %%d3l, %%d4u, %%acc0\n" | ||
1539 | "mac.w %%d3l, %%d4l, (-256*4,%[x1]), %%d4, %%acc1\n" | ||
1540 | "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */ | ||
1541 | "mac.w %%d0u, %%d4u, %%acc0\n" | ||
1542 | "mac.w %%d0u, %%d4l, (-192*4,%[x1]), %%d4, %%acc1\n" | ||
1543 | "mac.w %%d0l, %%d4u, %%acc0\n" | ||
1544 | "mac.w %%d0l, %%d4l, (-128*4,%[x1]), %%d4, %%acc1\n" | ||
1545 | "mac.w %%d1u, %%d4u, %%acc0\n" | ||
1546 | "mac.w %%d1u, %%d4l, ( -64*4,%[x1]), %%d4, %%acc1\n" | ||
1547 | "mac.w %%d1l, %%d4u, %%acc0\n" | ||
1548 | "mac.w %%d1l, %%d4l, ( 0*4,%[x1]), %%d4, %%acc1\n" | ||
1549 | "mac.w %%d2u, %%d4u, %%acc0\n" | ||
1550 | "mac.w %%d2u, %%d4l, ( 64*4,%[x1]), %%d4, %%acc1\n" | ||
1551 | "mac.w %%d2l, %%d4u, %%acc0\n" | ||
1552 | "mac.w %%d2l, %%d4l, ( 128*4,%[x1]), %%d4, %%acc1\n" | ||
1553 | "mac.w %%d3u, %%d4u, %%acc0\n" | ||
1554 | "mac.w %%d3u, %%d4l, ( 192*4,%[x1]), %%d4, %%acc1\n" | ||
1555 | "mac.w %%d3l, %%d4u, %%acc0\n" | ||
1556 | "mac.w %%d3l, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n" | ||
1557 | "movclr.l %%acc0, %%d0\n" | ||
1558 | "move.l %%d0, %[s0]\n" | ||
1559 | "movclr.l %%acc1, %%d0\n" | ||
1560 | "move.l %%d0, %[s1]\n" | ||
1561 | |||
1562 | "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */ | ||
1563 | "mac.w %%d0u, %%d4u, %%acc0\n" | ||
1564 | "mac.w %%d0u, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n" | ||
1565 | "mac.w %%d0l, %%d4u, %%acc0\n" | ||
1566 | "mac.w %%d0l, %%d4l, ( 96*4,%[x1]), %%d4, %%acc1\n" | ||
1567 | "mac.w %%d1u, %%d4u, %%acc0\n" | ||
1568 | "mac.w %%d1u, %%d4l, ( 32*4,%[x1]), %%d4, %%acc1\n" | ||
1569 | "mac.w %%d1l, %%d4u, %%acc0\n" | ||
1570 | "mac.w %%d1l, %%d4l, ( -32*4,%[x1]), %%d4, %%acc1\n" | ||
1571 | "mac.w %%d2u, %%d4u, %%acc0\n" | ||
1572 | "mac.w %%d2u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n" | ||
1573 | "mac.w %%d2l, %%d4u, %%acc0\n" | ||
1574 | "mac.w %%d2l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n" | ||
1575 | "mac.w %%d3u, %%d4u, %%acc0\n" | ||
1576 | "mac.w %%d3u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n" | ||
1577 | "mac.w %%d3l, %%d4u, %%acc0\n" | ||
1578 | "mac.w %%d3l, %%d4l, ( 256*4,%[x2]), %%d4, %%acc1\n" | ||
1579 | "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */ | ||
1580 | "mac.w %%d0u, %%d4u, %%acc0\n" | ||
1581 | "mac.w %%d0u, %%d4l, ( 192*4,%[x2]), %%d4, %%acc1\n" | ||
1582 | "mac.w %%d0l, %%d4u, %%acc0\n" | ||
1583 | "mac.w %%d0l, %%d4l, ( 128*4,%[x2]), %%d4, %%acc1\n" | ||
1584 | "mac.w %%d1u, %%d4u, %%acc0\n" | ||
1585 | "mac.w %%d1u, %%d4l, ( 64*4,%[x2]), %%d4, %%acc1\n" | ||
1586 | "mac.w %%d1l, %%d4u, %%acc0\n" | ||
1587 | "mac.w %%d1l, %%d4l, ( 0*4,%[x2]), %%d4, %%acc1\n" | ||
1588 | "mac.w %%d2u, %%d4u, %%acc0\n" | ||
1589 | "mac.w %%d2u, %%d4l, ( -64*4,%[x2]), %%d4, %%acc1\n" | ||
1590 | "mac.w %%d2l, %%d4u, %%acc0\n" | ||
1591 | "mac.w %%d2l, %%d4l, (-128*4,%[x2]), %%d4, %%acc1\n" | ||
1592 | "mac.w %%d3u, %%d4u, %%acc0\n" | ||
1593 | "mac.w %%d3u, %%d4l, (-192*4,%[x2]), %%d4, %%acc1\n" | ||
1594 | "mac.w %%d3l, %%d4u, %%acc0\n" | ||
1595 | "mac.w %%d3l, %%d4l, %%acc1\n" | ||
1596 | "movclr.l %%acc0, %%d0\n" | ||
1597 | "move.l %%d0, %[t0]\n" | ||
1598 | "movclr.l %%acc1, %%d0\n" | ||
1599 | "move.l %%d0, %[t1]\n" | ||
1600 | |||
1601 | : [x1] "+a" (x1), [x2] "+a" (x2), [s0] "+m" (s0), [t0] "+m" (t0), | ||
1602 | [s1] "+m" (s1), [t1] "+m" (t1) | ||
1603 | : [wp] "a" (wp) : "d0", "d1", "d2", "d3", "d4"); | ||
1604 | |||
1605 | sb0[30+i*2] = shft4(t0) + shft13(s0) * wp[24]; | ||
1606 | sb0[31+i*2] = shft13(t0) * wp[25] - shft13(s0) * wp[26]; | ||
1607 | sb1[30+i*2] = shft4(t1) + shft13(s1) * wp[24]; | ||
1608 | sb1[31+i*2] = shft13(t1) * wp[25] - shft13(s1) * wp[26]; | ||
1609 | wp += 27; | ||
1610 | x1 -= 2; | ||
1611 | x2 += 2; | ||
1612 | } | ||
1613 | |||
1614 | asm volatile( | ||
1615 | "move.l ( -32*4,%[x1]), %%d4\n" /* d4 = x1[-32] */ | ||
1616 | "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */ | ||
1617 | |||
1618 | "mac.w %%d0u, %%d4u, %%acc0\n" | ||
1619 | "mac.w %%d0u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n" | ||
1620 | "mac.w %%d0l, %%d4u, %%acc0\n" | ||
1621 | "mac.w %%d0l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n" | ||
1622 | "mac.w %%d1u, %%d4u, %%acc0\n" | ||
1623 | "mac.w %%d1u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n" | ||
1624 | "mac.w %%d1l, %%d4u, %%acc0\n" | ||
1625 | "mac.w %%d1l, %%d4l, ( 32*4,%[x1]), %%d4, %%acc1\n" | ||
1626 | "mac.w %%d2u, %%d4u, %%acc0\n" | ||
1627 | "mac.w %%d2u, %%d4l, ( 96*4,%[x1]), %%d4, %%acc1\n" | ||
1628 | "mac.w %%d2l, %%d4u, %%acc0\n" | ||
1629 | "mac.w %%d2l, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n" | ||
1630 | "mac.w %%d3u, %%d4u, %%acc0\n" | ||
1631 | "mac.w %%d3u, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n" | ||
1632 | "mac.w %%d3l, %%d4u, %%acc0\n" | ||
1633 | "mac.w %%d3l, %%d4l, ( -16*4,%[x1]), %%d4, %%acc1\n" | ||
1634 | "movclr.l %%acc0, %%d0\n" | ||
1635 | "move.l %%d0, %[s0]\n" | ||
1636 | "movclr.l %%acc1, %%d0\n" | ||
1637 | "move.l %%d0, %[s1]\n" | ||
1638 | |||
1639 | "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */ | ||
1640 | "mac.w %%d0u, %%d4u, %%acc0\n" | ||
1641 | "mac.w %%d0u, %%d4l, ( -48*4,%[x1]), %%d4, %%acc1\n" | ||
1642 | "mac.w %%d1u, %%d4u, %%acc0\n" | ||
1643 | "mac.w %%d1u, %%d4l, ( 16*4,%[x1]), %%d4, %%acc1\n" | ||
1644 | "mac.w %%d1l, %%d4u, %%acc0\n" | ||
1645 | "mac.w %%d1l, %%d4l, ( -80*4,%[x1]), %%d4, %%acc1\n" | ||
1646 | "mac.w %%d2u, %%d4u, %%acc0\n" | ||
1647 | "mac.w %%d2u, %%d4l, ( 48*4,%[x1]), %%d4, %%acc1\n" | ||
1648 | "mac.w %%d2u, %%d4u, %%acc0\n" | ||
1649 | "mac.w %%d2u, %%d4l, (-112*4,%[x1]), %%d4, %%acc1\n" | ||
1650 | "mac.w %%d3u, %%d4u, %%acc0\n" | ||
1651 | "mac.w %%d3u, %%d4l, ( 80*4,%[x1]), %%d4, %%acc1\n" | ||
1652 | "mac.w %%d3l, %%d4u, %%acc0\n" | ||
1653 | "mac.w %%d3l, %%d4l, (-144*4,%[x1]), %%d4, %%acc1\n" | ||
1654 | "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */ | ||
1655 | "mac.w %%d0u, %%d4u, %%acc0\n" | ||
1656 | "mac.w %%d0u, %%d4l, ( 112*4,%[x1]), %%d4, %%acc1\n" | ||
1657 | "mac.w %%d0u, %%d4u, %%acc0\n" | ||
1658 | "mac.w %%d0u, %%d4l, (-176*4,%[x1]), %%d4, %%acc1\n" | ||
1659 | "mac.w %%d1u, %%d4u, %%acc0\n" | ||
1660 | "mac.w %%d1u, %%d4l, ( 144*4,%[x1]), %%d4, %%acc1\n" | ||
1661 | "mac.w %%d1l, %%d4u, %%acc0\n" | ||
1662 | "mac.w %%d1l, %%d4l, (-208*4,%[x1]), %%d4, %%acc1\n" | ||
1663 | "mac.w %%d2u, %%d4u, %%acc0\n" | ||
1664 | "mac.w %%d2u, %%d4l, ( 176*4,%[x1]), %%d4, %%acc1\n" | ||
1665 | "mac.w %%d2u, %%d4u, %%acc0\n" | ||
1666 | "mac.w %%d2u, %%d4l, (-240*4,%[x1]), %%d4, %%acc1\n" | ||
1667 | "mac.w %%d3u, %%d4u, %%acc0\n" | ||
1668 | "mac.w %%d3u, %%d4l, ( 208*4,%[x1]), %%d4, %%acc1\n" | ||
1669 | "mac.w %%d3l, %%d4u, %%acc0\n" | ||
1670 | "mac.w %%d3l, %%d4l, %%acc1\n" | ||
1671 | "movclr.l %%acc0, %%d0\n" | ||
1672 | "move.l %%d0, %[t0]\n" | ||
1673 | "movclr.l %%acc1, %%d0\n" | ||
1674 | "move.l %%d0, %[t1]\n" | ||
1675 | |||
1676 | : [x1] "+a" (x1), [s0] "+m" (s0), [t0] "+m" (t0), | ||
1677 | [s1] "+m" (s1), [t1] "+m" (t1) | ||
1678 | : [wp] "a" (wp) : "d0", "d1", "d2", "d3", "d4"); | ||
1679 | |||
1680 | u = shft4(s0 - t0); | ||
1681 | v = shft4(s0 + t0); | ||
1682 | t0 = sb0[14]; | ||
1683 | s0 = sb0[15] - t0; | ||
1684 | |||
1685 | sb0[31] = v + t0; /* A0 */ | ||
1686 | sb0[30] = u + s0; /* A1 */ | ||
1687 | sb0[15] = u - s0; /* A2 */ | ||
1688 | sb0[14] = v - t0; /* A3 */ | ||
1689 | |||
1690 | u = shft4(s1 - t1); | ||
1691 | v = shft4(s1 + t1); | ||
1692 | t1 = sb1[14]; | ||
1693 | s1 = sb1[15] - t1; | ||
1694 | |||
1695 | sb1[31] = v + t1; /* A0 */ | ||
1696 | sb1[30] = u + s1; /* A1 */ | ||
1697 | sb1[15] = u - s1; /* A2 */ | ||
1698 | sb1[14] = v - t1; /* A3 */ | ||
1699 | } | ||
1700 | #else | ||
1701 | int ch, s, t, *a; | ||
1702 | |||
1703 | for(ch=0; ch<cfg.channels; ch++) | ||
1704 | { | ||
1705 | a = ch ? sb1 : sb0; | ||
1706 | for(k=0; k<18; k++, wk+=64, a+=SBLIMIT) | ||
1707 | { | ||
1708 | wp = enwindow; | ||
1709 | x1 = wk; | ||
1710 | x2 = x1 - 124; | ||
1711 | |||
1712 | /* x1[-572] .... x1[448] = 1022 */ | ||
1713 | /* 18*4*16*32 */ | ||
1714 | for(i=-15; i<0; i++) | ||
1715 | { | ||
1716 | s = (int)x2[-224*2] * wp[ 0]; t = (int)x1[ 224*2] * wp[ 0]; | ||
1717 | s += (int)x2[-160*2] * wp[ 1]; t += (int)x1[ 160*2] * wp[ 1]; | ||
1718 | s += (int)x2[- 96*2] * wp[ 2]; t += (int)x1[ 96*2] * wp[ 2]; | ||
1719 | s += (int)x2[- 32*2] * wp[ 3]; t += (int)x1[ 32*2] * wp[ 3]; | ||
1720 | s += (int)x2[ 32*2] * wp[ 4]; t += (int)x1[- 32*2] * wp[ 4]; | ||
1721 | s += (int)x2[ 96*2] * wp[ 5]; t += (int)x1[- 96*2] * wp[ 5]; | ||
1722 | s += (int)x2[ 160*2] * wp[ 6]; t += (int)x1[-160*2] * wp[ 6]; | ||
1723 | s += (int)x2[ 224*2] * wp[ 7]; t += (int)x1[-224*2] * wp[ 7]; | ||
1724 | s += (int)x1[-256*2] * wp[ 8]; t += (int)x2[ 256*2] * wp[16]; | ||
1725 | s += (int)x1[-192*2] * wp[ 9]; t += (int)x2[ 192*2] * wp[17]; | ||
1726 | s += (int)x1[-128*2] * wp[10]; t += (int)x2[ 128*2] * wp[18]; | ||
1727 | s += (int)x1[- 64*2] * wp[11]; t += (int)x2[ 64*2] * wp[19]; | ||
1728 | s += (int)x1[ 0*2] * wp[12]; t += (int)x2[ 0*2] * wp[20]; | ||
1729 | s += (int)x1[ 64*2] * wp[13]; t += (int)x2[- 64*2] * wp[21]; | ||
1730 | s += (int)x1[ 128*2] * wp[14]; t += (int)x2[-128*2] * wp[22]; | ||
1731 | s += (int)x1[ 192*2] * wp[15]; t += (int)x2[-192*2] * wp[23]; | ||
1732 | |||
1733 | a[30+i*2] = shft4(t) + shft13(s) * wp[24]; | ||
1734 | a[31+i*2] = shft13(t) * wp[25] - shft13(s) * wp[26]; | ||
1735 | wp += 27; | ||
1736 | x1 -= 2; | ||
1737 | x2 += 2; | ||
1738 | } | ||
1739 | |||
1740 | t = (int)x1[- 16*2] * wp[ 8]; s = (int)x1[ -32*2] * wp[0]; | ||
1741 | t += ((int)x1[- 48*2]-x1[ 16*2]) * wp[10]; s += (int)x1[ -96*2] * wp[1]; | ||
1742 | t += ((int)x1[- 80*2]+x1[ 48*2]) * wp[12]; s += (int)x1[-160*2] * wp[2]; | ||
1743 | t += ((int)x1[-112*2]-x1[ 80*2]) * wp[14]; s += (int)x1[-224*2] * wp[3]; | ||
1744 | t += ((int)x1[-144*2]+x1[112*2]) * wp[16]; s += (int)x1[ 32*2] * wp[4]; | ||
1745 | t += ((int)x1[-176*2]-x1[144*2]) * wp[18]; s += (int)x1[ 96*2] * wp[5]; | ||
1746 | t += ((int)x1[-208*2]+x1[176*2]) * wp[20]; s += (int)x1[ 160*2] * wp[6]; | ||
1747 | t += ((int)x1[-240*2]-x1[208*2]) * wp[22]; s += (int)x1[ 224*2] * wp[7]; | ||
1748 | |||
1749 | u = shft4(s - t); | ||
1750 | v = shft4(s + t); | ||
1751 | t = a[14]; | ||
1752 | s = a[15] - t; | ||
1753 | |||
1754 | a[31] = v + t; /* A0 */ | ||
1755 | a[30] = u + s; /* A1 */ | ||
1756 | a[15] = u - s; /* A2 */ | ||
1757 | a[14] = v - t; /* A3 */ | ||
1758 | } | ||
1759 | wk -= 18 * 64 - 1; /* rewind wk (to next channel start) */ | ||
1760 | } | ||
1761 | #endif | ||
1762 | } | ||
1763 | |||
1764 | void window_subband2(short *x1, int a[SBLIMIT]) ICODE_ATTR; | ||
1765 | void window_subband2(short *x1, int a[SBLIMIT]) | ||
1766 | { | ||
1767 | int xr; | ||
1768 | short *wp = enwindow; | ||
1769 | short *x2 = x1 - 124; | ||
1770 | |||
1771 | wp += 27 * 15; | ||
1772 | x1 -= 2 * 15; | ||
1773 | x2 += 2 * 15; | ||
1774 | |||
1775 | xr = a[28] - a[0]; a[0] += a[28]; a[28] = shft9(xr) * wp[-2*27+25]; | ||
1776 | xr = a[29] - a[1]; a[1] += a[29]; a[29] = shft9(xr) * wp[-2*27+25]; | ||
1777 | xr = a[26] - a[2]; a[2] += a[26]; a[26] = shft9(xr) * wp[-4*27+25]; | ||
1778 | xr = a[27] - a[3]; a[3] += a[27]; a[27] = shft9(xr) * wp[-4*27+25]; | ||
1779 | xr = a[24] - a[4]; a[4] += a[24]; a[24] = shft9(xr) * wp[-6*27+25]; | ||
1780 | xr = a[25] - a[5]; a[5] += a[25]; a[25] = shft9(xr) * wp[-6*27+25]; | ||
1781 | xr = a[22] - a[6]; a[6] += a[22]; a[22] = shft9(xr) * SQRT ; | ||
1782 | xr = a[23] - a[7]; a[7] += a[23]; a[23] = shft9(xr) * SQRT - a[7]; | ||
1783 | a[ 7] -= a[ 6]; | ||
1784 | a[22] -= a[ 7]; | ||
1785 | a[23] -= a[22]; | ||
1786 | |||
1787 | xr = a[ 6]; a[ 6] = a[31] - xr; a[31] = a[31] + xr; | ||
1788 | xr = a[ 7]; a[ 7] = a[30] - xr; a[30] = a[30] + xr; | ||
1789 | xr = a[22]; a[22] = a[15] - xr; a[15] = a[15] + xr; | ||
1790 | xr = a[23]; a[23] = a[14] - xr; a[14] = a[14] + xr; | ||
1791 | |||
1792 | xr = a[20] - a[ 8]; a[ 8] += a[20]; a[20] = shft9(xr) * wp[-10*27+25]; | ||
1793 | xr = a[21] - a[ 9]; a[ 9] += a[21]; a[21] = shft9(xr) * wp[-10*27+25]; | ||
1794 | xr = a[18] - a[10]; a[10] += a[18]; a[18] = shft9(xr) * wp[-12*27+25]; | ||
1795 | xr = a[19] - a[11]; a[11] += a[19]; a[19] = shft9(xr) * wp[-12*27+25]; | ||
1796 | xr = a[16] - a[12]; a[12] += a[16]; a[16] = shft9(xr) * wp[-14*27+25]; | ||
1797 | xr = a[17] - a[13]; a[13] += a[17]; a[17] = shft9(xr) * wp[-14*27+25]; | ||
1798 | xr =-a[20] + a[24]; a[20] += a[24]; a[24] = shft9(xr) * wp[-12*27+25]; | ||
1799 | xr =-a[21] + a[25]; a[21] += a[25]; a[25] = shft9(xr) * wp[-12*27+25]; | ||
1800 | xr = a[ 4] - a[ 8]; a[ 4] += a[ 8]; a[ 8] = shft9(xr) * wp[-12*27+25]; | ||
1801 | xr = a[ 5] - a[ 9]; a[ 5] += a[ 9]; a[ 9] = shft9(xr) * wp[-12*27+25]; | ||
1802 | xr = a[ 0] - a[12]; a[ 0] += a[12]; a[12] = shft9(xr) * wp[ -4*27+25]; | ||
1803 | xr = a[ 1] - a[13]; a[ 1] += a[13]; a[13] = shft9(xr) * wp[ -4*27+25]; | ||
1804 | xr = a[16] - a[28]; a[16] += a[28]; a[28] = shft9(xr) * wp[ -4*27+25]; | ||
1805 | xr =-a[17] + a[29]; a[17] += a[29]; a[29] = shft9(xr) * wp[ -4*27+25]; | ||
1806 | |||
1807 | xr = SQRT * shft9(a[ 2] - a[10]); a[ 2] += a[10]; a[10] = xr; | ||
1808 | xr = SQRT * shft9(a[ 3] - a[11]); a[ 3] += a[11]; a[11] = xr; | ||
1809 | xr = SQRT * shft9(a[26] - a[18]); a[18] += a[26]; a[26] = xr - a[18]; | ||
1810 | xr = SQRT * shft9(a[27] - a[19]); a[19] += a[27]; a[27] = xr - a[19]; | ||
1811 | |||
1812 | xr = a[ 2]; a[19] -= a[ 3]; a[ 3] -= xr; a[ 2] = a[31] - xr; a[31] += xr; | ||
1813 | xr = a[ 3]; a[11] -= a[19]; a[18] -= xr; a[ 3] = a[30] - xr; a[30] += xr; | ||
1814 | xr = a[18]; a[27] -= a[11]; a[19] -= xr; a[18] = a[15] - xr; a[15] += xr; | ||
1815 | |||
1816 | xr = a[19]; a[10] -= xr; a[19] = a[14] - xr; a[14] += xr; | ||
1817 | xr = a[10]; a[11] -= xr; a[10] = a[23] - xr; a[23] += xr; | ||
1818 | xr = a[11]; a[26] -= xr; a[11] = a[22] - xr; a[22] += xr; | ||
1819 | xr = a[26]; a[27] -= xr; a[26] = a[ 7] - xr; a[ 7] += xr; | ||
1820 | |||
1821 | xr = a[27]; a[27] = a[6] - xr; a[6] += xr; | ||
1822 | |||
1823 | xr = SQRT * shft9(a[ 0] - a[ 4]); a[ 0] += a[ 4]; a[ 4] = xr; | ||
1824 | xr = SQRT * shft9(a[ 1] - a[ 5]); a[ 1] += a[ 5]; a[ 5] = xr; | ||
1825 | xr = SQRT * shft9(a[16] - a[20]); a[16] += a[20]; a[20] = xr; | ||
1826 | xr = SQRT * shft9(a[17] - a[21]); a[17] += a[21]; a[21] = xr; | ||
1827 | xr =-SQRT * shft9(a[ 8] - a[12]); a[ 8] += a[12]; a[12] = xr - a[ 8]; | ||
1828 | xr =-SQRT * shft9(a[ 9] - a[13]); a[ 9] += a[13]; a[13] = xr - a[ 9]; | ||
1829 | xr =-SQRT * shft9(a[25] - a[29]); a[25] += a[29]; a[29] = xr - a[25]; | ||
1830 | xr =-SQRT * shft9(a[24] + a[28]); a[24] -= a[28]; a[28] = xr - a[24]; | ||
1831 | |||
1832 | xr = a[24] - a[16]; a[24] = xr; | ||
1833 | xr = a[20] - xr; a[20] = xr; | ||
1834 | xr = a[28] - xr; a[28] = xr; | ||
1835 | |||
1836 | xr = a[25] - a[17]; a[25] = xr; | ||
1837 | xr = a[21] - xr; a[21] = xr; | ||
1838 | xr = a[29] - xr; a[29] = xr; | ||
1839 | |||
1840 | xr = a[17] - a[1]; a[17] = xr; | ||
1841 | xr = a[ 9] - xr; a[ 9] = xr; | ||
1842 | xr = a[25] - xr; a[25] = xr; | ||
1843 | xr = a[ 5] - xr; a[ 5] = xr; | ||
1844 | xr = a[21] - xr; a[21] = xr; | ||
1845 | xr = a[13] - xr; a[13] = xr; | ||
1846 | xr = a[29] - xr; a[29] = xr; | ||
1847 | |||
1848 | xr = a[ 1] - a[0]; a[ 1] = xr; | ||
1849 | xr = a[16] - xr; a[16] = xr; | ||
1850 | xr = a[17] - xr; a[17] = xr; | ||
1851 | xr = a[ 8] - xr; a[ 8] = xr; | ||
1852 | xr = a[ 9] - xr; a[ 9] = xr; | ||
1853 | xr = a[24] - xr; a[24] = xr; | ||
1854 | xr = a[25] - xr; a[25] = xr; | ||
1855 | xr = a[ 4] - xr; a[ 4] = xr; | ||
1856 | xr = a[ 5] - xr; a[ 5] = xr; | ||
1857 | xr = a[20] - xr; a[20] = xr; | ||
1858 | xr = a[21] - xr; a[21] = xr; | ||
1859 | xr = a[12] - xr; a[12] = xr; | ||
1860 | xr = a[13] - xr; a[13] = xr; | ||
1861 | xr = a[28] - xr; a[28] = xr; | ||
1862 | xr = a[29] - xr; a[29] = xr; | ||
1863 | |||
1864 | xr = a[ 0]; a[ 0] += a[31]; a[31] -= xr; | ||
1865 | xr = a[ 1]; a[ 1] += a[30]; a[30] -= xr; | ||
1866 | xr = a[16]; a[16] += a[15]; a[15] -= xr; | ||
1867 | xr = a[17]; a[17] += a[14]; a[14] -= xr; | ||
1868 | xr = a[ 8]; a[ 8] += a[23]; a[23] -= xr; | ||
1869 | xr = a[ 9]; a[ 9] += a[22]; a[22] -= xr; | ||
1870 | xr = a[24]; a[24] += a[ 7]; a[ 7] -= xr; | ||
1871 | xr = a[25]; a[25] += a[ 6]; a[ 6] -= xr; | ||
1872 | xr = a[ 4]; a[ 4] += a[27]; a[27] -= xr; | ||
1873 | xr = a[ 5]; a[ 5] += a[26]; a[26] -= xr; | ||
1874 | xr = a[20]; a[20] += a[11]; a[11] -= xr; | ||
1875 | xr = a[21]; a[21] += a[10]; a[10] -= xr; | ||
1876 | xr = a[12]; a[12] += a[19]; a[19] -= xr; | ||
1877 | xr = a[13]; a[13] += a[18]; a[18] -= xr; | ||
1878 | xr = a[28]; a[28] += a[ 3]; a[ 3] -= xr; | ||
1879 | xr = a[29]; a[29] += a[ 2]; a[ 2] -= xr; | ||
1880 | } | ||
1881 | |||
1882 | void mdct_long(int *out, int *in) ICODE_ATTR; | ||
1883 | void mdct_long(int *out, int *in) | ||
1884 | { | ||
1885 | int ct,st; | ||
1886 | int tc1, tc2, tc3, tc4, ts5, ts6, ts7, ts8; | ||
1887 | int ts1, ts2, ts3, ts4, tc5, tc6, tc7, tc8; | ||
1888 | |||
1889 | /* 1,2, 5,6, 9,10, 13,14, 17 */ | ||
1890 | tc1 = in[17] - in[ 9]; | ||
1891 | tc3 = in[15] - in[11]; | ||
1892 | tc4 = in[14] - in[12]; | ||
1893 | ts5 = in[ 0] + in[ 8]; | ||
1894 | ts6 = in[ 1] + in[ 7]; | ||
1895 | ts7 = in[ 2] + in[ 6]; | ||
1896 | ts8 = in[ 3] + in[ 5]; | ||
1897 | |||
1898 | out[17] = (ts5 + ts7 - ts8) * cx[8] - (ts6 - in[4]) * cx[8]; | ||
1899 | st = (ts5 + ts7 - ts8) * cx[7] + (ts6 - in[4]) * cx[8]; | ||
1900 | ct = (tc1 - tc3 - tc4) * cx[6]; | ||
1901 | out[5] = ct + st; | ||
1902 | out[6] = ct - st; | ||
1903 | |||
1904 | tc2 = (in[16] - in[10]) * cx[6]; | ||
1905 | ts6 = ts6 * cx[7] + in[4] * cx[8]; | ||
1906 | |||
1907 | ct = tc1 * cx[0] + tc2 + tc3 * cx[1] + tc4 * cx[2]; | ||
1908 | st = -ts5 * cx[4] + ts6 - ts7 * cx[5] + ts8 * cx[3]; | ||
1909 | out[1] = ct + st; | ||
1910 | out[2] = ct - st; | ||
1911 | |||
1912 | ct = tc1 * cx[1] - tc2 - tc3 * cx[2] + tc4 * cx[0]; | ||
1913 | st = -ts5 * cx[5] + ts6 - ts7 * cx[3] + ts8 * cx[4]; | ||
1914 | out[ 9] = ct + st; | ||
1915 | out[10] = ct - st; | ||
1916 | |||
1917 | ct = tc1 * cx[2] - tc2 + tc3 * cx[0] - tc4 * cx[1]; | ||
1918 | st = ts5 * cx[3] - ts6 + ts7 * cx[4] - ts8 * cx[5]; | ||
1919 | out[13] = ct + st; | ||
1920 | out[14] = ct - st; | ||
1921 | |||
1922 | ts1 = in[ 8] - in[ 0]; | ||
1923 | ts3 = in[ 6] - in[ 2]; | ||
1924 | ts4 = in[ 5] - in[ 3]; | ||
1925 | tc5 = in[17] + in[ 9]; | ||
1926 | tc6 = in[16] + in[10]; | ||
1927 | tc7 = in[15] + in[11]; | ||
1928 | tc8 = in[14] + in[12]; | ||
1929 | |||
1930 | out[0] = (tc5 + tc7 + tc8) * cx[8] + (tc6 + in[13]) * cx[8]; | ||
1931 | ct = (tc5 + tc7 + tc8) * cx[7] - (tc6 + in[13]) * cx[8]; | ||
1932 | st = (ts1 - ts3 + ts4) * cx[6]; | ||
1933 | out[11] = ct + st; | ||
1934 | out[12] = ct - st; | ||
1935 | |||
1936 | ts2 = (in[7] - in[1]) * cx[6]; | ||
1937 | tc6 = in[13] * cx[8] - tc6 * cx[7]; | ||
1938 | |||
1939 | ct = tc5 * cx[3] - tc6 + tc7 * cx[4] + tc8 * cx[5]; | ||
1940 | st = ts1 * cx[2] + ts2 + ts3 * cx[0] + ts4 * cx[1]; | ||
1941 | out[3] = ct + st; | ||
1942 | out[4] = ct - st; | ||
1943 | |||
1944 | ct =-tc5 * cx[5] + tc6 - tc7 * cx[3] - tc8 * cx[4]; | ||
1945 | st = ts1 * cx[1] + ts2 - ts3 * cx[2] - ts4 * cx[0]; | ||
1946 | out[7] = ct + st; | ||
1947 | out[8] = ct - st; | ||
1948 | |||
1949 | ct =-tc5 * cx[4] + tc6 - tc7 * cx[5] - tc8 * cx[3]; | ||
1950 | st = ts1 * cx[0] - ts2 + ts3 * cx[1] - ts4 * cx[2]; | ||
1951 | out[15] = ct + st; | ||
1952 | out[16] = ct - st; | ||
1953 | } | ||
1954 | |||
1955 | static int find_bitrate_index(int type, int bitrate, bool stereo) | ||
1956 | { | ||
1957 | if (type == 1 && !stereo && bitrate > 160) | ||
1958 | bitrate = 160; | ||
1959 | |||
1960 | return ci->round_value_to_list32(bitrate, | ||
1961 | &bitr_index[type][1], 14, true) + 1; | ||
1962 | } | ||
1963 | |||
1964 | static int find_samplerate_index(long freq, int *mp3_type) | ||
1965 | { | ||
1966 | int mpeg = freq >= (32000+24000)/2 ? 1 : 0; | ||
1967 | int i = ci->round_value_to_list32(freq, sampr_index[mpeg], 3, true); | ||
1968 | *mp3_type = mpeg; | ||
1969 | return i; | ||
1970 | } | ||
1971 | |||
1972 | static bool init_mp3_encoder_engine(int sample_rate, | ||
1973 | int num_channels, | ||
1974 | int rec_mono_mode, | ||
1975 | struct encoder_config *enc_cfg) | ||
1976 | { | ||
1977 | const bool stereo = num_channels > 1; | ||
1978 | uint32_t avg_byte_per_frame; | ||
1979 | |||
1980 | cfg.channels = stereo ? 2 : 1; | ||
1981 | cfg.rec_mono_mode = rec_mono_mode; | ||
1982 | cfg.mpg.mode = stereo ? 0 : 3; /* 0=stereo, 3=mono */ | ||
1983 | cfg.mpg.smpl_id = find_samplerate_index(sample_rate, &cfg.mpg.type); | ||
1984 | cfg.samplerate = sampr_index[cfg.mpg.type][cfg.mpg.smpl_id]; | ||
1985 | cfg.mpg.bitr_id = find_bitrate_index(cfg.mpg.type, | ||
1986 | enc_cfg->mp3_enc.bitrate, | ||
1987 | stereo); | ||
1988 | cfg.mpg.bitrate = bitr_index[cfg.mpg.type][cfg.mpg.bitr_id]; | ||
1989 | cfg.mpg.num_bands = num_bands[stereo ? cfg.mpg.type : 2][cfg.mpg.bitr_id]; | ||
1990 | |||
1991 | if (cfg.mpg.type == 1) | ||
1992 | { | ||
1993 | cfg.granules = 2; | ||
1994 | pcm_chunk_size = PCM_CHUNK_SIZE1; | ||
1995 | samp_per_frame = SAMP_PER_FRAME1; | ||
1996 | } | ||
1997 | else | ||
1998 | { | ||
1999 | cfg.granules = 1; | ||
2000 | pcm_chunk_size = PCM_CHUNK_SIZE2; | ||
2001 | samp_per_frame = SAMP_PER_FRAME2; | ||
2002 | } | ||
2003 | |||
2004 | memcpy(scalefac, sfBand[cfg.mpg.smpl_id + 3*cfg.mpg.type], sizeof(scalefac)); | ||
2005 | memset(mfbuf , 0 , sizeof(mfbuf )); | ||
2006 | memset(mdct_freq , 0 , sizeof(mdct_freq )); | ||
2007 | memset(enc_data , 0 , sizeof(enc_data )); | ||
2008 | memset(sb_data , 0 , sizeof(sb_data )); | ||
2009 | memset(&CodedData, 0 , sizeof(CodedData )); | ||
2010 | memcpy(ca , ca_const , sizeof(ca )); | ||
2011 | memcpy(cs , cs_const , sizeof(cs )); | ||
2012 | memcpy(cx , cx_const , sizeof(cx )); | ||
2013 | memcpy(win , win_const , sizeof(win )); | ||
2014 | memcpy(enwindow , enwindow_const , sizeof(enwindow )); | ||
2015 | memcpy(int2idx , int2idx_const , sizeof(int2idx )); | ||
2016 | memcpy(ht_count , ht_count_const , sizeof(ht_count )); | ||
2017 | memcpy( tab01 , tab01_const , sizeof(tab01 )); | ||
2018 | memcpy( tab23 , tab23_const , sizeof(tab23 )); | ||
2019 | memcpy( tab56 , tab56_const , sizeof(tab56 )); | ||
2020 | memcpy( tab1315 , tab1315_const , sizeof(tab1315 )); | ||
2021 | memcpy( tab1624 , tab1624_const , sizeof(tab1624 )); | ||
2022 | memcpy( tab789 , tab789_const , sizeof(tab789 )); | ||
2023 | memcpy( tabABC , tabABC_const , sizeof(tabABC )); | ||
2024 | memcpy( t1HB , t1HB_const , sizeof(t1HB )); | ||
2025 | memcpy( t2HB , t2HB_const , sizeof(t2HB )); | ||
2026 | memcpy( t3HB , t3HB_const , sizeof(t3HB )); | ||
2027 | memcpy( t5HB , t5HB_const , sizeof(t5HB )); | ||
2028 | memcpy( t6HB , t6HB_const , sizeof(t6HB )); | ||
2029 | memcpy( t7HB , t7HB_const , sizeof(t7HB )); | ||
2030 | memcpy( t8HB , t8HB_const , sizeof(t8HB )); | ||
2031 | memcpy( t9HB , t9HB_const , sizeof(t9HB )); | ||
2032 | memcpy(t10HB , t10HB_const , sizeof(t10HB )); | ||
2033 | memcpy(t11HB , t11HB_const , sizeof(t11HB )); | ||
2034 | memcpy(t12HB , t12HB_const , sizeof(t12HB )); | ||
2035 | memcpy(t13HB , t13HB_const , sizeof(t13HB )); | ||
2036 | memcpy(t15HB , t15HB_const , sizeof(t15HB )); | ||
2037 | memcpy(t16HB , t16HB_const , sizeof(t16HB )); | ||
2038 | memcpy(t24HB , t24HB_const , sizeof(t24HB )); | ||
2039 | memcpy( t1l , t1l_const , sizeof(t1l )); | ||
2040 | memcpy( t2l , t2l_const , sizeof(t2l )); | ||
2041 | memcpy( t3l , t3l_const , sizeof(t3l )); | ||
2042 | memcpy( t5l , t5l_const , sizeof(t5l )); | ||
2043 | memcpy( t6l , t6l_const , sizeof(t6l )); | ||
2044 | memcpy( t7l , t7l_const , sizeof(t7l )); | ||
2045 | memcpy( t8l , t8l_const , sizeof(t8l )); | ||
2046 | memcpy( t9l , t9l_const , sizeof(t9l )); | ||
2047 | memcpy(t10l , t10l_const , sizeof(t10l )); | ||
2048 | memcpy(t11l , t11l_const , sizeof(t11l )); | ||
2049 | memcpy(t12l , t12l_const , sizeof(t12l )); | ||
2050 | memcpy(t13l , t13l_const , sizeof(t13l )); | ||
2051 | memcpy(t15l , t15l_const , sizeof(t15l )); | ||
2052 | memcpy(t16l , t16l_const , sizeof(t16l )); | ||
2053 | memcpy(t24l , t24l_const , sizeof(t24l )); | ||
2054 | memcpy(ht , ht_const , sizeof(ht )); | ||
2055 | |||
2056 | ht[ 0].table = NULL; ht[ 0].hlen = NULL; /* Apparently not used */ | ||
2057 | ht[ 1].table = t1HB; ht[ 1].hlen = t1l; | ||
2058 | ht[ 2].table = t2HB; ht[ 2].hlen = t2l; | ||
2059 | ht[ 3].table = t3HB; ht[ 3].hlen = t3l; | ||
2060 | ht[ 4].table = NULL; ht[ 4].hlen = NULL; /* Apparently not used */ | ||
2061 | ht[ 5].table = t5HB; ht[ 5].hlen = t5l; | ||
2062 | ht[ 6].table = t6HB; ht[ 6].hlen = t6l; | ||
2063 | ht[ 7].table = t7HB; ht[ 7].hlen = t7l; | ||
2064 | ht[ 8].table = t8HB; ht[ 8].hlen = t8l; | ||
2065 | ht[ 9].table = t9HB; ht[ 9].hlen = t9l; | ||
2066 | ht[10].table = t10HB; ht[10].hlen = t10l; | ||
2067 | ht[11].table = t11HB; ht[11].hlen = t11l; | ||
2068 | ht[12].table = t12HB; ht[12].hlen = t12l; | ||
2069 | ht[13].table = t13HB; ht[13].hlen = t13l; | ||
2070 | ht[14].table = NULL; ht[14].hlen = NULL; /* Apparently not used */ | ||
2071 | ht[15].table = t15HB; ht[15].hlen = t15l; | ||
2072 | |||
2073 | /* Figure average number of 'bytes' per frame */ | ||
2074 | avg_byte_per_frame = SAMPL2 * 16000 * cfg.mpg.bitrate / (2 - cfg.mpg.type); | ||
2075 | avg_byte_per_frame = avg_byte_per_frame / cfg.samplerate; | ||
2076 | cfg.byte_per_frame = avg_byte_per_frame / 64; | ||
2077 | cfg.frac_per_frame = avg_byte_per_frame & 63; | ||
2078 | cfg.slot_lag = 0; | ||
2079 | cfg.sideinfo_len = 32 + (cfg.mpg.type ? (cfg.channels == 1 ? 136 : 256) | ||
2080 | : (cfg.channels == 1 ? 72 : 136)); | ||
2081 | |||
2082 | return true; | ||
2083 | } | ||
2084 | |||
2085 | STATICIRAM void to_mono_mm(void) ICODE_ATTR; | ||
2086 | STATICIRAM void to_mono_mm(void) | ||
2087 | { | ||
2088 | /* |llllllllllllllll|rrrrrrrrrrrrrrrr| => | ||
2089 | * |mmmmmmmmmmmmmmmm|mmmmmmmmmmmmmmmm| | ||
2090 | */ | ||
2091 | uint16_t *samp = &mfbuf[2*512]; | ||
2092 | uint16_t *samp_end = samp + 2*samp_per_frame; | ||
2093 | |||
2094 | inline void to_mono(uint16_t **samp) | ||
2095 | { | ||
2096 | int16_t l = **samp; | ||
2097 | int16_t r = *(*samp+1); | ||
2098 | int32_t m; | ||
2099 | |||
2100 | switch(cfg.rec_mono_mode) | ||
2101 | { | ||
2102 | case 1: | ||
2103 | /* mono = L */ | ||
2104 | m = l; | ||
2105 | break; | ||
2106 | case 2: | ||
2107 | /* mono = R */ | ||
2108 | m = r; | ||
2109 | break; | ||
2110 | case 0: | ||
2111 | default: | ||
2112 | /* mono = (L+R)/2 */ | ||
2113 | m = l + r + err; | ||
2114 | err = m & 1; | ||
2115 | m >>= 1; | ||
2116 | break; | ||
2117 | } | ||
2118 | *(*samp)++ = (uint16_t)m; | ||
2119 | *(*samp)++ = (uint16_t)m; | ||
2120 | } /* to_mono */ | ||
2121 | |||
2122 | do | ||
2123 | { | ||
2124 | to_mono(&samp); | ||
2125 | to_mono(&samp); | ||
2126 | to_mono(&samp); | ||
2127 | to_mono(&samp); | ||
2128 | to_mono(&samp); | ||
2129 | to_mono(&samp); | ||
2130 | to_mono(&samp); | ||
2131 | to_mono(&samp); | ||
2132 | } | ||
2133 | while (samp < samp_end); | ||
2134 | } /* to_mono_mm */ | ||
2135 | |||
2136 | #ifdef ROCKBOX_LITTLE_ENDIAN | ||
2137 | /* Swaps a frame to big endian */ | ||
2138 | static inline void byte_swap_frame32(uint32_t *dst, uint32_t *src, | ||
2139 | size_t size) | ||
2140 | { | ||
2141 | uint32_t *src_end = SKIPBYTES(src, size); | ||
2142 | |||
2143 | do | ||
2144 | { | ||
2145 | *dst++ = swap32(*src++); | ||
2146 | *dst++ = swap32(*src++); | ||
2147 | *dst++ = swap32(*src++); | ||
2148 | *dst++ = swap32(*src++); | ||
2149 | *dst++ = swap32(*src++); | ||
2150 | *dst++ = swap32(*src++); | ||
2151 | *dst++ = swap32(*src++); | ||
2152 | *dst++ = swap32(*src++); | ||
2153 | } | ||
2154 | while(src < src_end); | ||
2155 | } /* byte_swap_frame32 */ | ||
2156 | #endif /* ROCKBOX_LITTLE_ENDIAN */ | ||
2157 | |||
2158 | static void set_scale_facs(int *mdct_freq) | ||
2159 | { | ||
2160 | unsigned int i, is, ie, k, s; | ||
2161 | int max_freq_val, avrg_freq_val; | ||
2162 | |||
2163 | /* calc average of first 256 frequency values */ | ||
2164 | for(avrg_freq_val=i=0; i<256; i++) | ||
2165 | avrg_freq_val += mdct_freq[i]; | ||
2166 | avrg_freq_val >>= 8; | ||
2167 | |||
2168 | /* if max of current band is smaller than average, increase precision */ | ||
2169 | /* last band keeps untouched (not scaled) */ | ||
2170 | for(is=k=0; is<scalefac[21]; k++) | ||
2171 | { | ||
2172 | max_freq_val = 0; | ||
2173 | |||
2174 | for(i=is, ie=scalefac[k+1]; i<ie; i++) | ||
2175 | if(max_freq_val < mdct_freq[i]) | ||
2176 | max_freq_val = mdct_freq[i]; | ||
2177 | |||
2178 | for(s=0; s<3; s++) | ||
2179 | if((max_freq_val<<s) > avrg_freq_val) | ||
2180 | break; | ||
2181 | |||
2182 | band_scale_f[k] = (unsigned char)s; | ||
2183 | |||
2184 | for(i=is; s && i<ie; i++) | ||
2185 | mdct_freq[i] <<= s; | ||
2186 | |||
2187 | is = ie; | ||
2188 | } | ||
2189 | } | ||
2190 | |||
2191 | STATICIRAM void encode_frame(char *buffer, struct enc_chunk_hdr *chunk) | ||
2192 | ICODE_ATTR; | ||
2193 | STATICIRAM void encode_frame(char *buffer, struct enc_chunk_hdr *chunk) | ||
2194 | { | ||
2195 | int gr, gr_cnt; | ||
2196 | uint32_t max; | ||
2197 | |||
2198 | /* encode one mp3 frame in this loop */ | ||
2199 | CodedData.bitpos = 0; | ||
2200 | memset(CodedData.bbuf, 0, sizeof(CodedData.bbuf)); | ||
2201 | |||
2202 | if((cfg.slot_lag += cfg.frac_per_frame) >= 64) | ||
2203 | { /* Padding for this frame */ | ||
2204 | cfg.slot_lag -= 64; | ||
2205 | cfg.mpg.padding = 1; | ||
2206 | } | ||
2207 | else | ||
2208 | cfg.mpg.padding = 0; | ||
2209 | |||
2210 | cfg.mean_bits = (8 * cfg.byte_per_frame + 8 * cfg.mpg.padding | ||
2211 | - cfg.sideinfo_len) / cfg.granules / cfg.channels | ||
2212 | - 42; // reserved for scale_facs | ||
2213 | |||
2214 | /* shift out old samples */ | ||
2215 | memcpy(mfbuf, mfbuf + 2*cfg.granules*576, 4*512); | ||
2216 | |||
2217 | if (chunk->flags & CHUNKF_START_FILE) | ||
2218 | { | ||
2219 | /* prefix silent samples for encoder delay */ | ||
2220 | memset(mfbuf + 2*512, 0, ENC_DELAY_SIZE); | ||
2221 | /* read new samples to iram for further processing */ | ||
2222 | memcpy(mfbuf + 2*512 + ENC_DELAY_SIZE/2, | ||
2223 | buffer, pcm_chunk_size - ENC_DELAY_SIZE); | ||
2224 | chunk->num_pcm = samp_per_frame - ENC_DELAY_SAMP; | ||
2225 | } | ||
2226 | else | ||
2227 | { | ||
2228 | /* read new samples to iram for further processing */ | ||
2229 | memcpy(mfbuf + 2*512, buffer, pcm_chunk_size); | ||
2230 | chunk->num_pcm = samp_per_frame; | ||
2231 | } | ||
2232 | |||
2233 | if (cfg.channels == 1) | ||
2234 | to_mono_mm(); | ||
2235 | |||
2236 | cfg.ResvSize = 0; | ||
2237 | gr_cnt = cfg.granules * cfg.channels; | ||
2238 | CodedData.bitpos = cfg.sideinfo_len; /* leave space for mp3 header */ | ||
2239 | |||
2240 | for(gr=0; gr<cfg.granules; gr++) | ||
2241 | { | ||
2242 | short *wk = mfbuf + 2*286 + gr*1152; | ||
2243 | int ch; | ||
2244 | |||
2245 | /* 16bit packed wav data can be windowed efficiently on coldfire */ | ||
2246 | window_subband1(wk, sb_data[0][1-gr][0], sb_data[1][1-gr][0]); | ||
2247 | |||
2248 | for(ch=0; ch<cfg.channels; ch++) | ||
2249 | { | ||
2250 | int ii, k, shift; | ||
2251 | |||
2252 | wk = mfbuf + 2*286 + gr*1152 + ch; | ||
2253 | |||
2254 | /* 36864=4*18*16*32 */ | ||
2255 | for(k=0; k<18; k++, wk+=64) | ||
2256 | { | ||
2257 | window_subband2(wk, sb_data[ch][1-gr][k]); | ||
2258 | /* Compensate for inversion in the analysis filter */ | ||
2259 | if(k & 1) | ||
2260 | { | ||
2261 | int band; | ||
2262 | for(band=1; band<32; band+=2) | ||
2263 | sb_data[ch][1-gr][k][band] *= -1; | ||
2264 | } | ||
2265 | } | ||
2266 | |||
2267 | /* Perform imdct of 18 previous + 18 current subband samples */ | ||
2268 | /* for integer precision do this loop again (if neccessary) */ | ||
2269 | shift = 14 - (cfg.cod_info[gr][ch].additStep >> 2); | ||
2270 | for(k=1,ii=0; ii<3 && k; ii++) | ||
2271 | { | ||
2272 | int *mdct = mdct_freq; | ||
2273 | int band; | ||
2274 | |||
2275 | cfg.cod_info[gr][ch].additStep = 4 * (14 - shift); | ||
2276 | |||
2277 | for(band=0; band<cfg.mpg.num_bands; band++, mdct+=18) | ||
2278 | { | ||
2279 | int *band0 = sb_data[ch][ gr][0] + order[band]; | ||
2280 | int *band1 = sb_data[ch][1-gr][0] + order[band]; | ||
2281 | int work[18]; | ||
2282 | |||
2283 | /* 9216=4*32*9*8 */ | ||
2284 | for(k=-9; k<0; k++) | ||
2285 | { | ||
2286 | int a = shft_n(band1[(k+9)*32], shift); | ||
2287 | int b = shft_n(band1[(8-k)*32], shift); | ||
2288 | int c = shft_n(band0[(k+9)*32], shift); | ||
2289 | int d = shft_n(band0[(8-k)*32], shift); | ||
2290 | |||
2291 | work[k+ 9] = shft16(a * win[k+ 9][0] + | ||
2292 | b * win[k+ 9][1] + | ||
2293 | c * win[k+ 9][2] + | ||
2294 | d * win[k+ 9][3]); | ||
2295 | |||
2296 | work[k+18] = shft16(c * win[k+18][0] + | ||
2297 | d * win[k+18][1] + | ||
2298 | a * win[k+18][2] + | ||
2299 | b * win[k+18][3]); | ||
2300 | } | ||
2301 | |||
2302 | /* 7200=4*18*100 */ | ||
2303 | mdct_long(mdct, work); | ||
2304 | |||
2305 | /* Perform aliasing reduction butterfly */ | ||
2306 | if(band != 0) | ||
2307 | { | ||
2308 | for(k=7; k>=0; --k) | ||
2309 | { | ||
2310 | int bu, bd; | ||
2311 | bu = shft15(mdct[k]) * ca[k] + | ||
2312 | shft15(mdct[-1-k]) * cs[k]; | ||
2313 | bd = shft15(mdct[k]) * cs[k] - | ||
2314 | shft15(mdct[-1-k]) * ca[k]; | ||
2315 | mdct[-1-k] = bu; | ||
2316 | mdct[ k ] = bd; | ||
2317 | } | ||
2318 | } | ||
2319 | } | ||
2320 | |||
2321 | max = 0; | ||
2322 | for(k=0; k<576; k++) | ||
2323 | { | ||
2324 | if(mdct_freq[k] < 0) | ||
2325 | { | ||
2326 | mdct_sign[k] = 1; /* negative */ | ||
2327 | mdct_freq[k] = shft13(-mdct_freq[k]); | ||
2328 | } | ||
2329 | else | ||
2330 | { | ||
2331 | mdct_sign[k] = 0; /* positive */ | ||
2332 | mdct_freq[k] = shft13(mdct_freq[k]); | ||
2333 | } | ||
2334 | |||
2335 | if(max < (uint32_t)mdct_freq[k]) | ||
2336 | max = (uint32_t)mdct_freq[k]; | ||
2337 | } | ||
2338 | cfg.cod_info[gr][ch].max_val = max; | ||
2339 | |||
2340 | /* calc new shift for higher integer precision */ | ||
2341 | for(k=0; max<(uint32_t)(0x7800>>k); k++) shift--; | ||
2342 | for( ; (max>>k)>=(uint32_t)0x10000; k++) shift++; | ||
2343 | if(shift < 0) shift = 0; | ||
2344 | } | ||
2345 | |||
2346 | cfg.cod_info[gr][ch].quantStep += | ||
2347 | cfg.cod_info[gr][ch].additStep; | ||
2348 | |||
2349 | set_scale_facs(mdct_freq); | ||
2350 | |||
2351 | /* bit and noise allocation */ | ||
2352 | iteration_loop(mdct_freq, &cfg.cod_info[gr][ch], | ||
2353 | gr_cnt--); | ||
2354 | /* write the frame to the bitstream */ | ||
2355 | Huffmancodebits(enc_data, mdct_sign, | ||
2356 | &cfg.cod_info[gr][ch]); | ||
2357 | |||
2358 | cfg.cod_info[gr][ch].quantStep -= | ||
2359 | cfg.cod_info[gr][ch].additStep; | ||
2360 | |||
2361 | if(cfg.granules == 1) | ||
2362 | { | ||
2363 | memcpy(sb_data[ch][0], sb_data[ch][1], | ||
2364 | sizeof(sb_data[ch][0])); | ||
2365 | } | ||
2366 | } | ||
2367 | } | ||
2368 | |||
2369 | chunk->enc_size = cfg.byte_per_frame + cfg.mpg.padding; | ||
2370 | |||
2371 | /* finish this chunk by adding sideinfo header data */ | ||
2372 | CodedData.bitpos = 0; | ||
2373 | encodeSideInfo( cfg.cod_info ); | ||
2374 | |||
2375 | #ifdef ROCKBOX_BIG_ENDIAN | ||
2376 | /* copy chunk to enc_buffer */ | ||
2377 | memcpy(chunk->enc_data, CodedData.bbuf, chunk->enc_size); | ||
2378 | #else | ||
2379 | /* swap frame to big endian */ | ||
2380 | byte_swap_frame32((uint32_t *)chunk->enc_data, CodedData.bbuf, chunk->enc_size); | ||
2381 | #endif | ||
2382 | } /* encode_frame */ | ||
2383 | |||
2384 | /* called very often - inline */ | ||
2385 | static inline bool is_file_data_ok(struct enc_file_event_data *filed) | ||
2386 | { | ||
2387 | return filed->rec_file >= 0 && (long)filed->chunk->flags >= 0; | ||
2388 | } /* is_event_ok */ | ||
2389 | |||
2390 | static unsigned char mp3_data[16384] __attribute__((aligned(4))); | ||
2391 | static unsigned int mp3_data_len; /* current data size in buffer */ | ||
2392 | |||
2393 | /* called very often - inline */ | ||
2394 | static inline bool on_write_chunk(struct enc_file_event_data *data) | ||
2395 | { | ||
2396 | if (!is_file_data_ok(data)) | ||
2397 | return false; | ||
2398 | |||
2399 | if (data->chunk->enc_data == NULL) | ||
2400 | { | ||
2401 | #ifdef ROCKBOX_HAS_LOGF | ||
2402 | ci->logf("mp3 enc: NULL data"); | ||
2403 | #endif | ||
2404 | return true; | ||
2405 | } | ||
2406 | |||
2407 | /* if current chunk doesn't fit => write collected data */ | ||
2408 | if (mp3_data_len + data->chunk->enc_size > sizeof(mp3_data)) | ||
2409 | { | ||
2410 | if (ci->write(data->rec_file, mp3_data, | ||
2411 | mp3_data_len) != (ssize_t)mp3_data_len) | ||
2412 | return false; | ||
2413 | |||
2414 | mp3_data_len = 0; | ||
2415 | } | ||
2416 | |||
2417 | memcpy(mp3_data+mp3_data_len, data->chunk->enc_data, | ||
2418 | data->chunk->enc_size); | ||
2419 | |||
2420 | mp3_data_len += data->chunk->enc_size; | ||
2421 | |||
2422 | data->num_pcm_samples += data->chunk->num_pcm; | ||
2423 | return true; | ||
2424 | } /* on_write_chunk */ | ||
2425 | |||
2426 | static bool on_start_file(struct enc_file_event_data *data) | ||
2427 | { | ||
2428 | if ((data->chunk->flags & CHUNKF_ERROR) || *data->filename == '\0') | ||
2429 | return false; | ||
2430 | |||
2431 | data->rec_file = ci->open(data->filename, O_RDWR|O_CREAT|O_TRUNC, 0666); | ||
2432 | |||
2433 | if (data->rec_file < 0) | ||
2434 | return false; | ||
2435 | |||
2436 | /* reset sample count */ | ||
2437 | data->num_pcm_samples = 0; | ||
2438 | |||
2439 | /* reset buffer write position */ | ||
2440 | mp3_data_len = 0; | ||
2441 | |||
2442 | return true; | ||
2443 | } /* on_start_file */ | ||
2444 | |||
2445 | static bool on_end_file(struct enc_file_event_data *data) | ||
2446 | { | ||
2447 | if (data->rec_file < 0) | ||
2448 | return false; /* file already closed, nothing more we can do */ | ||
2449 | |||
2450 | /* write the remaining mp3_data */ | ||
2451 | if (ci->write(data->rec_file, mp3_data, mp3_data_len) | ||
2452 | != (ssize_t)mp3_data_len) | ||
2453 | return false; | ||
2454 | |||
2455 | /* reset buffer write position */ | ||
2456 | mp3_data_len = 0; | ||
2457 | |||
2458 | /* always _try_ to write the file header, even on error */ | ||
2459 | if (ci->close(data->rec_file) != 0) | ||
2460 | return false; | ||
2461 | |||
2462 | data->rec_file = -1; | ||
2463 | |||
2464 | return true; | ||
2465 | } /* on_end_file */ | ||
2466 | |||
2467 | static void on_rec_new_stream(struct enc_buffer_event_data *data) | ||
2468 | { | ||
2469 | int num_frames = cfg.mpg.type == 1 ? | ||
2470 | ENC_PADDING_FRAMES1 : ENC_PADDING_FRAMES2; | ||
2471 | |||
2472 | if (data->flags & CHUNKF_END_FILE) | ||
2473 | { | ||
2474 | /* add silent frames to end - encoder will also be flushed for start | ||
2475 | of next file if any */ | ||
2476 | memset(res_buffer, 0, pcm_chunk_size); | ||
2477 | |||
2478 | /* the initial chunk given for the end is at enc_wr_index */ | ||
2479 | while (num_frames-- > 0) | ||
2480 | { | ||
2481 | data->chunk->enc_data = ENC_CHUNK_SKIP_HDR(data->chunk->enc_data, | ||
2482 | data->chunk); | ||
2483 | |||
2484 | encode_frame(res_buffer, data->chunk); | ||
2485 | data->chunk->num_pcm = samp_per_frame; | ||
2486 | |||
2487 | ci->enc_finish_chunk(); | ||
2488 | data->chunk = ci->enc_get_chunk(); | ||
2489 | } | ||
2490 | } | ||
2491 | else if (data->flags & CHUNKF_PRERECORD) | ||
2492 | { | ||
2493 | /* nothing to add and we cannot change prerecorded data */ | ||
2494 | } | ||
2495 | else if (data->flags & CHUNKF_START_FILE) | ||
2496 | { | ||
2497 | /* starting fresh ... be sure to flush encoder first */ | ||
2498 | struct enc_chunk_hdr *chunk = ENC_CHUNK_HDR(res_buffer); | ||
2499 | |||
2500 | chunk->flags = 0; | ||
2501 | chunk->enc_data = ENC_CHUNK_SKIP_HDR(chunk->enc_data, chunk); | ||
2502 | |||
2503 | while (num_frames-- > 0) | ||
2504 | { | ||
2505 | memset(chunk->enc_data, 0, pcm_chunk_size); | ||
2506 | encode_frame(chunk->enc_data, chunk); | ||
2507 | } | ||
2508 | } | ||
2509 | } /* on_rec_new_stream */ | ||
2510 | |||
2511 | static void enc_events_callback(enum enc_events event, void *data) | ||
2512 | { | ||
2513 | switch (event) | ||
2514 | { | ||
2515 | case ENC_WRITE_CHUNK: | ||
2516 | if (on_write_chunk((struct enc_file_event_data *)data)) | ||
2517 | return; | ||
2518 | |||
2519 | break; | ||
2520 | |||
2521 | case ENC_START_FILE: | ||
2522 | if (on_start_file((struct enc_file_event_data *)data)) | ||
2523 | return; | ||
2524 | |||
2525 | break; | ||
2526 | |||
2527 | case ENC_END_FILE: | ||
2528 | if (on_end_file((struct enc_file_event_data *)data)) | ||
2529 | return; | ||
2530 | |||
2531 | break; | ||
2532 | |||
2533 | case ENC_REC_NEW_STREAM: | ||
2534 | on_rec_new_stream((struct enc_buffer_event_data *)data); | ||
2535 | return; | ||
2536 | |||
2537 | default: | ||
2538 | return; | ||
2539 | } | ||
2540 | |||
2541 | /* Something failed above. Signal error back to core. */ | ||
2542 | ((struct enc_file_event_data *)data)->chunk->flags |= CHUNKF_ERROR; | ||
2543 | } /* enc_events_callback */ | ||
2544 | |||
2545 | static bool enc_init(void) | ||
2546 | { | ||
2547 | struct enc_inputs inputs; | ||
2548 | struct enc_parameters params; | ||
2549 | |||
2550 | if (ci->enc_get_inputs == NULL || | ||
2551 | ci->enc_set_parameters == NULL || | ||
2552 | ci->enc_get_chunk == NULL || | ||
2553 | ci->enc_finish_chunk == NULL || | ||
2554 | ci->enc_get_pcm_data == NULL || | ||
2555 | ci->enc_unget_pcm_data == NULL ) | ||
2556 | return false; | ||
2557 | |||
2558 | ci->enc_get_inputs(&inputs); | ||
2559 | |||
2560 | if (inputs.config->afmt != AFMT_MPA_L3) | ||
2561 | return false; | ||
2562 | |||
2563 | init_mp3_encoder_engine(inputs.sample_rate, inputs.num_channels, | ||
2564 | inputs.rec_mono_mode, inputs.config); | ||
2565 | |||
2566 | err = 0; | ||
2567 | |||
2568 | /* configure the buffer system */ | ||
2569 | params.afmt = AFMT_MPA_L3; | ||
2570 | params.chunk_size = cfg.byte_per_frame + 1; | ||
2571 | params.enc_sample_rate = cfg.samplerate; | ||
2572 | /* need enough reserved bytes to hold one frame of pcm samples + hdr | ||
2573 | for padding and flushing */ | ||
2574 | params.reserve_bytes = ENC_CHUNK_HDR_SIZE + pcm_chunk_size; | ||
2575 | params.events_callback = enc_events_callback; | ||
2576 | ci->enc_set_parameters(¶ms); | ||
2577 | |||
2578 | res_buffer = params.reserve_buffer; | ||
2579 | |||
2580 | #ifdef CPU_COLDFIRE | ||
2581 | asm volatile ("move.l #0, %macsr"); /* integer mode */ | ||
2582 | #endif | ||
2583 | |||
2584 | return true; | ||
2585 | } /* enc_init */ | ||
2586 | |||
2587 | /* this is the codec entry point */ | ||
2588 | enum codec_status codec_main(enum codec_entry_call_reason reason) | ||
2589 | { | ||
2590 | if (reason == CODEC_LOAD) { | ||
2591 | if (!enc_init()) | ||
2592 | return CODEC_ERROR; | ||
2593 | } | ||
2594 | else if (reason == CODEC_UNLOAD) { | ||
2595 | /* reset parameters to initial state */ | ||
2596 | ci->enc_set_parameters(NULL); | ||
2597 | } | ||
2598 | |||
2599 | return CODEC_OK; | ||
2600 | } | ||
2601 | |||
2602 | /* this is called for each file to process */ | ||
2603 | enum codec_status codec_run(void) | ||
2604 | { | ||
2605 | /* main encoding loop */ | ||
2606 | while(ci->get_command(NULL) != CODEC_ACTION_HALT) | ||
2607 | { | ||
2608 | char *buffer = buffer = ci->enc_get_pcm_data(pcm_chunk_size); | ||
2609 | struct enc_chunk_hdr *chunk; | ||
2610 | |||
2611 | if(buffer == NULL) | ||
2612 | continue; | ||
2613 | |||
2614 | chunk = ci->enc_get_chunk(); | ||
2615 | chunk->enc_data = ENC_CHUNK_SKIP_HDR(chunk->enc_data, chunk); | ||
2616 | |||
2617 | encode_frame(buffer, chunk); | ||
2618 | |||
2619 | if (chunk->num_pcm < samp_per_frame) | ||
2620 | { | ||
2621 | ci->enc_unget_pcm_data(pcm_chunk_size - chunk->num_pcm*4); | ||
2622 | chunk->num_pcm = samp_per_frame; | ||
2623 | } | ||
2624 | |||
2625 | ci->enc_finish_chunk(); | ||
2626 | } | ||
2627 | |||
2628 | return CODEC_OK; | ||
2629 | } | ||