mirror of https://git.ffmpeg.org/ffmpeg.git
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@nsup.org> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
parent
dff1709eb2
commit
f308f37441
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue