FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavutil
buffer.h
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
/**
20
* @file
21
* @ingroup lavu_buffer
22
* refcounted data buffer API
23
*/
24
25
#ifndef AVUTIL_BUFFER_H
26
#define AVUTIL_BUFFER_H
27
28
#include <stdint.h>
29
30
/**
31
* @defgroup lavu_buffer AVBuffer
32
* @ingroup lavu_data
33
*
34
* @{
35
* AVBuffer is an API for reference-counted data buffers.
36
*
37
* There are two core objects in this API -- AVBuffer and AVBufferRef. AVBuffer
38
* represents the data buffer itself; it is opaque and not meant to be accessed
39
* by the caller directly, but only through AVBufferRef. However, the caller may
40
* e.g. compare two AVBuffer pointers to check whether two different references
41
* are describing the same data buffer. AVBufferRef represents a single
42
* reference to an AVBuffer and it is the object that may be manipulated by the
43
* caller directly.
44
*
45
* There are two functions provided for creating a new AVBuffer with a single
46
* reference -- av_buffer_alloc() to just allocate a new buffer, and
47
* av_buffer_create() to wrap an existing array in an AVBuffer. From an existing
48
* reference, additional references may be created with av_buffer_ref().
49
* Use av_buffer_unref() to free a reference (this will automatically free the
50
* data once all the references are freed).
51
*
52
* The convention throughout this API and the rest of FFmpeg is such that the
53
* buffer is considered writable if there exists only one reference to it (and
54
* it has not been marked as read-only). The av_buffer_is_writable() function is
55
* provided to check whether this is true and av_buffer_make_writable() will
56
* automatically create a new writable buffer when necessary.
57
* Of course nothing prevents the calling code from violating this convention,
58
* however that is safe only when all the existing references are under its
59
* control.
60
*
61
* @note Referencing and unreferencing the buffers is thread-safe and thus
62
* may be done from multiple threads simultaneously without any need for
63
* additional locking.
64
*
65
* @note Two different references to the same buffer can point to different
66
* parts of the buffer (i.e. their AVBufferRef.data will not be equal).
67
*/
68
69
/**
70
* A reference counted buffer type. It is opaque and is meant to be used through
71
* references (AVBufferRef).
72
*/
73
typedef
struct
AVBuffer
AVBuffer
;
74
75
/**
76
* A reference to a data buffer.
77
*
78
* The size of this struct is not a part of the public ABI and it is not meant
79
* to be allocated directly.
80
*/
81
typedef
struct
AVBufferRef
{
82
AVBuffer
*
buffer
;
83
84
/**
85
* The data buffer. It is considered writable if and only if
86
* this is the only reference to the buffer, in which case
87
* av_buffer_is_writable() returns 1.
88
*/
89
uint8_t
*
data
;
90
/**
91
* Size of data in bytes.
92
*/
93
int
size
;
94
}
AVBufferRef
;
95
96
/**
97
* Allocate an AVBuffer of the given size using av_malloc().
98
*
99
* @return an AVBufferRef of given size or NULL when out of memory
100
*/
101
AVBufferRef
*
av_buffer_alloc
(
int
size
);
102
103
/**
104
* Same as av_buffer_alloc(), except the returned buffer will be initialized
105
* to zero.
106
*/
107
AVBufferRef
*
av_buffer_allocz
(
int
size
);
108
109
/**
110
* Always treat the buffer as read-only, even when it has only one
111
* reference.
112
*/
113
#define AV_BUFFER_FLAG_READONLY (1 << 0)
114
115
/**
116
* Create an AVBuffer from an existing array.
117
*
118
* If this function is successful, data is owned by the AVBuffer. The caller may
119
* only access data through the returned AVBufferRef and references derived from
120
* it.
121
* If this function fails, data is left untouched.
122
* @param data data array
123
* @param size size of data in bytes
124
* @param free a callback for freeing this buffer's data
125
* @param opaque parameter to be got for processing or passed to free
126
* @param flags a combination of AV_BUFFER_FLAG_*
127
*
128
* @return an AVBufferRef referring to data on success, NULL on failure.
129
*/
130
AVBufferRef
*
av_buffer_create
(
uint8_t
*
data
,
int
size
,
131
void
(*free)(
void
*opaque,
uint8_t
*data),
132
void
*opaque,
int
flags
);
133
134
/**
135
* Default free callback, which calls av_free() on the buffer data.
136
* This function is meant to be passed to av_buffer_create(), not called
137
* directly.
138
*/
139
void
av_buffer_default_free
(
void
*opaque,
uint8_t
*data);
140
141
/**
142
* Create a new reference to an AVBuffer.
143
*
144
* @return a new AVBufferRef referring to the same AVBuffer as buf or NULL on
145
* failure.
146
*/
147
AVBufferRef
*
av_buffer_ref
(
AVBufferRef
*
buf
);
148
149
/**
150
* Free a given reference and automatically free the buffer if there are no more
151
* references to it.
152
*
153
* @param buf the reference to be freed. The pointer is set to NULL on return.
154
*/
155
void
av_buffer_unref
(
AVBufferRef
**
buf
);
156
157
/**
158
* @return 1 if the caller may write to the data referred to by buf (which is
159
* true if and only if buf is the only reference to the underlying AVBuffer).
160
* Return 0 otherwise.
161
* A positive answer is valid until av_buffer_ref() is called on buf.
162
*/
163
int
av_buffer_is_writable
(
const
AVBufferRef
*
buf
);
164
165
/**
166
* @return the opaque parameter set by av_buffer_create.
167
*/
168
void
*
av_buffer_get_opaque
(
const
AVBufferRef
*
buf
);
169
170
int
av_buffer_get_ref_count
(
const
AVBufferRef
*
buf
);
171
172
/**
173
* Create a writable reference from a given buffer reference, avoiding data copy
174
* if possible.
175
*
176
* @param buf buffer reference to make writable. On success, buf is either left
177
* untouched, or it is unreferenced and a new writable AVBufferRef is
178
* written in its place. On failure, buf is left untouched.
179
* @return 0 on success, a negative AVERROR on failure.
180
*/
181
int
av_buffer_make_writable
(
AVBufferRef
**
buf
);
182
183
/**
184
* Reallocate a given buffer.
185
*
186
* @param buf a buffer reference to reallocate. On success, buf will be
187
* unreferenced and a new reference with the required size will be
188
* written in its place. On failure buf will be left untouched. *buf
189
* may be NULL, then a new buffer is allocated.
190
* @param size required new buffer size.
191
* @return 0 on success, a negative AVERROR on failure.
192
*
193
* @note the buffer is actually reallocated with av_realloc() only if it was
194
* initially allocated through av_buffer_realloc(NULL) and there is only one
195
* reference to it (i.e. the one passed to this function). In all other cases
196
* a new buffer is allocated and the data is copied.
197
*/
198
int
av_buffer_realloc
(
AVBufferRef
**
buf
,
int
size);
199
200
/**
201
* @}
202
*/
203
204
/**
205
* @defgroup lavu_bufferpool AVBufferPool
206
* @ingroup lavu_data
207
*
208
* @{
209
* AVBufferPool is an API for a lock-free thread-safe pool of AVBuffers.
210
*
211
* Frequently allocating and freeing large buffers may be slow. AVBufferPool is
212
* meant to solve this in cases when the caller needs a set of buffers of the
213
* same size (the most obvious use case being buffers for raw video or audio
214
* frames).
215
*
216
* At the beginning, the user must call av_buffer_pool_init() to create the
217
* buffer pool. Then whenever a buffer is needed, call av_buffer_pool_get() to
218
* get a reference to a new buffer, similar to av_buffer_alloc(). This new
219
* reference works in all aspects the same way as the one created by
220
* av_buffer_alloc(). However, when the last reference to this buffer is
221
* unreferenced, it is returned to the pool instead of being freed and will be
222
* reused for subsequent av_buffer_pool_get() calls.
223
*
224
* When the caller is done with the pool and no longer needs to allocate any new
225
* buffers, av_buffer_pool_uninit() must be called to mark the pool as freeable.
226
* Once all the buffers are released, it will automatically be freed.
227
*
228
* Allocating and releasing buffers with this API is thread-safe as long as
229
* either the default alloc callback is used, or the user-supplied one is
230
* thread-safe.
231
*/
232
233
/**
234
* The buffer pool. This structure is opaque and not meant to be accessed
235
* directly. It is allocated with av_buffer_pool_init() and freed with
236
* av_buffer_pool_uninit().
237
*/
238
typedef
struct
AVBufferPool
AVBufferPool
;
239
240
/**
241
* Allocate and initialize a buffer pool.
242
*
243
* @param size size of each buffer in this pool
244
* @param alloc a function that will be used to allocate new buffers when the
245
* pool is empty. May be NULL, then the default allocator will be used
246
* (av_buffer_alloc()).
247
* @return newly created buffer pool on success, NULL on error.
248
*/
249
AVBufferPool
*
av_buffer_pool_init
(
int
size,
AVBufferRef
* (*
alloc
)(
int
size));
250
251
/**
252
* Mark the pool as being available for freeing. It will actually be freed only
253
* once all the allocated buffers associated with the pool are released. Thus it
254
* is safe to call this function while some of the allocated buffers are still
255
* in use.
256
*
257
* @param pool pointer to the pool to be freed. It will be set to NULL.
258
* @see av_buffer_pool_can_uninit()
259
*/
260
void
av_buffer_pool_uninit
(
AVBufferPool
**
pool
);
261
262
/**
263
* Allocate a new AVBuffer, reusing an old buffer from the pool when available.
264
* This function may be called simultaneously from multiple threads.
265
*
266
* @return a reference to the new buffer on success, NULL on error.
267
*/
268
AVBufferRef
*
av_buffer_pool_get
(
AVBufferPool
*
pool
);
269
270
/**
271
* @}
272
*/
273
274
#endif
/* AVUTIL_BUFFER_H */
Generated on Sat Jan 25 2014 19:52:06 for FFmpeg by
1.8.2