[FFmpeg-devel] [PATCH 2/3] avutil/buffer: use staticpool

Muhammad Faiz mfcc64 at gmail.com
Sat Jan 20 06:29:14 EET 2018


Use default size 1024.
Benchmark:
time ./ffmpeg -f s16le -ac 5 -ar 48000 -t 10000 -i /dev/zero \
    -af "aformat=s16p, asetnsamples=256" -f null -
old: 27.616s
new: 22.079s

Signed-off-by: Muhammad Faiz <mfcc64 at gmail.com>
---
 libavutil/buffer.c | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/libavutil/buffer.c b/libavutil/buffer.c
index 8d1aa5fa84..6dd3f0441b 100644
--- a/libavutil/buffer.c
+++ b/libavutil/buffer.c
@@ -24,6 +24,11 @@
 #include "common.h"
 #include "mem.h"
 #include "thread.h"
+#include "staticpool.h"
+
+FF_STATICPOOL_DECLARE(AVBufferRef, 1024)
+FF_STATICPOOL_DECLARE(AVBuffer, 1024)
+FF_STATICPOOL_DECLARE(BufferPoolEntry, 1024)
 
 AVBufferRef *av_buffer_create(uint8_t *data, int size,
                               void (*free)(void *opaque, uint8_t *data),
@@ -32,7 +37,7 @@ AVBufferRef *av_buffer_create(uint8_t *data, int size,
     AVBufferRef *ref = NULL;
     AVBuffer    *buf = NULL;
 
-    buf = av_mallocz(sizeof(*buf));
+    buf = FF_STATICPOOL_MALLOCZ(AVBuffer);
     if (!buf)
         return NULL;
 
@@ -46,9 +51,9 @@ AVBufferRef *av_buffer_create(uint8_t *data, int size,
     if (flags & AV_BUFFER_FLAG_READONLY)
         buf->flags |= BUFFER_FLAG_READONLY;
 
-    ref = av_mallocz(sizeof(*ref));
+    ref = FF_STATICPOOL_MALLOCZ(AVBufferRef);
     if (!ref) {
-        av_freep(&buf);
+        FF_STATICPOOL_FREEP(AVBuffer, &buf);
         return NULL;
     }
 
@@ -92,7 +97,7 @@ AVBufferRef *av_buffer_allocz(int size)
 
 AVBufferRef *av_buffer_ref(AVBufferRef *buf)
 {
-    AVBufferRef *ret = av_mallocz(sizeof(*ret));
+    AVBufferRef *ret = FF_STATICPOOL_MALLOCZ(AVBufferRef);
 
     if (!ret)
         return NULL;
@@ -112,13 +117,13 @@ static void buffer_replace(AVBufferRef **dst, AVBufferRef **src)
 
     if (src) {
         **dst = **src;
-        av_freep(src);
+        FF_STATICPOOL_FREEP(AVBufferRef, src);
     } else
-        av_freep(dst);
+        FF_STATICPOOL_FREEP(AVBufferRef, dst);
 
     if (atomic_fetch_add_explicit(&b->refcount, -1, memory_order_acq_rel) == 1) {
         b->free(b->opaque, b->data);
-        av_freep(&b);
+        FF_STATICPOOL_FREEP(AVBuffer, &b);
     }
 }
 
@@ -262,7 +267,7 @@ static void buffer_pool_free(AVBufferPool *pool)
         pool->pool = buf->next;
 
         buf->free(buf->opaque, buf->data);
-        av_freep(&buf);
+        FF_STATICPOOL_FREEP(BufferPoolEntry, &buf);
     }
     ff_mutex_destroy(&pool->mutex);
 
@@ -314,7 +319,7 @@ static AVBufferRef *pool_alloc_buffer(AVBufferPool *pool)
     if (!ret)
         return NULL;
 
-    buf = av_mallocz(sizeof(*buf));
+    buf = FF_STATICPOOL_MALLOCZ(BufferPoolEntry);
     if (!buf) {
         av_buffer_unref(&ret);
         return NULL;
-- 
2.13.2



More information about the ffmpeg-devel mailing list