* commit '721a4efc0545548a241080b53ab480e34f366240': buffer: add support for pools using caller data in allocation Merged-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>tags/n3.1
| @@ -15,6 +15,9 @@ libavutil: 2015-08-28 | |||||
| API changes, most recent first: | API changes, most recent first: | ||||
| 2016-xx-xx - lavu 55.18.0 | |||||
| xxxxxxx buffer.h - Add av_buffer_pool_init2(). | |||||
| -------- 8< --------- FFmpeg 3.0 was cut here -------- 8< --------- | -------- 8< --------- FFmpeg 3.0 was cut here -------- 8< --------- | ||||
| 2016-02-10 - bc9a596 / 9f61abc - lavf 57.25.100 / 57.3.0 - avformat.h | 2016-02-10 - bc9a596 / 9f61abc - lavf 57.25.100 / 57.3.0 - avformat.h | ||||
| @@ -214,6 +214,26 @@ int av_buffer_realloc(AVBufferRef **pbuf, int size) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| AVBufferPool *av_buffer_pool_init2(int size, void *opaque, | |||||
| AVBufferRef* (*alloc)(void *opaque, int size), | |||||
| void (*pool_free)(void *opaque)) | |||||
| { | |||||
| AVBufferPool *pool = av_mallocz(sizeof(*pool)); | |||||
| if (!pool) | |||||
| return NULL; | |||||
| ff_mutex_init(&pool->mutex, NULL); | |||||
| pool->size = size; | |||||
| pool->opaque = opaque; | |||||
| pool->alloc2 = alloc; | |||||
| pool->pool_free = pool_free; | |||||
| avpriv_atomic_int_set(&pool->refcount, 1); | |||||
| return pool; | |||||
| } | |||||
| AVBufferPool *av_buffer_pool_init(int size, AVBufferRef* (*alloc)(int size)) | AVBufferPool *av_buffer_pool_init(int size, AVBufferRef* (*alloc)(int size)) | ||||
| { | { | ||||
| AVBufferPool *pool = av_mallocz(sizeof(*pool)); | AVBufferPool *pool = av_mallocz(sizeof(*pool)); | ||||
| @@ -244,6 +264,10 @@ static void buffer_pool_free(AVBufferPool *pool) | |||||
| av_freep(&buf); | av_freep(&buf); | ||||
| } | } | ||||
| ff_mutex_destroy(&pool->mutex); | ff_mutex_destroy(&pool->mutex); | ||||
| if (pool->pool_free) | |||||
| pool->pool_free(pool->opaque); | |||||
| av_freep(&pool); | av_freep(&pool); | ||||
| } | } | ||||
| @@ -326,7 +350,8 @@ static AVBufferRef *pool_alloc_buffer(AVBufferPool *pool) | |||||
| BufferPoolEntry *buf; | BufferPoolEntry *buf; | ||||
| AVBufferRef *ret; | AVBufferRef *ret; | ||||
| ret = pool->alloc(pool->size); | |||||
| ret = pool->alloc2 ? pool->alloc2(pool->opaque, pool->size) : | |||||
| pool->alloc(pool->size); | |||||
| if (!ret) | if (!ret) | ||||
| return NULL; | return NULL; | ||||
| @@ -248,6 +248,23 @@ typedef struct AVBufferPool AVBufferPool; | |||||
| */ | */ | ||||
| AVBufferPool *av_buffer_pool_init(int size, AVBufferRef* (*alloc)(int size)); | AVBufferPool *av_buffer_pool_init(int size, AVBufferRef* (*alloc)(int size)); | ||||
| /** | |||||
| * Allocate and initialize a buffer pool with a more complex allocator. | |||||
| * | |||||
| * @param size size of each buffer in this pool | |||||
| * @param opaque arbitrary user data used by the allocator | |||||
| * @param alloc a function that will be used to allocate new buffers when the | |||||
| * pool is empty. | |||||
| * @param pool_free a function that will be called immediately before the pool | |||||
| * is freed. I.e. after av_buffer_pool_can_uninit() is called | |||||
| * by the pool and all the frames are returned to the pool and | |||||
| * freed. It is intended to uninitialize the user opaque data. | |||||
| * @return newly created buffer pool on success, NULL on error. | |||||
| */ | |||||
| AVBufferPool *av_buffer_pool_init2(int size, void *opaque, | |||||
| AVBufferRef* (*alloc)(void *opaque, int size), | |||||
| void (*pool_free)(void *opaque)); | |||||
| /** | /** | ||||
| * Mark the pool as being available for freeing. It will actually be freed only | * Mark the pool as being available for freeing. It will actually be freed only | ||||
| * once all the allocated buffers associated with the pool are released. Thus it | * once all the allocated buffers associated with the pool are released. Thus it | ||||
| @@ -90,7 +90,10 @@ struct AVBufferPool { | |||||
| volatile int nb_allocated; | volatile int nb_allocated; | ||||
| int size; | int size; | ||||
| void *opaque; | |||||
| AVBufferRef* (*alloc)(int size); | AVBufferRef* (*alloc)(int size); | ||||
| AVBufferRef* (*alloc2)(void *opaque, int size); | |||||
| void (*pool_free)(void *opaque); | |||||
| }; | }; | ||||
| #endif /* AVUTIL_BUFFER_INTERNAL_H */ | #endif /* AVUTIL_BUFFER_INTERNAL_H */ | ||||
| @@ -64,8 +64,8 @@ | |||||
| */ | */ | ||||
| #define LIBAVUTIL_VERSION_MAJOR 55 | #define LIBAVUTIL_VERSION_MAJOR 55 | ||||
| #define LIBAVUTIL_VERSION_MINOR 17 | |||||
| #define LIBAVUTIL_VERSION_MICRO 103 | |||||
| #define LIBAVUTIL_VERSION_MINOR 18 | |||||
| #define LIBAVUTIL_VERSION_MICRO 100 | |||||
| #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | ||||
| LIBAVUTIL_VERSION_MINOR, \ | LIBAVUTIL_VERSION_MINOR, \ | ||||