Browse Source

Merge commit '721a4efc0545548a241080b53ab480e34f366240'

* commit '721a4efc0545548a241080b53ab480e34f366240':
  buffer: add support for pools using caller data in allocation

Merged-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
tags/n3.1
Derek Buitenhuis 10 years ago
parent
commit
26abd5149e
5 changed files with 51 additions and 3 deletions
  1. +3
    -0
      doc/APIchanges
  2. +26
    -1
      libavutil/buffer.c
  3. +17
    -0
      libavutil/buffer.h
  4. +3
    -0
      libavutil/buffer_internal.h
  5. +2
    -2
      libavutil/version.h

+ 3
- 0
doc/APIchanges View File

@@ -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


+ 26
- 1
libavutil/buffer.c View File

@@ -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;




+ 17
- 0
libavutil/buffer.h View File

@@ -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


+ 3
- 0
libavutil/buffer_internal.h View File

@@ -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 */

+ 2
- 2
libavutil/version.h View File

@@ -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, \


Loading…
Cancel
Save