Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4349 | Serge | 1 | /* |
2 | * This file is part of FFmpeg. |
||
3 | * |
||
4 | * FFmpeg is free software; you can redistribute it and/or |
||
5 | * modify it under the terms of the GNU Lesser General Public |
||
6 | * License as published by the Free Software Foundation; either |
||
7 | * version 2.1 of the License, or (at your option) any later version. |
||
8 | * |
||
9 | * FFmpeg is distributed in the hope that it will be useful, |
||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||
12 | * Lesser General Public License for more details. |
||
13 | * |
||
14 | * You should have received a copy of the GNU Lesser General Public |
||
15 | * License along with FFmpeg; if not, write to the Free Software |
||
16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||
17 | */ |
||
18 | |||
19 | /** |
||
20 | * @file |
||
21 | * a very simple circular buffer FIFO implementation |
||
22 | */ |
||
23 | |||
24 | #ifndef AVUTIL_FIFO_H |
||
25 | #define AVUTIL_FIFO_H |
||
26 | |||
27 | #include |
||
28 | #include "avutil.h" |
||
29 | #include "attributes.h" |
||
30 | |||
31 | typedef struct AVFifoBuffer { |
||
32 | uint8_t *buffer; |
||
33 | uint8_t *rptr, *wptr, *end; |
||
34 | uint32_t rndx, wndx; |
||
35 | } AVFifoBuffer; |
||
36 | |||
37 | /** |
||
38 | * Initialize an AVFifoBuffer. |
||
39 | * @param size of FIFO |
||
40 | * @return AVFifoBuffer or NULL in case of memory allocation failure |
||
41 | */ |
||
42 | AVFifoBuffer *av_fifo_alloc(unsigned int size); |
||
43 | |||
44 | /** |
||
45 | * Free an AVFifoBuffer. |
||
46 | * @param f AVFifoBuffer to free |
||
47 | */ |
||
48 | void av_fifo_free(AVFifoBuffer *f); |
||
49 | |||
50 | /** |
||
51 | * Reset the AVFifoBuffer to the state right after av_fifo_alloc, in particular it is emptied. |
||
52 | * @param f AVFifoBuffer to reset |
||
53 | */ |
||
54 | void av_fifo_reset(AVFifoBuffer *f); |
||
55 | |||
56 | /** |
||
57 | * Return the amount of data in bytes in the AVFifoBuffer, that is the |
||
58 | * amount of data you can read from it. |
||
59 | * @param f AVFifoBuffer to read from |
||
60 | * @return size |
||
61 | */ |
||
62 | int av_fifo_size(AVFifoBuffer *f); |
||
63 | |||
64 | /** |
||
65 | * Return the amount of space in bytes in the AVFifoBuffer, that is the |
||
66 | * amount of data you can write into it. |
||
67 | * @param f AVFifoBuffer to write into |
||
68 | * @return size |
||
69 | */ |
||
70 | int av_fifo_space(AVFifoBuffer *f); |
||
71 | |||
72 | /** |
||
73 | * Feed data from an AVFifoBuffer to a user-supplied callback. |
||
74 | * @param f AVFifoBuffer to read from |
||
75 | * @param buf_size number of bytes to read |
||
76 | * @param func generic read function |
||
77 | * @param dest data destination |
||
78 | */ |
||
79 | int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)); |
||
80 | |||
81 | /** |
||
82 | * Feed data from a user-supplied callback to an AVFifoBuffer. |
||
83 | * @param f AVFifoBuffer to write to |
||
84 | * @param src data source; non-const since it may be used as a |
||
85 | * modifiable context by the function defined in func |
||
86 | * @param size number of bytes to write |
||
87 | * @param func generic write function; the first parameter is src, |
||
88 | * the second is dest_buf, the third is dest_buf_size. |
||
89 | * func must return the number of bytes written to dest_buf, or <= 0 to |
||
90 | * indicate no more data available to write. |
||
91 | * If func is NULL, src is interpreted as a simple byte array for source data. |
||
92 | * @return the number of bytes written to the FIFO |
||
93 | */ |
||
94 | int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)); |
||
95 | |||
96 | /** |
||
97 | * Resize an AVFifoBuffer. |
||
98 | * In case of reallocation failure, the old FIFO is kept unchanged. |
||
99 | * |
||
100 | * @param f AVFifoBuffer to resize |
||
101 | * @param size new AVFifoBuffer size in bytes |
||
102 | * @return <0 for failure, >=0 otherwise |
||
103 | */ |
||
104 | int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size); |
||
105 | |||
106 | /** |
||
107 | * Enlarge an AVFifoBuffer. |
||
108 | * In case of reallocation failure, the old FIFO is kept unchanged. |
||
109 | * The new fifo size may be larger than the requested size. |
||
110 | * |
||
111 | * @param f AVFifoBuffer to resize |
||
112 | * @param additional_space the amount of space in bytes to allocate in addition to av_fifo_size() |
||
113 | * @return <0 for failure, >=0 otherwise |
||
114 | */ |
||
115 | int av_fifo_grow(AVFifoBuffer *f, unsigned int additional_space); |
||
116 | |||
117 | /** |
||
118 | * Read and discard the specified amount of data from an AVFifoBuffer. |
||
119 | * @param f AVFifoBuffer to read from |
||
120 | * @param size amount of data to read in bytes |
||
121 | */ |
||
122 | void av_fifo_drain(AVFifoBuffer *f, int size); |
||
123 | |||
124 | /** |
||
125 | * Return a pointer to the data stored in a FIFO buffer at a certain offset. |
||
126 | * The FIFO buffer is not modified. |
||
127 | * |
||
128 | * @param f AVFifoBuffer to peek at, f must be non-NULL |
||
129 | * @param offs an offset in bytes, its absolute value must be less |
||
130 | * than the used buffer size or the returned pointer will |
||
131 | * point outside to the buffer data. |
||
132 | * The used buffer size can be checked with av_fifo_size(). |
||
133 | */ |
||
134 | static inline uint8_t *av_fifo_peek2(const AVFifoBuffer *f, int offs) |
||
135 | { |
||
136 | uint8_t *ptr = f->rptr + offs; |
||
137 | if (ptr >= f->end) |
||
138 | ptr = f->buffer + (ptr - f->end); |
||
139 | else if (ptr < f->buffer) |
||
140 | ptr = f->end - (f->buffer - ptr); |
||
141 | return ptr; |
||
142 | } |
||
143 | |||
144 | #endif /* AVUTIL_FIFO_H */>0>0>=> |