buffer.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  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. * @file
  20. * @ingroup lavu_buffer
  21. * refcounted data buffer API
  22. */
  23. #ifndef AVUTIL_BUFFER_H
  24. #define AVUTIL_BUFFER_H
  25. #include <stddef.h>
  26. #include <stdint.h>
  27. /**
  28. * @defgroup lavu_buffer AVBuffer
  29. * @ingroup lavu_data
  30. *
  31. * @{
  32. * AVBuffer是一个用于引用计数数据缓冲区的API。
  33. *
  34. * There are two core objects in this API -- AVBuffer and AVBufferRef. AVBuffer
  35. * represents the data buffer itself; it is opaque and not meant to be accessed
  36. * by the caller directly, but only through AVBufferRef. However, the caller may
  37. * e.g. compare two AVBuffer pointers to check whether two different references
  38. * are describing the same data buffer. AVBufferRef represents a single
  39. * reference to an AVBuffer and it is the object that may be manipulated by the
  40. * caller directly.
  41. *
  42. * There are two functions provided for creating a new AVBuffer with a single
  43. * reference -- av_buffer_alloc() to just allocate a new buffer, and
  44. * av_buffer_create() to wrap an existing array in an AVBuffer. From an existing
  45. * reference, additional references may be created with av_buffer_ref().
  46. * Use av_buffer_unref() to free a reference (this will automatically free the
  47. * data once all the references are freed).
  48. *
  49. * The convention throughout this API and the rest of FFmpeg is such that the
  50. * buffer is considered writable if there exists only one reference to it (and
  51. * it has not been marked as read-only). The av_buffer_is_writable() function is
  52. * provided to check whether this is true and av_buffer_make_writable() will
  53. * automatically create a new writable buffer when necessary.
  54. * Of course nothing prevents the calling code from violating this convention,
  55. * however that is safe only when all the existing references are under its
  56. * control.
  57. *
  58. * @note Referencing and unreferencing the buffers is thread-safe and thus
  59. * may be done from multiple threads simultaneously without any need for
  60. * additional locking.
  61. *
  62. * @note Two different references to the same buffer can point to different
  63. * parts of the buffer (i.e. their AVBufferRef.data will not be equal).
  64. */
  65. /**
  66. * 引用计数缓冲区类型。它是不透明的,意在通过引用(AVBufferRef)使用。
  67. */
  68. typedef struct AVBuffer AVBuffer;
  69. /**
  70. * 对数据缓冲区的引用。
  71. *
  72. * 这个结构的大小不是公共ABI的一部分,也不是直接分配的。
  73. */
  74. typedef struct AVBufferRef {
  75. AVBuffer *buffer;
  76. /**
  77. * The data buffer. It is considered writable if and only if
  78. * this is the only reference to the buffer, in which case
  79. * av_buffer_is_writable() returns 1.
  80. */
  81. uint8_t *data;
  82. /**
  83. * Size of data in bytes.
  84. */
  85. size_t size;
  86. } AVBufferRef;
  87. /**
  88. * Allocate an AVBuffer of the given size using av_malloc().
  89. *
  90. * @return an AVBufferRef of given size or NULL when out of memory
  91. */
  92. AVBufferRef *av_buffer_alloc(size_t size);
  93. /**
  94. * Same as av_buffer_alloc(), except the returned buffer will be initialized
  95. * to zero.
  96. */
  97. AVBufferRef *av_buffer_allocz(size_t size);
  98. /**
  99. * Always treat the buffer as read-only, even when it has only one
  100. * reference.
  101. */
  102. #define AV_BUFFER_FLAG_READONLY (1 << 0)
  103. /**
  104. * Create an AVBuffer from an existing array.
  105. *
  106. * If this function is successful, data is owned by the AVBuffer. The caller may
  107. * only access data through the returned AVBufferRef and references derived from
  108. * it.
  109. * If this function fails, data is left untouched.
  110. * @param data data array
  111. * @param size size of data in bytes
  112. * @param free a callback for freeing this buffer's data
  113. * @param opaque parameter to be got for processing or passed to free
  114. * @param flags a combination of AV_BUFFER_FLAG_*
  115. *
  116. * @return an AVBufferRef referring to data on success, NULL on failure.
  117. */
  118. AVBufferRef *av_buffer_create(uint8_t *data, size_t size,
  119. void (*free)(void *opaque, uint8_t *data),
  120. void *opaque, int flags);
  121. /**
  122. * Default free callback, which calls av_free() on the buffer data.
  123. * This function is meant to be passed to av_buffer_create(), not called
  124. * directly.
  125. */
  126. void av_buffer_default_free(void *opaque, uint8_t *data);
  127. /**
  128. * 创建一个对AVBuffer的新引用。
  129. *
  130. * @return 一个新的AVBufferRef引用与buf相同的AVBuff或失败时为NULL。
  131. */
  132. AVBufferRef *av_buffer_ref(const AVBufferRef *buf);
  133. /**
  134. * 释放一个给定的引用,如果没有更多的引用,则自动释放缓冲区。
  135. *
  136. * @param buf the reference to be freed. The pointer is set to NULL on return.
  137. */
  138. void av_buffer_unref(AVBufferRef **buf);
  139. /**
  140. * @return 1 if the caller may write to the data referred to by buf (which is
  141. * true if and only if buf is the only reference to the underlying AVBuffer).
  142. * Return 0 otherwise.
  143. * A positive answer is valid until av_buffer_ref() is called on buf.
  144. */
  145. int av_buffer_is_writable(const AVBufferRef *buf);
  146. /**
  147. * @return the opaque parameter set by av_buffer_create.
  148. */
  149. void *av_buffer_get_opaque(const AVBufferRef *buf);
  150. int av_buffer_get_ref_count(const AVBufferRef *buf);
  151. /**
  152. * Create a writable reference from a given buffer reference, avoiding data copy
  153. * if possible.
  154. *
  155. * @param buf buffer reference to make writable. On success, buf is either left
  156. * untouched, or it is unreferenced and a new writable AVBufferRef is
  157. * written in its place. On failure, buf is left untouched.
  158. * @return 0 on success, a negative AVERROR on failure.
  159. */
  160. int av_buffer_make_writable(AVBufferRef **buf);
  161. /**
  162. * Reallocate a given buffer.
  163. *
  164. * @param buf a buffer reference to reallocate. On success, buf will be
  165. * unreferenced and a new reference with the required size will be
  166. * written in its place. On failure buf will be left untouched. *buf
  167. * may be NULL, then a new buffer is allocated.
  168. * @param size required new buffer size.
  169. * @return 0 on success, a negative AVERROR on failure.
  170. *
  171. * @note the buffer is actually reallocated with av_realloc() only if it was
  172. * initially allocated through av_buffer_realloc(NULL) and there is only one
  173. * reference to it (i.e. the one passed to this function). In all other cases
  174. * a new buffer is allocated and the data is copied.
  175. */
  176. int av_buffer_realloc(AVBufferRef **buf, size_t size);
  177. /**
  178. * Ensure dst refers to the same data as src.
  179. *
  180. * When *dst is already equivalent to src, do nothing. Otherwise unreference dst
  181. * and replace it with a new reference to src.
  182. *
  183. * @param dst Pointer to either a valid buffer reference or NULL. On success,
  184. * this will point to a buffer reference equivalent to src. On
  185. * failure, dst will be left untouched.
  186. * @param src A buffer reference to replace dst with. May be NULL, then this
  187. * function is equivalent to av_buffer_unref(dst).
  188. * @return 0 on success
  189. * AVERROR(ENOMEM) on memory allocation failure.
  190. */
  191. int av_buffer_replace(AVBufferRef **dst, const AVBufferRef *src);
  192. /**
  193. * @}
  194. */
  195. /**
  196. * @defgroup lavu_bufferpool AVBufferPool
  197. * @ingroup lavu_data
  198. *
  199. * @{
  200. * AVBufferPool is an API for a lock-free thread-safe pool of AVBuffers.
  201. *
  202. * Frequently allocating and freeing large buffers may be slow. AVBufferPool is
  203. * meant to solve this in cases when the caller needs a set of buffers of the
  204. * same size (the most obvious use case being buffers for raw video or audio
  205. * frames).
  206. *
  207. * At the beginning, the user must call av_buffer_pool_init() to create the
  208. * buffer pool. Then whenever a buffer is needed, call av_buffer_pool_get() to
  209. * get a reference to a new buffer, similar to av_buffer_alloc(). This new
  210. * reference works in all aspects the same way as the one created by
  211. * av_buffer_alloc(). However, when the last reference to this buffer is
  212. * unreferenced, it is returned to the pool instead of being freed and will be
  213. * reused for subsequent av_buffer_pool_get() calls.
  214. *
  215. * When the caller is done with the pool and no longer needs to allocate any new
  216. * buffers, av_buffer_pool_uninit() must be called to mark the pool as freeable.
  217. * Once all the buffers are released, it will automatically be freed.
  218. *
  219. * Allocating and releasing buffers with this API is thread-safe as long as
  220. * either the default alloc callback is used, or the user-supplied one is
  221. * thread-safe.
  222. */
  223. /**
  224. * The buffer pool. This structure is opaque and not meant to be accessed
  225. * directly. It is allocated with av_buffer_pool_init() and freed with
  226. * av_buffer_pool_uninit().
  227. */
  228. typedef struct AVBufferPool AVBufferPool;
  229. /**
  230. * Allocate and initialize a buffer pool.
  231. *
  232. * @param size size of each buffer in this pool
  233. * @param alloc a function that will be used to allocate new buffers when the
  234. * pool is empty. May be NULL, then the default allocator will be used
  235. * (av_buffer_alloc()).
  236. * @return newly created buffer pool on success, NULL on error.
  237. */
  238. AVBufferPool *av_buffer_pool_init(size_t size, AVBufferRef* (*alloc)(size_t size));
  239. /**
  240. * Allocate and initialize a buffer pool with a more complex allocator.
  241. *
  242. * @param size size of each buffer in this pool
  243. * @param opaque arbitrary user data used by the allocator
  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
  246. * used (av_buffer_alloc()).
  247. * @param pool_free a function that will be called immediately before the pool
  248. * is freed. I.e. after av_buffer_pool_uninit() is called
  249. * by the caller and all the frames are returned to the pool
  250. * and freed. It is intended to uninitialize the user opaque
  251. * data. May be NULL.
  252. * @return newly created buffer pool on success, NULL on error.
  253. */
  254. AVBufferPool *av_buffer_pool_init2(size_t size, void *opaque,
  255. AVBufferRef* (*alloc)(void *opaque, size_t size),
  256. void (*pool_free)(void *opaque));
  257. /**
  258. * Mark the pool as being available for freeing. It will actually be freed only
  259. * once all the allocated buffers associated with the pool are released. Thus it
  260. * is safe to call this function while some of the allocated buffers are still
  261. * in use.
  262. *
  263. * @param pool pointer to the pool to be freed. It will be set to NULL.
  264. */
  265. void av_buffer_pool_uninit(AVBufferPool **pool);
  266. /**
  267. * Allocate a new AVBuffer, reusing an old buffer from the pool when available.
  268. * This function may be called simultaneously from multiple threads.
  269. *
  270. * @return a reference to the new buffer on success, NULL on error.
  271. */
  272. AVBufferRef *av_buffer_pool_get(AVBufferPool *pool);
  273. /**
  274. * Query the original opaque parameter of an allocated buffer in the pool.
  275. *
  276. * @param ref a buffer reference to a buffer returned by av_buffer_pool_get.
  277. * @return the opaque parameter set by the buffer allocator function of the
  278. * buffer pool.
  279. *
  280. * @note the opaque parameter of ref is used by the buffer pool implementation,
  281. * therefore you have to use this function to access the original opaque
  282. * parameter of an allocated buffer.
  283. */
  284. void *av_buffer_pool_buffer_get_opaque(const AVBufferRef *ref);
  285. /**
  286. * @}
  287. */
  288. #endif /* AVUTIL_BUFFER_H */