2 frame: Central data structures and opmitization hooks.
4 copyright 2007 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 Thomas Orgis
10 #define MPG123_FRAME_H
26 int frame_dither_init(mpg123_handle
*fr
);
30 #define MAXFRAMESIZE 3456
38 /* the output buffer, used to be pcm_sample, pcm_point and audiobufsize */
42 unsigned char *p
; /* read pointer */
43 size_t fill
; /* fill from read pointer */
44 size_t size
; /* that's actually more like a safe size, after we have more than that, flush it */
50 int encsize
; /* Size of one sample in bytes, plain int should be fine here... */
55 void invalidate_format(struct audioformat
*af
);
57 struct mpg123_pars_struct
59 int verbose
; /* verbose level */
60 long flags
; /* combination of above */
65 int rva
; /* (which) rva to do: 0: nothing, 1: radio/mix/track 2: album/audiophile */
69 #define NUM_CHANNELS 2
70 char audio_caps
[NUM_CHANNELS
][MPG123_RATES
+1][MPG123_ENCODINGS
];
71 /* long start_frame; */ /* frame offset to begin with */
72 /* long frame_number;*/ /* number of frames to decode */
78 long index_size
; /* Long, because: negative values have a meaning. */
84 /* There is a lot to condense here... many ints can be merged as flags; though the main space is still consumed by buffers. */
85 struct mpg123_handle_struct
87 int fresh
; /* to be moved into flags */
89 real hybrid_block
[2][2][SBLIMIT
*SSLIMIT
];
91 /* the scratch vars for the decoders, sometimes real, sometimes short... sometimes int/long */
92 short *short_buffs
[2][2];
93 real
*real_buffs
[2][2];
94 unsigned char *rawbuffs
;
99 int bo
; /* Just have it always here. */
104 unsigned char* rawdecwin
; /* the block with all decwins */
105 int rawdecwins
; /* size of rawdecwin memory */
106 real
*decwin
; /* _the_ decode table */
108 /* I am not really sure that I need both of them... used in assembler */
112 int have_eq_settings
;
113 real equalizer
[2][32];
115 /* for halfspeed mode */
116 unsigned char ssave
[34];
119 /* a raw buffer and a pointer into the middle for signed short conversion, only allocated on demand */
120 unsigned char *conv16to8_buf
;
121 unsigned char *conv16to8
;
123 /* There's some possible memory saving for stuff that is not _really_ dynamic. */
126 int longLimit
[9][23];
127 int shortLimit
[9][14];
128 real gainpow2
[256+118+4]; /* not really dynamic, just different for mmx */
131 real muls
[27][64]; /* also used by layer 1 */
135 unsigned long ntom_val
[2];
136 unsigned long ntom_step
;
138 /* special i486 fun */
140 int *int_buffs
[2][2];
142 /* special altivec... */
144 real
*areal_buffs
[4][4];
146 struct synth_s synths
;
152 #if (defined OPT_3DNOW || defined OPT_3DNOWEXT)
153 void (*the_dct36
)(real
*,real
*,real
*,real
*,real
*);
162 int verbose
; /* 0: nothing, 1: just print chosen decoder, 2: be verbose */
164 const struct al_table
*alloc
;
165 /* The runtime-chosen decoding, based on input and output format. */
167 func_synth_stereo synth_stereo
;
168 func_synth_mono synth_mono
;
169 /* Yes, this function is runtime-switched, too. */
170 void (*make_decode_tables
)(mpg123_handle
*fr
); /* That is the volume control. */
172 int stereo
; /* I _think_ 1 for mono and 2 for stereo */
174 #define SINGLE_STEREO -1
175 #define SINGLE_LEFT 0
176 #define SINGLE_RIGHT 1
180 int down_sample_sblimit
;
181 int lsf
; /* 0: MPEG 1.0; 1: MPEG 2.0/2.5 -- both used as bool and array index! */
182 /* Many flags in disguise as integers... wasting bytes. */
187 int (*do_layer
)(mpg123_handle
*);
188 int error_protection
;
190 int sampling_frequency
;
198 int framesize
; /* computed framesize */
199 int freesize
; /* free format frame size */
200 enum mpg123_vbr vbr
; /* 1 if variable bitrate was detected */
201 off_t num
; /* frame offset ... */
202 off_t playnum
; /* playback offset... includes repetitions, reset at seeks */
203 off_t audio_start
; /* The byte offset in the file where audio data begins. */
204 char accurate
; /* Flag to see if we trust the frame number. */
205 char silent_resync
; /* Do not complain for the next n resyncs. */
206 unsigned char* xing_toc
; /* The seek TOC from Xing header. */
208 long freeformat_framesize
;
210 /* bitstream info; bsi */
212 unsigned char *wordpointer
;
213 /* temporary storage for getbits stuff */
217 /* rva data, used in common.c, set in id3.c */
219 double maxoutburst
; /* The maximum amplitude in current sample represenation. */
231 double mean_framesize
;
235 unsigned int bitreservoir
;
236 unsigned char bsspace
[2][MAXFRAMESIZE
+512]; /* MAXFRAMESIZE */
237 unsigned char *bsbuf
;
238 unsigned char *bsbufold
;
240 unsigned long oldhead
;
241 unsigned long firsthead
;
244 struct frame_index index
;
248 struct outbuffer buffer
;
249 struct audioformat af
;
251 size_t outblock
; /* number of bytes that this frame produces (upper bound) */
252 int to_decode
; /* this frame holds data to be decoded */
253 int to_ignore
; /* the same, somehow */
254 off_t firstframe
; /* start decoding from here */
255 off_t lastframe
; /* last frame to decode (for gapless or num_frames limit) */
256 off_t ignoreframe
; /* frames to decode but discard before firstframe */
258 off_t firstoff
; /* number of samples to ignore from firstframe */
259 off_t lastoff
; /* number of samples to use from lastframe */
260 off_t begin_s
; /* overall begin offset in samples */
262 off_t end_s
; /* overall end offset in samples */
265 unsigned int crc
; /* Well, I need a safe 16bit type, actually. But wider doesn't hurt. */
266 struct reader
*rd
; /* pointer to the reading functions */
267 struct reader_data rdat
; /* reader data and state info */
268 struct mpg123_pars_struct p
;
275 unsigned char id3buf
[128];
283 More variables needed for decoders, layerX.c.
284 This time it is not about static variables but about the need for alignment which cannot be guaranteed on the stack by certain compilers (Sun Studio).
285 We do not require the compiler to align stuff for our hand-written assembly. We only hope that it's able to align stuff for SSE and similar ops it generates itself.
288 Those layer-specific structs could actually share memory, as they are not in use simultaneously. One might allocate on decoder switch, too.
289 They all reside in one lump of memory (after each other), allocated to layerscratch.
295 real (*fraction
)[SBLIMIT
]; /* ALIGNED(16) real fraction[2][SBLIMIT]; */
301 real (*fraction
)[4][SBLIMIT
]; /* ALIGNED(16) real fraction[2][4][SBLIMIT] */
305 /* These are significant chunks of memory already... */
308 real (*hybrid_in
)[SBLIMIT
][SSLIMIT
]; /* ALIGNED(16) real hybridIn[2][SBLIMIT][SSLIMIT]; */
309 real (*hybrid_out
)[SSLIMIT
][SBLIMIT
]; /* ALIGNED(16) real hybridOut[2][SSLIMIT][SBLIMIT]; */
312 /* A place for storing additional data for the large file wrapper.
315 /* A callback used to properly destruct the wrapper data. */
316 void (*wrapperclean
)(void*);
319 /* generic init, does not include dynamic buffers */
320 void frame_init(mpg123_handle
*fr
);
321 void frame_init_par(mpg123_handle
*fr
, mpg123_pars
*mp
);
322 /* output buffer and format */
323 int frame_outbuffer(mpg123_handle
*fr
);
324 int frame_output_format(mpg123_handle
*fr
);
326 int frame_buffers(mpg123_handle
*fr
); /* various decoder buffers, needed once */
327 int frame_reset(mpg123_handle
* fr
); /* reset for next track */
328 int frame_buffers_reset(mpg123_handle
*fr
);
329 void frame_exit(mpg123_handle
*fr
); /* end, free all buffers */
331 /* Index functions... */
332 /* Well... print it... */
333 int mpg123_print_index(mpg123_handle
*fr
, FILE* out
);
334 /* Find a seek position in index. */
335 off_t
frame_index_find(mpg123_handle
*fr
, off_t want_frame
, off_t
* get_frame
);
336 /* Apply index_size setting. */
337 int frame_index_setup(mpg123_handle
*fr
);
339 void do_volume(mpg123_handle
*fr
, double factor
);
340 void do_rva(mpg123_handle
*fr
);
342 /* samples per frame ...
359 #define spf(fr) ((fr)->lay == 1 ? 384 : ((fr)->lay==2 ? 1152 : ((fr)->lsf || (fr)->mpeg25 ? 576 : 1152)))
362 /* well, I take that one for granted... at least layer3 */
363 #define GAPLESS_DELAY 529
364 /* still fine-tuning the "real music" window... see read_frame */
365 void frame_gapless_init(mpg123_handle
*fr
, off_t b
, off_t e
);
366 void frame_gapless_realinit(mpg123_handle
*fr
);
367 void frame_gapless_update(mpg123_handle
*mh
, off_t total_samples
);
368 /*void frame_gapless_position(mpg123_handle* fr);
369 void frame_gapless_bytify(mpg123_handle *fr);
370 void frame_gapless_ignore(mpg123_handle *fr, off_t frames);*/
371 /* void frame_gapless_buffercheck(mpg123_handle *fr); */
374 /* Number of samples the decoding of the current frame should yield. */
375 off_t
frame_expect_outsamples(mpg123_handle
*fr
);
377 /* Skip this frame... do some fake action to get away without actually decoding it. */
378 void frame_skip(mpg123_handle
*fr
);
381 Seeking core functions:
382 - convert input sample offset to output sample offset
383 - convert frame offset to output sample offset
384 - get leading frame offset for output sample offset
385 The offsets are "unadjusted"/internal; resampling is being taken care of.
387 off_t
frame_ins2outs(mpg123_handle
*fr
, off_t ins
);
388 off_t
frame_outs(mpg123_handle
*fr
, off_t num
);
389 /* This one just computes the expected sample count for _this_ frame. */
390 off_t
frame_expect_outsampels(mpg123_handle
*fr
);
391 off_t
frame_offset(mpg123_handle
*fr
, off_t outs
);
392 void frame_set_frameseek(mpg123_handle
*fr
, off_t fe
);
393 void frame_set_seek(mpg123_handle
*fr
, off_t sp
);
394 off_t
frame_tell_seek(mpg123_handle
*fr
);
395 /* Take a copy of the Xing VBR TOC for fuzzy seeking. */
396 int frame_fill_toc(mpg123_handle
*fr
, unsigned char* in
);
399 /* adjust volume to current outscale and rva values if wanted */
400 void do_rva(mpg123_handle
*fr
);