[FFmpeg-cvslog] avfilter/avfilter: Allow to free non-static pads generically
Andreas Rheinhardt
git at videolan.org
Sun Aug 22 19:06:13 EEST 2021
ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Wed Aug 11 21:54:31 2021 +0200| [f308f37441ec0d49166641843acd5302c1e26e6a] | committer: Andreas Rheinhardt
avfilter/avfilter: Allow to free non-static pads generically
This can be enabled/disabled on a per-pad basis by setting
the AVFILTERPAD_FLAG_FREE_NAME flag; variants of ff_append_(in|out)pads
that do this for you have been added and will be put to use in the
following commits.
Reviewed-by: Nicolas George <george at nsup.org>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=f308f37441ec0d49166641843acd5302c1e26e6a
---
libavfilter/avfilter.c | 21 ++++++++++++++++++++-
libavfilter/internal.h | 10 ++++++++++
2 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
index 2681d04fc0..4b6a3d1e8f 100644
--- a/libavfilter/avfilter.c
+++ b/libavfilter/avfilter.c
@@ -123,8 +123,11 @@ static int append_pad(unsigned *count, AVFilterPad **pads,
*pads = newpads;
if (newlinks)
*links = newlinks;
- if (!newpads || !newlinks)
+ if (!newpads || !newlinks) {
+ if (newpad->flags & AVFILTERPAD_FLAG_FREE_NAME)
+ av_freep(&newpad->name);
return AVERROR(ENOMEM);
+ }
memcpy(*pads + idx, newpad, sizeof(AVFilterPad));
(*links)[idx] = NULL;
@@ -139,11 +142,23 @@ int ff_append_inpad(AVFilterContext *f, AVFilterPad *p)
return append_pad(&f->nb_inputs, &f->input_pads, &f->inputs, p);
}
+int ff_append_inpad_free_name(AVFilterContext *f, AVFilterPad *p)
+{
+ p->flags |= AVFILTERPAD_FLAG_FREE_NAME;
+ return ff_append_inpad(f, p);
+}
+
int ff_append_outpad(AVFilterContext *f, AVFilterPad *p)
{
return append_pad(&f->nb_outputs, &f->output_pads, &f->outputs, p);
}
+int ff_append_outpad_free_name(AVFilterContext *f, AVFilterPad *p)
+{
+ p->flags |= AVFILTERPAD_FLAG_FREE_NAME;
+ return ff_append_outpad(f, p);
+}
+
int avfilter_link(AVFilterContext *src, unsigned srcpad,
AVFilterContext *dst, unsigned dstpad)
{
@@ -754,9 +769,13 @@ void avfilter_free(AVFilterContext *filter)
for (i = 0; i < filter->nb_inputs; i++) {
free_link(filter->inputs[i]);
+ if (filter->input_pads[i].flags & AVFILTERPAD_FLAG_FREE_NAME)
+ av_freep(&filter->input_pads[i].name);
}
for (i = 0; i < filter->nb_outputs; i++) {
free_link(filter->outputs[i]);
+ if (filter->output_pads[i].flags & AVFILTERPAD_FLAG_FREE_NAME)
+ av_freep(&filter->output_pads[i].name);
}
if (filter->filter->priv_class)
diff --git a/libavfilter/internal.h b/libavfilter/internal.h
index cc95f06c4c..6ddf024d93 100644
--- a/libavfilter/internal.h
+++ b/libavfilter/internal.h
@@ -68,6 +68,11 @@ struct AVFilterPad {
*/
#define AVFILTERPAD_FLAG_NEEDS_WRITABLE (1 << 0)
+ /**
+ * The pad's name is allocated and should be freed generically.
+ */
+#define AVFILTERPAD_FLAG_FREE_NAME (1 << 1)
+
/**
* A combination of AVFILTERPAD_FLAG_* flags.
*/
@@ -231,9 +236,14 @@ void ff_tlog_link(void *ctx, AVFilterLink *link, int end);
/**
* Append a new input/output pad to the filter's list of such pads.
+ *
+ * The *_free_name versions will set the AVFILTERPAD_FLAG_FREE_NAME flag
+ * ensuring that the name will be freed generically (even on insertion error).
*/
int ff_append_inpad (AVFilterContext *f, AVFilterPad *p);
int ff_append_outpad(AVFilterContext *f, AVFilterPad *p);
+int ff_append_inpad_free_name (AVFilterContext *f, AVFilterPad *p);
+int ff_append_outpad_free_name(AVFilterContext *f, AVFilterPad *p);
/**
* Request an input frame from the filter at the other end of the link.
More information about the ffmpeg-cvslog
mailing list