/src/mpg123/src/libmpg123/tabinit.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | tabinit.c: initialize tables... |
3 | | |
4 | | copyright ?-2008 by the mpg123 project - free software under the terms of the LGPL 2.1 |
5 | | see COPYING and AUTHORS files in distribution or http://mpg123.org |
6 | | initially written by Michael Hipp |
7 | | */ |
8 | | |
9 | | #include "mpg123lib_intern.h" |
10 | | #include "../common/debug.h" |
11 | | |
12 | | // The (normally precomputed) cos tables. |
13 | | #include "costabs.h" |
14 | | #ifdef RUNTIME_TABLES |
15 | | #include "init_costabs.h" |
16 | | #else |
17 | | const |
18 | | #endif |
19 | | real *INT123_pnts[] = { cos64,cos32,cos16,cos8,cos4 }; |
20 | | |
21 | | static const long intwinbase[] = { |
22 | | 0, -1, -1, -1, -1, -1, -1, -2, -2, -2, |
23 | | -2, -3, -3, -4, -4, -5, -5, -6, -7, -7, |
24 | | -8, -9, -10, -11, -13, -14, -16, -17, -19, -21, |
25 | | -24, -26, -29, -31, -35, -38, -41, -45, -49, -53, |
26 | | -58, -63, -68, -73, -79, -85, -91, -97, -104, -111, |
27 | | -117, -125, -132, -139, -147, -154, -161, -169, -176, -183, |
28 | | -190, -196, -202, -208, -213, -218, -222, -225, -227, -228, |
29 | | -228, -227, -224, -221, -215, -208, -200, -189, -177, -163, |
30 | | -146, -127, -106, -83, -57, -29, 2, 36, 72, 111, |
31 | | 153, 197, 244, 294, 347, 401, 459, 519, 581, 645, |
32 | | 711, 779, 848, 919, 991, 1064, 1137, 1210, 1283, 1356, |
33 | | 1428, 1498, 1567, 1634, 1698, 1759, 1817, 1870, 1919, 1962, |
34 | | 2001, 2032, 2057, 2075, 2085, 2087, 2080, 2063, 2037, 2000, |
35 | | 1952, 1893, 1822, 1739, 1644, 1535, 1414, 1280, 1131, 970, |
36 | | 794, 605, 402, 185, -45, -288, -545, -814, -1095, -1388, |
37 | | -1692, -2006, -2330, -2663, -3004, -3351, -3705, -4063, -4425, -4788, |
38 | | -5153, -5517, -5879, -6237, -6589, -6935, -7271, -7597, -7910, -8209, |
39 | | -8491, -8755, -8998, -9219, -9416, -9585, -9727, -9838, -9916, -9959, |
40 | | -9966, -9935, -9863, -9750, -9592, -9389, -9139, -8840, -8492, -8092, |
41 | | -7640, -7134, -6574, -5959, -5288, -4561, -3776, -2935, -2037, -1082, |
42 | | -70, 998, 2122, 3300, 4533, 5818, 7154, 8540, 9975, 11455, |
43 | | 12980, 14548, 16155, 17799, 19478, 21189, 22929, 24694, 26482, 28289, |
44 | | 30112, 31947, 33791, 35640, 37489, 39336, 41176, 43006, 44821, 46617, |
45 | | 48390, 50137, 51853, 53534, 55178, 56778, 58333, 59838, 61289, 62684, |
46 | | 64019, 65290, 66494, 67629, 68692, 69679, 70590, 71420, 72169, 72835, |
47 | | 73415, 73908, 74313, 74630, 74856, 74992, 75038 }; |
48 | | |
49 | | #ifdef OPT_MMXORSSE |
50 | | #if !defined(OPT_X86_64) && !defined(OPT_NEON) && !defined(OPT_NEON64) && !defined(OPT_AVX) |
51 | | void INT123_make_decode_tables_mmx_asm(long scaleval, float* decwin_mmx, float *decwins); |
52 | | void INT123_make_decode_tables_mmx(mpg123_handle *fr) |
53 | | { |
54 | | debug("MMX decode tables"); |
55 | | /* Take care: The scale should be like before, when we didn't have float output all around. */ |
56 | | INT123_make_decode_tables_mmx_asm((long)((fr->lastscale < 0 ? fr->p.outscale : fr->lastscale)*SHORT_SCALE), fr->decwin_mmx, fr->decwins); |
57 | | debug("MMX decode tables done"); |
58 | | } |
59 | | #else |
60 | | |
61 | | /* This mimics round() as defined in C99. We stay C89. */ |
62 | | static int rounded(double f) |
63 | 0 | { |
64 | 0 | return (int)(f>0 ? floor(f+0.5) : ceil(f-0.5)); |
65 | 0 | } |
66 | | |
67 | | /* x86-64 doesn't use asm version */ |
68 | | void INT123_make_decode_tables_mmx(mpg123_handle *fr) |
69 | 0 | { |
70 | 0 | int i,j,val; |
71 | 0 | int idx = 0; |
72 | 0 | short *ptr = (short *)fr->decwins; |
73 | | /* Scale is always based on 1.0 . */ |
74 | 0 | double scaleval = -0.5*(fr->lastscale < 0 ? fr->p.outscale : fr->lastscale); |
75 | 0 | debug1("MMX decode tables with scaleval %g", scaleval); |
76 | 0 | for(i=0,j=0;i<256;i++,j++,idx+=32) |
77 | 0 | { |
78 | 0 | if(idx < 512+16) |
79 | 0 | fr->decwin_mmx[idx+16] = fr->decwin_mmx[idx] = DOUBLE_TO_REAL((double) intwinbase[j] * scaleval); |
80 | | |
81 | 0 | if(i % 32 == 31) |
82 | 0 | idx -= 1023; |
83 | 0 | if(i % 64 == 63) |
84 | 0 | scaleval = - scaleval; |
85 | 0 | } |
86 | | |
87 | 0 | for( /* i=256 */ ;i<512;i++,j--,idx+=32) |
88 | 0 | { |
89 | 0 | if(idx < 512+16) |
90 | 0 | fr->decwin_mmx[idx+16] = fr->decwin_mmx[idx] = DOUBLE_TO_REAL((double) intwinbase[j] * scaleval); |
91 | | |
92 | 0 | if(i % 32 == 31) |
93 | 0 | idx -= 1023; |
94 | 0 | if(i % 64 == 63) |
95 | 0 | scaleval = - scaleval; |
96 | 0 | } |
97 | | |
98 | 0 | for(i=0; i<512; i++) { |
99 | 0 | if(i&1) val = rounded(fr->decwin_mmx[i]*0.5); |
100 | 0 | else val = rounded(fr->decwin_mmx[i]*-0.5); |
101 | 0 | if(val > 32767) val = 32767; |
102 | 0 | else if(val < -32768) val = -32768; |
103 | 0 | ptr[i] = val; |
104 | 0 | } |
105 | 0 | for(i=512; i<512+32; i++) { |
106 | 0 | if(i&1) val = rounded(fr->decwin_mmx[i]*0.5); |
107 | 0 | else val = 0; |
108 | 0 | if(val > 32767) val = 32767; |
109 | 0 | else if(val < -32768) val = -32768; |
110 | 0 | ptr[i] = val; |
111 | 0 | } |
112 | 0 | for(i=0; i<512; i++) { |
113 | 0 | val = rounded(fr->decwin_mmx[511-i]*-0.5); |
114 | 0 | if(val > 32767) val = 32767; |
115 | 0 | else if(val < -32768) val = -32768; |
116 | 0 | ptr[512+32+i] = val; |
117 | 0 | } |
118 | 0 | debug("decode tables done"); |
119 | 0 | } |
120 | | #endif |
121 | | #endif |
122 | | |
123 | | #ifdef REAL_IS_FIXED |
124 | | /* Need saturating multiplication that keeps table values in 32 bit range, |
125 | | with the option to swap sign at will (so -2**31 is out). |
126 | | This code is far from the decoder core and so assembly optimization might |
127 | | be overkill. */ |
128 | | static int32_t sat_mul32(int32_t a, int32_t b) |
129 | | { |
130 | | int64_t prod = (int64_t)a * (int64_t)b; |
131 | | /* TODO: record the clipping? An extra flag? */ |
132 | | if(prod > 2147483647L) return 2147483647L; |
133 | | if(prod < -2147483647L) return -2147483647L; |
134 | | return (int32_t)prod; |
135 | | } |
136 | | #endif |
137 | | |
138 | | void INT123_make_decode_tables(mpg123_handle *fr) |
139 | 0 | { |
140 | 0 | int i,j; |
141 | 0 | int idx = 0; |
142 | 0 | double scaleval; |
143 | | #ifdef REAL_IS_FIXED |
144 | | real scaleval_long; |
145 | | #endif |
146 | | /* Scale is always based on 1.0 . */ |
147 | 0 | scaleval = -0.5*(fr->lastscale < 0 ? fr->p.outscale : fr->lastscale); |
148 | 0 | debug1("decode tables with scaleval %g", scaleval); |
149 | | #ifdef REAL_IS_FIXED |
150 | | scaleval_long = DOUBLE_TO_REAL_15(scaleval); |
151 | | debug1("decode table with fixed scaleval %li", (long)scaleval_long); |
152 | | if(scaleval_long > 28618 || scaleval_long < -28618) |
153 | | { |
154 | | /* TODO: Limit the scaleval itself or limit the multiplication afterwards? |
155 | | The former basically disables significant amplification for fixed-point |
156 | | decoders, but avoids (possibly subtle) distortion. */ |
157 | | /* This would limit the amplification instead: |
158 | | scaleval_long = scaleval_long < 0 ? -28618 : 28618; */ |
159 | | if(NOQUIET) warning("Desired amplification may introduce distortion."); |
160 | | } |
161 | | #endif |
162 | 0 | for(i=0,j=0;i<256;i++,j++,idx+=32) |
163 | 0 | { |
164 | 0 | if(idx < 512+16) |
165 | | #ifdef REAL_IS_FIXED |
166 | | fr->decwin[idx+16] = fr->decwin[idx] = |
167 | | REAL_SCALE_WINDOW(sat_mul32(intwinbase[j],scaleval_long)); |
168 | | #else |
169 | 0 | fr->decwin[idx+16] = fr->decwin[idx] = DOUBLE_TO_REAL((double) intwinbase[j] * scaleval); |
170 | 0 | #endif |
171 | |
|
172 | 0 | if(i % 32 == 31) |
173 | 0 | idx -= 1023; |
174 | 0 | if(i % 64 == 63) |
175 | | #ifdef REAL_IS_FIXED |
176 | | scaleval_long = - scaleval_long; |
177 | | #else |
178 | 0 | scaleval = - scaleval; |
179 | 0 | #endif |
180 | 0 | } |
181 | |
|
182 | 0 | for( /* i=256 */ ;i<512;i++,j--,idx+=32) |
183 | 0 | { |
184 | 0 | if(idx < 512+16) |
185 | | #ifdef REAL_IS_FIXED |
186 | | fr->decwin[idx+16] = fr->decwin[idx] = |
187 | | REAL_SCALE_WINDOW(sat_mul32(intwinbase[j],scaleval_long)); |
188 | | #else |
189 | 0 | fr->decwin[idx+16] = fr->decwin[idx] = DOUBLE_TO_REAL((double) intwinbase[j] * scaleval); |
190 | 0 | #endif |
191 | |
|
192 | 0 | if(i % 32 == 31) |
193 | 0 | idx -= 1023; |
194 | 0 | if(i % 64 == 63) |
195 | | #ifdef REAL_IS_FIXED |
196 | | scaleval_long = - scaleval_long; |
197 | | #else |
198 | 0 | scaleval = - scaleval; |
199 | 0 | #endif |
200 | 0 | } |
201 | 0 | #if defined(OPT_X86_64) || defined(OPT_ALTIVEC) || defined(OPT_SSE) || defined(OPT_SSE_VINTAGE) || defined(OPT_ARM) || defined(OPT_NEON) || defined(OPT_NEON64) || defined(OPT_AVX) |
202 | 0 | if( fr->cpu_opts.type == x86_64 |
203 | 0 | || fr->cpu_opts.type == altivec |
204 | 0 | || fr->cpu_opts.type == sse |
205 | 0 | || fr->cpu_opts.type == sse_vintage |
206 | 0 | || fr->cpu_opts.type == arm |
207 | 0 | || fr->cpu_opts.type == neon |
208 | 0 | || fr->cpu_opts.type == neon64 |
209 | 0 | || fr->cpu_opts.type == avx ) |
210 | 0 | { /* for float SSE / AltiVec / ARM decoder */ |
211 | 0 | for(i=512; i<512+32; i++) |
212 | 0 | { |
213 | 0 | fr->decwin[i] = (i&1) ? fr->decwin[i] : 0; |
214 | 0 | } |
215 | 0 | for(i=0; i<512; i++) |
216 | 0 | { |
217 | 0 | fr->decwin[512+32+i] = -fr->decwin[511-i]; |
218 | 0 | } |
219 | | #if defined(OPT_NEON) || defined(OPT_NEON64) |
220 | | if(fr->cpu_opts.type == neon || fr->cpu_opts.type == neon64) |
221 | | { |
222 | | for(i=0; i<512; i+=2) |
223 | | { |
224 | | fr->decwin[i] = -fr->decwin[i]; |
225 | | } |
226 | | } |
227 | | #endif |
228 | 0 | } |
229 | 0 | #endif |
230 | 0 | debug("decode tables done"); |
231 | 0 | } |
232 | | |
233 | | #ifndef NO_8BIT |
234 | | int INT123_make_conv16to8_table(mpg123_handle *fr) |
235 | 0 | { |
236 | 0 | int i; |
237 | 0 | int mode = fr->af.dec_enc; |
238 | | |
239 | | /* |
240 | | * ????: 8.0 is right but on SB cards '2.0' is a better value ??? |
241 | | */ |
242 | 0 | const double mul = 8.0; |
243 | |
|
244 | 0 | if(!fr->conv16to8_buf){ |
245 | 0 | fr->conv16to8_buf = (unsigned char *) malloc(8192); |
246 | 0 | if(!fr->conv16to8_buf) { |
247 | 0 | fr->err = MPG123_ERR_16TO8TABLE; |
248 | 0 | if(NOQUIET) error("Can't allocate 16 to 8 converter table!"); |
249 | 0 | return -1; |
250 | 0 | } |
251 | 0 | fr->conv16to8 = fr->conv16to8_buf + 4096; |
252 | 0 | } |
253 | | |
254 | 0 | switch(mode) |
255 | 0 | { |
256 | 0 | case MPG123_ENC_ULAW_8: |
257 | 0 | { |
258 | 0 | double m=127.0 / log(256.0); |
259 | 0 | int c1; |
260 | |
|
261 | 0 | for(i=-4096;i<4096;i++) |
262 | 0 | { |
263 | | /* dunno whether this is a valid transformation rule ?!?!? */ |
264 | 0 | if(i < 0) |
265 | 0 | c1 = 127 - (int) (log( 1.0 - 255.0 * (double) i*mul / 32768.0 ) * m); |
266 | 0 | else |
267 | 0 | c1 = 255 - (int) (log( 1.0 + 255.0 * (double) i*mul / 32768.0 ) * m); |
268 | 0 | if(c1 < 0 || c1 > 255) |
269 | 0 | { |
270 | 0 | if(NOQUIET) error2("Converror %d %d",i,c1); |
271 | 0 | return -1; |
272 | 0 | } |
273 | 0 | if(c1 == 0) |
274 | 0 | c1 = 2; |
275 | 0 | fr->conv16to8[i] = (unsigned char) c1; |
276 | 0 | } |
277 | 0 | } |
278 | 0 | break; |
279 | 0 | case MPG123_ENC_SIGNED_8: |
280 | 0 | for(i=-4096;i<4096;i++) |
281 | 0 | fr->conv16to8[i] = i>>5; |
282 | 0 | break; |
283 | 0 | case MPG123_ENC_UNSIGNED_8: |
284 | 0 | for(i=-4096;i<4096;i++) |
285 | 0 | fr->conv16to8[i] = (i>>5)+128; |
286 | 0 | break; |
287 | 0 | case MPG123_ENC_ALAW_8: |
288 | 0 | { |
289 | | /* |
290 | | Let's believe Wikipedia (http://en.wikipedia.org/wiki/G.711) that this |
291 | | is the correct table: |
292 | | |
293 | | s0000000wxyza... n000wxyz [0-31] -> [0-15] |
294 | | s0000001wxyza... n001wxyz [32-63] -> [16-31] |
295 | | s000001wxyzab... n010wxyz [64-127] -> [32-47] |
296 | | s00001wxyzabc... n011wxyz [128-255] -> [48-63] |
297 | | s0001wxyzabcd... n100wxyz [256-511] -> [64-79] |
298 | | s001wxyzabcde... n101wxyz [512-1023] -> [80-95] |
299 | | s01wxyzabcdef... n110wxyz [1024-2047] -> [96-111] |
300 | | s1wxyzabcdefg... n111wxyz [2048-4095] -> [112-127] |
301 | | |
302 | | Let's extend to -4096, too. |
303 | | Also, bytes are xored with 0x55 for transmission. |
304 | | |
305 | | Since it sounds OK, I assume it is fine;-) |
306 | | */ |
307 | 0 | for(i=0; i<64; ++i) |
308 | 0 | fr->conv16to8[i] = ((unsigned int)i)>>1; |
309 | 0 | for(i=64; i<128; ++i) |
310 | 0 | fr->conv16to8[i] = ((((unsigned int)i)>>2) & 0xf) | (2<<4); |
311 | 0 | for(i=128; i<256; ++i) |
312 | 0 | fr->conv16to8[i] = ((((unsigned int)i)>>3) & 0xf) | (3<<4); |
313 | 0 | for(i=256; i<512; ++i) |
314 | 0 | fr->conv16to8[i] = ((((unsigned int)i)>>4) & 0xf) | (4<<4); |
315 | 0 | for(i=512; i<1024; ++i) |
316 | 0 | fr->conv16to8[i] = ((((unsigned int)i)>>5) & 0xf) | (5<<4); |
317 | 0 | for(i=1024; i<2048; ++i) |
318 | 0 | fr->conv16to8[i] = ((((unsigned int)i)>>6) & 0xf) | (6<<4); |
319 | 0 | for(i=2048; i<4096; ++i) |
320 | 0 | fr->conv16to8[i] = ((((unsigned int)i)>>7) & 0xf) | (7<<4); |
321 | |
|
322 | 0 | for(i=-4095; i<0; ++i) |
323 | 0 | fr->conv16to8[i] = fr->conv16to8[-i] | 0x80; |
324 | |
|
325 | 0 | fr->conv16to8[-4096] = fr->conv16to8[-4095]; |
326 | |
|
327 | 0 | for(i=-4096;i<4096;i++) |
328 | 0 | { |
329 | | /* fr->conv16to8[i] = - i>>5; */ |
330 | | /* fprintf(stderr, "table %i %i\n", i<<AUSHIFT, fr->conv16to8[i]); */ |
331 | 0 | fr->conv16to8[i] ^= 0x55; |
332 | 0 | } |
333 | 0 | } |
334 | 0 | break; |
335 | 0 | default: |
336 | 0 | fr->err = MPG123_ERR_16TO8TABLE; |
337 | 0 | if(NOQUIET) error("Unknown 8 bit encoding choice."); |
338 | 0 | return -1; |
339 | 0 | break; |
340 | 0 | } |
341 | | |
342 | 0 | return 0; |
343 | 0 | } |
344 | | #endif |
345 | | |