This can be enabled/disabled on a per-filter basis by setting the new internal flags FF_FILTER_FLAG_FREE_(IN|OUT)PADS.
Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@outlook.com> --- It would be possible to only free the names of non-static pads; it could then be used with the headphone and afir filters. But I don't think the additional complexity is worth it. libavfilter/avfilter.c | 19 +++++++++++++++---- libavfilter/internal.h | 10 ++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c index de7501c37b..9ac247c251 100644 --- a/libavfilter/avfilter.c +++ b/libavfilter/avfilter.c @@ -117,7 +117,7 @@ void ff_command_queue_pop(AVFilterContext *filter) */ static int insert_pad(unsigned idx, unsigned *count, size_t padidx_off, AVFilterPad **pads, AVFilterLink ***links, - AVFilterPad *newpad) + AVFilterPad *newpad, int free_on_failure) { AVFilterLink **newlinks; AVFilterPad *newpads; @@ -131,8 +131,11 @@ static int insert_pad(unsigned idx, unsigned *count, size_t padidx_off, *pads = newpads; if (newlinks) *links = newlinks; - if (!newpads || !newlinks) + if (!newpads || !newlinks) { + if (free_on_failure) + av_freep(&newpad->name); return AVERROR(ENOMEM); + } memmove(*pads + idx + 1, *pads + idx, sizeof(AVFilterPad) * (*count - idx)); memmove(*links + idx + 1, *links + idx, sizeof(AVFilterLink*) * (*count - idx)); @@ -150,13 +153,15 @@ static int insert_pad(unsigned idx, unsigned *count, size_t padidx_off, int ff_insert_inpad(AVFilterContext *f, unsigned index, AVFilterPad *p) { return insert_pad(index, &f->nb_inputs, offsetof(AVFilterLink, dstpad), - &f->input_pads, &f->inputs, p); + &f->input_pads, &f->inputs, p, + f->filter->flags_internal & FF_FILTER_FLAG_FREE_INPADS); } int ff_insert_outpad(AVFilterContext *f, unsigned index, AVFilterPad *p) { return insert_pad(index, &f->nb_outputs, offsetof(AVFilterLink, srcpad), - &f->output_pads, &f->outputs, p); + &f->output_pads, &f->outputs, p, + f->filter->flags_internal & FF_FILTER_FLAG_FREE_OUTPADS); } int avfilter_link(AVFilterContext *src, unsigned srcpad, @@ -767,7 +772,13 @@ void avfilter_free(AVFilterContext *filter) av_buffer_unref(&filter->hw_device_ctx); av_freep(&filter->name); + if (filter->filter->flags_internal & FF_FILTER_FLAG_FREE_INPADS) + for (unsigned i = 0; i < filter->nb_inputs; i++) + av_freep(&filter->input_pads[i].name); av_freep(&filter->input_pads); + if (filter->filter->flags_internal & FF_FILTER_FLAG_FREE_OUTPADS) + for (unsigned i = 0; i < filter->nb_outputs; i++) + av_freep(&filter->output_pads[i].name); av_freep(&filter->output_pads); av_freep(&filter->inputs); av_freep(&filter->outputs); diff --git a/libavfilter/internal.h b/libavfilter/internal.h index 615b725cab..d9ff997e72 100644 --- a/libavfilter/internal.h +++ b/libavfilter/internal.h @@ -306,6 +306,16 @@ void ff_filter_graph_remove_filter(AVFilterGraph *graph, AVFilterContext *filter */ #define FF_FILTER_FLAG_HWFRAME_AWARE (1 << 0) +/** + * The names of all input pads are allocated and should be freed generically. + */ + #define FF_FILTER_FLAG_FREE_INPADS (1 << 1) + +/** + * The names of all output pads are allocated and should be freed generically. + */ + #define FF_FILTER_FLAG_FREE_OUTPADS (1 << 2) + /** * Run one round of processing on a filter graph. */ -- 2.30.2 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".