Rev 1905 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1905 | serge | 1 | #ifndef MPG123_H_INDEX |
2 | #define MPG123_H_INDEX |
||
3 | |||
4 | /* |
||
5 | index: frame index data structure and functions |
||
6 | |||
7 | This is for keeping track of frame positions for accurate seeking. |
||
8 | Now in it's own file, with initial code from frame.c and parse.c . |
||
9 | |||
10 | The idea of the index with a certain amount of entries is to cover |
||
11 | all yet-encountered frame positions with minimal coarseness. |
||
12 | Meaning: At first every frame position is recorded, then, when |
||
13 | the index is full, every second position is trown away to make |
||
14 | space. Next time it is full, the same happens. And so on. |
||
15 | In this manner we maintain a good resolution with the given |
||
16 | maximum index size while covering the whole stream. |
||
17 | |||
18 | copyright 2007-8 by the mpg123 project - free software under the terms of the LGPL 2.1 |
||
19 | see COPYING and AUTHORS files in distribution or http://mpg123.org |
||
20 | initially written by Thomas Orgis |
||
21 | */ |
||
22 | |||
23 | #include "config.h" |
||
24 | #include "compat.h" |
||
25 | |||
26 | struct frame_index |
||
27 | { |
||
28 | off_t *data; /* actual data, the frame positions */ |
||
29 | off_t step; /* advancement in frame number per index point */ |
||
30 | off_t next; /* frame offset supposed to come next into the index */ |
||
31 | size_t size; /* total number of possible entries */ |
||
32 | size_t fill; /* number of used entries */ |
||
33 | size_t grow_size; /* if > 0: index allowed to grow on need with these steps, instead of lowering resolution */ |
||
34 | }; |
||
35 | |||
36 | /* The condition for a framenum to be appended to the index. |
||
37 | if(FI_NEXT(fr->index, fr->num)) fi_add(offset); */ |
||
38 | #define FI_NEXT(fi, framenum) ((fi).size && framenum == (fi).next) |
||
39 | |||
40 | /* Initialize stuff, set things to zero and NULL... */ |
||
41 | void fi_init(struct frame_index *fi); |
||
42 | /* Deallocate/zero things. */ |
||
43 | void fi_exit(struct frame_index *fi); |
||
44 | |||
45 | /* Prepare a given size, preserving current fill, if possible. |
||
46 | If the new size is smaller than fill, the entry density is reduced. |
||
47 | Return 0 on success. */ |
||
48 | int fi_resize(struct frame_index *fi, size_t newsize); |
||
49 | |||
50 | /* Append a frame position, reducing index density if needed. */ |
||
51 | void fi_add(struct frame_index *fi, off_t pos); |
||
52 | |||
3960 | Serge | 53 | /* Replace the frame index */ |
54 | int fi_set(struct frame_index *fi, off_t *offsets, off_t step, size_t fill); |
||
55 | |||
1905 | serge | 56 | /* Empty the index (setting fill=0 and step=1), but keep current size. */ |
57 | void fi_reset(struct frame_index *fi); |
||
58 | |||
59 | #endif |