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