blob: dc7bc6f0dd7925a6c0e94847d537fa62164a4639
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 <stdint.h> |
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 | * Initialize an AVFifoBuffer. |
46 | * @param nmemb number of elements |
47 | * @param size size of the single element |
48 | * @return AVFifoBuffer or NULL in case of memory allocation failure |
49 | */ |
50 | AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size); |
51 | |
52 | /** |
53 | * Free an AVFifoBuffer. |
54 | * @param f AVFifoBuffer to free |
55 | */ |
56 | void av_fifo_free(AVFifoBuffer *f); |
57 | |
58 | /** |
59 | * Free an AVFifoBuffer and reset pointer to NULL. |
60 | * @param f AVFifoBuffer to free |
61 | */ |
62 | void av_fifo_freep(AVFifoBuffer **f); |
63 | |
64 | /** |
65 | * Reset the AVFifoBuffer to the state right after av_fifo_alloc, in particular it is emptied. |
66 | * @param f AVFifoBuffer to reset |
67 | */ |
68 | void av_fifo_reset(AVFifoBuffer *f); |
69 | |
70 | /** |
71 | * Return the amount of data in bytes in the AVFifoBuffer, that is the |
72 | * amount of data you can read from it. |
73 | * @param f AVFifoBuffer to read from |
74 | * @return size |
75 | */ |
76 | int av_fifo_size(const AVFifoBuffer *f); |
77 | |
78 | /** |
79 | * Return the amount of space in bytes in the AVFifoBuffer, that is the |
80 | * amount of data you can write into it. |
81 | * @param f AVFifoBuffer to write into |
82 | * @return size |
83 | */ |
84 | int av_fifo_space(const AVFifoBuffer *f); |
85 | |
86 | /** |
87 | * Feed data at specific position from an AVFifoBuffer to a user-supplied callback. |
88 | * Similar as av_fifo_gereric_read but without discarding data. |
89 | * @param f AVFifoBuffer to read from |
90 | * @param offset offset from current read position |
91 | * @param buf_size number of bytes to read |
92 | * @param func generic read function |
93 | * @param dest data destination |
94 | */ |
95 | int av_fifo_generic_peek_at(AVFifoBuffer *f, void *dest, int offset, int buf_size, void (*func)(void*, void*, int)); |
96 | |
97 | /** |
98 | * Feed data from an AVFifoBuffer to a user-supplied callback. |
99 | * Similar as av_fifo_gereric_read but without discarding data. |
100 | * @param f AVFifoBuffer to read from |
101 | * @param buf_size number of bytes to read |
102 | * @param func generic read function |
103 | * @param dest data destination |
104 | */ |
105 | int av_fifo_generic_peek(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)); |
106 | |
107 | /** |
108 | * Feed data from an AVFifoBuffer to a user-supplied callback. |
109 | * @param f AVFifoBuffer to read from |
110 | * @param buf_size number of bytes to read |
111 | * @param func generic read function |
112 | * @param dest data destination |
113 | */ |
114 | int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)); |
115 | |
116 | /** |
117 | * Feed data from a user-supplied callback to an AVFifoBuffer. |
118 | * @param f AVFifoBuffer to write to |
119 | * @param src data source; non-const since it may be used as a |
120 | * modifiable context by the function defined in func |
121 | * @param size number of bytes to write |
122 | * @param func generic write function; the first parameter is src, |
123 | * the second is dest_buf, the third is dest_buf_size. |
124 | * func must return the number of bytes written to dest_buf, or <= 0 to |
125 | * indicate no more data available to write. |
126 | * If func is NULL, src is interpreted as a simple byte array for source data. |
127 | * @return the number of bytes written to the FIFO |
128 | */ |
129 | int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)); |
130 | |
131 | /** |
132 | * Resize an AVFifoBuffer. |
133 | * In case of reallocation failure, the old FIFO is kept unchanged. |
134 | * |
135 | * @param f AVFifoBuffer to resize |
136 | * @param size new AVFifoBuffer size in bytes |
137 | * @return <0 for failure, >=0 otherwise |
138 | */ |
139 | int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size); |
140 | |
141 | /** |
142 | * Enlarge an AVFifoBuffer. |
143 | * In case of reallocation failure, the old FIFO is kept unchanged. |
144 | * The new fifo size may be larger than the requested size. |
145 | * |
146 | * @param f AVFifoBuffer to resize |
147 | * @param additional_space the amount of space in bytes to allocate in addition to av_fifo_size() |
148 | * @return <0 for failure, >=0 otherwise |
149 | */ |
150 | int av_fifo_grow(AVFifoBuffer *f, unsigned int additional_space); |
151 | |
152 | /** |
153 | * Read and discard the specified amount of data from an AVFifoBuffer. |
154 | * @param f AVFifoBuffer to read from |
155 | * @param size amount of data to read in bytes |
156 | */ |
157 | void av_fifo_drain(AVFifoBuffer *f, int size); |
158 | |
159 | /** |
160 | * Return a pointer to the data stored in a FIFO buffer at a certain offset. |
161 | * The FIFO buffer is not modified. |
162 | * |
163 | * @param f AVFifoBuffer to peek at, f must be non-NULL |
164 | * @param offs an offset in bytes, its absolute value must be less |
165 | * than the used buffer size or the returned pointer will |
166 | * point outside to the buffer data. |
167 | * The used buffer size can be checked with av_fifo_size(). |
168 | */ |
169 | static inline uint8_t *av_fifo_peek2(const AVFifoBuffer *f, int offs) |
170 | { |
171 | uint8_t *ptr = f->rptr + offs; |
172 | if (ptr >= f->end) |
173 | ptr = f->buffer + (ptr - f->end); |
174 | else if (ptr < f->buffer) |
175 | ptr = f->end - (f->buffer - ptr); |
176 | return ptr; |
177 | } |
178 | |
179 | #endif /* AVUTIL_FIFO_H */ |
180 |