Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>tags/n1.0
@@ -214,42 +214,6 @@ static av_cold int init(AVFilterContext *ctx, const char *args) | |||
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) | |||
{ | |||
return 0; | |||
@@ -296,7 +260,7 @@ AVFilter avfilter_vf_delogo = { | |||
.inputs = (const AVFilterPad[]) {{ .name = "default", | |||
.type = AVMEDIA_TYPE_VIDEO, | |||
.get_video_buffer = ff_null_get_video_buffer, | |||
.start_frame = start_frame, | |||
.start_frame = ff_inplace_start_frame, | |||
.draw_slice = null_draw_slice, | |||
.end_frame = end_frame, | |||
.min_perms = AV_PERM_WRITE | AV_PERM_READ, | |||
@@ -180,41 +180,6 @@ static int config_input(AVFilterLink *inlink) | |||
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) | |||
{ | |||
return 0; | |||
@@ -261,7 +226,7 @@ AVFilter avfilter_vf_gradfun = { | |||
.inputs = (const AVFilterPad[]) {{ .name = "default", | |||
.type = AVMEDIA_TYPE_VIDEO, | |||
.config_props = config_input, | |||
.start_frame = start_frame, | |||
.start_frame = ff_inplace_start_frame, | |||
.draw_slice = null_draw_slice, | |||
.end_frame = end_frame, | |||
.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); | |||
} | |||
// 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) | |||
{ | |||
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, | |||
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_draw_slice(AVFilterLink *link, int y, int h, int slice_dir); | |||
int ff_null_end_frame(AVFilterLink *link); | |||