Showing the changes to libavfilter/avfilter.c (1 of 4 files). Show all
Unified · Split
| @@ -25,6 +25,7 @@ · 24 unmodified lines | ||
| 25 | 25 | #include "libavutil/rational.h" |
| 26 | 26 | #include "libavutil/audioconvert.h" |
| 27 | 27 | #include "libavutil/imgutils.h" |
| 28 | +#include "libavutil/avassert.h" | |
| 28 | 29 | #include "avfilter.h" |
| 29 | 30 | #include "internal.h" |
| 30 | 31 | |
| @@ -69,12 +70,50 @@ AVFilterBufferRef *avfilter_ref_buffer(AVFilterBufferRef *ref, int pmask) · 38 unmodified lines | ||
| 69 | 70 | return ret; |
| 70 | 71 | } |
| 71 | 72 | |
| 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 | + | |
| 72 | 106 | void avfilter_unref_buffer(AVFilterBufferRef *ref) |
| 73 | 107 | { |
| 74 | 108 | if (!ref) |
| 75 | 109 | return; |
| 76 | − if (!(--ref->buf->refcount)) | |
| 110 | + if (!(--ref->buf->refcount)){ | |
| 111 | + if(!ref->buf->free){ | |
| 112 | + store_in_pool(ref); | |
| 113 | + return; | |
| 114 | + } | |
| 77 | 115 | ref->buf->free(ref->buf); |
| 116 | + } | |
| 78 | 117 | av_freep(&ref->video); |
| 79 | 118 | av_freep(&ref->audio); |
| 80 | 119 | av_free(ref); |
| @@ -646,6 +685,7 @@ void avfilter_free(AVFilterContext *filter) · 565 unmodified lines | ||
| 646 | 685 | if ((link = filter->inputs[i])) { |
| 647 | 686 | if (link->src) |
| 648 | 687 | link->src->outputs[link->srcpad - link->src->output_pads] = NULL; |
| 688 | + av_freep(&link->pool); | |
| 649 | 689 | avfilter_formats_unref(&link->in_formats); |
| 650 | 690 | avfilter_formats_unref(&link->out_formats); |
| 651 | 691 | } |
| @@ -655,6 +695,7 @@ void avfilter_free(AVFilterContext *filter) · 3 unmodified lines | ||
| 655 | 695 | if ((link = filter->outputs[i])) { |
| 656 | 696 | if (link->dst) |
| 657 | 697 | link->dst->inputs[link->dstpad - link->dst->input_pads] = NULL; |
| 698 | + av_freep(&link->pool); | |
| 658 | 699 | avfilter_formats_unref(&link->in_formats); |
| 659 | 700 | avfilter_formats_unref(&link->out_formats); |
| 660 | 701 | } |