Diffstat (limited to 'core/multimedia/opieplayer/libmpeg3/audio/tables.c') (more/less context) (ignore whitespace changes)
-rw-r--r-- | core/multimedia/opieplayer/libmpeg3/audio/tables.c | 554 |
1 files changed, 554 insertions, 0 deletions
diff --git a/core/multimedia/opieplayer/libmpeg3/audio/tables.c b/core/multimedia/opieplayer/libmpeg3/audio/tables.c new file mode 100644 index 0000000..aeab335 --- a/dev/null +++ b/core/multimedia/opieplayer/libmpeg3/audio/tables.c | |||
@@ -0,0 +1,554 @@ | |||
1 | #include "mpeg3audio.h" | ||
2 | #include "../libmpeg3.h" | ||
3 | #include "../mpeg3protos.h" | ||
4 | #include "tables.h" | ||
5 | |||
6 | #include <math.h> | ||
7 | |||
8 | /* Bitrate indexes */ | ||
9 | int mpeg3_tabsel_123[2][3][16] = { | ||
10 | { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,}, | ||
11 | {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,}, | ||
12 | {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} }, | ||
13 | |||
14 | { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,}, | ||
15 | {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,}, | ||
16 | {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} } | ||
17 | }; | ||
18 | |||
19 | long mpeg3_freqs[9] = { 44100, 48000, 32000, 22050, 24000, 16000 , 11025 , 12000 , 8000 }; | ||
20 | |||
21 | #ifdef USE_3DNOW | ||
22 | mpeg3_real_t mpeg3_decwin[2 * (512 + 32)]; | ||
23 | mpeg3_real_t mpeg3_cos64[32], mpeg3_cos32[16], mpeg3_cos16[8], mpeg3_cos8[4], mpeg3_cos4[2]; | ||
24 | #else | ||
25 | mpeg3_real_t mpeg3_decwin[512 + 32]; | ||
26 | mpeg3_real_t mpeg3_cos64[16], mpeg3_cos32[8], mpeg3_cos16[4], mpeg3_cos8[2], mpeg3_cos4[1]; | ||
27 | #endif | ||
28 | |||
29 | mpeg3_real_t *mpeg3_pnts[] = { mpeg3_cos64, mpeg3_cos32, mpeg3_cos16, mpeg3_cos8, mpeg3_cos4 }; | ||
30 | |||
31 | int mpeg3_grp_3tab[32 * 3] = { 0, }; /* used: 27 */ | ||
32 | int mpeg3_grp_5tab[128 * 3] = { 0, }; /* used: 125 */ | ||
33 | int mpeg3_grp_9tab[1024 * 3] = { 0, }; /* used: 729 */ | ||
34 | |||
35 | REAL_MATRIX(mpeg3_muls, [27], [64]);/* also used by layer 1 */ | ||
36 | REAL_MATRIX(mpeg3_gainpow2, [256 + 118 + 4], ); | ||
37 | REAL_MATRIX(mpeg3_ispow, [8207], ); | ||
38 | REAL_MATRIX(mpeg3_aa_ca, [8], ); | ||
39 | REAL_MATRIX(mpeg3_aa_cs, [8], ); | ||
40 | REAL_MATRIX(mpeg3_win, [4], [36]); | ||
41 | REAL_MATRIX(mpeg3_win1, [4], [36]); | ||
42 | REAL_MATRIX(mpeg3_COS1, [12], [6]); | ||
43 | REAL_MATRIX(mpeg3_COS9, [9], ); | ||
44 | REAL_MATRIX(mpeg3_tfcos36, [9], ); | ||
45 | REAL_MATRIX(mpeg3_tfcos12, [3], ); | ||
46 | REAL_MATRIX(mpeg3_cos9, [3], ); | ||
47 | REAL_MATRIX(mpeg3_cos18, [3], ); | ||
48 | REAL_MATRIX(mpeg3_tan1_1, [16], ); | ||
49 | REAL_MATRIX(mpeg3_tan2_1, [16], ); | ||
50 | REAL_MATRIX(mpeg3_tan1_2, [16], ); | ||
51 | REAL_MATRIX(mpeg3_tan2_2, [16], ); | ||
52 | REAL_MATRIX(mpeg3_pow1_1, [2], [16]); | ||
53 | REAL_MATRIX(mpeg3_pow2_1, [2], [16]); | ||
54 | REAL_MATRIX(mpeg3_pow1_2, [2], [16]); | ||
55 | REAL_MATRIX(mpeg3_pow2_2, [2], [16]); | ||
56 | |||
57 | mpeg3_real_t mpeg3_COS6_1, mpeg3_COS6_2; | ||
58 | |||
59 | #ifdef PRINT_FIXED_POINT_TABLES | ||
60 | static void print_table(const char* var, mpeg3_real_t* data, int count) | ||
61 | { | ||
62 | int i; | ||
63 | printf("#ifdef USE_DATA_TABLES\n"); | ||
64 | printf("static long %s_data[] = {",var); | ||
65 | for(i = 0; i < count; i++) { | ||
66 | printf("%c0x%08x,", i%8?' ':'\n', data[i].fixedPoint()); | ||
67 | } | ||
68 | printf("};\n"); | ||
69 | printf("#endif\n"); | ||
70 | } | ||
71 | #endif | ||
72 | |||
73 | #ifdef PRINT_FIXED_POINT_TABLES | ||
74 | # define DO_TABLE(T) print_table(#T, T, sizeof(T)/sizeof(mpeg3_real_t)) | ||
75 | # define DO_TABLE2(T,DIM) print_table(#T, (mpeg3_real_t*)T, sizeof(T)/sizeof(mpeg3_real_t)) | ||
76 | #elif USE_FIXED_POINT | ||
77 | # define DO_TABLE(T) T = (mpeg3_real_t*)T##_data | ||
78 | // multidimensional | ||
79 | # define DO_TABLE2(T,DIM) T = (mpeg3_real_t(*)DIM)T##_data | ||
80 | #else | ||
81 | # define DO_TABLE(T) | ||
82 | # define DO_TABLE2(T,DIM) | ||
83 | #endif | ||
84 | |||
85 | #if defined(USE_FIXED_POINT) && !defined(PRINT_FIXED_POINT_TABLES) | ||
86 | #define USE_DATA_TABLES | ||
87 | #include "fptables.h" | ||
88 | #endif | ||
89 | |||
90 | long mpeg3_intwinbase[] = { | ||
91 | 0, -1, -1, -1, -1, -1, -1, -2, -2, -2, | ||
92 | -2, -3, -3, -4, -4, -5, -5, -6, -7, -7, | ||
93 | -8, -9, -10, -11, -13, -14, -16, -17, -19, -21, | ||
94 | -24, -26, -29, -31, -35, -38, -41, -45, -49, -53, | ||
95 | -58, -63, -68, -73, -79, -85, -91, -97, -104, -111, | ||
96 | -117, -125, -132, -139, -147, -154, -161, -169, -176, -183, | ||
97 | -190, -196, -202, -208, -213, -218, -222, -225, -227, -228, | ||
98 | -228, -227, -224, -221, -215, -208, -200, -189, -177, -163, | ||
99 | -146, -127, -106, -83, -57, -29, 2, 36, 72, 111, | ||
100 | 153, 197, 244, 294, 347, 401, 459, 519, 581, 645, | ||
101 | 711, 779, 848, 919, 991, 1064, 1137, 1210, 1283, 1356, | ||
102 | 1428, 1498, 1567, 1634, 1698, 1759, 1817, 1870, 1919, 1962, | ||
103 | 2001, 2032, 2057, 2075, 2085, 2087, 2080, 2063, 2037, 2000, | ||
104 | 1952, 1893, 1822, 1739, 1644, 1535, 1414, 1280, 1131, 970, | ||
105 | 794, 605, 402, 185, -45, -288, -545, -814, -1095, -1388, | ||
106 | -1692, -2006, -2330, -2663, -3004, -3351, -3705, -4063, -4425, -4788, | ||
107 | -5153, -5517, -5879, -6237, -6589, -6935, -7271, -7597, -7910, -8209, | ||
108 | -8491, -8755, -8998, -9219, -9416, -9585, -9727, -9838, -9916, -9959, | ||
109 | -9966, -9935, -9863, -9750, -9592, -9389, -9139, -8840, -8492, -8092, | ||
110 | -7640, -7134, -6574, -5959, -5288, -4561, -3776, -2935, -2037, -1082, | ||
111 | -70, 998, 2122, 3300, 4533, 5818, 7154, 8540, 9975, 11455, | ||
112 | 12980, 14548, 16155, 17799, 19478, 21189, 22929, 24694, 26482, 28289, | ||
113 | 30112, 31947, 33791, 35640, 37489, 39336, 41176, 43006, 44821, 46617, | ||
114 | 48390, 50137, 51853, 53534, 55178, 56778, 58333, 59838, 61289, 62684, | ||
115 | 64019, 65290, 66494, 67629, 68692, 69679, 70590, 71420, 72169, 72835, | ||
116 | 73415, 73908, 74313, 74630, 74856, 74992, 75038 }; | ||
117 | |||
118 | int mpeg3_longLimit[9][23]; | ||
119 | int mpeg3_shortLimit[9][14]; | ||
120 | |||
121 | struct mpeg3_bandInfoStruct mpeg3_bandInfo[9] = | ||
122 | { | ||
123 | |||
124 | /* MPEG 1.0 */ | ||
125 | { {0,4,8,12,16,20,24,30,36,44,52,62,74, 90,110,134,162,196,238,288,342,418,576}, | ||
126 | {4,4,4,4,4,4,6,6,8, 8,10,12,16,20,24,28,34,42,50,54, 76,158}, | ||
127 | {0,4*3,8*3,12*3,16*3,22*3,30*3,40*3,52*3,66*3, 84*3,106*3,136*3,192*3}, | ||
128 | {4,4,4,4,6,8,10,12,14,18,22,30,56} } , | ||
129 | |||
130 | { {0,4,8,12,16,20,24,30,36,42,50,60,72, 88,106,128,156,190,230,276,330,384,576}, | ||
131 | {4,4,4,4,4,4,6,6,6, 8,10,12,16,18,22,28,34,40,46,54, 54,192}, | ||
132 | {0,4*3,8*3,12*3,16*3,22*3,28*3,38*3,50*3,64*3, 80*3,100*3,126*3,192*3}, | ||
133 | {4,4,4,4,6,6,10,12,14,16,20,26,66} } , | ||
134 | |||
135 | { {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576} , | ||
136 | {4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102, 26} , | ||
137 | {0,4*3,8*3,12*3,16*3,22*3,30*3,42*3,58*3,78*3,104*3,138*3,180*3,192*3} , | ||
138 | {4,4,4,4,6,8,12,16,20,26,34,42,12} } , | ||
139 | |||
140 | /* MPEG 2.0 */ | ||
141 | { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, | ||
142 | {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 } , | ||
143 | {0,4*3,8*3,12*3,18*3,24*3,32*3,42*3,56*3,74*3,100*3,132*3,174*3,192*3} , | ||
144 | {4,4,4,6,6,8,10,14,18,26,32,42,18 } } , | ||
145 | |||
146 | { {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576}, | ||
147 | {6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,52,64,70,76,36 } , | ||
148 | {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,136*3,180*3,192*3} , | ||
149 | {4,4,4,6,8,10,12,14,18,24,32,44,12 } } , | ||
150 | |||
151 | { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, | ||
152 | {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 }, | ||
153 | {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,134*3,174*3,192*3}, | ||
154 | {4,4,4,6,8,10,12,14,18,24,30,40,18 } } , | ||
155 | /* MPEG 2.5 */ | ||
156 | { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} , | ||
157 | {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54}, | ||
158 | {0,12,24,36,54,78,108,144,186,240,312,402,522,576}, | ||
159 | {4,4,4,6,8,10,12,14,18,24,30,40,18} }, | ||
160 | { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} , | ||
161 | {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54}, | ||
162 | {0,12,24,36,54,78,108,144,186,240,312,402,522,576}, | ||
163 | {4,4,4,6,8,10,12,14,18,24,30,40,18} }, | ||
164 | { {0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576}, | ||
165 | {12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2}, | ||
166 | {0, 24, 48, 72,108,156,216,288,372,480,486,492,498,576}, | ||
167 | {8,8,8,12,16,20,24,28,36,2,2,2,26} } , | ||
168 | }; | ||
169 | |||
170 | int mpeg3_mapbuf0[9][152]; | ||
171 | int mpeg3_mapbuf1[9][156]; | ||
172 | int mpeg3_mapbuf2[9][44]; | ||
173 | int *mpeg3_map[9][3]; | ||
174 | int *mpeg3_mapend[9][3]; | ||
175 | |||
176 | unsigned int mpeg3_n_slen2[512]; /* MPEG 2.0 slen for 'normal' mode */ | ||
177 | unsigned int mpeg3_i_slen2[256]; /* MPEG 2.0 slen for intensity stereo */ | ||
178 | |||
179 | int mpeg3audio_init_layer3(mpeg3audio_t *audio); | ||
180 | |||
181 | int mpeg3audio_init_layer2(mpeg3audio_t *audio) | ||
182 | { | ||
183 | static double mulmul[27] = | ||
184 | { | ||
185 | 0.0 , -2.0/3.0 , 2.0/3.0 , | ||
186 | 2.0/7.0 , 2.0/15.0 , 2.0/31.0, 2.0/63.0 , 2.0/127.0 , 2.0/255.0 , | ||
187 | 2.0/511.0 , 2.0/1023.0 , 2.0/2047.0 , 2.0/4095.0 , 2.0/8191.0 , | ||
188 | 2.0/16383.0 , 2.0/32767.0 , 2.0/65535.0 , | ||
189 | -4.0/5.0 , -2.0/5.0 , 2.0/5.0, 4.0/5.0 , | ||
190 | -8.0/9.0 , -4.0/9.0 , -2.0/9.0 , 2.0/9.0 , 4.0/9.0 , 8.0/9.0 | ||
191 | }; | ||
192 | static int base[3][9] = | ||
193 | { | ||
194 | { 1 , 0, 2 , } , | ||
195 | { 17, 18, 0 , 19, 20 , } , | ||
196 | { 21, 1, 22, 23, 0, 24, 25, 2, 26 } | ||
197 | }; | ||
198 | static int tablen[3] = { 3, 5, 9 }; | ||
199 | static int *itable, *tables[3] = {mpeg3_grp_3tab, mpeg3_grp_5tab, mpeg3_grp_9tab}; | ||
200 | int i, j, k, l, len; | ||
201 | mpeg3_real_t *table; | ||
202 | |||
203 | for(i = 0; i < 3; i++) | ||
204 | { | ||
205 | itable = tables[i]; | ||
206 | len = tablen[i]; | ||
207 | for(j = 0; j < len; j++) | ||
208 | for(k = 0; k < len; k++) | ||
209 | for(l = 0; l < len; l++) | ||
210 | { | ||
211 | *itable++ = base[i][l]; | ||
212 | *itable++ = base[i][k]; | ||
213 | *itable++ = base[i][j]; | ||
214 | } | ||
215 | } | ||
216 | |||
217 | #if !defined(USE_FIXED_POINT) || defined(PRINT_FIXED_POINT_TABLES) | ||
218 | #if defined(PRINT_FIXED_POINT_TABLES) | ||
219 | //mpeg3audio_init_layer3(audio); // we depend on mpeg3_muls table | ||
220 | #endif | ||
221 | for(k = 0; k < 27; k++) | ||
222 | { | ||
223 | double m = mulmul[k]; | ||
224 | table = mpeg3_muls[k]; | ||
225 | for(j = 3, i = 0; i < 63; i++, j--) | ||
226 | *table++ = m * pow(2.0, (double)j / 3.0); | ||
227 | *table++ = 0.0; | ||
228 | } | ||
229 | #endif | ||
230 | DO_TABLE2(mpeg3_muls,[64]); | ||
231 | return 0; | ||
232 | } | ||
233 | |||
234 | int mpeg3audio_init_layer3(mpeg3audio_t *audio) | ||
235 | { | ||
236 | int i, j, k, l; | ||
237 | int down_sample_sblimit = 32; | ||
238 | |||
239 | audio->mp3_block[0][0][0] = 0; | ||
240 | audio->mp3_blc[0] = 0; | ||
241 | audio->mp3_blc[1] = 0; | ||
242 | |||
243 | #if !defined(USE_FIXED_POINT) || defined(PRINT_FIXED_POINT_TABLES) | ||
244 | for(i = -256; i < 118 + 4; i++) | ||
245 | mpeg3_gainpow2[i + 256] = pow((double)2.0, -0.25 * (double)(i + 210)); | ||
246 | |||
247 | for(i = 0; i < 8207; i++) | ||
248 | mpeg3_ispow[i] = pow((double)i, (double)4.0 / 3.0); | ||
249 | |||
250 | for(i = 0; i < 8; i++) | ||
251 | { | ||
252 | static double Ci[8] = {-0.6,-0.535,-0.33,-0.185,-0.095,-0.041,-0.0142,-0.0037}; | ||
253 | double sq = sqrt(1.0+Ci[i]*Ci[i]); | ||
254 | mpeg3_aa_cs[i] = 1.0/sq; | ||
255 | mpeg3_aa_ca[i] = Ci[i]/sq; | ||
256 | } | ||
257 | |||
258 | for(i = 0; i < 18; i++) | ||
259 | { | ||
260 | mpeg3_win[0][i] = mpeg3_win[1][i] = 0.5 * sin( M_PI / 72.0 * (double)(2 * (i + 0) + 1) ) / cos (M_PI * (double)(2 * (i + 0) + 19) / 72.0); | ||
261 | mpeg3_win[0][i+18] = mpeg3_win[3][i+18] = 0.5 * sin( M_PI / 72.0 * (double)(2 * (i + 18) + 1) ) / cos (M_PI * (double)(2 * (i + 18) + 19) / 72.0); | ||
262 | } | ||
263 | for(i = 0; i < 6; i++) | ||
264 | { | ||
265 | mpeg3_win[1][i + 18] = 0.5 / cos ( M_PI * (double) (2*(i+18)+19) / 72.0 ); | ||
266 | mpeg3_win[3][i + 12] = 0.5 / cos ( M_PI * (double) (2*(i+12)+19) / 72.0 ); | ||
267 | mpeg3_win[1][i + 24] = 0.5 * sin( M_PI / 24.0 * (double)(2 * i + 13) ) / cos (M_PI * (double)(2 * (i + 24)+ 19) / 72.0 ); | ||
268 | mpeg3_win[1][i + 30] = mpeg3_win[3][i] = 0.0; | ||
269 | mpeg3_win[3][i + 6 ] = 0.5 * sin( M_PI / 24.0 * (double)(2 * i + 1) ) / cos (M_PI * (double)(2 * (i + 6 )+ 19) / 72.0 ); | ||
270 | } | ||
271 | |||
272 | for(i = 0; i < 9; i++) | ||
273 | mpeg3_COS9[i] = cos(M_PI / 18.0 * (double)i); | ||
274 | |||
275 | for(i = 0; i < 9; i++) | ||
276 | mpeg3_tfcos36[i] = 0.5 / cos (M_PI * (double) (i*2+1) / 36.0); | ||
277 | for(i = 0; i < 3; i++) | ||
278 | mpeg3_tfcos12[i] = 0.5 / cos (M_PI * (double) (i*2+1) / 12.0); | ||
279 | |||
280 | mpeg3_cos9[0] = cos(1.0 * M_PI / 9.0); | ||
281 | mpeg3_cos9[1] = cos(5.0 * M_PI / 9.0); | ||
282 | mpeg3_cos9[2] = cos(7.0 * M_PI / 9.0); | ||
283 | mpeg3_cos18[0] = cos(1.0 * M_PI / 18.0); | ||
284 | mpeg3_cos18[1] = cos(11.0 * M_PI / 18.0); | ||
285 | mpeg3_cos18[2] = cos(13.0 * M_PI / 18.0); | ||
286 | |||
287 | for(i = 0; i < 12; i++) | ||
288 | { | ||
289 | mpeg3_win[2][i] = 0.5 * sin(M_PI / 24.0 * (double) (2 * i + 1)) / cos(M_PI * (double)(2 * i + 7) / 24.0); | ||
290 | for(j = 0; j < 6; j++) | ||
291 | mpeg3_COS1[i][j] = cos(M_PI / 24.0 * (double) ((2 * i + 7) * (2 * j + 1))); | ||
292 | } | ||
293 | |||
294 | for(j = 0; j < 4; j++) | ||
295 | { | ||
296 | static int len[4] = {36, 36, 12, 36}; | ||
297 | for(i = 0; i < len[j]; i += 2) | ||
298 | mpeg3_win1[j][i] = + mpeg3_win[j][i]; | ||
299 | for(i = 1; i < len[j]; i += 2) | ||
300 | mpeg3_win1[j][i] = - mpeg3_win[j][i]; | ||
301 | } | ||
302 | |||
303 | for(i = 0; i < 16; i++) | ||
304 | { | ||
305 | double t = tan( (double) i * M_PI / 12.0 ); | ||
306 | mpeg3_tan1_1[i] = t / (1.0 + t); | ||
307 | mpeg3_tan2_1[i] = 1.0 / (1.0 + t); | ||
308 | mpeg3_tan1_2[i] = M_SQRT2 * t / (1.0 + t); | ||
309 | mpeg3_tan2_2[i] = M_SQRT2 / (1.0 + t); | ||
310 | |||
311 | for(j = 0; j < 2; j++) | ||
312 | { | ||
313 | double base = pow(2.0, -0.25 * (j + 1.0)); | ||
314 | double p1 = 1.0,p2 = 1.0; | ||
315 | if(i > 0) | ||
316 | { | ||
317 | if( i & 1 ) | ||
318 | p1 = pow(base, (i + 1.0) * 0.5); | ||
319 | else | ||
320 | p2 = pow(base, i * 0.5); | ||
321 | } | ||
322 | mpeg3_pow1_1[j][i] = p1; | ||
323 | mpeg3_pow2_1[j][i] = p2; | ||
324 | mpeg3_pow1_2[j][i] = M_SQRT2 * p1; | ||
325 | mpeg3_pow2_2[j][i] = M_SQRT2 * p2; | ||
326 | } | ||
327 | } | ||
328 | |||
329 | #endif | ||
330 | |||
331 | DO_TABLE(mpeg3_gainpow2); | ||
332 | DO_TABLE(mpeg3_ispow); | ||
333 | DO_TABLE(mpeg3_aa_cs); | ||
334 | DO_TABLE(mpeg3_aa_ca); | ||
335 | DO_TABLE2(mpeg3_win,[36]); | ||
336 | DO_TABLE(mpeg3_COS9); | ||
337 | DO_TABLE(mpeg3_tfcos36); | ||
338 | DO_TABLE(mpeg3_tfcos12); | ||
339 | DO_TABLE(mpeg3_cos9); | ||
340 | DO_TABLE(mpeg3_cos18); | ||
341 | DO_TABLE2(mpeg3_COS1,[6]); | ||
342 | DO_TABLE2(mpeg3_win1,[36]); | ||
343 | DO_TABLE(mpeg3_tan1_1); | ||
344 | DO_TABLE(mpeg3_tan2_1); | ||
345 | DO_TABLE(mpeg3_tan1_2); | ||
346 | DO_TABLE(mpeg3_tan2_2); | ||
347 | DO_TABLE2(mpeg3_pow1_1,[16]); | ||
348 | DO_TABLE2(mpeg3_pow2_1,[16]); | ||
349 | DO_TABLE2(mpeg3_pow1_2,[16]); | ||
350 | DO_TABLE2(mpeg3_pow2_2,[16]); | ||
351 | |||
352 | mpeg3_COS6_1 = cos( M_PI / 6.0 * (double) 1); | ||
353 | mpeg3_COS6_2 = cos( M_PI / 6.0 * (double) 2); | ||
354 | |||
355 | for(j = 0; j < 9; j++) | ||
356 | { | ||
357 | struct mpeg3_bandInfoStruct *bi = &mpeg3_bandInfo[j]; | ||
358 | int *mp; | ||
359 | int cb,lwin; | ||
360 | int *bdf; | ||
361 | |||
362 | mp = mpeg3_map[j][0] = mpeg3_mapbuf0[j]; | ||
363 | bdf = bi->longDiff; | ||
364 | for(i = 0, cb = 0; cb < 8; cb++, i += *bdf++) | ||
365 | { | ||
366 | *mp++ = (*bdf) >> 1; | ||
367 | *mp++ = i; | ||
368 | *mp++ = 3; | ||
369 | *mp++ = cb; | ||
370 | } | ||
371 | bdf = bi->shortDiff + 3; | ||
372 | for(cb = 3; cb < 13; cb++) | ||
373 | { | ||
374 | int l = (*bdf++) >> 1; | ||
375 | for(lwin = 0; lwin < 3; lwin++) | ||
376 | { | ||
377 | *mp++ = l; | ||
378 | *mp++ = i + lwin; | ||
379 | *mp++ = lwin; | ||
380 | *mp++ = cb; | ||
381 | } | ||
382 | i += 6 * l; | ||
383 | } | ||
384 | mpeg3_mapend[j][0] = mp; | ||
385 | |||
386 | mp = mpeg3_map[j][1] = mpeg3_mapbuf1[j]; | ||
387 | bdf = bi->shortDiff+0; | ||
388 | for(i = 0,cb = 0; cb < 13; cb++) | ||
389 | { | ||
390 | int l = (*bdf++) >> 1; | ||
391 | for(lwin = 0; lwin < 3; lwin++) | ||
392 | { | ||
393 | *mp++ = l; | ||
394 | *mp++ = i + lwin; | ||
395 | *mp++ = lwin; | ||
396 | *mp++ = cb; | ||
397 | } | ||
398 | i += 6 * l; | ||
399 | } | ||
400 | mpeg3_mapend[j][1] = mp; | ||
401 | |||
402 | mp = mpeg3_map[j][2] = mpeg3_mapbuf2[j]; | ||
403 | bdf = bi->longDiff; | ||
404 | for(cb = 0; cb < 22 ; cb++) | ||
405 | { | ||
406 | *mp++ = (*bdf++) >> 1; | ||
407 | *mp++ = cb; | ||
408 | } | ||
409 | mpeg3_mapend[j][2] = mp; | ||
410 | } | ||
411 | |||
412 | for(j = 0; j < 9; j++) | ||
413 | { | ||
414 | for(i = 0; i < 23; i++) | ||
415 | { | ||
416 | mpeg3_longLimit[j][i] = (mpeg3_bandInfo[j].longIdx[i] - 1 + 8) / 18 + 1; | ||
417 | if(mpeg3_longLimit[j][i] > (down_sample_sblimit)) | ||
418 | mpeg3_longLimit[j][i] = down_sample_sblimit; | ||
419 | } | ||
420 | for(i = 0; i < 14; i++) | ||
421 | { | ||
422 | mpeg3_shortLimit[j][i] = (mpeg3_bandInfo[j].shortIdx[i] - 1) / 18 + 1; | ||
423 | if(mpeg3_shortLimit[j][i] > (down_sample_sblimit) ) | ||
424 | mpeg3_shortLimit[j][i] = down_sample_sblimit; | ||
425 | } | ||
426 | } | ||
427 | |||
428 | for(i = 0; i < 5; i++) | ||
429 | { | ||
430 | for(j = 0; j < 6; j++) | ||
431 | { | ||
432 | for(k = 0; k < 6; k++) | ||
433 | { | ||
434 | int n = k + j * 6 + i * 36; | ||
435 | mpeg3_i_slen2[n] = i | (j << 3) | (k << 6) | (3 << 12); | ||
436 | } | ||
437 | } | ||
438 | } | ||
439 | for(i = 0; i < 4; i++) | ||
440 | { | ||
441 | for(j = 0; j < 4; j++) | ||
442 | { | ||
443 | for(k = 0; k < 4; k++) | ||
444 | { | ||
445 | int n = k + j * 4 + i * 16; | ||
446 | mpeg3_i_slen2[n+180] = i | (j << 3) | (k << 6) | (4 << 12); | ||
447 | } | ||
448 | } | ||
449 | } | ||
450 | for(i = 0; i < 4; i++) | ||
451 | { | ||
452 | for(j = 0; j < 3; j++) | ||
453 | { | ||
454 | int n = j + i * 3; | ||
455 | mpeg3_i_slen2[n + 244] = i | (j << 3) | (5 << 12); | ||
456 | mpeg3_n_slen2[n + 500] = i | (j << 3) | (2 << 12) | (1 << 15); | ||
457 | } | ||
458 | } | ||
459 | |||
460 | for(i = 0; i < 5; i++) | ||
461 | { | ||
462 | for(j = 0; j < 5; j++) | ||
463 | { | ||
464 | for(k = 0; k < 4; k++) | ||
465 | { | ||
466 | for(l = 0; l < 4; l++) | ||
467 | { | ||
468 | int n = l + k * 4 + j * 16 + i * 80; | ||
469 | mpeg3_n_slen2[n] = i | (j << 3) | ( k << 6) | (l << 9) | (0 << 12); | ||
470 | } | ||
471 | } | ||
472 | } | ||
473 | } | ||
474 | for(i = 0; i < 5; i++) | ||
475 | { | ||
476 | for(j = 0; j < 5; j++) | ||
477 | { | ||
478 | for(k = 0; k < 4; k++) | ||
479 | { | ||
480 | int n = k + j * 4 + i * 20; | ||
481 | mpeg3_n_slen2[n + 400] = i | (j << 3) | (k << 6) | (1 << 12); | ||
482 | } | ||
483 | } | ||
484 | } | ||
485 | |||
486 | return 0; | ||
487 | } | ||
488 | |||
489 | int mpeg3audio_new_decode_tables(mpeg3audio_t *audio) | ||
490 | { | ||
491 | int i, j, k, kr, divv; | ||
492 | mpeg3_real_t *costab; | ||
493 | int idx; | ||
494 | long scaleval = audio->outscale; | ||
495 | |||
496 | |||
497 | for(i = 0; i < 5; i++) | ||
498 | { | ||
499 | kr = 0x10 >> i; | ||
500 | divv = 0x40 >> i; | ||
501 | costab = mpeg3_pnts[i]; | ||
502 | for(k = 0; k < kr; k++) | ||
503 | costab[k] = 1.0 / (2.0 * cos(M_PI * ((double)k * 2.0 + 1.0) / (double)divv)); | ||
504 | |||
505 | #ifdef USE_3DNOW | ||
506 | for(k = 0; k < kr; k++) | ||
507 | costab[k + kr] = -costab[k]; | ||
508 | #endif | ||
509 | |||
510 | } | ||
511 | |||
512 | idx = 0; | ||
513 | scaleval = -scaleval; | ||
514 | for(i = 0, j = 0; i < 256; i++, j++,idx += 32) | ||
515 | { | ||
516 | if(idx < 512 + 16) | ||
517 | mpeg3_decwin[idx+16] = mpeg3_decwin[idx] = (double)mpeg3_intwinbase[j] / 65536.0 * (double)scaleval; | ||
518 | |||
519 | if(i % 32 == 31) | ||
520 | idx -= 1023; | ||
521 | if(i % 64 == 63) | ||
522 | scaleval = -scaleval; | ||
523 | } | ||
524 | |||
525 | for( ; i < 512; i++, j--, idx += 32) | ||
526 | { | ||
527 | if(idx < 512 + 16) | ||
528 | mpeg3_decwin[idx + 16] = mpeg3_decwin[idx] = (double)mpeg3_intwinbase[j] / 65536.0 * (double)scaleval; | ||
529 | |||
530 | if(i % 32 == 31) | ||
531 | idx -= 1023; | ||
532 | if(i % 64 == 63) | ||
533 | scaleval = -scaleval; | ||
534 | } | ||
535 | |||
536 | #ifdef USE_3DNOW | ||
537 | if(!param.down_sample) | ||
538 | { | ||
539 | for(i = 0; i < 512 + 32; i++) | ||
540 | { | ||
541 | mpeg3_decwin[512 + 31 - i] *= 65536.0; /* allows faster clipping in 3dnow code */ | ||
542 | mpeg3_decwin[512 + 32 + i] = mpeg3_decwin[512 + 31 - i]; | ||
543 | } | ||
544 | } | ||
545 | #endif | ||
546 | |||
547 | /* Initialize AC3 */ | ||
548 | audio->ac3_lfsr_state = 1; | ||
549 | mpeg3audio_imdct_init(audio); | ||
550 | /* Initialize MPEG */ | ||
551 | mpeg3audio_init_layer2(audio); /* inits also shared tables with layer1 */ | ||
552 | mpeg3audio_init_layer3(audio); | ||
553 | return 0; | ||
554 | } | ||