Commit 52269f48 authored by Vittorio Giovara's avatar Vittorio Giovara

Revert "vf_interlace: deprecate lowpass option"

This reverts commit 35b05c51.
A warning is introduced in case this option is used.
parent 4da8cdbb
...@@ -1600,8 +1600,7 @@ A floating point number which specifies chroma temporal strength. It defaults to ...@@ -1600,8 +1600,7 @@ A floating point number which specifies chroma temporal strength. It defaults to
Simple interlacing filter from progressive contents. This interleaves upper (or Simple interlacing filter from progressive contents. This interleaves upper (or
lower) lines from odd frames with lower (or upper) lines from even frames, lower) lines from odd frames with lower (or upper) lines from even frames,
halving the frame rate and preserving image height. A vertical lowpass filter halving the frame rate and preserving image height.
is always applied in order to avoid twitter effects and reduce moiré patterns.
@example @example
Original Original New Frame Original Original New Frame
...@@ -1621,6 +1620,10 @@ It accepts the following optional parameters: ...@@ -1621,6 +1620,10 @@ It accepts the following optional parameters:
@item scan @item scan
This determines whether the interlaced frame is taken from the even This determines whether the interlaced frame is taken from the even
(tff - default) or odd (bff) lines of the progressive frame. (tff - default) or odd (bff) lines of the progressive frame.
@item lowpass
Enable (default) or disable the vertical lowpass filter to avoid twitter
interlacing and reduce moire patterns.
@end table @end table
@section lut, lutrgb, lutyuv @section lut, lutrgb, lutyuv
......
...@@ -71,8 +71,5 @@ ...@@ -71,8 +71,5 @@
#ifndef FF_API_NOCONST_GET_NAME #ifndef FF_API_NOCONST_GET_NAME
#define FF_API_NOCONST_GET_NAME (LIBAVFILTER_VERSION_MAJOR < 5) #define FF_API_NOCONST_GET_NAME (LIBAVFILTER_VERSION_MAJOR < 5)
#endif #endif
#ifndef FF_API_INTERLACE_LOWPASS_SET
#define FF_API_INTERLACE_LOWPASS_SET (LIBAVFILTER_VERSION_MAJOR < 5)
#endif
#endif /* AVFILTER_VERSION_H */ #endif /* AVFILTER_VERSION_H */
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
#include "formats.h" #include "formats.h"
#include "avfilter.h" #include "avfilter.h"
#include "internal.h" #include "internal.h"
#include "version.h"
#include "video.h" #include "video.h"
enum ScanMode { enum ScanMode {
...@@ -45,9 +44,7 @@ enum FieldType { ...@@ -45,9 +44,7 @@ enum FieldType {
typedef struct InterlaceContext { typedef struct InterlaceContext {
const AVClass *class; const AVClass *class;
enum ScanMode scan; // top or bottom field first scanning enum ScanMode scan; // top or bottom field first scanning
#if FF_API_INTERLACE_LOWPASS_SET
int lowpass; // enable or disable low pass filterning int lowpass; // enable or disable low pass filterning
#endif
AVFrame *cur, *next; // the two frames from which the new one is obtained AVFrame *cur, *next; // the two frames from which the new one is obtained
int got_output; // signal an output frame is reday to request_frame() int got_output; // signal an output frame is reday to request_frame()
} InterlaceContext; } InterlaceContext;
...@@ -61,10 +58,8 @@ static const AVOption options[] = { ...@@ -61,10 +58,8 @@ static const AVOption options[] = {
AV_OPT_TYPE_CONST, {.i64 = MODE_TFF }, INT_MIN, INT_MAX, .flags = V, .unit = "scan" }, AV_OPT_TYPE_CONST, {.i64 = MODE_TFF }, INT_MIN, INT_MAX, .flags = V, .unit = "scan" },
{ "bff", "bottom field first", 0, { "bff", "bottom field first", 0,
AV_OPT_TYPE_CONST, {.i64 = MODE_BFF }, INT_MIN, INT_MAX, .flags = V, .unit = "scan" }, AV_OPT_TYPE_CONST, {.i64 = MODE_BFF }, INT_MIN, INT_MAX, .flags = V, .unit = "scan" },
#if FF_API_INTERLACE_LOWPASS_SET { "lowpass", "enable vertical low-pass filter", OFFSET(lowpass),
{ "lowpass", "(deprecated, this option is always set)", OFFSET(lowpass),
AV_OPT_TYPE_INT, {.i64 = 1 }, 0, 1, .flags = V }, AV_OPT_TYPE_INT, {.i64 = 1 }, 0, 1, .flags = V },
#endif
{ NULL } { NULL }
}; };
...@@ -105,15 +100,15 @@ static int config_out_props(AVFilterLink *outlink) ...@@ -105,15 +100,15 @@ static int config_out_props(AVFilterLink *outlink)
AVFilterLink *inlink = outlink->src->inputs[0]; AVFilterLink *inlink = outlink->src->inputs[0];
InterlaceContext *s = ctx->priv; InterlaceContext *s = ctx->priv;
#if FF_API_INTERLACE_LOWPASS_SET
if (!s->lowpass)
av_log(ctx, AV_LOG_WARNING, "This option is deprecated and always set.\n");
#endif
if (inlink->h < 2) { if (inlink->h < 2) {
av_log(ctx, AV_LOG_ERROR, "input video height is too small\n"); av_log(ctx, AV_LOG_ERROR, "input video height is too small\n");
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
if (!s->lowpass)
av_log(ctx, AV_LOG_WARNING, "***warning*** Lowpass filter is disabled, "
"the resulting video will be aliased rather than interlaced.\n");
// same input size // same input size
outlink->w = inlink->w; outlink->w = inlink->w;
outlink->h = inlink->h; outlink->h = inlink->h;
...@@ -121,14 +116,15 @@ static int config_out_props(AVFilterLink *outlink) ...@@ -121,14 +116,15 @@ static int config_out_props(AVFilterLink *outlink)
// half framerate // half framerate
outlink->time_base.num *= 2; outlink->time_base.num *= 2;
av_log(ctx, AV_LOG_VERBOSE, "%s interlacing\n", av_log(ctx, AV_LOG_VERBOSE, "%s interlacing %s lowpass filter\n",
s->scan == MODE_TFF ? "tff" : "bff"); s->scan == MODE_TFF ? "tff" : "bff", (s->lowpass) ? "with" : "without");
return 0; return 0;
} }
static void copy_picture_field(AVFrame *src_frame, AVFrame *dst_frame, static void copy_picture_field(AVFrame *src_frame, AVFrame *dst_frame,
AVFilterLink *inlink, enum FieldType field_type) AVFilterLink *inlink, enum FieldType field_type,
int lowpass)
{ {
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
int vsub = desc->log2_chroma_h; int vsub = desc->log2_chroma_h;
...@@ -139,8 +135,6 @@ static void copy_picture_field(AVFrame *src_frame, AVFrame *dst_frame, ...@@ -139,8 +135,6 @@ static void copy_picture_field(AVFrame *src_frame, AVFrame *dst_frame,
int linesize = av_image_get_linesize(inlink->format, inlink->w, plane); int linesize = av_image_get_linesize(inlink->format, inlink->w, plane);
uint8_t *dstp = dst_frame->data[plane]; uint8_t *dstp = dst_frame->data[plane];
const uint8_t *srcp = src_frame->data[plane]; const uint8_t *srcp = src_frame->data[plane];
int srcp_linesize;
int dstp_linesize;
av_assert0(linesize >= 0); av_assert0(linesize >= 0);
...@@ -149,9 +143,9 @@ static void copy_picture_field(AVFrame *src_frame, AVFrame *dst_frame, ...@@ -149,9 +143,9 @@ static void copy_picture_field(AVFrame *src_frame, AVFrame *dst_frame,
srcp += src_frame->linesize[plane]; srcp += src_frame->linesize[plane];
if (field_type == FIELD_LOWER) if (field_type == FIELD_LOWER)
dstp += dst_frame->linesize[plane]; dstp += dst_frame->linesize[plane];
if (lowpass) {
srcp_linesize = src_frame->linesize[plane] * 2; int srcp_linesize = src_frame->linesize[plane] * 2;
dstp_linesize = dst_frame->linesize[plane] * 2; int dstp_linesize = dst_frame->linesize[plane] * 2;
for (j = lines; j > 0; j--) { for (j = lines; j > 0; j--) {
const uint8_t *srcp_above = srcp - src_frame->linesize[plane]; const uint8_t *srcp_above = srcp - src_frame->linesize[plane];
const uint8_t *srcp_below = srcp + src_frame->linesize[plane]; const uint8_t *srcp_below = srcp + src_frame->linesize[plane];
...@@ -168,6 +162,11 @@ static void copy_picture_field(AVFrame *src_frame, AVFrame *dst_frame, ...@@ -168,6 +162,11 @@ static void copy_picture_field(AVFrame *src_frame, AVFrame *dst_frame,
dstp += dstp_linesize; dstp += dstp_linesize;
srcp += srcp_linesize; srcp += srcp_linesize;
} }
} else {
av_image_copy_plane(dstp, dst_frame->linesize[plane] * 2,
srcp, src_frame->linesize[plane] * 2,
linesize, lines);
}
} }
} }
...@@ -210,11 +209,11 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *buf) ...@@ -210,11 +209,11 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *buf)
out->pts /= 2; // adjust pts to new framerate out->pts /= 2; // adjust pts to new framerate
/* copy upper/lower field from cur */ /* copy upper/lower field from cur */
copy_picture_field(s->cur, out, inlink, tff ? FIELD_UPPER : FIELD_LOWER); copy_picture_field(s->cur, out, inlink, tff ? FIELD_UPPER : FIELD_LOWER, s->lowpass);
av_frame_free(&s->cur); av_frame_free(&s->cur);
/* copy lower/upper field from next */ /* copy lower/upper field from next */
copy_picture_field(s->next, out, inlink, tff ? FIELD_LOWER : FIELD_UPPER); copy_picture_field(s->next, out, inlink, tff ? FIELD_LOWER : FIELD_UPPER, s->lowpass);
av_frame_free(&s->next); av_frame_free(&s->next);
ret = ff_filter_frame(outlink, out); ret = ff_filter_frame(outlink, out);
......
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