mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-04 13:53:26 +00:00
factor identical ff_inplace_start_frame out of two filters
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
This commit is contained in:
parent
60b9785530
commit
fb44e7401f
@ -214,42 +214,6 @@ static av_cold int init(AVFilterContext *ctx, const char *args)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
|
|
||||||
{
|
|
||||||
AVFilterLink *outlink = inlink->dst->outputs[0];
|
|
||||||
AVFilterBufferRef *outpicref = NULL, *for_next_filter;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if (inpicref->perms & AV_PERM_PRESERVE) {
|
|
||||||
outpicref = ff_get_video_buffer(outlink, AV_PERM_WRITE,
|
|
||||||
outlink->w, outlink->h);
|
|
||||||
if (!outpicref)
|
|
||||||
return AVERROR(ENOMEM);
|
|
||||||
|
|
||||||
avfilter_copy_buffer_ref_props(outpicref, inpicref);
|
|
||||||
outpicref->video->w = outlink->w;
|
|
||||||
outpicref->video->h = outlink->h;
|
|
||||||
} else {
|
|
||||||
outpicref = avfilter_ref_buffer(inpicref, ~0);
|
|
||||||
if (!outpicref)
|
|
||||||
return AVERROR(ENOMEM);
|
|
||||||
}
|
|
||||||
|
|
||||||
for_next_filter = avfilter_ref_buffer(outpicref, ~0);
|
|
||||||
if (for_next_filter)
|
|
||||||
ret = ff_start_frame(outlink, for_next_filter);
|
|
||||||
else
|
|
||||||
ret = AVERROR(ENOMEM);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
|
||||||
avfilter_unref_bufferp(&outpicref);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
outlink->out_buf = outpicref;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@ -296,7 +260,7 @@ AVFilter avfilter_vf_delogo = {
|
|||||||
.inputs = (const AVFilterPad[]) {{ .name = "default",
|
.inputs = (const AVFilterPad[]) {{ .name = "default",
|
||||||
.type = AVMEDIA_TYPE_VIDEO,
|
.type = AVMEDIA_TYPE_VIDEO,
|
||||||
.get_video_buffer = ff_null_get_video_buffer,
|
.get_video_buffer = ff_null_get_video_buffer,
|
||||||
.start_frame = start_frame,
|
.start_frame = ff_inplace_start_frame,
|
||||||
.draw_slice = null_draw_slice,
|
.draw_slice = null_draw_slice,
|
||||||
.end_frame = end_frame,
|
.end_frame = end_frame,
|
||||||
.min_perms = AV_PERM_WRITE | AV_PERM_READ,
|
.min_perms = AV_PERM_WRITE | AV_PERM_READ,
|
||||||
|
@ -180,41 +180,6 @@ static int config_input(AVFilterLink *inlink)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
|
|
||||||
{
|
|
||||||
AVFilterLink *outlink = inlink->dst->outputs[0];
|
|
||||||
AVFilterBufferRef *outpicref = NULL, *for_next_filter;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if (inpicref->perms & AV_PERM_PRESERVE) {
|
|
||||||
outpicref = ff_get_video_buffer(outlink, AV_PERM_WRITE, outlink->w, outlink->h);
|
|
||||||
if (!outpicref)
|
|
||||||
return AVERROR(ENOMEM);
|
|
||||||
|
|
||||||
avfilter_copy_buffer_ref_props(outpicref, inpicref);
|
|
||||||
outpicref->video->w = outlink->w;
|
|
||||||
outpicref->video->h = outlink->h;
|
|
||||||
} else {
|
|
||||||
outpicref = avfilter_ref_buffer(inpicref, ~0);
|
|
||||||
if (!outpicref)
|
|
||||||
return AVERROR(ENOMEM);
|
|
||||||
}
|
|
||||||
|
|
||||||
for_next_filter = avfilter_ref_buffer(outpicref, ~0);
|
|
||||||
if (for_next_filter)
|
|
||||||
ret = ff_start_frame(outlink, for_next_filter);
|
|
||||||
else
|
|
||||||
ret = AVERROR(ENOMEM);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
|
||||||
avfilter_unref_bufferp(&outpicref);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
outlink->out_buf = outpicref;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@ -261,7 +226,7 @@ AVFilter avfilter_vf_gradfun = {
|
|||||||
.inputs = (const AVFilterPad[]) {{ .name = "default",
|
.inputs = (const AVFilterPad[]) {{ .name = "default",
|
||||||
.type = AVMEDIA_TYPE_VIDEO,
|
.type = AVMEDIA_TYPE_VIDEO,
|
||||||
.config_props = config_input,
|
.config_props = config_input,
|
||||||
.start_frame = start_frame,
|
.start_frame = ff_inplace_start_frame,
|
||||||
.draw_slice = null_draw_slice,
|
.draw_slice = null_draw_slice,
|
||||||
.end_frame = end_frame,
|
.end_frame = end_frame,
|
||||||
.min_perms = AV_PERM_READ, },
|
.min_perms = AV_PERM_READ, },
|
||||||
|
@ -168,6 +168,42 @@ int ff_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
|
|||||||
return ff_start_frame(link->dst->outputs[0], buf_out);
|
return ff_start_frame(link->dst->outputs[0], buf_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// for filters that support (but don't require) outpic==inpic
|
||||||
|
int ff_inplace_start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
|
||||||
|
{
|
||||||
|
AVFilterLink *outlink = inlink->dst->outputs[0];
|
||||||
|
AVFilterBufferRef *outpicref = NULL, *for_next_filter;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if ((inpicref->perms & AV_PERM_WRITE) && !(inpicref->perms & AV_PERM_PRESERVE)) {
|
||||||
|
outpicref = avfilter_ref_buffer(inpicref, ~0);
|
||||||
|
if (!outpicref)
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
} else {
|
||||||
|
outpicref = ff_get_video_buffer(outlink, AV_PERM_WRITE, outlink->w, outlink->h);
|
||||||
|
if (!outpicref)
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
|
avfilter_copy_buffer_ref_props(outpicref, inpicref);
|
||||||
|
outpicref->video->w = outlink->w;
|
||||||
|
outpicref->video->h = outlink->h;
|
||||||
|
}
|
||||||
|
|
||||||
|
for_next_filter = avfilter_ref_buffer(outpicref, ~0);
|
||||||
|
if (for_next_filter)
|
||||||
|
ret = ff_start_frame(outlink, for_next_filter);
|
||||||
|
else
|
||||||
|
ret = AVERROR(ENOMEM);
|
||||||
|
|
||||||
|
if (ret < 0) {
|
||||||
|
avfilter_unref_bufferp(&outpicref);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
outlink->out_buf = outpicref;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int default_start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
|
static int default_start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
|
||||||
{
|
{
|
||||||
AVFilterLink *outlink = NULL;
|
AVFilterLink *outlink = NULL;
|
||||||
|
@ -39,6 +39,7 @@ AVFilterBufferRef *ff_null_get_video_buffer(AVFilterLink *link, int perms, int w
|
|||||||
AVFilterBufferRef *ff_get_video_buffer(AVFilterLink *link, int perms,
|
AVFilterBufferRef *ff_get_video_buffer(AVFilterLink *link, int perms,
|
||||||
int w, int h);
|
int w, int h);
|
||||||
|
|
||||||
|
int ff_inplace_start_frame(AVFilterLink *link, AVFilterBufferRef *picref);
|
||||||
int ff_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref);
|
int ff_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref);
|
||||||
int ff_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir);
|
int ff_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir);
|
||||||
int ff_null_end_frame(AVFilterLink *link);
|
int ff_null_end_frame(AVFilterLink *link);
|
||||||
|
Loading…
Reference in New Issue
Block a user