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); | |||