History

AVFilter: use picture pool to avoid malloc(). Signed-off-by: Michael Niedermayer <michaelni@gmx.at>

Michael Niedermayer committed 15 years ago

Commit 39f66ed1 parent fa3eddc4 files · +71 −2Browse files

Unified · Split

4 files
  1. libavfilter/avfilter.c +42 −1
  2. libavfilter/avfilter.h +2 −0
  3. libavfilter/defaults.c +21 −1
  4. libavfilter/internal.h +6 −0
libavfilter/avfilter.c+42−1
@@ -25,6 +25,7 @@ · 24 unmodified lines
2525 #include "libavutil/rational.h"
2626 #include "libavutil/audioconvert.h"
2727 #include "libavutil/imgutils.h"
28+#include "libavutil/avassert.h"
2829 #include "avfilter.h"
2930 #include "internal.h"
3031
@@ -69,12 +70,50 @@ AVFilterBufferRef *avfilter_ref_buffer(AVFilterBufferRef *ref, int pmask) · 38 unmodified lines
6970 return ret;
7071 }
7172
73+static void store_in_pool(AVFilterBufferRef *ref)
74+{
75+ int i;
76+ AVFilterLink *link= ref->buf->priv;
77+ AVFilterPool *pool;
78+
79+ av_assert0(ref->buf->data[0]);
80+
81+ if(!link->pool)
82+ link->pool = av_mallocz(sizeof(AVFilterPool));
83+ pool= link->pool;
84+
85+ if(pool->count == POOL_SIZE){
86+ AVFilterBufferRef *ref1= pool->pic[0];
87+ av_freep(&ref1->video);
88+ av_freep(&ref1->audio);
89+ av_freep(&ref1->buf->data[0]);
90+ av_freep(&ref1->buf);
91+ av_free(ref1);
92+ memmove(&pool->pic[0], &pool->pic[1], sizeof(void*)*(POOL_SIZE-1));
93+ pool->count--;
94+ pool->pic[POOL_SIZE-1] = NULL;
95+ }
96+
97+ for(i=0; i<POOL_SIZE; i++){
98+ if(!pool->pic[i]){
99+ pool->pic[i]= ref;
100+ pool->count++;
101+ break;
102+ }
103+ }
104+}
105+
72106 void avfilter_unref_buffer(AVFilterBufferRef *ref)
73107 {
74108 if (!ref)
75109 return;
76− if (!(--ref->buf->refcount))
110+ if (!(--ref->buf->refcount)){
111+ if(!ref->buf->free){
112+ store_in_pool(ref);
113+ return;
114+ }
77115 ref->buf->free(ref->buf);
116+ }
78117 av_freep(&ref->video);
79118 av_freep(&ref->audio);
80119 av_free(ref);
@@ -646,6 +685,7 @@ void avfilter_free(AVFilterContext *filter) · 565 unmodified lines
646685 if ((link = filter->inputs[i])) {
647686 if (link->src)
648687 link->src->outputs[link->srcpad - link->src->output_pads] = NULL;
688+ av_freep(&link->pool);
649689 avfilter_formats_unref(&link->in_formats);
650690 avfilter_formats_unref(&link->out_formats);
651691 }
@@ -655,6 +695,7 @@ void avfilter_free(AVFilterContext *filter) · 3 unmodified lines
655695 if ((link = filter->outputs[i])) {
656696 if (link->dst)
657697 link->dst->inputs[link->dstpad - link->dst->input_pads] = NULL;
698+ av_freep(&link->pool);
658699 avfilter_formats_unref(&link->in_formats);
659700 avfilter_formats_unref(&link->out_formats);
660701 }
libavfilter/avfilter.h+2−0
@@ -619,6 +619,8 @@ struct AVFilterLink { · 618 unmodified lines
619619 * input link is assumed to be an unchangeable property.
620620 */
621621 AVRational time_base;
622+
623+ struct AVFilterPool *pool;
622624 };
623625
624626 /**
libavfilter/defaults.c+21−1
@@ -25,7 +25,6 @@ · 24 unmodified lines
2525 #include "avfilter.h"
2626 #include "internal.h"
2727
28−/* TODO: buffer pool. see comment for avfilter_default_get_video_buffer() */
2928 void ff_avfilter_default_free_buffer(AVFilterBuffer *ptr)
3029 {
3130 av_free(ptr->data[0]);
@@ -39,7 +38,26 @@ AVFilterBufferRef *avfilter_default_get_video_buffer(AVFilterLink *link, int per · 7 unmodified lines
3938 {
4039 int linesize[4];
4140 uint8_t *data[4];
41+ int i;
4242 AVFilterBufferRef *picref = NULL;
43+ AVFilterPool *pool= link->pool;
44+
45+ if(pool) for(i=0; i<POOL_SIZE; i++){
46+ picref= pool->pic[i];
47+ if(picref && picref->buf->format == link->format && picref->buf->w == w && picref->buf->h == h){
48+ AVFilterBuffer *pic= picref->buf;
49+ pool->pic[i]= NULL;
50+ pool->count--;
51+ picref->video->w = w;
52+ picref->video->h = h;
53+ picref->perms = perms | AV_PERM_READ;
54+ picref->format= link->format;
55+ pic->refcount = 1;
56+ memcpy(picref->data, pic->data, sizeof(picref->data));
57+ memcpy(picref->linesize, pic->linesize, sizeof(picref->linesize));
58+ return picref;
59+ }
60+ }
4361
4462 // +2 is needed for swscaler, +16 to be SIMD-friendly
4563 if (av_image_alloc(data, linesize, w, h, link->format, 16) < 0)
@@ -51,6 +69,8 @@ AVFilterBufferRef *avfilter_default_get_video_buffer(AVFilterLink *link, int per · 5 unmodified lines
5169 av_free(data[0]);
5270 return NULL;
5371 }
72+ picref->buf->priv= link;
73+ picref->buf->free= NULL;
5474
5575 return picref;
5676 }
libavfilter/internal.h+6−0
@@ -27,6 +27,12 @@ · 26 unmodified lines
2727 #include "avfilter.h"
2828 #include "avfiltergraph.h"
2929
30+#define POOL_SIZE 32
31+typedef struct AVFilterPool {
32+ AVFilterBufferRef *pic[POOL_SIZE];
33+ int count;
34+}AVFilterPool;
35+
3036 /**
3137 * Check for the validity of graph.
3238 *

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t