FFmpeg
Loading...
Searching...
No Matches
container_fifo.c
Go to the documentation of this file.
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#include "avassert.h"
20#include "container_fifo.h"
21#include "error.h"
22#include "fifo.h"
23#include "frame.h"
24#include "mem.h"
25#include "refstruct.h"
26
30
31 void *opaque;
32 void* (*container_alloc)(void *opaque);
33 void (*container_reset)(void *opaque, void *obj);
34 void (*container_free) (void *opaque, void *obj);
35 int (*fifo_transfer) (void *opaque, void *dst, void *src, unsigned flags);
36
37};
38
39static int container_fifo_init_entry(AVRefStructOpaque opaque, void *obj)
40{
41 AVContainerFifo *cf = opaque.nc;
42 void **pobj = obj;
43
44 *pobj = cf->container_alloc(cf->opaque);
45 if (!*pobj)
46 return AVERROR(ENOMEM);
47
48 return 0;
49}
50
51static void container_fifo_reset_entry(AVRefStructOpaque opaque, void *obj)
52{
53 AVContainerFifo *cf = opaque.nc;
54 cf->container_reset(cf->opaque, *(void**)obj);
55}
56
57static void container_fifo_free_entry(AVRefStructOpaque opaque, void *obj)
58{
59 AVContainerFifo *cf = opaque.nc;
60 cf->container_free(cf->opaque, *(void**)obj);
61}
62
65 void* (*container_alloc)(void *opaque),
66 void (*container_reset)(void *opaque, void *obj),
67 void (*container_free) (void *opaque, void *obj),
68 int (*fifo_transfer) (void *opaque, void *dst, void *src, unsigned flags),
69 unsigned flags)
70{
72
73 cf = av_mallocz(sizeof(*cf));
74 if (!cf)
75 return NULL;
76
77 cf->opaque = opaque;
78 cf->container_alloc = container_alloc;
79 cf->container_reset = container_reset;
80 cf->container_free = container_free;
81 cf->fifo_transfer = fifo_transfer;
82
83 cf->fifo = av_fifo_alloc2(1, sizeof(void*), AV_FIFO_FLAG_AUTO_GROW);
84 if (!cf->fifo)
85 goto fail;
86
87 cf->pool = av_refstruct_pool_alloc_ext(sizeof(void*), 0, cf,
91 NULL);
92 if (!cf->pool)
93 goto fail;
94
95 return cf;
96fail:
98 return NULL;
99}
100
102{
103 AVContainerFifo *cf;
104
105 if (!*pcf)
106 return;
107
108 cf = *pcf;
109
110 if (cf->fifo) {
111 void *obj;
112 while (av_fifo_read(cf->fifo, &obj, 1) >= 0)
113 av_refstruct_unref(&obj);
114 av_fifo_freep2(&cf->fifo);
115 }
116
118
119 av_freep(pcf);
120}
121
122int av_container_fifo_read(AVContainerFifo *cf, void *obj, unsigned flags)
123{
124 void **psrc;
125 int ret;
126
127 ret = av_fifo_read(cf->fifo, &psrc, 1);
128 if (ret < 0)
129 return ret;
130
131 ret = cf->fifo_transfer(cf->opaque, obj, *psrc, flags);
132 av_refstruct_unref(&psrc);
133
134 return ret;
135}
136
137int av_container_fifo_peek(AVContainerFifo *cf, void **pdst, size_t offset)
138{
139 void **pobj;
140 int ret;
141
142 ret = av_fifo_peek(cf->fifo, &pobj, 1, offset);
143 if (ret < 0)
144 return ret;
145
146 *pdst = *pobj;
147
148 return 0;
149}
150
151void av_container_fifo_drain(AVContainerFifo *cf, size_t nb_elems)
152{
153 av_assert0(nb_elems <= av_fifo_can_read(cf->fifo));
154 while (nb_elems--) {
155 void **pobj;
156 int ret = av_fifo_read(cf->fifo, &pobj, 1);
157 av_assert0(ret >= 0);
158 av_refstruct_unref(&pobj);
159 }
160}
161
162int av_container_fifo_write(AVContainerFifo *cf, void *obj, unsigned flags)
163{
164 void **pdst;
165 int ret;
166
167 pdst = av_refstruct_pool_get(cf->pool);
168 if (!pdst)
169 return AVERROR(ENOMEM);
170
171 ret = cf->fifo_transfer(cf->opaque, *pdst, obj, flags);
172 if (ret < 0)
173 goto fail;
174
175 ret = av_fifo_write(cf->fifo, &pdst, 1);
176 if (ret < 0)
177 goto fail;
178
179 return 0;
180fail:
181 av_refstruct_unref(&pdst);
182 return ret;
183}
184
186{
187 return av_fifo_can_read(cf->fifo);
188}
189
190static void *frame_alloc(void *opaque)
191{
192 return av_frame_alloc();
193}
194
195static void frame_reset(void *opaque, void *obj)
196{
197 av_frame_unref(obj);
198}
199
200static void frame_free(void *opaque, void *obj)
201{
202 AVFrame *frame = obj;
204}
205
206static int frame_transfer(void *opaque, void *dst, void *src, unsigned flags)
207{
209 return av_frame_ref(dst, src);
210
212 return 0;
213}
214
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
#define flags(name, subs,...)
Definition cbs_h264.c:74
static void frame_reset(void *opaque, void *obj)
static void container_fifo_free_entry(AVRefStructOpaque opaque, void *obj)
static void * frame_alloc(void *opaque)
int av_container_fifo_write(AVContainerFifo *cf, void *obj, unsigned flags)
Write the contents of obj to the FIFO.
static int frame_transfer(void *opaque, void *dst, void *src, unsigned flags)
void av_container_fifo_drain(AVContainerFifo *cf, size_t nb_elems)
Discard the specified number of elements from the FIFO.
void av_container_fifo_free(AVContainerFifo **pcf)
Free a AVContainerFifo and everything in it.
static void container_fifo_reset_entry(AVRefStructOpaque opaque, void *obj)
static void frame_free(void *opaque, void *obj)
AVContainerFifo * av_container_fifo_alloc(void *opaque, void *(*container_alloc)(void *opaque), void(*container_reset)(void *opaque, void *obj), void(*container_free)(void *opaque, void *obj), int(*fifo_transfer)(void *opaque, void *dst, void *src, unsigned flags), unsigned flags)
Allocate a new AVContainerFifo for the container type defined by provided callbacks.
int av_container_fifo_peek(AVContainerFifo *cf, void **pdst, size_t offset)
Access objects stored in the FIFO without retrieving them.
static int container_fifo_init_entry(AVRefStructOpaque opaque, void *obj)
int av_container_fifo_read(AVContainerFifo *cf, void *obj, unsigned flags)
Read the next available object from the FIFO into obj.
size_t av_container_fifo_can_read(const AVContainerFifo *cf)
AVContainerFifo * av_container_fifo_alloc_avframe(unsigned flags)
Allocate an AVContainerFifo instance for AVFrames.
@ AV_CONTAINER_FIFO_FLAG_REF
Signal to av_container_fifo_write() that it should make a new reference to data in src rather than co...
#define NULL
Definition coverity.c:32
static AVFrame * frame
error code definitions
A generic FIFO API.
reference-counted frame API
#define fail
Definition test.h:479
#define AVERROR(e)
Definition error.h:45
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.
Definition fifo.c:47
void av_fifo_freep2(AVFifo **f)
Free an AVFifo and reset pointer to NULL.
Definition fifo.c:286
#define AV_FIFO_FLAG_AUTO_GROW
Automatically resize the FIFO on writes, so that the data fits.
Definition fifo.h:63
size_t av_fifo_can_read(const AVFifo *f)
Definition fifo.c:87
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.
Definition fifo.c:255
int av_fifo_write(AVFifo *f, const void *buf, size_t nb_elems)
Write data into a FIFO.
Definition fifo.c:188
int av_fifo_read(AVFifo *f, void *buf, size_t nb_elems)
Read data from a FIFO.
Definition fifo.c:240
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition frame.c:496
void av_frame_move_ref(AVFrame *dst, AVFrame *src)
Move everything contained in src to dst and reset src.
Definition frame.c:523
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
Definition frame.c:278
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition frame.c:64
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition frame.c:52
unsigned offset
Definition libaomenc.c:763
Memory handling functions.
static mfxStatus frame_alloc(mfxHDL pthis, mfxFrameAllocRequest *req, mfxFrameAllocResponse *resp)
Definition qsvvpp.c:176
static mfxStatus frame_free(mfxHDL pthis, mfxFrameAllocResponse *resp)
Definition qsvvpp.c:210
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
Definition refstruct.c:120
void * av_refstruct_pool_get(AVRefStructPool *pool)
Get an object from the pool, reusing an old one from the pool when available.
Definition refstruct.c:297
static void av_refstruct_pool_uninit(AVRefStructPool **poolp)
Mark the pool as being available for freeing.
Definition refstruct.h:292
static AVRefStructPool * av_refstruct_pool_alloc_ext(size_t size, unsigned flags, void *opaque, int(*init_cb)(AVRefStructOpaque opaque, void *obj), void(*reset_cb)(AVRefStructOpaque opaque, void *obj), void(*free_entry_cb)(AVRefStructOpaque opaque, void *obj), void(*free_cb)(AVRefStructOpaque opaque))
A wrapper around av_refstruct_pool_alloc_ext_c() for the common case of a non-const qualified opaque.
Definition refstruct.h:258
AVContainerFifo is a FIFO for "containers" - dynamically allocated reusable structs (e....
int(* fifo_transfer)(void *opaque, void *dst, void *src, unsigned flags)
void(* container_reset)(void *opaque, void *obj)
void *(* container_alloc)(void *opaque)
void(* container_free)(void *opaque, void *obj)
AVRefStructPool * pool
Definition fifo.c:35
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
AVRefStructPool is an API for a thread-safe pool of objects managed via the RefStruct API.
Definition refstruct.c:183
#define av_mallocz(s)
#define av_freep(p)
#define src
Definition vp8dsp.c:248
RefStruct is an API for creating reference-counted objects with minimal overhead.
Definition refstruct.h:58