/src/mpg123/src/libmpg123/synth.c
Line | Count | Source |
1 | | /* |
2 | | synth.c: The functions for synthesizing samples, at the end of decoding. |
3 | | |
4 | | copyright 1995-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, heavily dissected and rearranged by Thomas Orgis |
7 | | */ |
8 | | |
9 | | #include "mpg123lib_intern.h" |
10 | | #ifdef OPT_GENERIC_DITHER |
11 | | #define FORCE_ACCURATE |
12 | | #endif |
13 | | #include "../common/sample.h" |
14 | | #include "../common/debug.h" |
15 | | |
16 | | /* |
17 | | Part 1: All synth functions that produce signed short. |
18 | | That is: |
19 | | - INT123_synth_1to1 with cpu-specific variants (INT123_synth_1to1_i386, INT123_synth_1to1_i586 ...) |
20 | | - INT123_synth_1to1_mono and INT123_synth_1to1_m2s; which use fr->synths.plain[r_1to1][f_16]. |
21 | | Nearly every decoder variant has it's own INT123_synth_1to1, while the mono conversion is shared. |
22 | | */ |
23 | | |
24 | 22.4k | #define SAMPLE_T short |
25 | 0 | #define WRITE_SAMPLE(samples,sum,clip) WRITE_SHORT_SAMPLE(samples,sum,clip) |
26 | | |
27 | | /* Part 1a: All straight 1to1 decoding functions */ |
28 | 382k | #define BLOCK 0x40 /* One decoding block is 64 samples. */ |
29 | | |
30 | | #define SYNTH_NAME INT123_synth_1to1 |
31 | | #include "synth.h" |
32 | | #undef SYNTH_NAME |
33 | | |
34 | | /* Mono-related synths; they wrap over _some_ INT123_synth_1to1. */ |
35 | 11.2k | #define SYNTH_NAME fr->synths.plain[r_1to1][f_16] |
36 | | #define MONO_NAME INT123_synth_1to1_mono |
37 | | #define MONO2STEREO_NAME INT123_synth_1to1_m2s |
38 | | #include "synth_mono.h" |
39 | | #undef SYNTH_NAME |
40 | | #undef MONO_NAME |
41 | | #undef MONO2STEREO_NAME |
42 | | |
43 | | /* Now we have possibly some special INT123_synth_1to1 ... |
44 | | ... they produce signed short; the mono functions defined above work on the special synths, too. */ |
45 | | |
46 | | #ifdef OPT_GENERIC_DITHER |
47 | | #define SYNTH_NAME INT123_synth_1to1_dither |
48 | | /* We need the accurate sample writing... */ |
49 | | #undef WRITE_SAMPLE |
50 | 0 | #define WRITE_SAMPLE(samples,sum,clip) WRITE_SHORT_SAMPLE_ACCURATE(samples,sum,clip) |
51 | | |
52 | | #define USE_DITHER |
53 | | #include "synth.h" |
54 | | #undef USE_DITHER |
55 | | #undef SYNTH_NAME |
56 | | |
57 | | #undef WRITE_SAMPLE |
58 | 0 | #define WRITE_SAMPLE(samples,sum,clip) WRITE_SHORT_SAMPLE(samples,sum,clip) |
59 | | |
60 | | #endif |
61 | | |
62 | | #ifdef OPT_X86 |
63 | | /* The i386-specific C code, here as short variant, later 8bit and float. */ |
64 | | #define NO_AUTOINCREMENT |
65 | | #define SYNTH_NAME INT123_synth_1to1_i386 |
66 | | #include "synth.h" |
67 | | #undef SYNTH_NAME |
68 | | /* i386 uses the normal mono functions. */ |
69 | | #undef NO_AUTOINCREMENT |
70 | | #endif |
71 | | |
72 | | #undef BLOCK /* Following functions are so special that they don't need this. */ |
73 | | |
74 | | #ifdef OPT_I586 |
75 | | /* This is defined in assembler. */ |
76 | | int INT123_synth_1to1_i586_asm(real *bandPtr, int channel, unsigned char *out, unsigned char *buffs, int *bo, real *decwin); |
77 | | /* This is just a hull to use the mpg123 handle. */ |
78 | | int INT123_synth_1to1_i586(real *bandPtr, int channel, mpg123_handle *fr, int final) |
79 | | { |
80 | | int ret; |
81 | | #ifndef NO_EQUALIZER |
82 | | if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer); |
83 | | #endif |
84 | | ret = INT123_synth_1to1_i586_asm(bandPtr, channel, fr->buffer.data+fr->buffer.fill, fr->rawbuffs, &fr->bo, fr->decwin); |
85 | | if(final) fr->buffer.fill += 128; |
86 | | return ret; |
87 | | } |
88 | | #endif |
89 | | |
90 | | #ifdef OPT_I586_DITHER |
91 | | /* This is defined in assembler. */ |
92 | | int INT123_synth_1to1_i586_asm_dither(real *bandPtr, int channel, unsigned char *out, unsigned char *buffs, int *bo, real *decwin, float *dithernoise); |
93 | | /* This is just a hull to use the mpg123 handle. */ |
94 | | int INT123_synth_1to1_i586_dither(real *bandPtr, int channel, mpg123_handle *fr, int final) |
95 | | { |
96 | | int ret; |
97 | | int bo_dither[2]; /* Temporary workaround? Could expand the asm code. */ |
98 | | #ifndef NO_EQUALIZER |
99 | | if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer); |
100 | | #endif |
101 | | /* Applying this hack, to change the asm only bit by bit (adding dithernoise pointer). */ |
102 | | bo_dither[0] = fr->bo; |
103 | | bo_dither[1] = fr->ditherindex; |
104 | | ret = INT123_synth_1to1_i586_asm_dither(bandPtr, channel, fr->buffer.data+fr->buffer.fill, fr->rawbuffs, bo_dither, fr->decwin, fr->dithernoise); |
105 | | fr->bo = bo_dither[0]; |
106 | | fr->ditherindex = bo_dither[1]; |
107 | | |
108 | | if(final) fr->buffer.fill += 128; |
109 | | return ret; |
110 | | } |
111 | | #endif |
112 | | |
113 | | #if defined(OPT_3DNOW) || defined(OPT_3DNOW_VINTAGE) |
114 | | /* Those are defined in assembler. */ |
115 | | void INT123_do_equalizer_3dnow(real *bandPtr,int channel, real equalizer[2][32]); |
116 | | int INT123_synth_1to1_3dnow_asm(real *bandPtr, int channel, unsigned char *out, unsigned char *buffs, int *bo, real *decwin); |
117 | | /* This is just a hull to use the mpg123 handle. */ |
118 | | int INT123_synth_1to1_3dnow(real *bandPtr, int channel, mpg123_handle *fr, int final) |
119 | | { |
120 | | int ret; |
121 | | #ifndef NO_EQUALIZER |
122 | | if(fr->have_eq_settings) INT123_do_equalizer_3dnow(bandPtr,channel,fr->equalizer); |
123 | | #endif |
124 | | /* this is in asm, can be dither or not */ |
125 | | /* uh, is this return from pointer correct? */ |
126 | | ret = (int) INT123_synth_1to1_3dnow_asm(bandPtr, channel, fr->buffer.data+fr->buffer.fill, fr->rawbuffs, &fr->bo, fr->decwin); |
127 | | if(final) fr->buffer.fill += 128; |
128 | | return ret; |
129 | | } |
130 | | #endif |
131 | | |
132 | | #ifdef OPT_MMX |
133 | | /* This is defined in assembler. */ |
134 | | int INT123_synth_1to1_MMX(real *bandPtr, int channel, short *out, short *buffs, int *bo, float *decwins); |
135 | | /* This is just a hull to use the mpg123 handle. */ |
136 | | int INT123_synth_1to1_mmx(real *bandPtr, int channel, mpg123_handle *fr, int final) |
137 | | { |
138 | | #ifndef NO_EQUALIZER |
139 | | if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer); |
140 | | #endif |
141 | | /* in asm */ |
142 | | INT123_synth_1to1_MMX(bandPtr, channel, (short*) (fr->buffer.data+fr->buffer.fill), (short *) fr->rawbuffs, &fr->bo, fr->decwins); |
143 | | if(final) fr->buffer.fill += 128; |
144 | | return 0; |
145 | | } |
146 | | #endif |
147 | | |
148 | | #if defined(OPT_SSE) || defined(OPT_SSE_VINTAGE) |
149 | | #ifdef ACCURATE_ROUNDING |
150 | | /* This is defined in assembler. */ |
151 | | int INT123_synth_1to1_sse_accurate_asm(real *window, real *b0, short *samples, int bo1); |
152 | | int INT123_synth_1to1_s_sse_accurate_asm(real *window, real *b0l, real *b0r, short *samples, int bo1); |
153 | | void INT123_dct64_real_sse(real *out0, real *out1, real *samples); |
154 | | /* This is just a hull to use the mpg123 handle. */ |
155 | | int INT123_synth_1to1_sse(real *bandPtr,int channel, mpg123_handle *fr, int final) |
156 | | { |
157 | | short *samples = (short *) (fr->buffer.data+fr->buffer.fill); |
158 | | real *b0, **buf; |
159 | | int clip; |
160 | | int bo1; |
161 | | #ifndef NO_EQUALIZER |
162 | | if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer); |
163 | | #endif |
164 | | if(!channel) |
165 | | { |
166 | | fr->bo--; |
167 | | fr->bo &= 0xf; |
168 | | buf = fr->real_buffs[0]; |
169 | | } |
170 | | else |
171 | | { |
172 | | samples++; |
173 | | buf = fr->real_buffs[1]; |
174 | | } |
175 | | |
176 | | if(fr->bo & 0x1) |
177 | | { |
178 | | b0 = buf[0]; |
179 | | bo1 = fr->bo; |
180 | | INT123_dct64_real_sse(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr); |
181 | | } |
182 | | else |
183 | | { |
184 | | b0 = buf[1]; |
185 | | bo1 = fr->bo+1; |
186 | | INT123_dct64_real_sse(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr); |
187 | | } |
188 | | |
189 | | clip = INT123_synth_1to1_sse_accurate_asm(fr->decwin, b0, samples, bo1); |
190 | | |
191 | | if(final) fr->buffer.fill += 128; |
192 | | |
193 | | return clip; |
194 | | } |
195 | | |
196 | | int INT123_synth_1to1_stereo_sse(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr) |
197 | | { |
198 | | short *samples = (short *) (fr->buffer.data+fr->buffer.fill); |
199 | | |
200 | | real *b0l, *b0r, **bufl, **bufr; |
201 | | int bo1; |
202 | | int clip; |
203 | | #ifndef NO_EQUALIZER |
204 | | if(fr->have_eq_settings) |
205 | | { |
206 | | INT123_do_equalizer(bandPtr_l,0,fr->equalizer); |
207 | | INT123_do_equalizer(bandPtr_r,1,fr->equalizer); |
208 | | } |
209 | | #endif |
210 | | fr->bo--; |
211 | | fr->bo &= 0xf; |
212 | | bufl = fr->real_buffs[0]; |
213 | | bufr = fr->real_buffs[1]; |
214 | | |
215 | | if(fr->bo & 0x1) |
216 | | { |
217 | | b0l = bufl[0]; |
218 | | b0r = bufr[0]; |
219 | | bo1 = fr->bo; |
220 | | INT123_dct64_real_sse(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l); |
221 | | INT123_dct64_real_sse(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r); |
222 | | } |
223 | | else |
224 | | { |
225 | | b0l = bufl[1]; |
226 | | b0r = bufr[1]; |
227 | | bo1 = fr->bo+1; |
228 | | INT123_dct64_real_sse(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l); |
229 | | INT123_dct64_real_sse(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r); |
230 | | } |
231 | | |
232 | | clip = INT123_synth_1to1_s_sse_accurate_asm(fr->decwin, b0l, b0r, samples, bo1); |
233 | | |
234 | | fr->buffer.fill += 128; |
235 | | |
236 | | return clip; |
237 | | } |
238 | | #else |
239 | | /* This is defined in assembler. */ |
240 | | void INT123_synth_1to1_sse_asm(real *bandPtr, int channel, short *samples, short *buffs, int *bo, real *decwin); |
241 | | /* This is just a hull to use the mpg123 handle. */ |
242 | | int INT123_synth_1to1_sse(real *bandPtr, int channel, mpg123_handle *fr, int final) |
243 | | { |
244 | | #ifndef NO_EQUALIZER |
245 | | if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer); |
246 | | #endif |
247 | | INT123_synth_1to1_sse_asm(bandPtr, channel, (short*) (fr->buffer.data+fr->buffer.fill), (short *) fr->rawbuffs, &fr->bo, fr->decwins); |
248 | | if(final) fr->buffer.fill += 128; |
249 | | return 0; |
250 | | } |
251 | | #endif |
252 | | #endif |
253 | | |
254 | | #if defined(OPT_3DNOWEXT) || defined(OPT_3DNOWEXT_VINTAGE) |
255 | | /* This is defined in assembler. */ |
256 | | void INT123_synth_1to1_3dnowext_asm(real *bandPtr, int channel, short *samples, short *buffs, int *bo, real *decwin); |
257 | | /* This is just a hull to use the mpg123 handle. */ |
258 | | int INT123_synth_1to1_3dnowext(real *bandPtr, int channel, mpg123_handle *fr, int final) |
259 | | { |
260 | | #ifndef NO_EQUALIZER |
261 | | if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer); |
262 | | #endif |
263 | | INT123_synth_1to1_3dnowext_asm(bandPtr, channel, (short*) (fr->buffer.data+fr->buffer.fill), (short *) fr->rawbuffs, &fr->bo, fr->decwins); |
264 | | if(final) fr->buffer.fill += 128; |
265 | | return 0; |
266 | | } |
267 | | #endif |
268 | | |
269 | | #ifdef OPT_X86_64 |
270 | | #ifdef ACCURATE_ROUNDING |
271 | | /* Assembler routines. */ |
272 | | int INT123_synth_1to1_x86_64_accurate_asm(real *window, real *b0, short *samples, int bo1); |
273 | | int INT123_synth_1to1_s_x86_64_accurate_asm(real *window, real *b0l, real *b0r, short *samples, int bo1); |
274 | | void INT123_dct64_real_x86_64(real *out0, real *out1, real *samples); |
275 | | /* Hull for C mpg123 API */ |
276 | | int INT123_synth_1to1_x86_64(real *bandPtr,int channel, mpg123_handle *fr, int final) |
277 | 0 | { |
278 | 0 | short *samples = (short *) (fr->buffer.data+fr->buffer.fill); |
279 | |
|
280 | 0 | real *b0, **buf; |
281 | 0 | int bo1; |
282 | 0 | int clip; |
283 | 0 | #ifndef NO_EQUALIZER |
284 | 0 | if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer); |
285 | 0 | #endif |
286 | 0 | if(!channel) |
287 | 0 | { |
288 | 0 | fr->bo--; |
289 | 0 | fr->bo &= 0xf; |
290 | 0 | buf = fr->real_buffs[0]; |
291 | 0 | } |
292 | 0 | else |
293 | 0 | { |
294 | 0 | samples++; |
295 | 0 | buf = fr->real_buffs[1]; |
296 | 0 | } |
297 | |
|
298 | 0 | if(fr->bo & 0x1) |
299 | 0 | { |
300 | 0 | b0 = buf[0]; |
301 | 0 | bo1 = fr->bo; |
302 | 0 | INT123_dct64_real_x86_64(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr); |
303 | 0 | } |
304 | 0 | else |
305 | 0 | { |
306 | 0 | b0 = buf[1]; |
307 | 0 | bo1 = fr->bo+1; |
308 | 0 | INT123_dct64_real_x86_64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr); |
309 | 0 | } |
310 | |
|
311 | 0 | clip = INT123_synth_1to1_x86_64_accurate_asm(fr->decwin, b0, samples, bo1); |
312 | |
|
313 | 0 | if(final) fr->buffer.fill += 128; |
314 | |
|
315 | 0 | return clip; |
316 | 0 | } |
317 | | |
318 | | int INT123_synth_1to1_stereo_x86_64(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr) |
319 | 0 | { |
320 | 0 | short *samples = (short *) (fr->buffer.data+fr->buffer.fill); |
321 | |
|
322 | 0 | real *b0l, *b0r, **bufl, **bufr; |
323 | 0 | int bo1; |
324 | 0 | int clip; |
325 | 0 | #ifndef NO_EQUALIZER |
326 | 0 | if(fr->have_eq_settings) |
327 | 0 | { |
328 | 0 | INT123_do_equalizer(bandPtr_l,0,fr->equalizer); |
329 | 0 | INT123_do_equalizer(bandPtr_r,1,fr->equalizer); |
330 | 0 | } |
331 | 0 | #endif |
332 | 0 | fr->bo--; |
333 | 0 | fr->bo &= 0xf; |
334 | 0 | bufl = fr->real_buffs[0]; |
335 | 0 | bufr = fr->real_buffs[1]; |
336 | |
|
337 | 0 | if(fr->bo & 0x1) |
338 | 0 | { |
339 | 0 | b0l = bufl[0]; |
340 | 0 | b0r = bufr[0]; |
341 | 0 | bo1 = fr->bo; |
342 | 0 | INT123_dct64_real_x86_64(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l); |
343 | 0 | INT123_dct64_real_x86_64(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r); |
344 | 0 | } |
345 | 0 | else |
346 | 0 | { |
347 | 0 | b0l = bufl[1]; |
348 | 0 | b0r = bufr[1]; |
349 | 0 | bo1 = fr->bo+1; |
350 | 0 | INT123_dct64_real_x86_64(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l); |
351 | 0 | INT123_dct64_real_x86_64(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r); |
352 | 0 | } |
353 | |
|
354 | 0 | clip = INT123_synth_1to1_s_x86_64_accurate_asm(fr->decwin, b0l, b0r, samples, bo1); |
355 | |
|
356 | 0 | fr->buffer.fill += 128; |
357 | |
|
358 | 0 | return clip; |
359 | 0 | } |
360 | | #else |
361 | | /* This is defined in assembler. */ |
362 | | int INT123_synth_1to1_x86_64_asm(short *window, short *b0, short *samples, int bo1); |
363 | | int INT123_synth_1to1_s_x86_64_asm(short *window, short *b0l, short *b0r, short *samples, int bo1); |
364 | | void INT123_dct64_x86_64(short *out0, short *out1, real *samples); |
365 | | /* This is just a hull to use the mpg123 handle. */ |
366 | | int INT123_synth_1to1_x86_64(real *bandPtr,int channel, mpg123_handle *fr, int final) |
367 | | { |
368 | | short *samples = (short *) (fr->buffer.data+fr->buffer.fill); |
369 | | short *b0, **buf; |
370 | | int clip; |
371 | | int bo1; |
372 | | #ifndef NO_EQUALIZER |
373 | | if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer); |
374 | | #endif |
375 | | if(!channel) |
376 | | { |
377 | | fr->bo--; |
378 | | fr->bo &= 0xf; |
379 | | buf = fr->short_buffs[0]; |
380 | | } |
381 | | else |
382 | | { |
383 | | samples++; |
384 | | buf = fr->short_buffs[1]; |
385 | | } |
386 | | |
387 | | if(fr->bo & 0x1) |
388 | | { |
389 | | b0 = buf[0]; |
390 | | bo1 = fr->bo; |
391 | | INT123_dct64_x86_64(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr); |
392 | | } |
393 | | else |
394 | | { |
395 | | b0 = buf[1]; |
396 | | bo1 = fr->bo+1; |
397 | | INT123_dct64_x86_64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr); |
398 | | } |
399 | | |
400 | | clip = INT123_synth_1to1_x86_64_asm((short *)fr->decwins, b0, samples, bo1); |
401 | | |
402 | | if(final) fr->buffer.fill += 128; |
403 | | |
404 | | return clip; |
405 | | } |
406 | | |
407 | | int INT123_synth_1to1_stereo_x86_64(real *bandPtr_l,real *bandPtr_r, mpg123_handle *fr) |
408 | | { |
409 | | short *samples = (short *) (fr->buffer.data+fr->buffer.fill); |
410 | | short *b0l, *b0r, **bufl, **bufr; |
411 | | int clip; |
412 | | int bo1; |
413 | | #ifndef NO_EQUALIZER |
414 | | if(fr->have_eq_settings) |
415 | | { |
416 | | INT123_do_equalizer(bandPtr_l,0,fr->equalizer); |
417 | | INT123_do_equalizer(bandPtr_r,1,fr->equalizer); |
418 | | } |
419 | | #endif |
420 | | fr->bo--; |
421 | | fr->bo &= 0xf; |
422 | | bufl = fr->short_buffs[0]; |
423 | | bufr = fr->short_buffs[1]; |
424 | | |
425 | | if(fr->bo & 0x1) |
426 | | { |
427 | | b0l = bufl[0]; |
428 | | b0r = bufr[0]; |
429 | | bo1 = fr->bo; |
430 | | INT123_dct64_x86_64(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l); |
431 | | INT123_dct64_x86_64(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r); |
432 | | } |
433 | | else |
434 | | { |
435 | | b0l = bufl[1]; |
436 | | b0r = bufr[1]; |
437 | | bo1 = fr->bo+1; |
438 | | INT123_dct64_x86_64(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l); |
439 | | INT123_dct64_x86_64(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r); |
440 | | } |
441 | | |
442 | | clip = INT123_synth_1to1_s_x86_64_asm((short *)fr->decwins, b0l, b0r, samples, bo1); |
443 | | |
444 | | fr->buffer.fill += 128; |
445 | | |
446 | | return clip; |
447 | | } |
448 | | #endif |
449 | | #endif |
450 | | |
451 | | #ifdef OPT_AVX |
452 | | #ifdef ACCURATE_ROUNDING |
453 | | /* Assembler routines. */ |
454 | | #ifndef OPT_X86_64 |
455 | | int INT123_synth_1to1_x86_64_accurate_asm(real *window, real *b0, short *samples, int bo1); |
456 | | #endif |
457 | | int INT123_synth_1to1_s_avx_accurate_asm(real *window, real *b0l, real *b0r, short *samples, int bo1); |
458 | | void INT123_dct64_real_avx(real *out0, real *out1, real *samples); |
459 | | /* Hull for C mpg123 API */ |
460 | | int INT123_synth_1to1_avx(real *bandPtr,int channel, mpg123_handle *fr, int final) |
461 | 11.2k | { |
462 | 11.2k | short *samples = (short *) (fr->buffer.data+fr->buffer.fill); |
463 | | |
464 | 11.2k | real *b0, **buf; |
465 | 11.2k | int bo1; |
466 | 11.2k | int clip; |
467 | 11.2k | #ifndef NO_EQUALIZER |
468 | 11.2k | if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer); |
469 | 11.2k | #endif |
470 | 11.2k | if(!channel) |
471 | 11.2k | { |
472 | 11.2k | fr->bo--; |
473 | 11.2k | fr->bo &= 0xf; |
474 | 11.2k | buf = fr->real_buffs[0]; |
475 | 11.2k | } |
476 | 0 | else |
477 | 0 | { |
478 | 0 | samples++; |
479 | 0 | buf = fr->real_buffs[1]; |
480 | 0 | } |
481 | | |
482 | 11.2k | if(fr->bo & 0x1) |
483 | 5.60k | { |
484 | 5.60k | b0 = buf[0]; |
485 | 5.60k | bo1 = fr->bo; |
486 | 5.60k | INT123_dct64_real_avx(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr); |
487 | 5.60k | } |
488 | 5.63k | else |
489 | 5.63k | { |
490 | 5.63k | b0 = buf[1]; |
491 | 5.63k | bo1 = fr->bo+1; |
492 | 5.63k | INT123_dct64_real_avx(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr); |
493 | 5.63k | } |
494 | | |
495 | 11.2k | clip = INT123_synth_1to1_x86_64_accurate_asm(fr->decwin, b0, samples, bo1); |
496 | | |
497 | 11.2k | if(final) fr->buffer.fill += 128; |
498 | | |
499 | 11.2k | return clip; |
500 | 11.2k | } |
501 | | |
502 | | int INT123_synth_1to1_stereo_avx(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr) |
503 | 14.4k | { |
504 | 14.4k | short *samples = (short *) (fr->buffer.data+fr->buffer.fill); |
505 | | |
506 | 14.4k | real *b0l, *b0r, **bufl, **bufr; |
507 | 14.4k | int bo1; |
508 | 14.4k | int clip; |
509 | 14.4k | #ifndef NO_EQUALIZER |
510 | 14.4k | if(fr->have_eq_settings) |
511 | 0 | { |
512 | 0 | INT123_do_equalizer(bandPtr_l,0,fr->equalizer); |
513 | 0 | INT123_do_equalizer(bandPtr_r,1,fr->equalizer); |
514 | 0 | } |
515 | 14.4k | #endif |
516 | 14.4k | fr->bo--; |
517 | 14.4k | fr->bo &= 0xf; |
518 | 14.4k | bufl = fr->real_buffs[0]; |
519 | 14.4k | bufr = fr->real_buffs[1]; |
520 | | |
521 | 14.4k | if(fr->bo & 0x1) |
522 | 7.17k | { |
523 | 7.17k | b0l = bufl[0]; |
524 | 7.17k | b0r = bufr[0]; |
525 | 7.17k | bo1 = fr->bo; |
526 | 7.17k | INT123_dct64_real_avx(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l); |
527 | 7.17k | INT123_dct64_real_avx(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r); |
528 | 7.17k | } |
529 | 7.24k | else |
530 | 7.24k | { |
531 | 7.24k | b0l = bufl[1]; |
532 | 7.24k | b0r = bufr[1]; |
533 | 7.24k | bo1 = fr->bo+1; |
534 | 7.24k | INT123_dct64_real_avx(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l); |
535 | 7.24k | INT123_dct64_real_avx(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r); |
536 | 7.24k | } |
537 | | |
538 | 14.4k | clip = INT123_synth_1to1_s_avx_accurate_asm(fr->decwin, b0l, b0r, samples, bo1); |
539 | | |
540 | 14.4k | fr->buffer.fill += 128; |
541 | | |
542 | 14.4k | return clip; |
543 | 14.4k | } |
544 | | #else |
545 | | /* This is defined in assembler. */ |
546 | | #ifndef OPT_X86_64 |
547 | | int INT123_synth_1to1_x86_64_asm(short *window, short *b0, short *samples, int bo1); |
548 | | #endif |
549 | | int INT123_synth_1to1_s_avx_asm(short *window, short *b0l, short *b0r, short *samples, int bo1); |
550 | | void INT123_dct64_avx(short *out0, short *out1, real *samples); |
551 | | /* This is just a hull to use the mpg123 handle. */ |
552 | | int INT123_synth_1to1_avx(real *bandPtr,int channel, mpg123_handle *fr, int final) |
553 | | { |
554 | | short *samples = (short *) (fr->buffer.data+fr->buffer.fill); |
555 | | short *b0, **buf; |
556 | | int clip; |
557 | | int bo1; |
558 | | #ifndef NO_EQUALIZER |
559 | | if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer); |
560 | | #endif |
561 | | if(!channel) |
562 | | { |
563 | | fr->bo--; |
564 | | fr->bo &= 0xf; |
565 | | buf = fr->short_buffs[0]; |
566 | | } |
567 | | else |
568 | | { |
569 | | samples++; |
570 | | buf = fr->short_buffs[1]; |
571 | | } |
572 | | |
573 | | if(fr->bo & 0x1) |
574 | | { |
575 | | b0 = buf[0]; |
576 | | bo1 = fr->bo; |
577 | | INT123_dct64_avx(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr); |
578 | | } |
579 | | else |
580 | | { |
581 | | b0 = buf[1]; |
582 | | bo1 = fr->bo+1; |
583 | | INT123_dct64_avx(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr); |
584 | | } |
585 | | |
586 | | clip = INT123_synth_1to1_x86_64_asm((short *)fr->decwins, b0, samples, bo1); |
587 | | |
588 | | if(final) fr->buffer.fill += 128; |
589 | | |
590 | | return clip; |
591 | | } |
592 | | |
593 | | int INT123_synth_1to1_stereo_avx(real *bandPtr_l,real *bandPtr_r, mpg123_handle *fr) |
594 | | { |
595 | | short *samples = (short *) (fr->buffer.data+fr->buffer.fill); |
596 | | short *b0l, *b0r, **bufl, **bufr; |
597 | | int clip; |
598 | | int bo1; |
599 | | #ifndef NO_EQUALIZER |
600 | | if(fr->have_eq_settings) |
601 | | { |
602 | | INT123_do_equalizer(bandPtr_l,0,fr->equalizer); |
603 | | INT123_do_equalizer(bandPtr_r,1,fr->equalizer); |
604 | | } |
605 | | #endif |
606 | | fr->bo--; |
607 | | fr->bo &= 0xf; |
608 | | bufl = fr->short_buffs[0]; |
609 | | bufr = fr->short_buffs[1]; |
610 | | |
611 | | if(fr->bo & 0x1) |
612 | | { |
613 | | b0l = bufl[0]; |
614 | | b0r = bufr[0]; |
615 | | bo1 = fr->bo; |
616 | | INT123_dct64_avx(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l); |
617 | | INT123_dct64_avx(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r); |
618 | | } |
619 | | else |
620 | | { |
621 | | b0l = bufl[1]; |
622 | | b0r = bufr[1]; |
623 | | bo1 = fr->bo+1; |
624 | | INT123_dct64_avx(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l); |
625 | | INT123_dct64_avx(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r); |
626 | | } |
627 | | |
628 | | clip = INT123_synth_1to1_s_avx_asm((short *)fr->decwins, b0l, b0r, samples, bo1); |
629 | | |
630 | | fr->buffer.fill += 128; |
631 | | |
632 | | return clip; |
633 | | } |
634 | | #endif |
635 | | #endif |
636 | | |
637 | | #ifdef OPT_ARM |
638 | | #ifdef ACCURATE_ROUNDING |
639 | | /* Assembler routines. */ |
640 | | int INT123_synth_1to1_arm_accurate_asm(real *window, real *b0, short *samples, int bo1); |
641 | | /* Hull for C mpg123 API */ |
642 | | int INT123_synth_1to1_arm(real *bandPtr,int channel, mpg123_handle *fr, int final) |
643 | | { |
644 | | short *samples = (short *) (fr->buffer.data+fr->buffer.fill); |
645 | | |
646 | | real *b0, **buf; |
647 | | int bo1; |
648 | | int clip; |
649 | | #ifndef NO_EQUALIZER |
650 | | if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer); |
651 | | #endif |
652 | | if(!channel) |
653 | | { |
654 | | fr->bo--; |
655 | | fr->bo &= 0xf; |
656 | | buf = fr->real_buffs[0]; |
657 | | } |
658 | | else |
659 | | { |
660 | | samples++; |
661 | | buf = fr->real_buffs[1]; |
662 | | } |
663 | | |
664 | | if(fr->bo & 0x1) |
665 | | { |
666 | | b0 = buf[0]; |
667 | | bo1 = fr->bo; |
668 | | INT123_dct64(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr); |
669 | | } |
670 | | else |
671 | | { |
672 | | b0 = buf[1]; |
673 | | bo1 = fr->bo+1; |
674 | | INT123_dct64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr); |
675 | | } |
676 | | |
677 | | clip = INT123_synth_1to1_arm_accurate_asm(fr->decwin, b0, samples, bo1); |
678 | | |
679 | | if(final) fr->buffer.fill += 128; |
680 | | |
681 | | return clip; |
682 | | } |
683 | | #else |
684 | | /* Assembler routines. */ |
685 | | int INT123_synth_1to1_arm_asm(real *window, real *b0, short *samples, int bo1); |
686 | | /* Hull for C mpg123 API */ |
687 | | int INT123_synth_1to1_arm(real *bandPtr,int channel, mpg123_handle *fr, int final) |
688 | | { |
689 | | short *samples = (short *) (fr->buffer.data+fr->buffer.fill); |
690 | | |
691 | | real *b0, **buf; |
692 | | int bo1; |
693 | | int clip; |
694 | | #ifndef NO_EQUALIZER |
695 | | if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer); |
696 | | #endif |
697 | | if(!channel) |
698 | | { |
699 | | fr->bo--; |
700 | | fr->bo &= 0xf; |
701 | | buf = fr->real_buffs[0]; |
702 | | } |
703 | | else |
704 | | { |
705 | | samples++; |
706 | | buf = fr->real_buffs[1]; |
707 | | } |
708 | | |
709 | | if(fr->bo & 0x1) |
710 | | { |
711 | | b0 = buf[0]; |
712 | | bo1 = fr->bo; |
713 | | INT123_dct64(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr); |
714 | | } |
715 | | else |
716 | | { |
717 | | b0 = buf[1]; |
718 | | bo1 = fr->bo+1; |
719 | | INT123_dct64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr); |
720 | | } |
721 | | |
722 | | clip = INT123_synth_1to1_arm_asm(fr->decwin, b0, samples, bo1); |
723 | | |
724 | | if(final) fr->buffer.fill += 128; |
725 | | |
726 | | return clip; |
727 | | } |
728 | | #endif |
729 | | #endif |
730 | | |
731 | | #ifdef OPT_NEON |
732 | | #ifdef ACCURATE_ROUNDING |
733 | | /* This is defined in assembler. */ |
734 | | int INT123_synth_1to1_neon_accurate_asm(real *window, real *b0, short *samples, int bo1); |
735 | | int INT123_synth_1to1_s_neon_accurate_asm(real *window, real *b0l, real *b0r, short *samples, int bo1); |
736 | | void INT123_dct64_real_neon(real *out0, real *out1, real *samples); |
737 | | /* Hull for C mpg123 API */ |
738 | | int INT123_synth_1to1_neon(real *bandPtr,int channel, mpg123_handle *fr, int final) |
739 | | { |
740 | | short *samples = (short *) (fr->buffer.data+fr->buffer.fill); |
741 | | |
742 | | real *b0, **buf; |
743 | | int bo1; |
744 | | int clip; |
745 | | #ifndef NO_EQUALIZER |
746 | | if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer); |
747 | | #endif |
748 | | if(!channel) |
749 | | { |
750 | | fr->bo--; |
751 | | fr->bo &= 0xf; |
752 | | buf = fr->real_buffs[0]; |
753 | | } |
754 | | else |
755 | | { |
756 | | samples++; |
757 | | buf = fr->real_buffs[1]; |
758 | | } |
759 | | |
760 | | if(fr->bo & 0x1) |
761 | | { |
762 | | b0 = buf[0]; |
763 | | bo1 = fr->bo; |
764 | | INT123_dct64_real_neon(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr); |
765 | | } |
766 | | else |
767 | | { |
768 | | b0 = buf[1]; |
769 | | bo1 = fr->bo+1; |
770 | | INT123_dct64_real_neon(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr); |
771 | | } |
772 | | |
773 | | clip = INT123_synth_1to1_neon_accurate_asm(fr->decwin, b0, samples, bo1); |
774 | | |
775 | | if(final) fr->buffer.fill += 128; |
776 | | |
777 | | return clip; |
778 | | } |
779 | | |
780 | | int INT123_synth_1to1_stereo_neon(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr) |
781 | | { |
782 | | short *samples = (short *) (fr->buffer.data+fr->buffer.fill); |
783 | | |
784 | | real *b0l, *b0r, **bufl, **bufr; |
785 | | int bo1; |
786 | | int clip; |
787 | | #ifndef NO_EQUALIZER |
788 | | if(fr->have_eq_settings) |
789 | | { |
790 | | INT123_do_equalizer(bandPtr_l,0,fr->equalizer); |
791 | | INT123_do_equalizer(bandPtr_r,1,fr->equalizer); |
792 | | } |
793 | | #endif |
794 | | fr->bo--; |
795 | | fr->bo &= 0xf; |
796 | | bufl = fr->real_buffs[0]; |
797 | | bufr = fr->real_buffs[1]; |
798 | | |
799 | | if(fr->bo & 0x1) |
800 | | { |
801 | | b0l = bufl[0]; |
802 | | b0r = bufr[0]; |
803 | | bo1 = fr->bo; |
804 | | INT123_dct64_real_neon(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l); |
805 | | INT123_dct64_real_neon(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r); |
806 | | } |
807 | | else |
808 | | { |
809 | | b0l = bufl[1]; |
810 | | b0r = bufr[1]; |
811 | | bo1 = fr->bo+1; |
812 | | INT123_dct64_real_neon(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l); |
813 | | INT123_dct64_real_neon(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r); |
814 | | } |
815 | | |
816 | | clip = INT123_synth_1to1_s_neon_accurate_asm(fr->decwin, b0l, b0r, samples, bo1); |
817 | | |
818 | | fr->buffer.fill += 128; |
819 | | |
820 | | return clip; |
821 | | } |
822 | | #else |
823 | | /* This is defined in assembler. */ |
824 | | int INT123_synth_1to1_neon_asm(short *window, short *b0, short *samples, int bo1); |
825 | | int INT123_synth_1to1_s_neon_asm(short *window, short *b0l, short *b0r, short *samples, int bo1); |
826 | | void INT123_dct64_neon(short *out0, short *out1, real *samples); |
827 | | /* Hull for C mpg123 API */ |
828 | | int INT123_synth_1to1_neon(real *bandPtr,int channel, mpg123_handle *fr, int final) |
829 | | { |
830 | | short *samples = (short *) (fr->buffer.data+fr->buffer.fill); |
831 | | short *b0, **buf; |
832 | | int clip; |
833 | | int bo1; |
834 | | #ifndef NO_EQUALIZER |
835 | | if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer); |
836 | | #endif |
837 | | if(!channel) |
838 | | { |
839 | | fr->bo--; |
840 | | fr->bo &= 0xf; |
841 | | buf = fr->short_buffs[0]; |
842 | | } |
843 | | else |
844 | | { |
845 | | samples++; |
846 | | buf = fr->short_buffs[1]; |
847 | | } |
848 | | |
849 | | if(fr->bo & 0x1) |
850 | | { |
851 | | b0 = buf[0]; |
852 | | bo1 = fr->bo; |
853 | | INT123_dct64_neon(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr); |
854 | | } |
855 | | else |
856 | | { |
857 | | b0 = buf[1]; |
858 | | bo1 = fr->bo+1; |
859 | | INT123_dct64_neon(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr); |
860 | | } |
861 | | |
862 | | clip = INT123_synth_1to1_neon_asm((short *)fr->decwins, b0, samples, bo1); |
863 | | |
864 | | if(final) fr->buffer.fill += 128; |
865 | | |
866 | | return clip; |
867 | | } |
868 | | |
869 | | int INT123_synth_1to1_stereo_neon(real *bandPtr_l,real *bandPtr_r, mpg123_handle *fr) |
870 | | { |
871 | | short *samples = (short *) (fr->buffer.data+fr->buffer.fill); |
872 | | short *b0l, *b0r, **bufl, **bufr; |
873 | | int clip; |
874 | | int bo1; |
875 | | #ifndef NO_EQUALIZER |
876 | | if(fr->have_eq_settings) |
877 | | { |
878 | | INT123_do_equalizer(bandPtr_l,0,fr->equalizer); |
879 | | INT123_do_equalizer(bandPtr_r,1,fr->equalizer); |
880 | | } |
881 | | #endif |
882 | | fr->bo--; |
883 | | fr->bo &= 0xf; |
884 | | bufl = fr->short_buffs[0]; |
885 | | bufr = fr->short_buffs[1]; |
886 | | |
887 | | if(fr->bo & 0x1) |
888 | | { |
889 | | b0l = bufl[0]; |
890 | | b0r = bufr[0]; |
891 | | bo1 = fr->bo; |
892 | | INT123_dct64_neon(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l); |
893 | | INT123_dct64_neon(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r); |
894 | | } |
895 | | else |
896 | | { |
897 | | b0l = bufl[1]; |
898 | | b0r = bufr[1]; |
899 | | bo1 = fr->bo+1; |
900 | | INT123_dct64_neon(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l); |
901 | | INT123_dct64_neon(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r); |
902 | | } |
903 | | |
904 | | clip = INT123_synth_1to1_s_neon_asm((short *)fr->decwins, b0l, b0r, samples, bo1); |
905 | | |
906 | | fr->buffer.fill += 128; |
907 | | |
908 | | return clip; |
909 | | } |
910 | | #endif |
911 | | #endif |
912 | | |
913 | | #ifdef OPT_NEON64 |
914 | | #ifdef ACCURATE_ROUNDING |
915 | | /* This is defined in assembler. */ |
916 | | int INT123_synth_1to1_neon64_accurate_asm(real *window, real *b0, short *samples, int bo1); |
917 | | int INT123_synth_1to1_s_neon64_accurate_asm(real *window, real *b0l, real *b0r, short *samples, int bo1); |
918 | | void INT123_dct64_real_neon64(real *out0, real *out1, real *samples); |
919 | | /* Hull for C mpg123 API */ |
920 | | int INT123_synth_1to1_neon64(real *bandPtr,int channel, mpg123_handle *fr, int final) |
921 | | { |
922 | | short *samples = (short *) (fr->buffer.data+fr->buffer.fill); |
923 | | |
924 | | real *b0, **buf; |
925 | | int bo1; |
926 | | int clip; |
927 | | #ifndef NO_EQUALIZER |
928 | | if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer); |
929 | | #endif |
930 | | if(!channel) |
931 | | { |
932 | | fr->bo--; |
933 | | fr->bo &= 0xf; |
934 | | buf = fr->real_buffs[0]; |
935 | | } |
936 | | else |
937 | | { |
938 | | samples++; |
939 | | buf = fr->real_buffs[1]; |
940 | | } |
941 | | |
942 | | if(fr->bo & 0x1) |
943 | | { |
944 | | b0 = buf[0]; |
945 | | bo1 = fr->bo; |
946 | | INT123_dct64_real_neon64(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr); |
947 | | } |
948 | | else |
949 | | { |
950 | | b0 = buf[1]; |
951 | | bo1 = fr->bo+1; |
952 | | INT123_dct64_real_neon64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr); |
953 | | } |
954 | | |
955 | | clip = INT123_synth_1to1_neon64_accurate_asm(fr->decwin, b0, samples, bo1); |
956 | | |
957 | | if(final) fr->buffer.fill += 128; |
958 | | |
959 | | return clip; |
960 | | } |
961 | | |
962 | | int INT123_synth_1to1_stereo_neon64(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr) |
963 | | { |
964 | | short *samples = (short *) (fr->buffer.data+fr->buffer.fill); |
965 | | |
966 | | real *b0l, *b0r, **bufl, **bufr; |
967 | | int bo1; |
968 | | int clip; |
969 | | #ifndef NO_EQUALIZER |
970 | | if(fr->have_eq_settings) |
971 | | { |
972 | | INT123_do_equalizer(bandPtr_l,0,fr->equalizer); |
973 | | INT123_do_equalizer(bandPtr_r,1,fr->equalizer); |
974 | | } |
975 | | #endif |
976 | | fr->bo--; |
977 | | fr->bo &= 0xf; |
978 | | bufl = fr->real_buffs[0]; |
979 | | bufr = fr->real_buffs[1]; |
980 | | |
981 | | if(fr->bo & 0x1) |
982 | | { |
983 | | b0l = bufl[0]; |
984 | | b0r = bufr[0]; |
985 | | bo1 = fr->bo; |
986 | | INT123_dct64_real_neon64(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l); |
987 | | INT123_dct64_real_neon64(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r); |
988 | | } |
989 | | else |
990 | | { |
991 | | b0l = bufl[1]; |
992 | | b0r = bufr[1]; |
993 | | bo1 = fr->bo+1; |
994 | | INT123_dct64_real_neon64(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l); |
995 | | INT123_dct64_real_neon64(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r); |
996 | | } |
997 | | |
998 | | clip = INT123_synth_1to1_s_neon64_accurate_asm(fr->decwin, b0l, b0r, samples, bo1); |
999 | | |
1000 | | fr->buffer.fill += 128; |
1001 | | |
1002 | | return clip; |
1003 | | } |
1004 | | #else |
1005 | | /* This is defined in assembler. */ |
1006 | | int INT123_synth_1to1_neon64_asm(short *window, short *b0, short *samples, int bo1); |
1007 | | int INT123_synth_1to1_s_neon64_asm(short *window, short *b0l, short *b0r, short *samples, int bo1); |
1008 | | void INT123_dct64_neon64(short *out0, short *out1, real *samples); |
1009 | | /* Hull for C mpg123 API */ |
1010 | | int INT123_synth_1to1_neon64(real *bandPtr,int channel, mpg123_handle *fr, int final) |
1011 | | { |
1012 | | short *samples = (short *) (fr->buffer.data+fr->buffer.fill); |
1013 | | short *b0, **buf; |
1014 | | int clip; |
1015 | | int bo1; |
1016 | | #ifndef NO_EQUALIZER |
1017 | | if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer); |
1018 | | #endif |
1019 | | if(!channel) |
1020 | | { |
1021 | | fr->bo--; |
1022 | | fr->bo &= 0xf; |
1023 | | buf = fr->short_buffs[0]; |
1024 | | } |
1025 | | else |
1026 | | { |
1027 | | samples++; |
1028 | | buf = fr->short_buffs[1]; |
1029 | | } |
1030 | | |
1031 | | if(fr->bo & 0x1) |
1032 | | { |
1033 | | b0 = buf[0]; |
1034 | | bo1 = fr->bo; |
1035 | | INT123_dct64_neon64(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr); |
1036 | | } |
1037 | | else |
1038 | | { |
1039 | | b0 = buf[1]; |
1040 | | bo1 = fr->bo+1; |
1041 | | INT123_dct64_neon64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr); |
1042 | | } |
1043 | | |
1044 | | clip = INT123_synth_1to1_neon64_asm((short *)fr->decwins, b0, samples, bo1); |
1045 | | |
1046 | | if(final) fr->buffer.fill += 128; |
1047 | | |
1048 | | return clip; |
1049 | | } |
1050 | | |
1051 | | int INT123_synth_1to1_stereo_neon64(real *bandPtr_l,real *bandPtr_r, mpg123_handle *fr) |
1052 | | { |
1053 | | short *samples = (short *) (fr->buffer.data+fr->buffer.fill); |
1054 | | short *b0l, *b0r, **bufl, **bufr; |
1055 | | int clip; |
1056 | | int bo1; |
1057 | | #ifndef NO_EQUALIZER |
1058 | | if(fr->have_eq_settings) |
1059 | | { |
1060 | | INT123_do_equalizer(bandPtr_l,0,fr->equalizer); |
1061 | | INT123_do_equalizer(bandPtr_r,1,fr->equalizer); |
1062 | | } |
1063 | | #endif |
1064 | | fr->bo--; |
1065 | | fr->bo &= 0xf; |
1066 | | bufl = fr->short_buffs[0]; |
1067 | | bufr = fr->short_buffs[1]; |
1068 | | |
1069 | | if(fr->bo & 0x1) |
1070 | | { |
1071 | | b0l = bufl[0]; |
1072 | | b0r = bufr[0]; |
1073 | | bo1 = fr->bo; |
1074 | | INT123_dct64_neon64(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l); |
1075 | | INT123_dct64_neon64(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r); |
1076 | | } |
1077 | | else |
1078 | | { |
1079 | | b0l = bufl[1]; |
1080 | | b0r = bufr[1]; |
1081 | | bo1 = fr->bo+1; |
1082 | | INT123_dct64_neon64(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l); |
1083 | | INT123_dct64_neon64(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r); |
1084 | | } |
1085 | | |
1086 | | clip = INT123_synth_1to1_s_neon64_asm((short *)fr->decwins, b0l, b0r, samples, bo1); |
1087 | | |
1088 | | fr->buffer.fill += 128; |
1089 | | |
1090 | | return clip; |
1091 | | } |
1092 | | #endif |
1093 | | #endif |
1094 | | |
1095 | | #ifndef NO_DOWNSAMPLE |
1096 | | |
1097 | | /* |
1098 | | Part 1b: 2to1 synth. |
1099 | | Only generic and i386 functions this time. |
1100 | | */ |
1101 | 0 | #define BLOCK 0x20 /* One decoding block is 32 samples. */ |
1102 | | |
1103 | | #define SYNTH_NAME INT123_synth_2to1 |
1104 | | #include "synth.h" |
1105 | | #undef SYNTH_NAME |
1106 | | |
1107 | | #ifdef OPT_DITHER /* Used for generic_dither and as fallback for i586_dither. */ |
1108 | | #define SYNTH_NAME INT123_synth_2to1_dither |
1109 | | #define USE_DITHER |
1110 | | #include "synth.h" |
1111 | | #undef USE_DITHER |
1112 | | #undef SYNTH_NAME |
1113 | | #endif |
1114 | | |
1115 | 0 | #define SYNTH_NAME fr->synths.plain[r_2to1][f_16] |
1116 | | #define MONO_NAME INT123_synth_2to1_mono |
1117 | | #define MONO2STEREO_NAME INT123_synth_2to1_m2s |
1118 | | #include "synth_mono.h" |
1119 | | #undef SYNTH_NAME |
1120 | | #undef MONO_NAME |
1121 | | #undef MONO2STEREO_NAME |
1122 | | |
1123 | | #ifdef OPT_X86 |
1124 | | #define NO_AUTOINCREMENT |
1125 | | #define SYNTH_NAME INT123_synth_2to1_i386 |
1126 | | #include "synth.h" |
1127 | | #undef SYNTH_NAME |
1128 | | /* i386 uses the normal mono functions. */ |
1129 | | #undef NO_AUTOINCREMENT |
1130 | | #endif |
1131 | | |
1132 | | #undef BLOCK |
1133 | | |
1134 | | /* |
1135 | | Part 1c: 4to1 synth. |
1136 | | Same procedure as above... |
1137 | | */ |
1138 | 0 | #define BLOCK 0x10 /* One decoding block is 16 samples. */ |
1139 | | |
1140 | | #define SYNTH_NAME INT123_synth_4to1 |
1141 | | #include "synth.h" |
1142 | | #undef SYNTH_NAME |
1143 | | |
1144 | | #ifdef OPT_DITHER |
1145 | | #define SYNTH_NAME INT123_synth_4to1_dither |
1146 | | #define USE_DITHER |
1147 | | #include "synth.h" |
1148 | | #undef USE_DITHER |
1149 | | #undef SYNTH_NAME |
1150 | | #endif |
1151 | | |
1152 | 0 | #define SYNTH_NAME fr->synths.plain[r_4to1][f_16] /* This is just for the _i386 one... gotta check if it is really useful... */ |
1153 | | #define MONO_NAME INT123_synth_4to1_mono |
1154 | | #define MONO2STEREO_NAME INT123_synth_4to1_m2s |
1155 | | #include "synth_mono.h" |
1156 | | #undef SYNTH_NAME |
1157 | | #undef MONO_NAME |
1158 | | #undef MONO2STEREO_NAME |
1159 | | |
1160 | | #ifdef OPT_X86 |
1161 | | #define NO_AUTOINCREMENT |
1162 | | #define SYNTH_NAME INT123_synth_4to1_i386 |
1163 | | #include "synth.h" |
1164 | | #undef SYNTH_NAME |
1165 | | /* i386 uses the normal mono functions. */ |
1166 | | #undef NO_AUTOINCREMENT |
1167 | | #endif |
1168 | | |
1169 | | #undef BLOCK |
1170 | | |
1171 | | #endif /* NO_DOWNSAMPLE */ |
1172 | | |
1173 | | #ifndef NO_NTOM |
1174 | | /* |
1175 | | Part 1d: ntom synth. |
1176 | | Same procedure as above... Just no extra play anymore, straight synth that uses the plain INT123_dct64. |
1177 | | */ |
1178 | | |
1179 | | /* These are all in one header, there's no flexibility to gain. */ |
1180 | 0 | #define SYNTH_NAME INT123_synth_ntom |
1181 | | #define MONO_NAME INT123_synth_ntom_mono |
1182 | | #define MONO2STEREO_NAME INT123_synth_ntom_m2s |
1183 | | #include "synth_ntom.h" |
1184 | | #undef SYNTH_NAME |
1185 | | #undef MONO_NAME |
1186 | | #undef MONO2STEREO_NAME |
1187 | | |
1188 | | #endif |
1189 | | |
1190 | | /* Done with short output. */ |
1191 | | #undef SAMPLE_T |
1192 | | #undef WRITE_SAMPLE |