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:
parent
28b5dc6199
commit
6498522bef
@ -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
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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, \
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user