[FFmpeg-devel] [PATCH] avfilter: Remove mcdeint, uspp filters

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Wed Mar 15 19:19:21 EET 2023


Andreas Rheinhardt:
> These filters have been disabled two years ago in commit
> 95054bfa48cc71db1c7bf66a6b6628cb62f262bf at the major bump
> before the last major bump. No one stepped up to port them,
> so this commit removes them.
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
> ---
>  LICENSE.md                           |   2 -
>  configure                            |  10 -
>  doc/filters.texi                     |  73 ----
>  libavfilter/Makefile                 |   2 -
>  libavfilter/allfilters.c             |   2 -
>  libavfilter/vf_mcdeint.c             | 303 ----------------
>  libavfilter/vf_uspp.c                | 498 ---------------------------
>  tests/fate/filter-video.mak          |   8 -
>  tests/ref/fate/filter-mcdeint-fast   |  35 --
>  tests/ref/fate/filter-mcdeint-medium |  35 --
>  10 files changed, 968 deletions(-)
>  delete mode 100644 libavfilter/vf_mcdeint.c
>  delete mode 100644 libavfilter/vf_uspp.c
>  delete mode 100644 tests/ref/fate/filter-mcdeint-fast
>  delete mode 100644 tests/ref/fate/filter-mcdeint-medium
> 
> diff --git a/LICENSE.md b/LICENSE.md
> index 613070e1b6..7e5ad9f7e4 100644
> --- a/LICENSE.md
> +++ b/LICENSE.md
> @@ -39,7 +39,6 @@ Specifically, the GPL parts of FFmpeg are:
>      - `vf_hqdn3d.c`
>      - `vf_kerndeint.c`
>      - `vf_lensfun.c` (GPL version 3 or later)
> -    - `vf_mcdeint.c`
>      - `vf_mpdecimate.c`
>      - `vf_nnedi.c`
>      - `vf_owdenoise.c`
> @@ -56,7 +55,6 @@ Specifically, the GPL parts of FFmpeg are:
>      - `vf_stereo3d.c`
>      - `vf_super2xsai.c`
>      - `vf_tinterlace.c`
> -    - `vf_uspp.c`
>      - `vf_vaguedenoiser.c`
>      - `vsrc_mptestsrc.c`
>  
> diff --git a/configure b/configure
> index 03d3c429a5..6bc7a4382f 100755
> --- a/configure
> +++ b/configure
> @@ -3686,7 +3686,6 @@ ladspa_filter_deps="ladspa libdl"
>  lensfun_filter_deps="liblensfun version3"
>  libplacebo_filter_deps="libplacebo vulkan"
>  lv2_filter_deps="lv2"
> -mcdeint_filter_deps="avcodec gpl"
>  metadata_filter_deps="avformat"
>  movie_filter_deps="avcodec avformat"
>  mpdecimate_filter_deps="gpl"
> @@ -3752,7 +3751,6 @@ transpose_opencl_filter_deps="opencl"
>  transpose_vaapi_filter_deps="vaapi VAProcPipelineCaps_rotation_flags"
>  transpose_vulkan_filter_deps="vulkan spirv_compiler"
>  unsharp_opencl_filter_deps="opencl"
> -uspp_filter_deps="gpl avcodec"
>  vaguedenoiser_filter_deps="gpl"
>  vflip_vulkan_filter_deps="vulkan spirv_compiler"
>  vidstabdetect_filter_deps="libvidstab"
> @@ -7355,12 +7353,6 @@ esac
>  
>  enable frame_thread_encoder
>  
> -# these filters depend on removed avcodec APIs
> -# they are kept disabled for now, but will be removed if
> -# nobody updates and re-enables them
> -disable mcdeint_filter
> -disable uspp_filter
> -
>  enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; }
>  
>  check_deps $CONFIG_LIST       \
> @@ -7470,7 +7462,6 @@ enabled cover_rect_filter   && prepend avfilter_deps "avformat avcodec"
>  enabled ebur128_filter && enabled swresample && prepend avfilter_deps "swresample"
>  enabled elbg_filter         && prepend avfilter_deps "avcodec"
>  enabled find_rect_filter    && prepend avfilter_deps "avformat avcodec"
> -enabled mcdeint_filter      && prepend avfilter_deps "avcodec"
>  enabled movie_filter    && prepend avfilter_deps "avformat avcodec"
>  enabled pan_filter          && prepend avfilter_deps "swresample"
>  enabled pp_filter           && prepend avfilter_deps "postproc"
> @@ -7484,7 +7475,6 @@ enabled smartblur_filter    && prepend avfilter_deps "swscale"
>  enabled spp_filter          && prepend avfilter_deps "avcodec"
>  enabled sr_filter           && prepend avfilter_deps "avformat swscale"
>  enabled subtitles_filter    && prepend avfilter_deps "avformat avcodec"
> -enabled uspp_filter         && prepend avfilter_deps "avcodec"
>  enabled zoompan_filter      && prepend avfilter_deps "swscale"
>  
>  enabled lavfi_indev         && prepend avdevice_deps "avfilter"
> diff --git a/doc/filters.texi b/doc/filters.texi
> index 7a7b2ba4e7..e8826ba2a3 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -16984,52 +16984,6 @@ Typically useful for scene changes when used in combination with @code{tblend} f
>  
>  This filter supports the all above options as @ref{commands}.
>  
> - at section mcdeint
> -
> -Apply motion-compensation deinterlacing.
> -
> -It needs one field per frame as input and must thus be used together
> -with yadif=1/3 or equivalent.
> -
> -This filter is only available in ffmpeg version 4.4 or earlier.
> -
> -This filter accepts the following options:
> - at table @option
> - at item mode
> -Set the deinterlacing mode.
> -
> -It accepts one of the following values:
> - at table @samp
> - at item fast
> - at item medium
> - at item slow
> -use iterative motion estimation
> - at item extra_slow
> -like @samp{slow}, but use multiple reference frames.
> - at end table
> -Default value is @samp{fast}.
> -
> - at item parity
> -Set the picture field parity assumed for the input video. It must be
> -one of the following values:
> -
> - at table @samp
> - at item 0, tff
> -assume top field first
> - at item 1, bff
> -assume bottom field first
> - at end table
> -
> -Default value is @samp{bff}.
> -
> - at item qp
> -Set per-block quantization parameter (QP) used by the internal
> -encoder.
> -
> -Higher values should result in a smoother motion vector field but less
> -optimal individual vectors. Default value is 1.
> - at end table
> -
>  @section median
>  
>  Pick median pixel from certain rectangle defined by radius.
> @@ -23342,33 +23296,6 @@ ffmpeg -r 1 -i image.jpg -vf untile=1x25 movie.mkv
>  @end example
>  @end itemize
>  
> - at section uspp
> -
> -Apply ultra slow/simple postprocessing filter that compresses and decompresses
> -the image at several (or - in the case of @option{quality} level @code{8} - all)
> -shifts and average the results.
> -
> -The way this differs from the behavior of spp is that uspp actually encodes &
> -decodes each case with libavcodec Snow, whereas spp uses a simplified intra only 8x8
> -DCT similar to MJPEG.
> -
> -This filter is only available in ffmpeg version 4.4 or earlier.
> -
> -The filter accepts the following options:
> -
> - at table @option
> - at item quality
> -Set quality. This option defines the number of levels for averaging. It accepts
> -an integer in the range 0-8. If set to @code{0}, the filter will have no
> -effect. A value of @code{8} means the higher quality. For each increment of
> -that value the speed drops by a factor of approximately 2.  Default value is
> - at code{3}.
> -
> - at item qp
> -Force a constant quantization parameter. If not set, the filter will use the QP
> -from the video stream (if available).
> - at end table
> -
>  @section v360
>  
>  Convert 360 videos between various formats.
> diff --git a/libavfilter/Makefile b/libavfilter/Makefile
> index b3d3d981dd..8b0b908617 100644
> --- a/libavfilter/Makefile
> +++ b/libavfilter/Makefile
> @@ -370,7 +370,6 @@ OBJS-$(CONFIG_MASKEDMERGE_FILTER)            += vf_maskedmerge.o framesync.o
>  OBJS-$(CONFIG_MASKEDMIN_FILTER)              += vf_maskedminmax.o framesync.o
>  OBJS-$(CONFIG_MASKEDTHRESHOLD_FILTER)        += vf_maskedthreshold.o framesync.o
>  OBJS-$(CONFIG_MASKFUN_FILTER)                += vf_maskfun.o
> -OBJS-$(CONFIG_MCDEINT_FILTER)                += vf_mcdeint.o
>  OBJS-$(CONFIG_MEDIAN_FILTER)                 += vf_median.o
>  OBJS-$(CONFIG_MERGEPLANES_FILTER)            += vf_mergeplanes.o framesync.o
>  OBJS-$(CONFIG_MESTIMATE_FILTER)              += vf_mestimate.o motion_estimation.o
> @@ -522,7 +521,6 @@ OBJS-$(CONFIG_UNSHARP_FILTER)                += vf_unsharp.o
>  OBJS-$(CONFIG_UNSHARP_OPENCL_FILTER)         += vf_unsharp_opencl.o opencl.o \
>                                                  opencl/unsharp.o
>  OBJS-$(CONFIG_UNTILE_FILTER)                 += vf_untile.o
> -OBJS-$(CONFIG_USPP_FILTER)                   += vf_uspp.o qp_table.o
>  OBJS-$(CONFIG_V360_FILTER)                   += vf_v360.o
>  OBJS-$(CONFIG_VAGUEDENOISER_FILTER)          += vf_vaguedenoiser.o
>  OBJS-$(CONFIG_VARBLUR_FILTER)                += vf_varblur.o framesync.o
> diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c
> index d7db46c2af..f4b36e88d6 100644
> --- a/libavfilter/allfilters.c
> +++ b/libavfilter/allfilters.c
> @@ -348,7 +348,6 @@ extern const AVFilter ff_vf_maskedmerge;
>  extern const AVFilter ff_vf_maskedmin;
>  extern const AVFilter ff_vf_maskedthreshold;
>  extern const AVFilter ff_vf_maskfun;
> -extern const AVFilter ff_vf_mcdeint;
>  extern const AVFilter ff_vf_median;
>  extern const AVFilter ff_vf_mergeplanes;
>  extern const AVFilter ff_vf_mestimate;
> @@ -491,7 +490,6 @@ extern const AVFilter ff_vf_unpremultiply;
>  extern const AVFilter ff_vf_unsharp;
>  extern const AVFilter ff_vf_unsharp_opencl;
>  extern const AVFilter ff_vf_untile;
> -extern const AVFilter ff_vf_uspp;
>  extern const AVFilter ff_vf_v360;
>  extern const AVFilter ff_vf_vaguedenoiser;
>  extern const AVFilter ff_vf_varblur;
> diff --git a/libavfilter/vf_mcdeint.c b/libavfilter/vf_mcdeint.c
> deleted file mode 100644
> index e747521c0a..0000000000
> --- a/libavfilter/vf_mcdeint.c
> +++ /dev/null
> @@ -1,303 +0,0 @@
> -/*
> - * Copyright (c) 2006 Michael Niedermayer <michaelni at gmx.at>
> - *
> - * This file is part of FFmpeg.
> - *
> - * FFmpeg is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License as published by
> - * the Free Software Foundation; either version 2 of the License, or
> - * (at your option) any later version.
> - *
> - * FFmpeg is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - *
> - * You should have received a copy of the GNU General Public License along
> - * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
> - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> - */
> -
> -/**
> - * @file
> - * Motion Compensation Deinterlacer
> - * Ported from MPlayer libmpcodecs/vf_mcdeint.c.
> - *
> - * Known Issues:
> - *
> - * The motion estimation is somewhat at the mercy of the input, if the
> - * input frames are created purely based on spatial interpolation then
> - * for example a thin black line or another random and not
> - * interpolateable pattern will cause problems.
> - * Note: completely ignoring the "unavailable" lines during motion
> - * estimation did not look any better, so the most obvious solution
> - * would be to improve tfields or penalize problematic motion vectors.
> - *
> - * If non iterative ME is used then snow currently ignores the OBMC
> - * window and as a result sometimes creates artifacts.
> - *
> - * Only past frames are used, we should ideally use future frames too,
> - * something like filtering the whole movie in forward and then
> - * backward direction seems like an interesting idea but the current
> - * filter framework is FAR from supporting such things.
> - *
> - * Combining the motion compensated image with the input image also is
> - * not as trivial as it seems, simple blindly taking even lines from
> - * one and odd ones from the other does not work at all as ME/MC
> - * sometimes has nothing in the previous frames which matches the
> - * current. The current algorithm has been found by trial and error
> - * and almost certainly can be improved...
> - */
> -
> -#include "libavutil/opt.h"
> -#include "libavutil/pixdesc.h"
> -#include "libavcodec/avcodec.h"
> -#include "avfilter.h"
> -#include "formats.h"
> -#include "internal.h"
> -
> -enum MCDeintMode {
> -    MODE_FAST = 0,
> -    MODE_MEDIUM,
> -    MODE_SLOW,
> -    MODE_EXTRA_SLOW,
> -    MODE_NB,
> -};
> -
> -enum MCDeintParity {
> -    PARITY_TFF  =  0, ///< top field first
> -    PARITY_BFF  =  1, ///< bottom field first
> -};
> -
> -typedef struct MCDeintContext {
> -    const AVClass *class;
> -    int mode;           ///< MCDeintMode
> -    int parity;         ///< MCDeintParity
> -    int qp;
> -    AVPacket *pkt;
> -    AVCodecContext *enc_ctx;
> -} MCDeintContext;
> -
> -#define OFFSET(x) offsetof(MCDeintContext, x)
> -#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
> -#define CONST(name, help, val, unit) { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, INT_MIN, INT_MAX, FLAGS, unit }
> -
> -static const AVOption mcdeint_options[] = {
> -    { "mode", "set mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=MODE_FAST}, 0, MODE_NB-1, FLAGS, .unit="mode" },
> -    CONST("fast",       NULL, MODE_FAST,       "mode"),
> -    CONST("medium",     NULL, MODE_MEDIUM,     "mode"),
> -    CONST("slow",       NULL, MODE_SLOW,       "mode"),
> -    CONST("extra_slow", NULL, MODE_EXTRA_SLOW, "mode"),
> -
> -    { "parity", "set the assumed picture field parity", OFFSET(parity), AV_OPT_TYPE_INT, {.i64=PARITY_BFF}, -1, 1, FLAGS, "parity" },
> -    CONST("tff", "assume top field first",    PARITY_TFF, "parity"),
> -    CONST("bff", "assume bottom field first", PARITY_BFF, "parity"),
> -
> -    { "qp", "set qp", OFFSET(qp), AV_OPT_TYPE_INT, {.i64=1}, INT_MIN, INT_MAX, FLAGS },
> -    { NULL }
> -};
> -
> -AVFILTER_DEFINE_CLASS(mcdeint);
> -
> -static int config_props(AVFilterLink *inlink)
> -{
> -    AVFilterContext *ctx = inlink->dst;
> -    MCDeintContext *mcdeint = ctx->priv;
> -    const AVCodec *enc;
> -    AVCodecContext *enc_ctx;
> -    AVDictionary *opts = NULL;
> -    int ret;
> -
> -    if (!(enc = avcodec_find_encoder(AV_CODEC_ID_SNOW))) {
> -        av_log(ctx, AV_LOG_ERROR, "Snow encoder is not enabled in libavcodec\n");
> -        return AVERROR(EINVAL);
> -    }
> -
> -    mcdeint->pkt = av_packet_alloc();
> -    if (!mcdeint->pkt)
> -        return AVERROR(ENOMEM);
> -    mcdeint->enc_ctx = avcodec_alloc_context3(enc);
> -    if (!mcdeint->enc_ctx)
> -        return AVERROR(ENOMEM);
> -    enc_ctx = mcdeint->enc_ctx;
> -    enc_ctx->width  = inlink->w;
> -    enc_ctx->height = inlink->h;
> -    enc_ctx->time_base = (AVRational){1,25};  // meaningless
> -    enc_ctx->gop_size = INT_MAX;
> -    enc_ctx->max_b_frames = 0;
> -    enc_ctx->pix_fmt = AV_PIX_FMT_YUV420P;
> -    enc_ctx->flags = AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_LOW_DELAY;
> -    enc_ctx->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
> -    enc_ctx->global_quality = 1;
> -    enc_ctx->me_cmp = enc_ctx->me_sub_cmp = FF_CMP_SAD;
> -    enc_ctx->mb_cmp = FF_CMP_SSE;
> -    av_dict_set(&opts, "memc_only", "1", 0);
> -    av_dict_set(&opts, "no_bitstream", "1", 0);
> -
> -    switch (mcdeint->mode) {
> -    case MODE_EXTRA_SLOW:
> -        enc_ctx->refs = 3;
> -    case MODE_SLOW:
> -        av_dict_set(&opts, "motion_est", "iter", 0);
> -    case MODE_MEDIUM:
> -        enc_ctx->flags |= AV_CODEC_FLAG_4MV;
> -        enc_ctx->dia_size = 2;
> -    case MODE_FAST:
> -        enc_ctx->flags |= AV_CODEC_FLAG_QPEL;
> -    }
> -
> -    ret = avcodec_open2(enc_ctx, enc, &opts);
> -    av_dict_free(&opts);
> -    if (ret < 0)
> -        return ret;
> -
> -    return 0;
> -}
> -
> -static av_cold void uninit(AVFilterContext *ctx)
> -{
> -    MCDeintContext *mcdeint = ctx->priv;
> -
> -    av_packet_free(&mcdeint->pkt);
> -    avcodec_free_context(&mcdeint->enc_ctx);
> -}
> -
> -static int filter_frame(AVFilterLink *inlink, AVFrame *inpic)
> -{
> -    MCDeintContext *mcdeint = inlink->dst->priv;
> -    AVFilterLink *outlink = inlink->dst->outputs[0];
> -    AVFrame *outpic, *frame_dec;
> -    AVPacket *pkt = mcdeint->pkt;
> -    int x, y, i, ret, got_frame = 0;
> -
> -    outpic = ff_get_video_buffer(outlink, outlink->w, outlink->h);
> -    if (!outpic) {
> -        av_frame_free(&inpic);
> -        return AVERROR(ENOMEM);
> -    }
> -    av_frame_copy_props(outpic, inpic);
> -    inpic->quality = mcdeint->qp * FF_QP2LAMBDA;
> -
> -    ret = avcodec_encode_video2(mcdeint->enc_ctx, pkt, inpic, &got_frame);
> -    if (ret < 0)
> -        goto end;
> -
> -    frame_dec = mcdeint->enc_ctx->coded_frame;
> -
> -    for (i = 0; i < 3; i++) {
> -        int is_chroma = !!i;
> -        int w = AV_CEIL_RSHIFT(inlink->w, is_chroma);
> -        int h = AV_CEIL_RSHIFT(inlink->h, is_chroma);
> -        int fils = frame_dec->linesize[i];
> -        int srcs = inpic    ->linesize[i];
> -        int dsts = outpic   ->linesize[i];
> -
> -        for (y = 0; y < h; y++) {
> -            if ((y ^ mcdeint->parity) & 1) {
> -                for (x = 0; x < w; x++) {
> -                    uint8_t *filp = &frame_dec->data[i][x + y*fils];
> -                    uint8_t *srcp = &inpic    ->data[i][x + y*srcs];
> -                    uint8_t *dstp = &outpic   ->data[i][x + y*dsts];
> -
> -                    if (y > 0 && y < h-1){
> -                        int is_edge = x < 3 || x > w-4;
> -                        int diff0 = filp[-fils] - srcp[-srcs];
> -                        int diff1 = filp[+fils] - srcp[+srcs];
> -                        int temp = filp[0];
> -
> -#define DELTA(j) av_clip(j, -x, w-1-x)
> -
> -#define GET_SCORE_EDGE(j)\
> -   FFABS(srcp[-srcs+DELTA(-1+(j))] - srcp[+srcs+DELTA(-1-(j))])+\
> -   FFABS(srcp[-srcs+DELTA(j)     ] - srcp[+srcs+DELTA(  -(j))])+\
> -   FFABS(srcp[-srcs+DELTA(1+(j)) ] - srcp[+srcs+DELTA( 1-(j))])
> -
> -#define GET_SCORE(j)\
> -   FFABS(srcp[-srcs-1+(j)] - srcp[+srcs-1-(j)])+\
> -   FFABS(srcp[-srcs  +(j)] - srcp[+srcs  -(j)])+\
> -   FFABS(srcp[-srcs+1+(j)] - srcp[+srcs+1-(j)])
> -
> -#define CHECK_EDGE(j)\
> -    {   int score = GET_SCORE_EDGE(j);\
> -        if (score < spatial_score){\
> -            spatial_score = score;\
> -            diff0 = filp[-fils+DELTA(j)]    - srcp[-srcs+DELTA(j)];\
> -            diff1 = filp[+fils+DELTA(-(j))] - srcp[+srcs+DELTA(-(j))];\
> -
> -#define CHECK(j)\
> -    {   int score = GET_SCORE(j);\
> -        if (score < spatial_score){\
> -            spatial_score= score;\
> -            diff0 = filp[-fils+(j)] - srcp[-srcs+(j)];\
> -            diff1 = filp[+fils-(j)] - srcp[+srcs-(j)];\
> -
> -                        if (is_edge) {
> -                            int spatial_score = GET_SCORE_EDGE(0) - 1;
> -                            CHECK_EDGE(-1) CHECK_EDGE(-2) }} }}
> -                            CHECK_EDGE( 1) CHECK_EDGE( 2) }} }}
> -                        } else {
> -                            int spatial_score = GET_SCORE(0) - 1;
> -                            CHECK(-1) CHECK(-2) }} }}
> -                            CHECK( 1) CHECK( 2) }} }}
> -                        }
> -
> -
> -                        if (diff0 + diff1 > 0)
> -                            temp -= (diff0 + diff1 - FFABS(FFABS(diff0) - FFABS(diff1)) / 2) / 2;
> -                        else
> -                            temp -= (diff0 + diff1 + FFABS(FFABS(diff0) - FFABS(diff1)) / 2) / 2;
> -                        *filp = *dstp = temp > 255U ? ~(temp>>31) : temp;
> -                    } else {
> -                        *dstp = *filp;
> -                    }
> -                }
> -            }
> -        }
> -
> -        for (y = 0; y < h; y++) {
> -            if (!((y ^ mcdeint->parity) & 1)) {
> -                for (x = 0; x < w; x++) {
> -                    frame_dec->data[i][x + y*fils] =
> -                    outpic   ->data[i][x + y*dsts] = inpic->data[i][x + y*srcs];
> -                }
> -            }
> -        }
> -    }
> -    mcdeint->parity ^= 1;
> -
> -end:
> -    av_packet_unref(pkt);
> -    av_frame_free(&inpic);
> -    if (ret < 0) {
> -        av_frame_free(&outpic);
> -        return ret;
> -    }
> -    return ff_filter_frame(outlink, outpic);
> -}
> -
> -static const AVFilterPad mcdeint_inputs[] = {
> -    {
> -        .name         = "default",
> -        .type         = AVMEDIA_TYPE_VIDEO,
> -        .filter_frame = filter_frame,
> -        .config_props = config_props,
> -    },
> -};
> -
> -static const AVFilterPad mcdeint_outputs[] = {
> -    {
> -        .name = "default",
> -        .type = AVMEDIA_TYPE_VIDEO,
> -    },
> -};
> -
> -const AVFilter ff_vf_mcdeint = {
> -    .name          = "mcdeint",
> -    .description   = NULL_IF_CONFIG_SMALL("Apply motion compensating deinterlacing."),
> -    .priv_size     = sizeof(MCDeintContext),
> -    .uninit        = uninit,
> -    FILTER_INPUTS(mcdeint_inputs),
> -    FILTER_OUTPUTS(mcdeint_outputs),
> -    FILTER_SINGLE_PIXFMT(AV_PIX_FMT_YUV420P),
> -    .priv_class    = &mcdeint_class,
> -};
> diff --git a/libavfilter/vf_uspp.c b/libavfilter/vf_uspp.c
> deleted file mode 100644
> index 051de00771..0000000000
> --- a/libavfilter/vf_uspp.c
> +++ /dev/null
> @@ -1,498 +0,0 @@
> -/*
> - * Copyright (c) 2003 Michael Niedermayer <michaelni at gmx.at>
> - * Copyright (c) 2014 Arwa Arif <arwaarif1994 at gmail.com>
> - *
> - * This file is part of FFmpeg.
> - *
> - * FFmpeg is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License as published by
> - * the Free Software Foundation; either version 2 of the License, or
> - * (at your option) any later version.
> - *
> - * FFmpeg is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - *
> - * You should have received a copy of the GNU General Public License along
> - * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
> - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> - */
> -
> -/**
> - * @file
> - * Ultra Slow/Simple Post-processing filter.
> - *
> - * Originally written by Michael Niedermayer for the MPlayer project, and
> - * ported by Arwa Arif for FFmpeg.
> - */
> -
> -#include "libavutil/avassert.h"
> -#include "libavutil/imgutils.h"
> -#include "libavutil/mem_internal.h"
> -#include "libavutil/opt.h"
> -#include "libavutil/pixdesc.h"
> -#include "libavutil/video_enc_params.h"
> -#include "libavcodec/avcodec.h"
> -#include "internal.h"
> -#include "qp_table.h"
> -#include "avfilter.h"
> -
> -#define MAX_LEVEL 8 /* quality levels */
> -#define BLOCK 16
> -
> -typedef struct USPPContext {
> -    const AVClass *av_class;
> -    int log2_count;
> -    int hsub, vsub;
> -    int qp;
> -    enum AVVideoEncParamsType qscale_type;
> -    int temp_stride[3];
> -    uint8_t *src[3];
> -    uint16_t *temp[3];
> -    int outbuf_size;
> -    uint8_t *outbuf;
> -    AVCodecContext *avctx_enc[BLOCK*BLOCK];
> -    AVPacket *pkt;
> -    AVFrame *frame;
> -    AVFrame *frame_dec;
> -    int8_t *non_b_qp_table;
> -    int non_b_qp_stride;
> -    int use_bframe_qp;
> -} USPPContext;
> -
> -#define OFFSET(x) offsetof(USPPContext, x)
> -#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
> -static const AVOption uspp_options[] = {
> -    { "quality",       "set quality",                          OFFSET(log2_count),    AV_OPT_TYPE_INT, {.i64 = 3}, 0, MAX_LEVEL, FLAGS },
> -    { "qp",            "force a constant quantizer parameter", OFFSET(qp),            AV_OPT_TYPE_INT, {.i64 = 0}, 0, 63,        FLAGS },
> -    { "use_bframe_qp", "use B-frames' QP",                     OFFSET(use_bframe_qp), AV_OPT_TYPE_BOOL,{.i64 = 0}, 0, 1,         FLAGS },
> -    { NULL }
> -};
> -
> -AVFILTER_DEFINE_CLASS(uspp);
> -
> -DECLARE_ALIGNED(8, static const uint8_t, dither)[8][8] = {
> -    {  0*4,  48*4,  12*4,  60*4,   3*4,  51*4,  15*4,  63*4, },
> -    { 32*4,  16*4,  44*4,  28*4,  35*4,  19*4,  47*4,  31*4, },
> -    {  8*4,  56*4,   4*4,  52*4,  11*4,  59*4,   7*4,  55*4, },
> -    { 40*4,  24*4,  36*4,  20*4,  43*4,  27*4,  39*4,  23*4, },
> -    {  2*4,  50*4,  14*4,  62*4,   1*4,  49*4,  13*4,  61*4, },
> -    { 34*4,  18*4,  46*4,  30*4,  33*4,  17*4,  45*4,  29*4, },
> -    { 10*4,  58*4,   6*4,  54*4,   9*4,  57*4,   5*4,  53*4, },
> -    { 42*4,  26*4,  38*4,  22*4,  41*4,  25*4,  37*4,  21*4, },
> -};
> -
> -static const uint8_t offset[511][2] = {
> -    { 0, 0},
> -    { 0, 0}, { 8, 8},                                                              // quality 1
> -    { 0, 0}, { 4, 4}, {12, 8}, { 8,12},                                            // quality 2
> -    { 0, 0}, {10, 2}, { 4, 4}, {14, 6}, { 8, 8}, { 2,10}, {12,12}, { 6,14},        // quality 3
> -
> -    { 0, 0}, {10, 2}, { 4, 4}, {14, 6}, { 8, 8}, { 2,10}, {12,12}, { 6,14},
> -    { 5, 1}, {15, 3}, { 9, 5}, { 3, 7}, {13, 9}, { 7,11}, { 1,13}, {11,15},        // quality 4
> -
> -    { 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 5, 1}, {13, 1}, { 5, 9}, {13, 9},
> -    { 2, 2}, {10, 2}, { 2,10}, {10,10}, { 7, 3}, {15, 3}, { 7,11}, {15,11},
> -    { 4, 4}, {12, 4}, { 4,12}, {12,12}, { 1, 5}, { 9, 5}, { 1,13}, { 9,13},
> -    { 6, 6}, {14, 6}, { 6,14}, {14,14}, { 3, 7}, {11, 7}, { 3,15}, {11,15},        // quality 5
> -
> -    { 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 4, 0}, {12, 0}, { 4, 8}, {12, 8},
> -    { 1, 1}, { 9, 1}, { 1, 9}, { 9, 9}, { 5, 1}, {13, 1}, { 5, 9}, {13, 9},
> -    { 3, 2}, {11, 2}, { 3,10}, {11,10}, { 7, 2}, {15, 2}, { 7,10}, {15,10},
> -    { 2, 3}, {10, 3}, { 2,11}, {10,11}, { 6, 3}, {14, 3}, { 6,11}, {14,11},
> -    { 0, 4}, { 8, 4}, { 0,12}, { 8,12}, { 4, 4}, {12, 4}, { 4,12}, {12,12},
> -    { 1, 5}, { 9, 5}, { 1,13}, { 9,13}, { 5, 5}, {13, 5}, { 5,13}, {13,13},
> -    { 3, 6}, {11, 6}, { 3,14}, {11,14}, { 7, 6}, {15, 6}, { 7,14}, {15,14},
> -    { 2, 7}, {10, 7}, { 2,15}, {10,15}, { 6, 7}, {14, 7}, { 6,15}, {14,15},        // quality 6
> -
> -    { 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 0, 2}, { 8, 2}, { 0,10}, { 8,10},
> -    { 0, 4}, { 8, 4}, { 0,12}, { 8,12}, { 0, 6}, { 8, 6}, { 0,14}, { 8,14},
> -    { 1, 1}, { 9, 1}, { 1, 9}, { 9, 9}, { 1, 3}, { 9, 3}, { 1,11}, { 9,11},
> -    { 1, 5}, { 9, 5}, { 1,13}, { 9,13}, { 1, 7}, { 9, 7}, { 1,15}, { 9,15},
> -    { 2, 0}, {10, 0}, { 2, 8}, {10, 8}, { 2, 2}, {10, 2}, { 2,10}, {10,10},
> -    { 2, 4}, {10, 4}, { 2,12}, {10,12}, { 2, 6}, {10, 6}, { 2,14}, {10,14},
> -    { 3, 1}, {11, 1}, { 3, 9}, {11, 9}, { 3, 3}, {11, 3}, { 3,11}, {11,11},
> -    { 3, 5}, {11, 5}, { 3,13}, {11,13}, { 3, 7}, {11, 7}, { 3,15}, {11,15},
> -    { 4, 0}, {12, 0}, { 4, 8}, {12, 8}, { 4, 2}, {12, 2}, { 4,10}, {12,10},
> -    { 4, 4}, {12, 4}, { 4,12}, {12,12}, { 4, 6}, {12, 6}, { 4,14}, {12,14},
> -    { 5, 1}, {13, 1}, { 5, 9}, {13, 9}, { 5, 3}, {13, 3}, { 5,11}, {13,11},
> -    { 5, 5}, {13, 5}, { 5,13}, {13,13}, { 5, 7}, {13, 7}, { 5,15}, {13,15},
> -    { 6, 0}, {14, 0}, { 6, 8}, {14, 8}, { 6, 2}, {14, 2}, { 6,10}, {14,10},
> -    { 6, 4}, {14, 4}, { 6,12}, {14,12}, { 6, 6}, {14, 6}, { 6,14}, {14,14},
> -    { 7, 1}, {15, 1}, { 7, 9}, {15, 9}, { 7, 3}, {15, 3}, { 7,11}, {15,11},
> -    { 7, 5}, {15, 5}, { 7,13}, {15,13}, { 7, 7}, {15, 7}, { 7,15}, {15,15},        // quality 7
> -
> -    { 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 4, 4}, {12, 4}, { 4,12}, {12,12},
> -    { 0, 4}, { 8, 4}, { 0,12}, { 8,12}, { 4, 0}, {12, 0}, { 4, 8}, {12, 8},
> -    { 2, 2}, {10, 2}, { 2,10}, {10,10}, { 6, 6}, {14, 6}, { 6,14}, {14,14},
> -    { 2, 6}, {10, 6}, { 2,14}, {10,14}, { 6, 2}, {14, 2}, { 6,10}, {14,10},
> -    { 0, 2}, { 8, 2}, { 0,10}, { 8,10}, { 4, 6}, {12, 6}, { 4,14}, {12,14},
> -    { 0, 6}, { 8, 6}, { 0,14}, { 8,14}, { 4, 2}, {12, 2}, { 4,10}, {12,10},
> -    { 2, 0}, {10, 0}, { 2, 8}, {10, 8}, { 6, 4}, {14, 4}, { 6,12}, {14,12},
> -    { 2, 4}, {10, 4}, { 2,12}, {10,12}, { 6, 0}, {14, 0}, { 6, 8}, {14, 8},
> -    { 1, 1}, { 9, 1}, { 1, 9}, { 9, 9}, { 5, 5}, {13, 5}, { 5,13}, {13,13},
> -    { 1, 5}, { 9, 5}, { 1,13}, { 9,13}, { 5, 1}, {13, 1}, { 5, 9}, {13, 9},
> -    { 3, 3}, {11, 3}, { 3,11}, {11,11}, { 7, 7}, {15, 7}, { 7,15}, {15,15},
> -    { 3, 7}, {11, 7}, { 3,15}, {11,15}, { 7, 3}, {15, 3}, { 7,11}, {15,11},
> -    { 1, 3}, { 9, 3}, { 1,11}, { 9,11}, { 5, 7}, {13, 7}, { 5,15}, {13,15},
> -    { 1, 7}, { 9, 7}, { 1,15}, { 9,15}, { 5, 3}, {13, 3}, { 5,11}, {13,11},        // quality 8
> -    { 3, 1}, {11, 1}, { 3, 9}, {11, 9}, { 7, 5}, {15, 5}, { 7,13}, {15,13},
> -    { 3, 5}, {11, 5}, { 3,13}, {11,13}, { 7, 1}, {15, 1}, { 7, 9}, {15, 9},
> -    { 0, 1}, { 8, 1}, { 0, 9}, { 8, 9}, { 4, 5}, {12, 5}, { 4,13}, {12,13},
> -    { 0, 5}, { 8, 5}, { 0,13}, { 8,13}, { 4, 1}, {12, 1}, { 4, 9}, {12, 9},
> -    { 2, 3}, {10, 3}, { 2,11}, {10,11}, { 6, 7}, {14, 7}, { 6,15}, {14,15},
> -    { 2, 7}, {10, 7}, { 2,15}, {10,15}, { 6, 3}, {14, 3}, { 6,11}, {14,11},
> -    { 0, 3}, { 8, 3}, { 0,11}, { 8,11}, { 4, 7}, {12, 7}, { 4,15}, {12,15},
> -    { 0, 7}, { 8, 7}, { 0,15}, { 8,15}, { 4, 3}, {12, 3}, { 4,11}, {12,11},
> -    { 2, 1}, {10, 1}, { 2, 9}, {10, 9}, { 6, 5}, {14, 5}, { 6,13}, {14,13},
> -    { 2, 5}, {10, 5}, { 2,13}, {10,13}, { 6, 1}, {14, 1}, { 6, 9}, {14, 9},
> -    { 1, 0}, { 9, 0}, { 1, 8}, { 9, 8}, { 5, 4}, {13, 4}, { 5,12}, {13,12},
> -    { 1, 4}, { 9, 4}, { 1,12}, { 9,12}, { 5, 0}, {13, 0}, { 5, 8}, {13, 8},
> -    { 3, 2}, {11, 2}, { 3,10}, {11,10}, { 7, 6}, {15, 6}, { 7,14}, {15,14},
> -    { 3, 6}, {11, 6}, { 3,14}, {11,14}, { 7, 2}, {15, 2}, { 7,10}, {15,10},
> -    { 1, 2}, { 9, 2}, { 1,10}, { 9,10}, { 5, 6}, {13, 6}, { 5,14}, {13,14},
> -    { 1, 6}, { 9, 6}, { 1,14}, { 9,14}, { 5, 2}, {13, 2}, { 5,10}, {13,10},
> -    { 3, 0}, {11, 0}, { 3, 8}, {11, 8}, { 7, 4}, {15, 4}, { 7,12}, {15,12},
> -    { 3, 4}, {11, 4}, { 3,12}, {11,12}, { 7, 0}, {15, 0}, { 7, 8}, {15, 8},
> -};
> -
> -static void store_slice_c(uint8_t *dst, const uint16_t *src,
> -                          int dst_stride, int src_stride,
> -                          int width, int height, int log2_scale)
> -{
> -    int y, x;
> -
> -#define STORE(pos) do {                                                     \
> -    temp = ((src[x + y * src_stride + pos] << log2_scale) + d[pos]) >> 8;   \
> -    if (temp & 0x100) temp = ~(temp >> 31);                                 \
> -    dst[x + y * dst_stride + pos] = temp;                                   \
> -} while (0)
> -
> -    for (y = 0; y < height; y++) {
> -        const uint8_t *d = dither[y&7];
> -        for (x = 0; x < width; x += 8) {
> -            int temp;
> -            STORE(0);
> -            STORE(1);
> -            STORE(2);
> -            STORE(3);
> -            STORE(4);
> -            STORE(5);
> -            STORE(6);
> -            STORE(7);
> -        }
> -    }
> -}
> -
> -static void filter(USPPContext *p, uint8_t *dst[3], uint8_t *src[3],
> -                   int dst_stride[3], int src_stride[3], int width,
> -                   int height, uint8_t *qp_store, int qp_stride)
> -{
> -    int x, y, i, j;
> -    const int count = 1<<p->log2_count;
> -    int ret;
> -
> -    for (i = 0; i < 3; i++) {
> -        int is_chroma = !!i;
> -        int w = AV_CEIL_RSHIFT(width,  is_chroma ? p->hsub : 0);
> -        int h = AV_CEIL_RSHIFT(height, is_chroma ? p->vsub : 0);
> -        int stride = p->temp_stride[i];
> -        int block = BLOCK >> (is_chroma ? p->hsub : 0);
> -
> -        if (!src[i] || !dst[i])
> -            continue;
> -        for (y = 0; y < h; y++) {
> -            int index = block + block * stride + y * stride;
> -
> -            memcpy(p->src[i] + index, src[i] + y * src_stride[i], w );
> -            for (x = 0; x < block; x++) {
> -                p->src[i][index     - x - 1] = p->src[i][index +     x    ];
> -                p->src[i][index + w + x    ] = p->src[i][index + w - x - 1];
> -            }
> -        }
> -        for (y = 0; y < block; y++) {
> -            memcpy(p->src[i] + (  block-1-y) * stride, p->src[i] + (  y+block  ) * stride, stride);
> -            memcpy(p->src[i] + (h+block  +y) * stride, p->src[i] + (h-y+block-1) * stride, stride);
> -        }
> -
> -        p->frame->linesize[i] = stride;
> -        memset(p->temp[i], 0, (h + 2 * block) * stride * sizeof(int16_t));
> -    }
> -
> -    if (p->qp)
> -        p->frame->quality = p->qp * FF_QP2LAMBDA;
> -    else {
> -        int qpsum=0;
> -        int qpcount = (height>>4) * (height>>4);
> -
> -        for (y = 0; y < (height>>4); y++) {
> -            for (x = 0; x < (width>>4); x++)
> -                qpsum += qp_store[x + y * qp_stride];
> -        }
> -        p->frame->quality = ff_norm_qscale((qpsum + qpcount/2) / qpcount, p->qscale_type) * FF_QP2LAMBDA;
> -    }
> -//    init per MB qscale stuff FIXME
> -    p->frame->height = height + BLOCK;
> -    p->frame->width  = width + BLOCK;
> -
> -    for (i = 0; i < count; i++) {
> -        const int x1 = offset[i+count-1][0];
> -        const int y1 = offset[i+count-1][1];
> -        const int x1c = x1 >> p->hsub;
> -        const int y1c = y1 >> p->vsub;
> -        const int BLOCKc = BLOCK >> p->hsub;
> -        int offset;
> -        AVPacket *pkt = p->pkt;
> -        int got_pkt_ptr;
> -
> -        av_packet_unref(pkt);
> -        pkt->data = p->outbuf;
> -        pkt->size = p->outbuf_size;
> -
> -        p->frame->data[0] = p->src[0] + x1   + y1   * p->frame->linesize[0];
> -        p->frame->data[1] = p->src[1] + x1c  + y1c  * p->frame->linesize[1];
> -        p->frame->data[2] = p->src[2] + x1c  + y1c  * p->frame->linesize[2];
> -        p->frame->format  = p->avctx_enc[i]->pix_fmt;
> -
> -        ret = avcodec_encode_video2(p->avctx_enc[i], pkt, p->frame, &got_pkt_ptr);
> -        if (ret < 0) {
> -            av_log(p->avctx_enc[i], AV_LOG_ERROR, "Encoding failed\n");
> -            continue;
> -        }
> -        av_packet_unref(pkt);
> -
> -        p->frame_dec = p->avctx_enc[i]->coded_frame;
> -
> -        offset = (BLOCK-x1) + (BLOCK-y1) * p->frame_dec->linesize[0];
> -
> -        for (y = 0; y < height; y++)
> -            for (x = 0; x < width; x++)
> -                p->temp[0][x + y * p->temp_stride[0]] += p->frame_dec->data[0][x + y * p->frame_dec->linesize[0] + offset];
> -
> -        if (!src[2] || !dst[2])
> -            continue;
> -
> -        offset = (BLOCKc-x1c) + (BLOCKc-y1c) * p->frame_dec->linesize[1];
> -
> -        for (y = 0; y < AV_CEIL_RSHIFT(height, p->vsub); y++) {
> -            for (x = 0; x < AV_CEIL_RSHIFT(width, p->hsub); x++) {
> -                p->temp[1][x + y * p->temp_stride[1]] += p->frame_dec->data[1][x + y * p->frame_dec->linesize[1] + offset];
> -                p->temp[2][x + y * p->temp_stride[2]] += p->frame_dec->data[2][x + y * p->frame_dec->linesize[2] + offset];
> -            }
> -        }
> -    }
> -
> -    for (j = 0; j < 3; j++) {
> -        int is_chroma = !!j;
> -        if (!dst[j])
> -            continue;
> -        store_slice_c(dst[j], p->temp[j], dst_stride[j], p->temp_stride[j],
> -                      AV_CEIL_RSHIFT(width,  is_chroma ? p->hsub : 0),
> -                      AV_CEIL_RSHIFT(height, is_chroma ? p->vsub : 0),
> -                      8-p->log2_count);
> -    }
> -}
> -
> -static const enum AVPixelFormat pix_fmts[] = {
> -    AV_PIX_FMT_YUV444P,
> -    AV_PIX_FMT_YUV420P,
> -    AV_PIX_FMT_YUV410P,
> -    AV_PIX_FMT_YUVJ444P,
> -    AV_PIX_FMT_YUVJ420P,
> -    AV_PIX_FMT_GRAY8,
> -    AV_PIX_FMT_NONE
> -};
> -
> -static int config_input(AVFilterLink *inlink)
> -{
> -
> -    AVFilterContext *ctx = inlink->dst;
> -    USPPContext *uspp = ctx->priv;
> -    const int height = inlink->h;
> -    const int width  = inlink->w;
> -    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
> -    int i;
> -
> -    const AVCodec *enc = avcodec_find_encoder(AV_CODEC_ID_SNOW);
> -    if (!enc) {
> -        av_log(ctx, AV_LOG_ERROR, "SNOW encoder not found.\n");
> -        return AVERROR(EINVAL);
> -    }
> -
> -    uspp->hsub = desc->log2_chroma_w;
> -    uspp->vsub = desc->log2_chroma_h;
> -
> -    for (i = 0; i < 3; i++) {
> -        int is_chroma = !!i;
> -        int w = (width  + 4 * BLOCK-1) & (~(2 * BLOCK-1));
> -        int h = (height + 4 * BLOCK-1) & (~(2 * BLOCK-1));
> -
> -        if (is_chroma) {
> -            w = AV_CEIL_RSHIFT(w, uspp->hsub);
> -            h = AV_CEIL_RSHIFT(h, uspp->vsub);
> -        }
> -
> -        uspp->temp_stride[i] = w;
> -        if (!(uspp->temp[i] = av_malloc_array(uspp->temp_stride[i], h * sizeof(int16_t))))
> -            return AVERROR(ENOMEM);
> -        if (!(uspp->src [i] = av_malloc_array(uspp->temp_stride[i], h * sizeof(uint8_t))))
> -            return AVERROR(ENOMEM);
> -    }
> -
> -    for (i = 0; i < (1<<uspp->log2_count); i++) {
> -        AVCodecContext *avctx_enc;
> -        AVDictionary *opts = NULL;
> -        int ret;
> -
> -        if (!(uspp->avctx_enc[i] = avcodec_alloc_context3(NULL)))
> -            return AVERROR(ENOMEM);
> -
> -        avctx_enc = uspp->avctx_enc[i];
> -        avctx_enc->width = width + BLOCK;
> -        avctx_enc->height = height + BLOCK;
> -        avctx_enc->time_base = (AVRational){1,25};  // meaningless
> -        avctx_enc->gop_size = INT_MAX;
> -        avctx_enc->max_b_frames = 0;
> -        avctx_enc->pix_fmt = inlink->format;
> -        avctx_enc->flags = AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_LOW_DELAY;
> -        avctx_enc->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
> -        avctx_enc->global_quality = 123;
> -        av_dict_set(&opts, "no_bitstream", "1", 0);
> -        ret = avcodec_open2(avctx_enc, enc, &opts);
> -        av_dict_free(&opts);
> -        if (ret < 0)
> -            return ret;
> -        av_assert0(avctx_enc->codec);
> -    }
> -
> -    uspp->outbuf_size = (width + BLOCK) * (height + BLOCK) * 10;
> -    if (!(uspp->frame = av_frame_alloc()))
> -        return AVERROR(ENOMEM);
> -    if (!(uspp->pkt = av_packet_alloc()))
> -        return AVERROR(ENOMEM);
> -    if (!(uspp->outbuf = av_malloc(uspp->outbuf_size)))
> -        return AVERROR(ENOMEM);
> -
> -    return 0;
> -}
> -
> -static int filter_frame(AVFilterLink *inlink, AVFrame *in)
> -{
> -    AVFilterContext *ctx = inlink->dst;
> -    USPPContext *uspp = ctx->priv;
> -    AVFilterLink *outlink = ctx->outputs[0];
> -    AVFrame *out = in;
> -
> -    int qp_stride = 0;
> -    int8_t *qp_table = NULL;
> -    int ret = 0;
> -
> -    /* if we are not in a constant user quantizer mode and we don't want to use
> -     * the quantizers from the B-frames (B-frames often have a higher QP), we
> -     * need to save the qp table from the last non B-frame; this is what the
> -     * following code block does */
> -    if (!uspp->qp && (uspp->use_bframe_qp || in->pict_type != AV_PICTURE_TYPE_B)) {
> -        ret = ff_qp_table_extract(in, &qp_table, &qp_stride, NULL, &uspp->qscale_type);
> -        if (ret < 0) {
> -            av_frame_free(&in);
> -            return ret;
> -        }
> -
> -        if (!uspp->use_bframe_qp && in->pict_type != AV_PICTURE_TYPE_B) {
> -            av_freep(&uspp->non_b_qp_table);
> -            uspp->non_b_qp_table  = qp_table;
> -            uspp->non_b_qp_stride = qp_stride;
> -        }
> -    }
> -
> -    if (uspp->log2_count && !ctx->is_disabled) {
> -        if (!uspp->use_bframe_qp && uspp->non_b_qp_table) {
> -            qp_table = uspp->non_b_qp_table;
> -            qp_stride = uspp->non_b_qp_stride;
> -        }
> -
> -        if (qp_table || uspp->qp) {
> -
> -            /* get a new frame if in-place is not possible or if the dimensions
> -             * are not multiple of 8 */
> -            if (!av_frame_is_writable(in) || (inlink->w & 7) || (inlink->h & 7)) {
> -                const int aligned_w = FFALIGN(inlink->w, 8);
> -                const int aligned_h = FFALIGN(inlink->h, 8);
> -
> -                out = ff_get_video_buffer(outlink, aligned_w, aligned_h);
> -                if (!out) {
> -                    av_frame_free(&in);
> -                    if (qp_table != uspp->non_b_qp_table)
> -                        av_free(qp_table);
> -                    return AVERROR(ENOMEM);
> -                }
> -                av_frame_copy_props(out, in);
> -                out->width  = in->width;
> -                out->height = in->height;
> -            }
> -
> -            filter(uspp, out->data, in->data, out->linesize, in->linesize,
> -                   inlink->w, inlink->h, qp_table, qp_stride);
> -        }
> -    }
> -
> -    if (in != out) {
> -        if (in->data[3])
> -            av_image_copy_plane(out->data[3], out->linesize[3],
> -                                in ->data[3], in ->linesize[3],
> -                                inlink->w, inlink->h);
> -        av_frame_free(&in);
> -    }
> -    ret = ff_filter_frame(outlink, out);
> -    if (qp_table != uspp->non_b_qp_table)
> -        av_freep(&qp_table);
> -    return ret;
> -}
> -
> -static av_cold void uninit(AVFilterContext *ctx)
> -{
> -    USPPContext *uspp = ctx->priv;
> -    int i;
> -
> -    for (i = 0; i < 3; i++) {
> -        av_freep(&uspp->temp[i]);
> -        av_freep(&uspp->src[i]);
> -    }
> -
> -    for (i = 0; i < (1 << uspp->log2_count); i++)
> -        avcodec_free_context(&uspp->avctx_enc[i]);
> -
> -    av_freep(&uspp->non_b_qp_table);
> -    av_freep(&uspp->outbuf);
> -    av_packet_free(&uspp->pkt);
> -    av_frame_free(&uspp->frame);
> -}
> -
> -static const AVFilterPad uspp_inputs[] = {
> -    {
> -        .name         = "default",
> -        .type         = AVMEDIA_TYPE_VIDEO,
> -        .config_props = config_input,
> -        .filter_frame = filter_frame,
> -    },
> -};
> -
> -static const AVFilterPad uspp_outputs[] = {
> -    {
> -        .name = "default",
> -        .type = AVMEDIA_TYPE_VIDEO,
> -    },
> -};
> -
> -const AVFilter ff_vf_uspp = {
> -    .name            = "uspp",
> -    .description     = NULL_IF_CONFIG_SMALL("Apply Ultra Simple / Slow Post-processing filter."),
> -    .priv_size       = sizeof(USPPContext),
> -    .uninit          = uninit,
> -    FILTER_INPUTS(uspp_inputs),
> -    FILTER_OUTPUTS(uspp_outputs),
> -    FILTER_PIXFMTS_ARRAY(pix_fmts),
> -    .priv_class      = &uspp_class,
> -    .flags           = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
> -};
> diff --git a/tests/fate/filter-video.mak b/tests/fate/filter-video.mak
> index 704087b835..426e27f61e 100644
> --- a/tests/fate/filter-video.mak
> +++ b/tests/fate/filter-video.mak
> @@ -29,14 +29,6 @@ fate-filter-w3fdif-complex: CMD = framecrc -flags bitexact -idct simple -i $(TAR
>  
>  FATE_FILTER_SAMPLES-$(call FILTERDEMDEC, W3FDIF, MPEGTS, MPEG2VIDEO) += $(FATE_W3FDIF)
>  
> -FATE_MCDEINT += fate-filter-mcdeint-fast
> -fate-filter-mcdeint-fast: CMD = framecrc -flags bitexact -idct simple -i $(TARGET_SAMPLES)/mpeg2/mpeg2_field_encoding.ts -frames:v 30 -vf mcdeint=fast
> -
> -FATE_MCDEINT += fate-filter-mcdeint-medium
> -fate-filter-mcdeint-medium: CMD = framecrc -flags bitexact -idct simple -i $(TARGET_SAMPLES)/mpeg2/mpeg2_field_encoding.ts -frames:v 30 -vf mcdeint=mode=medium
> -
> -FATE_FILTER_SAMPLES-$(call FILTERDEMDEC, MCDEINT, MPEGTS, MPEG2VIDEO, SNOW_ENCODER) += $(FATE_MCDEINT)
> -
>  FATE_FILTER_SAMPLES-$(call FILTERDEMDEC, CODECVIEW, RM, RV40) += fate-filter-codecview-mvs
>  fate-filter-codecview-mvs: CMD = framecrc -flags2 +export_mvs -i $(TARGET_SAMPLES)/real/spygames-2MB.rmvb -vf codecview=mv=pf+bf+bb -frames:v 60 -an
>  
> diff --git a/tests/ref/fate/filter-mcdeint-fast b/tests/ref/fate/filter-mcdeint-fast
> deleted file mode 100644
> index e4c2f8a337..0000000000
> --- a/tests/ref/fate/filter-mcdeint-fast
> +++ /dev/null
> @@ -1,35 +0,0 @@
> -#tb 0: 1/25
> -#media_type 0: video
> -#codec_id 0: rawvideo
> -#dimensions 0: 720x576
> -#sar 0: 16/15
> -0,          9,          9,        1,   622080, 0xff496bf5
> -0,         10,         10,        1,   622080, 0x513c8bd9
> -0,         11,         11,        1,   622080, 0x4e474368
> -0,         12,         12,        1,   622080, 0x1248abe9
> -0,         13,         13,        1,   622080, 0xa705c158
> -0,         14,         14,        1,   622080, 0xf9048e95
> -0,         15,         15,        1,   622080, 0x78b5c1a2
> -0,         16,         16,        1,   622080, 0x0efa8be8
> -0,         17,         17,        1,   622080, 0xd3396eac
> -0,         18,         18,        1,   622080, 0x5870cbdd
> -0,         19,         19,        1,   622080, 0x086fa311
> -0,         20,         20,        1,   622080, 0x7ce9bced
> -0,         21,         21,        1,   622080, 0xe7e0e0e1
> -0,         22,         22,        1,   622080, 0x5af3e14b
> -0,         23,         23,        1,   622080, 0xbf221d96
> -0,         24,         24,        1,   622080, 0x43d90a62
> -0,         25,         25,        1,   622080, 0x267a57b6
> -0,         26,         26,        1,   622080, 0x88d942eb
> -0,         27,         27,        1,   622080, 0x34ff87bf
> -0,         28,         28,        1,   622080, 0xa849b5ec
> -0,         29,         29,        1,   622080, 0x8302f51f
> -0,         30,         30,        1,   622080, 0xac9e7315
> -0,         31,         31,        1,   622080, 0x38b284fc
> -0,         32,         32,        1,   622080, 0x1ff0c6c4
> -0,         33,         33,        1,   622080, 0x50bf1ba5
> -0,         34,         34,        1,   622080, 0xe9bd1240
> -0,         35,         35,        1,   622080, 0x22116da3
> -0,         36,         36,        1,   622080, 0x6f3e887a
> -0,         37,         37,        1,   622080, 0x46b82bc5
> -0,         38,         38,        1,   622080, 0xeaaf69ee
> diff --git a/tests/ref/fate/filter-mcdeint-medium b/tests/ref/fate/filter-mcdeint-medium
> deleted file mode 100644
> index 1b0261960e..0000000000
> --- a/tests/ref/fate/filter-mcdeint-medium
> +++ /dev/null
> @@ -1,35 +0,0 @@
> -#tb 0: 1/25
> -#media_type 0: video
> -#codec_id 0: rawvideo
> -#dimensions 0: 720x576
> -#sar 0: 16/15
> -0,          9,          9,        1,   622080, 0xff496bf5
> -0,         10,         10,        1,   622080, 0xc0e4912c
> -0,         11,         11,        1,   622080, 0xa8aedd7e
> -0,         12,         12,        1,   622080, 0x2054deb9
> -0,         13,         13,        1,   622080, 0x1005d0ca
> -0,         14,         14,        1,   622080, 0x60f085dc
> -0,         15,         15,        1,   622080, 0x4da0d261
> -0,         16,         16,        1,   622080, 0x968e940e
> -0,         17,         17,        1,   622080, 0x86687b04
> -0,         18,         18,        1,   622080, 0xd63bc93d
> -0,         19,         19,        1,   622080, 0x7ab0a6e6
> -0,         20,         20,        1,   622080, 0x883dab85
> -0,         21,         21,        1,   622080, 0x9f6ef6b5
> -0,         22,         22,        1,   622080, 0xceccee25
> -0,         23,         23,        1,   622080, 0x2aa823a5
> -0,         24,         24,        1,   622080, 0xb20d0f48
> -0,         25,         25,        1,   622080, 0x571560b9
> -0,         26,         26,        1,   622080, 0xc0904764
> -0,         27,         27,        1,   622080, 0xdb5b89c3
> -0,         28,         28,        1,   622080, 0x707aadc5
> -0,         29,         29,        1,   622080, 0x6383ef1b
> -0,         30,         30,        1,   622080, 0xf9e56040
> -0,         31,         31,        1,   622080, 0x86ce7ff0
> -0,         32,         32,        1,   622080, 0x0c76bd84
> -0,         33,         33,        1,   622080, 0xd7192781
> -0,         34,         34,        1,   622080, 0x83b70cdc
> -0,         35,         35,        1,   622080, 0xaae87453
> -0,         36,         36,        1,   622080, 0xfafa92e2
> -0,         37,         37,        1,   622080, 0x28323354
> -0,         38,         38,        1,   622080, 0x34d47484

Will apply this patch tomorrow unless there are objections.

- Andreas



More information about the ffmpeg-devel mailing list