Commit ab09df9d authored by Joakim Plate's avatar Joakim Plate Committed by Anton Khirnov

vf_yadif: add an option to enable/disable deinterlacing based on src frame "interlaced" flag

Signed-off-by: 's avatarJoakim Plate <elupus@ecce.se>
Signed-off-by: 's avatarAnton Khirnov <anton@khirnov.net>
parent 91aff266
...@@ -1504,7 +1504,7 @@ Flip the input video vertically. ...@@ -1504,7 +1504,7 @@ Flip the input video vertically.
Deinterlace the input video ("yadif" means "yet another deinterlacing Deinterlace the input video ("yadif" means "yet another deinterlacing
filter"). filter").
It accepts the optional parameters: @var{mode}:@var{parity}. It accepts the optional parameters: @var{mode}:@var{parity}:@var{auto}.
@var{mode} specifies the interlacing mode to adopt, accepts one of the @var{mode} specifies the interlacing mode to adopt, accepts one of the
following values: following values:
...@@ -1538,6 +1538,18 @@ Default value is -1. ...@@ -1538,6 +1538,18 @@ Default value is -1.
If interlacing is unknown or decoder does not export this information, If interlacing is unknown or decoder does not export this information,
top field first will be assumed. top field first will be assumed.
@var{auto] specifies if deinterlacer should trust the interlaced flag
and only deinterlace frames marked as interlaced
@table @option
@item 0
deinterlace all frames
@item 1
only deinterlace frames marked as interlaced
@end table
Default value is 0.
@c man end VIDEO FILTERS @c man end VIDEO FILTERS
@chapter Video Sources @chapter Video Sources
......
...@@ -46,6 +46,12 @@ typedef struct { ...@@ -46,6 +46,12 @@ typedef struct {
int frame_pending; int frame_pending;
/**
* 0: deinterlace all frames
* 1: only deinterlace frames marked as interlaced
*/
int auto_enable;
AVFilterBufferRef *cur; AVFilterBufferRef *cur;
AVFilterBufferRef *next; AVFilterBufferRef *next;
AVFilterBufferRef *prev; AVFilterBufferRef *prev;
...@@ -242,6 +248,14 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) ...@@ -242,6 +248,14 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
if (!yadif->cur) if (!yadif->cur)
return; return;
if (yadif->auto_enable && !yadif->cur->video->interlaced) {
yadif->out = avfilter_ref_buffer(yadif->cur, AV_PERM_READ);
avfilter_unref_buffer(yadif->prev);
yadif->prev = NULL;
avfilter_start_frame(ctx->outputs[0], yadif->out);
return;
}
if (!yadif->prev) if (!yadif->prev)
yadif->prev = avfilter_ref_buffer(yadif->cur, AV_PERM_READ); yadif->prev = avfilter_ref_buffer(yadif->cur, AV_PERM_READ);
...@@ -261,6 +275,12 @@ static void end_frame(AVFilterLink *link) ...@@ -261,6 +275,12 @@ static void end_frame(AVFilterLink *link)
if (!yadif->out) if (!yadif->out)
return; return;
if (yadif->auto_enable && !yadif->cur->video->interlaced) {
avfilter_draw_slice(ctx->outputs[0], 0, link->h, 1);
avfilter_end_frame(ctx->outputs[0]);
return;
}
return_frame(ctx, 0); return_frame(ctx, 0);
} }
...@@ -301,6 +321,9 @@ static int poll_frame(AVFilterLink *link) ...@@ -301,6 +321,9 @@ static int poll_frame(AVFilterLink *link)
} }
assert(yadif->next || !val); assert(yadif->next || !val);
if (yadif->auto_enable && yadif->next && !yadif->next->video->interlaced)
return val;
return val * ((yadif->mode&1)+1); return val * ((yadif->mode&1)+1);
} }
...@@ -346,9 +369,10 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque) ...@@ -346,9 +369,10 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
yadif->mode = 0; yadif->mode = 0;
yadif->parity = -1; yadif->parity = -1;
yadif->auto_enable = 0;
yadif->csp = NULL; yadif->csp = NULL;
if (args) sscanf(args, "%d:%d", &yadif->mode, &yadif->parity); if (args) sscanf(args, "%d:%d:%d", &yadif->mode, &yadif->parity, &yadif->auto_enable);
yadif->filter_line = filter_line_c; yadif->filter_line = filter_line_c;
if (HAVE_SSSE3 && cpu_flags & AV_CPU_FLAG_SSSE3) if (HAVE_SSSE3 && cpu_flags & AV_CPU_FLAG_SSSE3)
...@@ -358,7 +382,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque) ...@@ -358,7 +382,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
else if (HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX) else if (HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX)
yadif->filter_line = ff_yadif_filter_line_mmx; yadif->filter_line = ff_yadif_filter_line_mmx;
av_log(ctx, AV_LOG_INFO, "mode:%d parity:%d\n", yadif->mode, yadif->parity); av_log(ctx, AV_LOG_INFO, "mode:%d parity:%d auto_enable:%d\n", yadif->mode, yadif->parity, yadif->auto_enable);
return 0; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment