[FFmpeg-cvslog] avfilter/vf_tinterlace: add support for bypassing already interlaced frames
Marton Balint
git at videolan.org
Sun Dec 15 01:25:06 EET 2019
ffmpeg | branch: master | Marton Balint <cus at passwd.hu> | Fri Dec 6 11:01:11 2019 +0100| [6498522befb21974061cb38ece90b482bd0d2b16] | committer: Marton Balint
avfilter/vf_tinterlace: add support for bypassing already interlaced frames
The old interlace filter worked this way before it was merged with tinterlace.
Signed-off-by: Marton Balint <cus at passwd.hu>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=6498522befb21974061cb38ece90b482bd0d2b16
---
doc/filters.texi | 6 ++++--
libavfilter/tinterlace.h | 1 +
libavfilter/version.h | 2 +-
libavfilter/vf_tinterlace.c | 11 +++++++++++
4 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/doc/filters.texi b/doc/filters.texi
index 93f54a2e1e..c543203ce3 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -18122,10 +18122,12 @@ Enable complex vertical low-pass filtering.
This will slightly less reduce interlace 'twitter' and Moire
patterning but better retain detail and subjective sharpness impression.
+ at item bypass_il
+Bypass already interlaced frames, only adjust the frame rate.
@end table
-Vertical low-pass filtering can only be enabled for @option{mode}
- at var{interleave_top} and @var{interleave_bottom}.
+Vertical low-pass filtering and bypassing already interlaced frames can only be
+enabled for @option{mode} @var{interleave_top} and @var{interleave_bottom}.
@end table
diff --git a/libavfilter/tinterlace.h b/libavfilter/tinterlace.h
index e204b61aa0..020887ff34 100644
--- a/libavfilter/tinterlace.h
+++ b/libavfilter/tinterlace.h
@@ -36,6 +36,7 @@
#define TINTERLACE_FLAG_VLPF 01
#define TINTERLACE_FLAG_CVLPF 2
#define TINTERLACE_FLAG_EXACT_TB 4
+#define TINTERLACE_FLAG_BYPASS_IL 8
enum VLPFilter {
VLPF_OFF = 0,
diff --git a/libavfilter/version.h b/libavfilter/version.h
index a3625006af..715be58065 100644
--- a/libavfilter/version.h
+++ b/libavfilter/version.h
@@ -31,7 +31,7 @@
#define LIBAVFILTER_VERSION_MAJOR 7
#define LIBAVFILTER_VERSION_MINOR 68
-#define LIBAVFILTER_VERSION_MICRO 100
+#define LIBAVFILTER_VERSION_MICRO 101
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
diff --git a/libavfilter/vf_tinterlace.c b/libavfilter/vf_tinterlace.c
index 32b2ff9f5a..0ee40ffce6 100644
--- a/libavfilter/vf_tinterlace.c
+++ b/libavfilter/vf_tinterlace.c
@@ -53,6 +53,7 @@ static const AVOption tinterlace_options[] = {
{"complex_filter", "enable complex vertical low-pass filter", 0, AV_OPT_TYPE_CONST, {.i64 = TINTERLACE_FLAG_CVLPF},INT_MIN, INT_MAX, FLAGS, "flags" },
{"cvlpf", "enable complex vertical low-pass filter", 0, AV_OPT_TYPE_CONST, {.i64 = TINTERLACE_FLAG_CVLPF},INT_MIN, INT_MAX, FLAGS, "flags" },
{"exact_tb", "force a timebase which can represent timestamps exactly", 0, AV_OPT_TYPE_CONST, {.i64 = TINTERLACE_FLAG_EXACT_TB}, INT_MIN, INT_MAX, FLAGS, "flags" },
+ {"bypass_il", "bypass already interlaced frames", 0, AV_OPT_TYPE_CONST, {.i64 = TINTERLACE_FLAG_BYPASS_IL}, INT_MIN, INT_MAX, FLAGS, "flags" },
{NULL}
};
@@ -439,6 +440,16 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *picref)
* halving the frame rate and preserving image height */
case MODE_INTERLEAVE_TOP: /* top field first */
case MODE_INTERLEAVE_BOTTOM: /* bottom field first */
+ if ((tinterlace->flags & TINTERLACE_FLAG_BYPASS_IL) && cur->interlaced_frame) {
+ av_log(ctx, AV_LOG_WARNING,
+ "video is already interlaced, adjusting framerate only\n");
+ out = av_frame_clone(cur);
+ if (!out)
+ return AVERROR(ENOMEM);
+ out->pts /= 2; // adjust pts to new framerate
+ ret = ff_filter_frame(outlink, out);
+ return ret;
+ }
tff = tinterlace->mode == MODE_INTERLEAVE_TOP;
out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
if (!out)
More information about the ffmpeg-cvslog
mailing list