Message ID | AS8P250MB07445BF6E64CBBFE4A876F9C8FB99@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel] avfilter: Remove mcdeint, uspp filters | expand |
Context | Check | Description |
---|---|---|
yinshiyou/make_loongarch64 | success | Make finished |
yinshiyou/make_fate_loongarch64 | success | Make fate finished |
andriy/make_x86 | success | Make finished |
andriy/make_fate_x86 | success | Make fate finished |
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@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}. > > -@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: > -@table @option > -@item mode > -Set the deinterlacing mode. > - > -It accepts one of the following values: > -@table @samp > -@item fast > -@item medium > -@item slow > -use iterative motion estimation > -@item extra_slow > -like @samp{slow}, but use multiple reference frames. > -@end table > -Default value is @samp{fast}. > - > -@item parity > -Set the picture field parity assumed for the input video. It must be > -one of the following values: > - > -@table @samp > -@item 0, tff > -assume top field first > -@item 1, bff > -assume bottom field first > -@end table > - > -Default value is @samp{bff}. > - > -@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. > -@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 > > -@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: > - > -@table @option > -@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 > -@code{3}. > - > -@item qp > -Force a constant quantization parameter. If not set, the filter will use the QP > -from the video stream (if available). > -@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@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@gmx.at> > - * Copyright (c) 2014 Arwa Arif <arwaarif1994@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
On Wed, Mar 15, 2023 at 06:19:21PM +0100, Andreas Rheinhardt wrote: > 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@outlook.com> [...] > Will apply this patch tomorrow unless there are objections. please wait a bit, id like to take a look at this, i have forgotten about them needing to be updated thx [...]
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}. -@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: -@table @option -@item mode -Set the deinterlacing mode. - -It accepts one of the following values: -@table @samp -@item fast -@item medium -@item slow -use iterative motion estimation -@item extra_slow -like @samp{slow}, but use multiple reference frames. -@end table -Default value is @samp{fast}. - -@item parity -Set the picture field parity assumed for the input video. It must be -one of the following values: - -@table @samp -@item 0, tff -assume top field first -@item 1, bff -assume bottom field first -@end table - -Default value is @samp{bff}. - -@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. -@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 -@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: - -@table @option -@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 -@code{3}. - -@item qp -Force a constant quantization parameter. If not set, the filter will use the QP -from the video stream (if available). -@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@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@gmx.at> - * Copyright (c) 2014 Arwa Arif <arwaarif1994@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
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@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