Browse Source

factor identical ff_inplace_start_frame out of two filters

Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
tags/n1.0
Loren Merritt Ronald S. Bultje 13 years ago
parent
commit
fb44e7401f
4 changed files with 39 additions and 73 deletions
  1. +1
    -37
      libavfilter/vf_delogo.c
  2. +1
    -36
      libavfilter/vf_gradfun.c
  3. +36
    -0
      libavfilter/video.c
  4. +1
    -0
      libavfilter/video.h

+ 1
- 37
libavfilter/vf_delogo.c View File

@@ -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,


+ 1
- 36
libavfilter/vf_gradfun.c View File

@@ -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, },


+ 36
- 0
libavfilter/video.c View File

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


+ 1
- 0
libavfilter/video.h View File

@@ -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…
Cancel
Save