Commit e977ca26 authored by Stefano Sabatini's avatar Stefano Sabatini

lavfi: add avfilter_link_free() function

Allow to free the buffers cached in each AVFilterLink pool.
Fix leak.
parent b932eb1b
...@@ -13,6 +13,9 @@ libavutil: 2011-04-18 ...@@ -13,6 +13,9 @@ libavutil: 2011-04-18
API changes, most recent first: API changes, most recent first:
2011-06-03 - xxxxxx - lavfi 2.12.0 - avfilter_link_free()
Add avfilter_link_free() function.
2011-05-28 - xxxxxx - lavu 51.3.0 - pixdesc.h 2011-05-28 - xxxxxx - lavu 51.3.0 - pixdesc.h
Add av_get_pix_fmt_name() in libavutil/pixdesc.h, and deprecate Add av_get_pix_fmt_name() in libavutil/pixdesc.h, and deprecate
avcodec_get_pix_fmt_name() in libavcodec/avcodec.h in its favor. avcodec_get_pix_fmt_name() in libavcodec/avcodec.h in its favor.
......
...@@ -165,6 +165,31 @@ int avfilter_link(AVFilterContext *src, unsigned srcpad, ...@@ -165,6 +165,31 @@ int avfilter_link(AVFilterContext *src, unsigned srcpad,
return 0; return 0;
} }
void avfilter_link_free(AVFilterLink **link)
{
if (!*link)
return;
if ((*link)->pool) {
int i;
for (i = 0; i < POOL_SIZE; i++) {
if ((*link)->pool->pic[i]) {
AVFilterBufferRef *picref = (*link)->pool->pic[i];
/* free buffer: picrefs stored in the pool are not
* supposed to contain a free callback */
av_freep(&picref->buf->data[0]);
av_freep(&picref->buf);
av_freep(&picref->audio);
av_freep(&picref->video);
av_freep(&picref);
}
}
av_freep(&(*link)->pool);
}
av_freep(link);
}
int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt, int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt,
unsigned filt_srcpad_idx, unsigned filt_dstpad_idx) unsigned filt_srcpad_idx, unsigned filt_dstpad_idx)
{ {
...@@ -683,7 +708,7 @@ void avfilter_free(AVFilterContext *filter) ...@@ -683,7 +708,7 @@ void avfilter_free(AVFilterContext *filter)
avfilter_formats_unref(&link->in_formats); avfilter_formats_unref(&link->in_formats);
avfilter_formats_unref(&link->out_formats); avfilter_formats_unref(&link->out_formats);
} }
av_freep(&link); avfilter_link_free(&link);
} }
for (i = 0; i < filter->output_count; i++) { for (i = 0; i < filter->output_count; i++) {
if ((link = filter->outputs[i])) { if ((link = filter->outputs[i])) {
...@@ -692,7 +717,7 @@ void avfilter_free(AVFilterContext *filter) ...@@ -692,7 +717,7 @@ void avfilter_free(AVFilterContext *filter)
avfilter_formats_unref(&link->in_formats); avfilter_formats_unref(&link->in_formats);
avfilter_formats_unref(&link->out_formats); avfilter_formats_unref(&link->out_formats);
} }
av_freep(&link); avfilter_link_free(&link);
} }
av_freep(&filter->name); av_freep(&filter->name);
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
#include "libavutil/samplefmt.h" #include "libavutil/samplefmt.h"
#define LIBAVFILTER_VERSION_MAJOR 2 #define LIBAVFILTER_VERSION_MAJOR 2
#define LIBAVFILTER_VERSION_MINOR 11 #define LIBAVFILTER_VERSION_MINOR 12
#define LIBAVFILTER_VERSION_MICRO 0 #define LIBAVFILTER_VERSION_MICRO 0
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
...@@ -635,6 +635,11 @@ struct AVFilterLink { ...@@ -635,6 +635,11 @@ struct AVFilterLink {
int avfilter_link(AVFilterContext *src, unsigned srcpad, int avfilter_link(AVFilterContext *src, unsigned srcpad,
AVFilterContext *dst, unsigned dstpad); AVFilterContext *dst, unsigned dstpad);
/**
* Free the link in *link, and set its pointer to NULL.
*/
void avfilter_link_free(AVFilterLink **link);
/** /**
* Negotiate the media format, dimensions, etc of all inputs to a filter. * Negotiate the media format, dimensions, etc of all inputs to a filter.
* *
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment