33#define AUTO_GROW_DEFAULT_BYTES (1024 * 1024)
67 f->nb_elems = nb_elems;
68 f->elem_size = elem_size;
79 f->auto_grow_limit = max_elems;
89 if (
f->offset_w <=
f->offset_r && !
f->is_empty)
90 return f->nb_elems -
f->offset_r +
f->offset_w;
91 return f->offset_w -
f->offset_r;
103 if (
inc > SIZE_MAX -
f->nb_elems)
113 if (
f->offset_w <=
f->offset_r && !
f->is_empty) {
115 memcpy(
tmp +
f->nb_elems *
f->elem_size,
tmp,
copy *
f->elem_size);
118 (
f->offset_w -
copy) *
f->elem_size);
132 const size_t need_grow = to_write > can_write ? to_write - can_write : 0;
138 can_grow =
f->auto_grow_limit >
f->nb_elems ?
139 f->auto_grow_limit -
f->nb_elems : 0;
142 const size_t inc = (need_grow < can_grow / 2 ) ? need_grow * 2 : can_grow;
152 size_t to_write = *nb_elems;
160 offset_w =
f->offset_w;
162 while (to_write > 0) {
163 size_t len =
FFMIN(
f->nb_elems - offset_w, to_write);
164 uint8_t *wptr =
f->buffer + offset_w *
f->elem_size;
168 if (ret < 0 ||
len == 0)
171 memcpy(wptr, buf,
len *
f->elem_size);
172 buf +=
len *
f->elem_size;
175 if (offset_w >=
f->nb_elems)
179 f->offset_w = offset_w;
181 if (*nb_elems != to_write)
183 *nb_elems -= to_write;
194 void *opaque,
size_t *nb_elems)
202 size_t to_read = *nb_elems;
203 size_t offset_r =
f->offset_r;
212 if (offset_r >=
f->nb_elems -
offset)
213 offset_r -=
f->nb_elems -
offset;
217 while (to_read > 0) {
218 size_t len =
FFMIN(
f->nb_elems - offset_r, to_read);
219 uint8_t *rptr =
f->buffer + offset_r *
f->elem_size;
223 if (ret < 0 ||
len == 0)
226 memcpy(buf, rptr,
len *
f->elem_size);
227 buf +=
len *
f->elem_size;
230 if (offset_r >=
f->nb_elems)
235 *nb_elems -= to_read;
248 void *opaque,
size_t *nb_elems)
261 size_t *nb_elems,
size_t offset)
271 if (cur_size ==
size)
274 if (
f->offset_r >=
f->nb_elems -
size)
275 f->offset_r -=
f->nb_elems -
size;
282 f->offset_r =
f->offset_w = 0;
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define flags(name, subs,...)
AVFifo * av_fifo_alloc2(size_t nb_elems, size_t elem_size, unsigned int flags)
Allocate and initialize an AVFifo with a given element size.
void av_fifo_freep2(AVFifo **f)
Free an AVFifo and reset pointer to NULL.
void av_fifo_reset2(AVFifo *f)
#define AV_FIFO_FLAG_AUTO_GROW
Automatically resize the FIFO on writes, so that the data fits.
size_t av_fifo_can_write(const AVFifo *f)
size_t av_fifo_can_read(const AVFifo *f)
int av_fifo_peek(const AVFifo *f, void *buf, size_t nb_elems, size_t offset)
Read data from a FIFO without modifying FIFO state.
int av_fifo_read_to_cb(AVFifo *f, AVFifoCB write_cb, void *opaque, size_t *nb_elems)
Feed data from a FIFO into a user-provided callback.
size_t av_fifo_elem_size(const AVFifo *f)
int av_fifo_write_from_cb(AVFifo *f, AVFifoCB read_cb, void *opaque, size_t *nb_elems)
Write data from a user-provided callback into a FIFO.
int av_fifo_grow2(AVFifo *f, size_t inc)
Enlarge an AVFifo.
int av_fifo_peek_to_cb(const AVFifo *f, AVFifoCB write_cb, void *opaque, size_t *nb_elems, size_t offset)
Feed data from a FIFO into a user-provided callback.
int AVFifoCB(void *opaque, void *buf, size_t *nb_elems)
Callback for writing or reading from a FIFO, passed to (and invoked from) the av_fifo_*_cb() function...
int av_fifo_write(AVFifo *f, const void *buf, size_t nb_elems)
Write data into a FIFO.
void av_fifo_auto_grow_limit(AVFifo *f, size_t max_elems)
Set the maximum size (in elements) to which the FIFO can be resized automatically.
void av_fifo_drain2(AVFifo *f, size_t size)
Discard the specified amount of data from an AVFifo.
int av_fifo_read(AVFifo *f, void *buf, size_t nb_elems)
Read data from a FIFO.
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
#define AUTO_GROW_DEFAULT_BYTES
static int fifo_check_space(AVFifo *f, size_t to_write)
static int fifo_peek_common(const AVFifo *f, uint8_t *buf, size_t *nb_elems, size_t offset, AVFifoCB write_cb, void *opaque)
static int fifo_write_common(AVFifo *f, const uint8_t *buf, size_t *nb_elems, AVFifoCB read_cb, void *opaque)
static int write_cb(void *opaque, void *buf, size_t *nb_elems)
static int read_cb(void *opaque, void *buf, size_t *nb_elems)
Utility Preprocessor macros.
Memory handling functions.
static int inc(int num, int period)
static void copy(const float *p1, float *p2, const int length)