diff --git a/doc/APIchanges b/doc/APIchanges index 85d4db7065..1c767871cc 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,9 @@ libavutil: 2015-08-28 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< --------- 2016-02-10 - bc9a596 / 9f61abc - lavf 57.25.100 / 57.3.0 - avformat.h diff --git a/libavutil/buffer.c b/libavutil/buffer.c index bb112c238e..694e116a3c 100644 --- a/libavutil/buffer.c +++ b/libavutil/buffer.c @@ -214,6 +214,26 @@ int av_buffer_realloc(AVBufferRef **pbuf, int size) 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 *pool = av_mallocz(sizeof(*pool)); @@ -244,6 +264,10 @@ static void buffer_pool_free(AVBufferPool *pool) av_freep(&buf); } ff_mutex_destroy(&pool->mutex); + + if (pool->pool_free) + pool->pool_free(pool->opaque); + av_freep(&pool); } @@ -326,7 +350,8 @@ static AVBufferRef *pool_alloc_buffer(AVBufferPool *pool) BufferPoolEntry *buf; AVBufferRef *ret; - ret = pool->alloc(pool->size); + ret = pool->alloc2 ? pool->alloc2(pool->opaque, pool->size) : + pool->alloc(pool->size); if (!ret) return NULL; diff --git a/libavutil/buffer.h b/libavutil/buffer.h index b4399fd39f..207e971190 100644 --- a/libavutil/buffer.h +++ b/libavutil/buffer.h @@ -248,6 +248,23 @@ typedef struct AVBufferPool AVBufferPool; */ 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 * once all the allocated buffers associated with the pool are released. Thus it diff --git a/libavutil/buffer_internal.h b/libavutil/buffer_internal.h index e6530485d3..29ce8a643c 100644 --- a/libavutil/buffer_internal.h +++ b/libavutil/buffer_internal.h @@ -90,7 +90,10 @@ struct AVBufferPool { volatile int nb_allocated; int size; + void *opaque; AVBufferRef* (*alloc)(int size); + AVBufferRef* (*alloc2)(void *opaque, int size); + void (*pool_free)(void *opaque); }; #endif /* AVUTIL_BUFFER_INTERNAL_H */ diff --git a/libavutil/version.h b/libavutil/version.h index 0ea8c79467..9a330f994a 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -64,8 +64,8 @@ */ #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, \ LIBAVUTIL_VERSION_MINOR, \