1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

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@passwd.hu>
This commit is contained in:
Marton Balint 2019-12-06 11:01:11 +01:00
parent 28b5dc6199
commit 6498522bef
4 changed files with 17 additions and 3 deletions

View File

@ -18122,10 +18122,12 @@ Enable complex vertical low-pass filtering.
This will slightly less reduce interlace 'twitter' and Moire This will slightly less reduce interlace 'twitter' and Moire
patterning but better retain detail and subjective sharpness impression. patterning but better retain detail and subjective sharpness impression.
@item bypass_il
Bypass already interlaced frames, only adjust the frame rate.
@end table @end table
Vertical low-pass filtering can only be enabled for @option{mode} Vertical low-pass filtering and bypassing already interlaced frames can only be
@var{interleave_top} and @var{interleave_bottom}. enabled for @option{mode} @var{interleave_top} and @var{interleave_bottom}.
@end table @end table

View File

@ -36,6 +36,7 @@
#define TINTERLACE_FLAG_VLPF 01 #define TINTERLACE_FLAG_VLPF 01
#define TINTERLACE_FLAG_CVLPF 2 #define TINTERLACE_FLAG_CVLPF 2
#define TINTERLACE_FLAG_EXACT_TB 4 #define TINTERLACE_FLAG_EXACT_TB 4
#define TINTERLACE_FLAG_BYPASS_IL 8
enum VLPFilter { enum VLPFilter {
VLPF_OFF = 0, VLPF_OFF = 0,

View File

@ -31,7 +31,7 @@
#define LIBAVFILTER_VERSION_MAJOR 7 #define LIBAVFILTER_VERSION_MAJOR 7
#define LIBAVFILTER_VERSION_MINOR 68 #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, \ #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \

View File

@ -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" }, {"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" }, {"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" }, {"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} {NULL}
}; };
@ -439,6 +440,16 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *picref)
* halving the frame rate and preserving image height */ * halving the frame rate and preserving image height */
case MODE_INTERLEAVE_TOP: /* top field first */ case MODE_INTERLEAVE_TOP: /* top field first */
case MODE_INTERLEAVE_BOTTOM: /* bottom 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; tff = tinterlace->mode == MODE_INTERLEAVE_TOP;
out = ff_get_video_buffer(outlink, outlink->w, outlink->h); out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
if (!out) if (!out)