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