Rev 1905 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1905 | serge | 1 | /* |
2 | decode.h: common definitions for decode functions |
||
3 | |||
4 | This file is strongly tied with optimize.h concerning the synth functions. |
||
5 | Perhaps one should restructure that a bit. |
||
6 | |||
7 | copyright 2007-8 by the mpg123 project - free software under the terms of the LGPL 2.1 |
||
8 | see COPYING and AUTHORS files in distribution or http://mpg123.org |
||
9 | initially written by Thomas Orgis, taking WRITE_SAMPLE from decode.c |
||
10 | */ |
||
11 | #ifndef MPG123_DECODE_H |
||
12 | #define MPG123_DECODE_H |
||
13 | |||
14 | /* Selection of class of output routines for basic format. */ |
||
15 | #ifndef REAL_IS_FIXED |
||
16 | #define OUT_FORMATS 4 /* Basic output formats: 16bit, 8bit, real and s32 */ |
||
17 | #else |
||
18 | #define OUT_FORMATS 2 /* Only up to 16bit */ |
||
19 | #endif |
||
20 | |||
21 | #define OUT_16 0 |
||
22 | #define OUT_8 1 |
||
23 | /* Those are defined but not supported for fixed point decoding! */ |
||
24 | #define OUT_REAL 2 /* Write a floating point sample (that is, one matching the internal real type). */ |
||
25 | #define OUT_S32 3 |
||
26 | |||
27 | #ifdef NO_NTOM |
||
28 | #define NTOM_MAX 1 |
||
29 | #else |
||
30 | #define NTOM_MAX 8 /* maximum allowed factor for upsampling */ |
||
31 | #define NTOM_MAX_FREQ 96000 /* maximum frequency to upsample to / downsample from */ |
||
32 | #define NTOM_MUL (32768) |
||
3960 | Serge | 33 | void ntom_set_ntom(mpg123_handle *fr, off_t num); |
1905 | serge | 34 | #endif |
35 | |||
36 | /* Let's collect all possible synth functions here, for an overview. |
||
37 | If they are actually defined and used depends on preprocessor machinery. |
||
38 | See synth.c and optimize.h for that, also some special C and assembler files. */ |
||
39 | |||
40 | #ifndef NO_16BIT |
||
41 | /* The signed-16bit-producing variants. */ |
||
42 | int synth_1to1 (real*, int, mpg123_handle*, int); |
||
43 | int synth_1to1_dither (real*, int, mpg123_handle*, int); |
||
44 | int synth_1to1_i386 (real*, int, mpg123_handle*, int); |
||
45 | int synth_1to1_i586 (real*, int, mpg123_handle*, int); |
||
46 | int synth_1to1_i586_dither(real*, int, mpg123_handle*, int); |
||
47 | int synth_1to1_mmx (real*, int, mpg123_handle*, int); |
||
48 | int synth_1to1_3dnow (real*, int, mpg123_handle*, int); |
||
49 | int synth_1to1_sse (real*, int, mpg123_handle*, int); |
||
50 | int synth_1to1_stereo_sse (real*, real*, mpg123_handle*); |
||
51 | int synth_1to1_3dnowext (real*, int, mpg123_handle*, int); |
||
52 | int synth_1to1_altivec (real*, int, mpg123_handle*, int); |
||
53 | int synth_1to1_stereo_altivec(real*, real*, mpg123_handle*); |
||
54 | int synth_1to1_x86_64 (real*, int, mpg123_handle*, int); |
||
55 | int synth_1to1_stereo_x86_64(real*, real*, mpg123_handle*); |
||
56 | int synth_1to1_arm (real*, int, mpg123_handle*, int); |
||
3960 | Serge | 57 | int synth_1to1_neon (real*, int, mpg123_handle*, int); |
58 | int synth_1to1_stereo_neon(real*, real*, mpg123_handle*); |
||
1905 | serge | 59 | /* This is different, special usage in layer3.c only. |
60 | Hence, the name... and now forget about it. |
||
61 | Never use it outside that special portion of code inside layer3.c! */ |
||
62 | int absynth_1to1_i486(real*, int, mpg123_handle*, int); |
||
63 | /* These mono/stereo converters use one of the above for the grunt work. */ |
||
64 | int synth_1to1_mono (real*, mpg123_handle*); |
||
3960 | Serge | 65 | int synth_1to1_m2s(real*, mpg123_handle*); |
1905 | serge | 66 | |
67 | /* Sample rate decimation comes in less flavours. */ |
||
68 | #ifndef NO_DOWNSAMPLE |
||
69 | int synth_2to1 (real*, int, mpg123_handle*, int); |
||
70 | int synth_2to1_dither (real*, int, mpg123_handle*, int); |
||
71 | int synth_2to1_i386 (real*, int, mpg123_handle*, int); |
||
72 | int synth_2to1_mono (real*, mpg123_handle*); |
||
3960 | Serge | 73 | int synth_2to1_m2s(real*, mpg123_handle*); |
1905 | serge | 74 | int synth_4to1 (real *,int, mpg123_handle*, int); |
75 | int synth_4to1_dither (real *,int, mpg123_handle*, int); |
||
76 | int synth_4to1_i386 (real*, int, mpg123_handle*, int); |
||
77 | int synth_4to1_mono (real*, mpg123_handle*); |
||
3960 | Serge | 78 | int synth_4to1_m2s(real*, mpg123_handle*); |
1905 | serge | 79 | #endif |
80 | #ifndef NO_NTOM |
||
81 | /* NtoM is really just one implementation. */ |
||
82 | int synth_ntom (real *,int, mpg123_handle*, int); |
||
83 | int synth_ntom_mono (real *, mpg123_handle *); |
||
3960 | Serge | 84 | int synth_ntom_m2s (real *, mpg123_handle *); |
1905 | serge | 85 | #endif |
86 | #endif |
||
87 | |||
88 | #ifndef NO_8BIT |
||
89 | /* The 8bit-producing variants. */ |
||
90 | /* There are direct 8-bit synths and wrappers over a possibly optimized 16bit one. */ |
||
91 | int synth_1to1_8bit (real*, int, mpg123_handle*, int); |
||
92 | int synth_1to1_8bit_i386 (real*, int, mpg123_handle*, int); |
||
93 | #ifndef NO_16BIT |
||
94 | int synth_1to1_8bit_wrap (real*, int, mpg123_handle*, int); |
||
95 | int synth_1to1_8bit_mono (real*, mpg123_handle*); |
||
96 | #endif |
||
3960 | Serge | 97 | int synth_1to1_8bit_m2s(real*, mpg123_handle*); |
1905 | serge | 98 | #ifndef NO_16BIT |
99 | int synth_1to1_8bit_wrap_mono (real*, mpg123_handle*); |
||
3960 | Serge | 100 | int synth_1to1_8bit_wrap_m2s(real*, mpg123_handle*); |
1905 | serge | 101 | #endif |
102 | #ifndef NO_DOWNSAMPLE |
||
103 | int synth_2to1_8bit (real*, int, mpg123_handle*, int); |
||
104 | int synth_2to1_8bit_i386 (real*, int, mpg123_handle*, int); |
||
105 | int synth_2to1_8bit_mono (real*, mpg123_handle*); |
||
3960 | Serge | 106 | int synth_2to1_8bit_m2s(real*, mpg123_handle*); |
1905 | serge | 107 | int synth_4to1_8bit (real*, int, mpg123_handle*, int); |
108 | int synth_4to1_8bit_i386 (real*, int, mpg123_handle*, int); |
||
109 | int synth_4to1_8bit_mono (real*, mpg123_handle*); |
||
3960 | Serge | 110 | int synth_4to1_8bit_m2s(real*, mpg123_handle*); |
1905 | serge | 111 | #endif |
112 | #ifndef NO_NTOM |
||
113 | int synth_ntom_8bit (real*, int, mpg123_handle*, int); |
||
114 | int synth_ntom_8bit_mono (real*, mpg123_handle*); |
||
3960 | Serge | 115 | int synth_ntom_8bit_m2s(real*, mpg123_handle*); |
1905 | serge | 116 | #endif |
117 | #endif |
||
118 | |||
119 | #ifndef REAL_IS_FIXED |
||
120 | |||
121 | #ifndef NO_REAL |
||
122 | /* The real-producing variants. */ |
||
123 | int synth_1to1_real (real*, int, mpg123_handle*, int); |
||
124 | int synth_1to1_real_i386 (real*, int, mpg123_handle*, int); |
||
125 | int synth_1to1_real_sse (real*, int, mpg123_handle*, int); |
||
126 | int synth_1to1_real_stereo_sse (real*, real*, mpg123_handle*); |
||
127 | int synth_1to1_real_x86_64 (real*, int, mpg123_handle*, int); |
||
128 | int synth_1to1_real_stereo_x86_64(real*, real*, mpg123_handle*); |
||
129 | int synth_1to1_real_altivec (real*, int, mpg123_handle*, int); |
||
130 | int synth_1to1_real_stereo_altivec(real*, real*, mpg123_handle*); |
||
3960 | Serge | 131 | int synth_1to1_real_neon (real*, int, mpg123_handle*, int); |
132 | int synth_1to1_real_stereo_neon(real*, real*, mpg123_handle*); |
||
1905 | serge | 133 | int synth_1to1_real_mono (real*, mpg123_handle*); |
3960 | Serge | 134 | int synth_1to1_real_m2s(real*, mpg123_handle*); |
1905 | serge | 135 | #ifndef NO_DOWNSAMPLE |
136 | int synth_2to1_real (real*, int, mpg123_handle*, int); |
||
137 | int synth_2to1_real_i386 (real*, int, mpg123_handle*, int); |
||
138 | int synth_2to1_real_mono (real*, mpg123_handle*); |
||
3960 | Serge | 139 | int synth_2to1_real_m2s(real*, mpg123_handle*); |
1905 | serge | 140 | int synth_4to1_real (real*, int, mpg123_handle*, int); |
141 | int synth_4to1_real_i386 (real*, int, mpg123_handle*, int); |
||
142 | int synth_4to1_real_mono (real*, mpg123_handle*); |
||
3960 | Serge | 143 | int synth_4to1_real_m2s(real*, mpg123_handle*); |
1905 | serge | 144 | #endif |
145 | #ifndef NO_NTOM |
||
146 | int synth_ntom_real (real*, int, mpg123_handle*, int); |
||
147 | int synth_ntom_real_mono (real*, mpg123_handle*); |
||
3960 | Serge | 148 | int synth_ntom_real_m2s(real*, mpg123_handle*); |
1905 | serge | 149 | #endif |
150 | #endif |
||
151 | |||
152 | #ifndef NO_32BIT |
||
153 | /* 32bit integer */ |
||
154 | int synth_1to1_s32 (real*, int, mpg123_handle*, int); |
||
155 | int synth_1to1_s32_i386 (real*, int, mpg123_handle*, int); |
||
156 | int synth_1to1_s32_sse (real*, int, mpg123_handle*, int); |
||
157 | int synth_1to1_s32_stereo_sse (real*, real*, mpg123_handle*); |
||
158 | int synth_1to1_s32_x86_64 (real*, int, mpg123_handle*, int); |
||
159 | int synth_1to1_s32_stereo_x86_64(real*, real*, mpg123_handle*); |
||
160 | int synth_1to1_s32_altivec (real*, int, mpg123_handle*, int); |
||
161 | int synth_1to1_s32_stereo_altivec(real*, real*, mpg123_handle*); |
||
3960 | Serge | 162 | int synth_1to1_s32_neon (real*, int, mpg123_handle*, int); |
163 | int synth_1to1_s32_stereo_neon(real*, real*, mpg123_handle*); |
||
1905 | serge | 164 | int synth_1to1_s32_mono (real*, mpg123_handle*); |
3960 | Serge | 165 | int synth_1to1_s32_m2s(real*, mpg123_handle*); |
1905 | serge | 166 | #ifndef NO_DOWNSAMPLE |
167 | int synth_2to1_s32 (real*, int, mpg123_handle*, int); |
||
168 | int synth_2to1_s32_i386 (real*, int, mpg123_handle*, int); |
||
169 | int synth_2to1_s32_mono (real*, mpg123_handle*); |
||
3960 | Serge | 170 | int synth_2to1_s32_m2s(real*, mpg123_handle*); |
1905 | serge | 171 | int synth_4to1_s32 (real*, int, mpg123_handle*, int); |
172 | int synth_4to1_s32_i386 (real*, int, mpg123_handle*, int); |
||
173 | int synth_4to1_s32_mono (real*, mpg123_handle*); |
||
3960 | Serge | 174 | int synth_4to1_s32_m2s(real*, mpg123_handle*); |
1905 | serge | 175 | #endif |
176 | #ifndef NO_NTOM |
||
177 | int synth_ntom_s32 (real*, int, mpg123_handle*, int); |
||
178 | int synth_ntom_s32_mono (real*, mpg123_handle*); |
||
3960 | Serge | 179 | int synth_ntom_s32_m2s(real*, mpg123_handle*); |
1905 | serge | 180 | #endif |
181 | #endif |
||
182 | |||
183 | #endif /* FIXED */ |
||
184 | |||
185 | |||
186 | /* Inside these synth functions, some dct64 variants may be used. |
||
187 | The special optimized ones that only appear in assembler code are not mentioned here. |
||
188 | And, generally, these functions are only employed in a matching synth function. */ |
||
189 | void dct64 (real *,real *,real *); |
||
190 | void dct64_i386 (real *,real *,real *); |
||
191 | void dct64_altivec(real *,real *,real *); |
||
192 | void dct64_i486(int*, int* , real*); /* Yeah, of no use outside of synth_i486.c .*/ |
||
193 | |||
194 | /* This is used by the layer 3 decoder, one generic function and 3DNow variants. */ |
||
195 | void dct36 (real *,real *,real *,real *,real *); |
||
196 | void dct36_3dnow (real *,real *,real *,real *,real *); |
||
197 | void dct36_3dnowext(real *,real *,real *,real *,real *); |
||
198 | |||
199 | /* Tools for NtoM resampling synth, defined in ntom.c . */ |
||
200 | int synth_ntom_set_step(mpg123_handle *fr); /* prepare ntom decoding */ |
||
201 | unsigned long ntom_val(mpg123_handle *fr, off_t frame); /* compute ntom_val for frame offset */ |
||
202 | /* Frame and sample offsets. */ |
||
203 | #ifndef NO_NTOM |
||
3960 | Serge | 204 | /* |
205 | Outsamples of _this_ frame. |
||
206 | To be exact: The samples to be expected from the next frame decode (using the current ntom_val). When you already decoded _this_ frame, this is the number of samples to be expected from the next one. |
||
207 | */ |
||
208 | off_t ntom_frame_outsamples(mpg123_handle *fr); |
||
209 | /* Total out/insample offset. */ |
||
1905 | serge | 210 | off_t ntom_frmouts(mpg123_handle *fr, off_t frame); |
211 | off_t ntom_ins2outs(mpg123_handle *fr, off_t ins); |
||
212 | off_t ntom_frameoff(mpg123_handle *fr, off_t soff); |
||
213 | #endif |
||
214 | |||
215 | /* Initialization of any static data that majy be needed at runtime. |
||
216 | Make sure you call these once before it is too late. */ |
||
217 | #ifndef NO_LAYER3 |
||
218 | void init_layer3(void); |
||
219 | real init_layer3_gainpow2(mpg123_handle *fr, int i); |
||
220 | void init_layer3_stuff(mpg123_handle *fr, real (*gainpow2)(mpg123_handle *fr, int i)); |
||
221 | #endif |
||
222 | #ifndef NO_LAYER12 |
||
223 | void init_layer12(void); |
||
224 | real* init_layer12_table(mpg123_handle *fr, real *table, int m); |
||
225 | void init_layer12_stuff(mpg123_handle *fr, real* (*init_table)(mpg123_handle *fr, real *table, int m)); |
||
226 | #endif |
||
227 | |||
228 | void prepare_decode_tables(void); |
||
229 | |||
230 | extern real *pnts[5]; /* tabinit provides, dct64 needs */ |
||
231 | |||
232 | /* Runtime (re)init functions; needed more often. */ |
||
233 | void make_decode_tables(mpg123_handle *fr); /* For every volume change. */ |
||
234 | /* Stuff needed after updating synth setup (see set_synth_functions()). */ |
||
235 | |||
236 | #ifdef OPT_MMXORSSE |
||
237 | /* Special treatment for mmx-like decoders, these functions go into the slots below. */ |
||
238 | void make_decode_tables_mmx(mpg123_handle *fr); |
||
239 | #ifndef NO_LAYER3 |
||
240 | real init_layer3_gainpow2_mmx(mpg123_handle *fr, int i); |
||
241 | #endif |
||
242 | #ifndef NO_LAYER12 |
||
243 | real* init_layer12_table_mmx(mpg123_handle *fr, real *table, int m); |
||
244 | #endif |
||
245 | #endif |
||
246 | |||
247 | #ifndef NO_8BIT |
||
248 | /* Needed when switching to 8bit output. */ |
||
249 | int make_conv16to8_table(mpg123_handle *fr); |
||
250 | #endif |
||
251 | |||
252 | /* These are the actual workers. |
||
253 | They operate on the parsed frame data and handle decompression to audio samples. |
||
254 | The synth functions defined above are called from inside the layer handlers. */ |
||
255 | |||
256 | #ifndef NO_LAYER3 |
||
257 | int do_layer3(mpg123_handle *fr); |
||
258 | #endif |
||
259 | #ifndef NO_LAYER2 |
||
260 | int do_layer2(mpg123_handle *fr); |
||
261 | #endif |
||
262 | #ifndef NO_LAYER1 |
||
263 | int do_layer1(mpg123_handle *fr); |
||
264 | #endif |
||
265 | /* There's an 3DNow counterpart in asm. */ |
||
266 | void do_equalizer(real *bandPtr,int channel, real equalizer[2][32]); |
||
267 | |||
268 | #endif |