1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-11-21 10:55:51 +02:00

Merge commit '52269f48e835a52023656f8330262ae70e6061c4'

* commit '52269f48e835a52023656f8330262ae70e6061c4':
  Revert "vf_interlace: deprecate lowpass option"

Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer 2014-08-01 16:39:22 +02:00
commit c87f645a75
3 changed files with 39 additions and 40 deletions

View File

@ -5454,8 +5454,7 @@ Swap luma/chroma/alpha fields. Exchange even & odd lines. Default value is @code
Simple interlacing filter from progressive contents. This interleaves upper (or
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
is always applied in order to avoid twitter effects and reduce moiré patterns.
halving the frame rate and preserving image height.
@example
Original Original New Frame
@ -5475,6 +5474,10 @@ It accepts the following optional parameters:
@item scan
This determines whether the interlaced frame is taken from the even
(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
@section kerndeint

View File

@ -88,8 +88,5 @@
#ifndef FF_API_NOCONST_GET_NAME
#define FF_API_NOCONST_GET_NAME (LIBAVFILTER_VERSION_MAJOR < 5)
#endif
#ifndef FF_API_INTERLACE_LOWPASS_SET
#define FF_API_INTERLACE_LOWPASS_SET (LIBAVFILTER_VERSION_MAJOR < 5)
#endif
#endif /* AVFILTER_VERSION_H */

View File

@ -34,7 +34,6 @@
#include "formats.h"
#include "avfilter.h"
#include "internal.h"
#include "version.h"
#include "video.h"
enum ScanMode {
@ -50,9 +49,7 @@ enum FieldType {
typedef struct InterlaceContext {
const AVClass *class;
enum ScanMode scan; // top or bottom field first scanning
#if FF_API_INTERLACE_LOWPASS_SET
int lowpass; // enable or disable low pass filterning
#endif
AVFrame *cur, *next; // the two frames from which the new one is obtained
} InterlaceContext;
@ -65,10 +62,8 @@ static const AVOption interlace_options[] = {
AV_OPT_TYPE_CONST, {.i64 = MODE_TFF }, INT_MIN, INT_MAX, .flags = V, .unit = "scan" },
{ "bff", "bottom field first", 0,
AV_OPT_TYPE_CONST, {.i64 = MODE_BFF }, INT_MIN, INT_MAX, .flags = V, .unit = "scan" },
#if FF_API_INTERLACE_LOWPASS_SET
{ "lowpass", "(deprecated, this option is always set)", OFFSET(lowpass),
{ "lowpass", "enable vertical low-pass filter", OFFSET(lowpass),
AV_OPT_TYPE_INT, {.i64 = 1 }, 0, 1, .flags = V },
#endif
{ NULL }
};
@ -101,15 +96,15 @@ static int config_out_props(AVFilterLink *outlink)
AVFilterLink *inlink = outlink->src->inputs[0];
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) {
av_log(ctx, AV_LOG_ERROR, "input video height is too small\n");
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
outlink->w = inlink->w;
outlink->h = inlink->h;
@ -120,14 +115,15 @@ static int config_out_props(AVFilterLink *outlink)
outlink->frame_rate.den *= 2;
outlink->flags |= FF_LINK_FLAG_REQUEST_LOOP;
av_log(ctx, AV_LOG_VERBOSE, "%s interlacing\n",
s->scan == MODE_TFF ? "tff" : "bff");
av_log(ctx, AV_LOG_VERBOSE, "%s interlacing %s lowpass filter\n",
s->scan == MODE_TFF ? "tff" : "bff", (s->lowpass) ? "with" : "without");
return 0;
}
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);
int vsub = desc->log2_chroma_h;
@ -138,8 +134,6 @@ static void copy_picture_field(AVFrame *src_frame, AVFrame *dst_frame,
int linesize = av_image_get_linesize(inlink->format, inlink->w, plane);
uint8_t *dstp = dst_frame->data[plane];
const uint8_t *srcp = src_frame->data[plane];
int srcp_linesize;
int dstp_linesize;
av_assert0(linesize >= 0);
@ -148,24 +142,29 @@ static void copy_picture_field(AVFrame *src_frame, AVFrame *dst_frame,
srcp += src_frame->linesize[plane];
if (field_type == FIELD_LOWER)
dstp += dst_frame->linesize[plane];
srcp_linesize = src_frame->linesize[plane] * 2;
dstp_linesize = dst_frame->linesize[plane] * 2;
for (j = lines; j > 0; j--) {
const uint8_t *srcp_above = srcp - src_frame->linesize[plane];
const uint8_t *srcp_below = srcp + src_frame->linesize[plane];
if (j == lines)
srcp_above = srcp; // there is no line above
if (j == 1)
srcp_below = srcp; // there is no line below
for (i = 0; i < linesize; i++) {
// this calculation is an integer representation of
// '0.5 * current + 0.25 * above + 0.25 * below'
// '1 +' is for rounding.
dstp[i] = (1 + srcp[i] + srcp[i] + srcp_above[i] + srcp_below[i]) >> 2;
if (lowpass) {
int srcp_linesize = src_frame->linesize[plane] * 2;
int dstp_linesize = dst_frame->linesize[plane] * 2;
for (j = lines; j > 0; j--) {
const uint8_t *srcp_above = srcp - src_frame->linesize[plane];
const uint8_t *srcp_below = srcp + src_frame->linesize[plane];
if (j == lines)
srcp_above = srcp; // there is no line above
if (j == 1)
srcp_below = srcp; // there is no line below
for (i = 0; i < linesize; i++) {
// this calculation is an integer representation of
// '0.5 * current + 0.25 * above + 0.25 * below'
// '1 +' is for rounding.
dstp[i] = (1 + srcp[i] + srcp[i] + srcp_above[i] + srcp_below[i]) >> 2;
}
dstp += dstp_linesize;
srcp += srcp_linesize;
}
dstp += dstp_linesize;
srcp += srcp_linesize;
} else {
av_image_copy_plane(dstp, dst_frame->linesize[plane] * 2,
srcp, src_frame->linesize[plane] * 2,
linesize, lines);
}
}
}
@ -208,11 +207,11 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *buf)
out->pts /= 2; // adjust pts to new framerate
/* 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);
/* 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);
ret = ff_filter_frame(outlink, out);