[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