ср, 14 мая 2025 г., 03:55 Andrew Randrianasulu <randrianas...@gmail.com>:

>
>
> вт, 6 мая 2025 г., 02:27 Michael Niedermayer <mich...@niedermayer.cc>:
>
>> This will be available in https://github.com/michaelni/libpostproc
>> either as a separate library or a ffmpeg source plugin whatever turns
>> out more convenient to maintain
>>
>
>
>
> Congratulations, you broke  building cinelerra-gg with ffmpeg.git despite
> our best efforts :/
>
> Why all this code movement?!
>
> For whom it "simple"?
>


For some reason this mail not arrived into my inbox (spam filter ate it?)

https://ffmpeg.org/pipermail/ffmpeg-devel/2025-May/343192.html

=====

The idea of course here is to expand this to filters and other
things. Which again is trivial, nothing really is needed except
people simply following this style of a source plugin


=====

I found this concerning. Because does this mean ffmpeg will be fragmented
like Python or Rust into million pieces users supposed to held together?



>> Sponsored-by: Sovereign Tech Fund
>> Signed-off-by: Michael Niedermayer <mich...@niedermayer.cc>
>> ---
>>  LICENSE.md                                 |    2 -
>>  MAINTAINERS                                |    2 -
>>  configure                                  |   13 +-
>>  doc/filters.texi                           |  175 --
>>  fftools/ffprobe.c                          |    3 -
>>  fftools/opt_common.c                       |    3 -
>>  libavfilter/Makefile                       |    1 -
>>  libavfilter/allfilters.c                   |    1 -
>>  libavfilter/vf_pp.c                        |  191 --
>>  libavutil/avutil.h                         |    1 -
>>  libpostproc/Makefile                       |   23 -
>>  libpostproc/libpostproc.v                  |    7 -
>>  libpostproc/postprocess.c                  |  992 ------
>>  libpostproc/postprocess.h                  |  109 -
>>  libpostproc/postprocess_altivec_template.c | 1214 --------
>>  libpostproc/postprocess_internal.h         |  185 --
>>  libpostproc/postprocess_template.c         | 3293 --------------------
>>  libpostproc/postprocres.rc                 |   55 -
>>  libpostproc/tests/.gitignore               |    3 -
>>  libpostproc/tests/blocktest.c              |  113 -
>>  libpostproc/tests/stripetest.c             |  115 -
>>  libpostproc/tests/temptest.c               |  106 -
>>  libpostproc/tests/test_utils.c             |   38 -
>>  libpostproc/tests/test_utils.h             |   27 -
>>  libpostproc/version.c                      |   45 -
>>  libpostproc/version.h                      |   48 -
>>  libpostproc/version_major.h                |   33 -
>>  tests/Makefile                             |    1 -
>>  tests/fate/filter-video.mak                |   16 -
>>  tests/fate/libpostproc.mak                 |   14 -
>>  tests/ref/fate/blocktest                   | 1800 -----------
>>  tests/ref/fate/filter-pp                   |   10 -
>>  tests/ref/fate/filter-pp1                  |    1 -
>>  tests/ref/fate/filter-pp2                  |    1 -
>>  tests/ref/fate/filter-pp3                  |    1 -
>>  tests/ref/fate/filter-pp4                  |    1 -
>>  tests/ref/fate/filter-pp5                  |    1 -
>>  tests/ref/fate/filter-pp6                  |    1 -
>>  tests/ref/fate/filter-qp                   |    1 -
>>  tests/ref/fate/stripetest                  |  360 ---
>>  tests/ref/fate/temptest                    |  336 --
>>  tools/gen-rc                               |    1 -
>>  42 files changed, 1 insertion(+), 9342 deletions(-)
>>  delete mode 100644 libavfilter/vf_pp.c
>>  delete mode 100644 libpostproc/Makefile
>>  delete mode 100644 libpostproc/libpostproc.v
>>  delete mode 100644 libpostproc/postprocess.c
>>  delete mode 100644 libpostproc/postprocess.h
>>  delete mode 100644 libpostproc/postprocess_altivec_template.c
>>  delete mode 100644 libpostproc/postprocess_internal.h
>>  delete mode 100644 libpostproc/postprocess_template.c
>>  delete mode 100644 libpostproc/postprocres.rc
>>  delete mode 100644 libpostproc/tests/.gitignore
>>  delete mode 100644 libpostproc/tests/blocktest.c
>>  delete mode 100644 libpostproc/tests/stripetest.c
>>  delete mode 100644 libpostproc/tests/temptest.c
>>  delete mode 100644 libpostproc/tests/test_utils.c
>>  delete mode 100644 libpostproc/tests/test_utils.h
>>  delete mode 100644 libpostproc/version.c
>>  delete mode 100644 libpostproc/version.h
>>  delete mode 100644 libpostproc/version_major.h
>>  delete mode 100644 tests/fate/libpostproc.mak
>>  delete mode 100644 tests/ref/fate/blocktest
>>  delete mode 100644 tests/ref/fate/filter-pp
>>  delete mode 100644 tests/ref/fate/filter-pp1
>>  delete mode 100644 tests/ref/fate/filter-pp2
>>  delete mode 100644 tests/ref/fate/filter-pp3
>>  delete mode 100644 tests/ref/fate/filter-pp4
>>  delete mode 100644 tests/ref/fate/filter-pp5
>>  delete mode 100644 tests/ref/fate/filter-pp6
>>  delete mode 100644 tests/ref/fate/filter-qp
>>  delete mode 100644 tests/ref/fate/stripetest
>>  delete mode 100644 tests/ref/fate/temptest
>>
>> diff --git a/LICENSE.md b/LICENSE.md
>> index 613070e1b63..371b0913ce7 100644
>> --- a/LICENSE.md
>> +++ b/LICENSE.md
>> @@ -12,7 +12,6 @@ configure to activate them. In this case, FFmpeg's
>> license changes to GPL v2+.
>>
>>  Specifically, the GPL parts of FFmpeg are:
>>
>> -- libpostproc
>>  - optional x86 optimization in the files
>>      - `libavcodec/x86/flac_dsp_gpl.asm`
>>      - `libavcodec/x86/idct_mmx.c`
>> @@ -45,7 +44,6 @@ Specifically, the GPL parts of FFmpeg are:
>>      - `vf_owdenoise.c`
>>      - `vf_perspective.c`
>>      - `vf_phase.c`
>> -    - `vf_pp.c`
>>      - `vf_pp7.c`
>>      - `vf_pullup.c`
>>      - `vf_repeatfields.c`
>> diff --git a/MAINTAINERS b/MAINTAINERS
>> index f58936db619..7f7faa05959 100644
>> --- a/MAINTAINERS
>> +++ b/MAINTAINERS
>> @@ -134,8 +134,6 @@ Generic Parts:
>>      ratecontrol.c                   [2] Michael Niedermayer
>>    simple IDCT:
>>      simple_idct.c, simple_idct.h    [2] Michael Niedermayer
>> -  postprocessing:
>> -    libpostproc/*                   [2] Michael Niedermayer
>>    table generation:
>>      tableprint.c, tableprint.h          Reimar Doeffinger
>>    fixed point FFT:
>> diff --git a/configure b/configure
>> index 6c23a38be1f..2e69b3c56c3 100755
>> --- a/configure
>> +++ b/configure
>> @@ -130,7 +130,6 @@ Component options:
>>    --disable-avformat       disable libavformat build
>>    --disable-swresample     disable libswresample build
>>    --disable-swscale        disable libswscale build
>> -  --disable-postproc       disable libpostproc build
>>    --disable-avfilter       disable libavfilter build
>>    --disable-pthreads       disable pthreads [autodetect]
>>    --disable-w32threads     disable Win32 threads [autodetect]
>> @@ -2072,7 +2071,6 @@ LIBRARY_LIST="
>>      avdevice
>>      avfilter
>>      swscale
>> -    postproc
>>      avformat
>>      avcodec
>>      swresample
>> @@ -3969,7 +3967,6 @@ pan_filter_deps="swresample"
>>  perspective_filter_deps="gpl"
>>  phase_filter_deps="gpl"
>>  pp7_filter_deps="gpl"
>> -pp_filter_deps="gpl postproc"
>>  prewitt_opencl_filter_deps="opencl"
>>  procamp_vaapi_filter_deps="vaapi"
>>  program_opencl_filter_deps="opencl"
>> @@ -4086,8 +4083,6 @@ avfilter_suggest="libm stdatomic spirv_compiler"
>>  avformat_deps="avcodec avutil"
>>  avformat_suggest="libm network zlib stdatomic"
>>  avutil_suggest="clock_gettime ffnvcodec gcrypt libm libdrm libmfx opencl
>> openssl user32 vaapi vulkan videotoolbox corefoundation corevideo coremedia
>> bcrypt stdatomic"
>> -postproc_deps="avutil gpl"
>> -postproc_suggest="libm stdatomic"
>>  swresample_deps="avutil"
>>  swresample_suggest="libm libsoxr stdatomic"
>>  swscale_deps="avutil"
>> @@ -7533,7 +7528,7 @@ void (^block)(void);
>>  EOF
>>
>>  # add some linker flags
>> -check_ldflags
>> -Wl,-rpath-link=:libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil
>> +check_ldflags
>> -Wl,-rpath-link=:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil
>>  enabled rpath && add_ldexeflags -Wl,-rpath,$libdir && add_ldsoflags
>> -Wl,-rpath,$libdir
>>  test_ldflags -Wl,-Bsymbolic && append SHFLAGS -Wl,-Bsymbolic
>>
>> @@ -7898,7 +7893,6 @@ enabled fsync_filter        && prepend
>> avfilter_deps "avformat"
>>  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"
>>  enabled qrencode_filter     && prepend avfilter_deps "swscale"
>>  enabled qrencodesrc_filter  && prepend avfilter_deps "swscale"
>>  enabled removelogo_filter   && prepend avfilter_deps "avformat avcodec
>> swscale"
>> @@ -7950,9 +7944,6 @@ expand_deps(){
>>      reorder_by ${1}_deps LIBRARY_LIST  # linking order is expected later
>>  }
>>
>> -#we have to remove gpl from the deps here as some code assumes all lib
>> deps are libs
>> -postproc_deps="$(filter_out 'gpl' $postproc_deps)"
>> -
>>  map 'expand_deps $v' $LIBRARY_LIST
>>
>>  if test "$quiet" != "yes"; then
>> @@ -8043,7 +8034,6 @@ echo "optimize for size         ${small-no}"
>>  echo "optimizations             ${optimizations-no}"
>>  echo "static                    ${static-no}"
>>  echo "shared                    ${shared-no}"
>> -echo "postprocessing support    ${postproc-no}"
>>  echo "network support           ${network-no}"
>>  echo "threading support         ${thread_type-no}"
>>  echo "safe bitstream reader     ${safe_bitstream_reader-no}"
>> @@ -8420,7 +8410,6 @@ extralibs_avcodec="$avcodec_extralibs"
>>  extralibs_avformat="$avformat_extralibs"
>>  extralibs_avdevice="$avdevice_extralibs"
>>  extralibs_avfilter="$avfilter_extralibs"
>> -extralibs_postproc="$postproc_extralibs"
>>  extralibs_swscale="$swscale_extralibs"
>>  extralibs_swresample="$swresample_extralibs"
>>  EOF
>> diff --git a/doc/filters.texi b/doc/filters.texi
>> index a9ec077ef04..679b71f2906 100644
>> --- a/doc/filters.texi
>> +++ b/doc/filters.texi
>> @@ -19387,181 +19387,6 @@ Set window Y position, relative offset on Y
>> axis.
>>
>>  This filter supports same @ref{commands} as options.
>>
>> -@section pp
>> -
>> -Enable the specified chain of postprocessing subfilters using
>> libpostproc. This
>> -library should be automatically selected with a GPL build
>> (@code{--enable-gpl}).
>> -Subfilters must be separated by '/' and can be disabled by prepending a
>> '-'.
>> -Each subfilter and some options have a short and a long name that can be
>> used
>> -interchangeably, i.e. dr/dering are the same.
>> -
>> -The filters accept the following options:
>> -
>> -@table @option
>> -@item subfilters
>> -Set postprocessing subfilters string.
>> -@end table
>> -
>> -All subfilters share common options to determine their scope:
>> -
>> -@table @option
>> -@item a/autoq
>> -Honor the quality commands for this subfilter.
>> -
>> -@item c/chrom
>> -Do chrominance filtering, too (default).
>> -
>> -@item y/nochrom
>> -Do luma filtering only (no chrominance).
>> -
>> -@item n/noluma
>> -Do chrominance filtering only (no luma).
>> -@end table
>> -
>> -These options can be appended after the subfilter name, separated by a
>> '|'.
>> -
>> -Available subfilters are:
>> -
>> -@table @option
>> -@item hb/hdeblock[|difference[|flatness]]
>> -Horizontal deblocking filter
>> -@table @option
>> -@item difference
>> -Difference factor where higher values mean more deblocking (default:
>> @code{32}).
>> -@item flatness
>> -Flatness threshold where lower values mean more deblocking (default:
>> @code{39}).
>> -@end table
>> -
>> -@item vb/vdeblock[|difference[|flatness]]
>> -Vertical deblocking filter
>> -@table @option
>> -@item difference
>> -Difference factor where higher values mean more deblocking (default:
>> @code{32}).
>> -@item flatness
>> -Flatness threshold where lower values mean more deblocking (default:
>> @code{39}).
>> -@end table
>> -
>> -@item ha/hadeblock[|difference[|flatness]]
>> -Accurate horizontal deblocking filter
>> -@table @option
>> -@item difference
>> -Difference factor where higher values mean more deblocking (default:
>> @code{32}).
>> -@item flatness
>> -Flatness threshold where lower values mean more deblocking (default:
>> @code{39}).
>> -@end table
>> -
>> -@item va/vadeblock[|difference[|flatness]]
>> -Accurate vertical deblocking filter
>> -@table @option
>> -@item difference
>> -Difference factor where higher values mean more deblocking (default:
>> @code{32}).
>> -@item flatness
>> -Flatness threshold where lower values mean more deblocking (default:
>> @code{39}).
>> -@end table
>> -@end table
>> -
>> -The horizontal and vertical deblocking filters share the difference and
>> -flatness values so you cannot set different horizontal and vertical
>> -thresholds.
>> -
>> -@table @option
>> -@item h1/x1hdeblock
>> -Experimental horizontal deblocking filter
>> -
>> -@item v1/x1vdeblock
>> -Experimental vertical deblocking filter
>> -
>> -@item dr/dering
>> -Deringing filter
>> -
>> -@item tn/tmpnoise[|threshold1[|threshold2[|threshold3]]], temporal noise
>> reducer
>> -@table @option
>> -@item threshold1
>> -larger -> stronger filtering
>> -@item threshold2
>> -larger -> stronger filtering
>> -@item threshold3
>> -larger -> stronger filtering
>> -@end table
>> -
>> -@item al/autolevels[:f/fullyrange], automatic brightness / contrast
>> correction
>> -@table @option
>> -@item f/fullyrange
>> -Stretch luma to @code{0-255}.
>> -@end table
>> -
>> -@item lb/linblenddeint
>> -Linear blend deinterlacing filter that deinterlaces the given block by
>> -filtering all lines with a @code{(1 2 1)} filter.
>> -
>> -@item li/linipoldeint
>> -Linear interpolating deinterlacing filter that deinterlaces the given
>> block by
>> -linearly interpolating every second line.
>> -
>> -@item ci/cubicipoldeint
>> -Cubic interpolating deinterlacing filter deinterlaces the given block by
>> -cubically interpolating every second line.
>> -
>> -@item md/mediandeint
>> -Median deinterlacing filter that deinterlaces the given block by
>> applying a
>> -median filter to every second line.
>> -
>> -@item fd/ffmpegdeint
>> -FFmpeg deinterlacing filter that deinterlaces the given block by
>> filtering every
>> -second line with a @code{(-1 4 2 4 -1)} filter.
>> -
>> -@item l5/lowpass5
>> -Vertically applied FIR lowpass deinterlacing filter that deinterlaces
>> the given
>> -block by filtering all lines with a @code{(-1 2 6 2 -1)} filter.
>> -
>> -@item fq/forceQuant[|quantizer]
>> -Overrides the quantizer table from the input with the constant quantizer
>> you
>> -specify.
>> -@table @option
>> -@item quantizer
>> -Quantizer to use
>> -@end table
>> -
>> -@item de/default
>> -Default pp filter combination (@code{hb|a,vb|a,dr|a})
>> -
>> -@item fa/fast
>> -Fast pp filter combination (@code{h1|a,v1|a,dr|a})
>> -
>> -@item ac
>> -High quality pp filter combination (@code{ha|a|128|7,va|a,dr|a})
>> -@end table
>> -
>> -@subsection Examples
>> -
>> -@itemize
>> -@item
>> -Apply horizontal and vertical deblocking, deringing and automatic
>> -brightness/contrast:
>> -@example
>> -pp=hb/vb/dr/al
>> -@end example
>> -
>> -@item
>> -Apply default filters without brightness/contrast correction:
>> -@example
>> -pp=de/-al
>> -@end example
>> -
>> -@item
>> -Apply default filters and temporal denoiser:
>> -@example
>> -pp=default/tmpnoise|1|2|3
>> -@end example
>> -
>> -@item
>> -Apply deblocking on luma only, and switch vertical deblocking on or off
>> -automatically depending on available CPU time:
>> -@example
>> -pp=hb|y/vb|a
>> -@end example
>> -@end itemize
>> -
>>  @section pp7
>>  Apply Postprocessing filter 7. It is variant of the @ref{spp} filter,
>>  similar to spp = 6 with 7 point DCT, where only the center sample is
>> diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c
>> index d980d4e64fe..f33531fd84c 100644
>> --- a/fftools/ffprobe.c
>> +++ b/fftools/ffprobe.c
>> @@ -62,8 +62,6 @@
>>  #include "libswscale/version.h"
>>  #include "libswresample/swresample.h"
>>  #include "libswresample/version.h"
>> -#include "libpostproc/postprocess.h"
>> -#include "libpostproc/version.h"
>>  #include "libavfilter/version.h"
>>  #include "textformat/avtextformat.h"
>>  #include "cmdutils.h"
>> @@ -2573,7 +2571,6 @@ static void
>> ffprobe_show_library_versions(AVTextFormatContext *tfc)
>>      SHOW_LIB_VERSION(avfilter,   AVFILTER);
>>      SHOW_LIB_VERSION(swscale,    SWSCALE);
>>      SHOW_LIB_VERSION(swresample, SWRESAMPLE);
>> -    SHOW_LIB_VERSION(postproc,   POSTPROC);
>>      avtext_print_section_footer(tfc);
>>  }
>>
>> diff --git a/fftools/opt_common.c b/fftools/opt_common.c
>> index 2ac3fd4fb36..c2f6b9de2a7 100644
>> --- a/fftools/opt_common.c
>> +++ b/fftools/opt_common.c
>> @@ -60,8 +60,6 @@
>>  #include "libswresample/swresample.h"
>>  #include "libswresample/version.h"
>>
>> -#include "libpostproc/postprocess.h"
>> -#include "libpostproc/version.h"
>>
>>  enum show_muxdemuxers {
>>      SHOW_DEFAULT,
>> @@ -191,7 +189,6 @@ static void print_all_libs_info(int flags, int level)
>>      PRINT_LIB_INFO(avfilter,   AVFILTER,   flags, level);
>>      PRINT_LIB_INFO(swscale,    SWSCALE,    flags, level);
>>      PRINT_LIB_INFO(swresample, SWRESAMPLE, flags, level);
>> -    PRINT_LIB_INFO(postproc,   POSTPROC,   flags, level);
>>  }
>>
>>  static void print_program_info(int flags, int level)
>> diff --git a/libavfilter/Makefile b/libavfilter/Makefile
>> index 7c0d879ec9c..0effe4127ff 100644
>> --- a/libavfilter/Makefile
>> +++ b/libavfilter/Makefile
>> @@ -431,7 +431,6 @@ OBJS-$(CONFIG_PHOTOSENSITIVITY_FILTER)       +=
>> vf_photosensitivity.o
>>  OBJS-$(CONFIG_PIXDESCTEST_FILTER)            += vf_pixdesctest.o
>>  OBJS-$(CONFIG_PIXELIZE_FILTER)               += vf_pixelize.o
>>  OBJS-$(CONFIG_PIXSCOPE_FILTER)               += vf_datascope.o
>> -OBJS-$(CONFIG_PP_FILTER)                     += vf_pp.o qp_table.o
>>  OBJS-$(CONFIG_PP7_FILTER)                    += vf_pp7.o qp_table.o
>>  OBJS-$(CONFIG_PREMULTIPLY_FILTER)            += vf_premultiply.o
>> framesync.o
>>  OBJS-$(CONFIG_PREWITT_FILTER)                += vf_convolution.o
>> diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c
>> index 740d9ab265c..5ea33cdf01b 100644
>> --- a/libavfilter/allfilters.c
>> +++ b/libavfilter/allfilters.c
>> @@ -404,7 +404,6 @@ extern const FFFilter ff_vf_photosensitivity;
>>  extern const FFFilter ff_vf_pixdesctest;
>>  extern const FFFilter ff_vf_pixelize;
>>  extern const FFFilter ff_vf_pixscope;
>> -extern const FFFilter ff_vf_pp;
>>  extern const FFFilter ff_vf_pp7;
>>  extern const FFFilter ff_vf_premultiply;
>>  extern const FFFilter ff_vf_prewitt;
>> diff --git a/libavfilter/vf_pp.c b/libavfilter/vf_pp.c
>> deleted file mode 100644
>> index 9e9903eb974..00000000000
>> --- a/libavfilter/vf_pp.c
>> +++ /dev/null
>> @@ -1,191 +0,0 @@
>> -/*
>> - * Copyright (c) 2002 A'rpi
>> - * Copyright (C) 2012 Clément Bœsch
>> - *
>> - * 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
>> <https://www.google.com/maps/search/51+Franklin+Street?entry=gmail&source=g>,
>> Fifth Floor, Boston, MA 02110-1301 USA.
>> - */
>> -
>> -/**
>> - * @file
>> - * libpostproc filter, ported from MPlayer.
>> - */
>> -
>> -#include "libavutil/avassert.h"
>> -#include "libavutil/mem.h"
>> -#include "libavutil/opt.h"
>> -
>> -#include "filters.h"
>> -#include "qp_table.h"
>> -#include "video.h"
>> -
>> -#include "libpostproc/postprocess.h"
>> -
>> -typedef struct PPFilterContext {
>> -    const AVClass *class;
>> -    char *subfilters;
>> -    int mode_id;
>> -    pp_mode *modes[PP_QUALITY_MAX + 1];
>> -    void *pp_ctx;
>> -} PPFilterContext;
>> -
>> -#define OFFSET(x) offsetof(PPFilterContext, x)
>> -#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
>> -static const AVOption pp_options[] = {
>> -    { "subfilters", "set postprocess subfilters", OFFSET(subfilters),
>> AV_OPT_TYPE_STRING, {.str="de"}, .flags = FLAGS },
>> -    { NULL }
>> -};
>> -
>> -AVFILTER_DEFINE_CLASS(pp);
>> -
>> -static av_cold int pp_init(AVFilterContext *ctx)
>> -{
>> -    int i;
>> -    PPFilterContext *pp = ctx->priv;
>> -
>> -    for (i = 0; i <= PP_QUALITY_MAX; i++) {
>> -        pp->modes[i] = pp_get_mode_by_name_and_quality(pp->subfilters,
>> i);
>> -        if (!pp->modes[i])
>> -            return AVERROR_EXTERNAL;
>> -    }
>> -    pp->mode_id = PP_QUALITY_MAX;
>> -    return 0;
>> -}
>> -
>> -static int pp_process_command(AVFilterContext *ctx, const char *cmd,
>> const char *args,
>> -                              char *res, int res_len, int flags)
>> -{
>> -    PPFilterContext *pp = ctx->priv;
>> -
>> -    if (!strcmp(cmd, "quality")) {
>> -        pp->mode_id = av_clip(strtol(args, NULL, 10), 0, PP_QUALITY_MAX);
>> -        return 0;
>> -    }
>> -    return AVERROR(ENOSYS);
>> -}
>> -
>> -static const enum AVPixelFormat pix_fmts[] = {
>> -    AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVJ420P,
>> -    AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVJ422P,
>> -    AV_PIX_FMT_YUV411P,
>> -    AV_PIX_FMT_GBRP,
>> -    AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVJ444P,
>> -    AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUVJ440P,
>> -    AV_PIX_FMT_GRAY8,
>> -    AV_PIX_FMT_NONE
>> -};
>> -
>> -static int pp_config_props(AVFilterLink *inlink)
>> -{
>> -    int flags = PP_CPU_CAPS_AUTO;
>> -    PPFilterContext *pp = inlink->dst->priv;
>> -
>> -    switch (inlink->format) {
>> -    case AV_PIX_FMT_GRAY8:
>> -    case AV_PIX_FMT_YUVJ420P:
>> -    case AV_PIX_FMT_YUV420P: flags |= PP_FORMAT_420; break;
>> -    case AV_PIX_FMT_YUVJ422P:
>> -    case AV_PIX_FMT_YUV422P: flags |= PP_FORMAT_422; break;
>> -    case AV_PIX_FMT_YUV411P: flags |= PP_FORMAT_411; break;
>> -    case AV_PIX_FMT_GBRP:
>> -    case AV_PIX_FMT_YUVJ444P:
>> -    case AV_PIX_FMT_YUV444P: flags |= PP_FORMAT_444; break;
>> -    case AV_PIX_FMT_YUVJ440P:
>> -    case AV_PIX_FMT_YUV440P: flags |= PP_FORMAT_440; break;
>> -    default: av_assert0(0);
>> -    }
>> -
>> -    pp->pp_ctx = pp_get_context(inlink->w, inlink->h, flags);
>> -    if (!pp->pp_ctx)
>> -        return AVERROR(ENOMEM);
>> -    return 0;
>> -}
>> -
>> -static int pp_filter_frame(AVFilterLink *inlink, AVFrame *inbuf)
>> -{
>> -    AVFilterContext *ctx = inlink->dst;
>> -    PPFilterContext *pp = ctx->priv;
>> -    AVFilterLink *outlink = ctx->outputs[0];
>> -    const int aligned_w = FFALIGN(outlink->w, 8);
>> -    const int aligned_h = FFALIGN(outlink->h, 8);
>> -    AVFrame *outbuf;
>> -    int qstride = 0;
>> -    int8_t *qp_table = NULL;
>> -    int ret;
>> -
>> -    outbuf = ff_get_video_buffer(outlink, aligned_w, aligned_h);
>> -    if (!outbuf) {
>> -        av_frame_free(&inbuf);
>> -        return AVERROR(ENOMEM);
>> -    }
>> -    av_frame_copy_props(outbuf, inbuf);
>> -    outbuf->width  = inbuf->width;
>> -    outbuf->height = inbuf->height;
>> -
>> -    ret = ff_qp_table_extract(inbuf, &qp_table, &qstride, NULL, NULL);
>> -    if (ret < 0) {
>> -        av_frame_free(&inbuf);
>> -        av_frame_free(&outbuf);
>> -        return ret;
>> -    }
>> -
>> -    pp_postprocess((const uint8_t **)inbuf->data, inbuf->linesize,
>> -                   outbuf->data,                 outbuf->linesize,
>> -                   aligned_w, outlink->h,
>> -                   qp_table,
>> -                   qstride,
>> -                   pp->modes[pp->mode_id],
>> -                   pp->pp_ctx,
>> -                   outbuf->pict_type | (qp_table ? PP_PICT_TYPE_QP2 :
>> 0));
>> -
>> -    av_frame_free(&inbuf);
>> -    av_freep(&qp_table);
>> -    return ff_filter_frame(outlink, outbuf);
>> -}
>> -
>> -static av_cold void pp_uninit(AVFilterContext *ctx)
>> -{
>> -    int i;
>> -    PPFilterContext *pp = ctx->priv;
>> -
>> -    for (i = 0; i <= PP_QUALITY_MAX; i++)
>> -        pp_free_mode(pp->modes[i]);
>> -    if (pp->pp_ctx)
>> -        pp_free_context(pp->pp_ctx);
>> -}
>> -
>> -static const AVFilterPad pp_inputs[] = {
>> -    {
>> -        .name         = "default",
>> -        .type         = AVMEDIA_TYPE_VIDEO,
>> -        .config_props = pp_config_props,
>> -        .filter_frame = pp_filter_frame,
>> -    },
>> -};
>> -
>> -const FFFilter ff_vf_pp = {
>> -    .p.name          = "pp",
>> -    .p.description   = NULL_IF_CONFIG_SMALL("Filter video using
>> libpostproc."),
>> -    .p.priv_class    = &pp_class,
>> -    .p.flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
>> -    .priv_size       = sizeof(PPFilterContext),
>> -    .init            = pp_init,
>> -    .uninit          = pp_uninit,
>> -    FILTER_INPUTS(pp_inputs),
>> -    FILTER_OUTPUTS(ff_video_default_filterpad),
>> -    FILTER_PIXFMTS_ARRAY(pix_fmts),
>> -    .process_command = pp_process_command,
>> -};
>> diff --git a/libavutil/avutil.h b/libavutil/avutil.h
>> index ee709fbb2ab..c8ae114ab6f 100644
>> --- a/libavutil/avutil.h
>> +++ b/libavutil/avutil.h
>> @@ -41,7 +41,6 @@
>>   * @li @ref lavd "libavdevice" special devices muxing/demuxing library
>>   * @li @ref lavu "libavutil" common utility library
>>   * @li @ref lswr "libswresample" audio resampling, format conversion and
>> mixing
>> - * @li @ref lpp  "libpostproc" post processing library
>>   * @li @ref libsws "libswscale" color conversion and scaling library
>>   *
>>   * @section ffmpeg_versioning Versioning and compatibility
>> diff --git a/libpostproc/Makefile b/libpostproc/Makefile
>> deleted file mode 100644
>> index d78fc0277f4..00000000000
>> --- a/libpostproc/Makefile
>> +++ /dev/null
>> @@ -1,23 +0,0 @@
>> -NAME = postproc
>> -DESC = FFmpeg postprocessing library
>> -FFLIBS = avutil
>> -
>> -HEADERS = postprocess.h        \
>> -          version.h            \
>> -          version_major.h      \
>> -
>> -OBJS = postprocess.o           \
>> -       version.o               \
>> -
>> -TESTOBJS = tests/test_utils.o        \
>> -
>> -# Windows resource file
>> -SHLIBOBJS-$(HAVE_GNU_WINDRES) += postprocres.o
>> -
>> -TESTPROGS = blocktest          \
>> -            stripetest         \
>> -            temptest          \
>> -
>> -$(SUBDIR)tests/blocktest$(EXESUF):  $(SUBDIR)tests/test_utils.o
>> -$(SUBDIR)tests/stripetest$(EXESUF): $(SUBDIR)tests/test_utils.o
>> -$(SUBDIR)tests/temptest$(EXESUF):  $(SUBDIR)tests/test_utils.o
>> diff --git a/libpostproc/libpostproc.v b/libpostproc/libpostproc.v
>> deleted file mode 100644
>> index 27381c6aca3..00000000000
>> --- a/libpostproc/libpostproc.v
>> +++ /dev/null
>> @@ -1,7 +0,0 @@
>> -LIBPOSTPROC_MAJOR {
>> -    global:
>> -        postproc_*;
>> -        pp_*;
>> -    local:
>> -        *;
>> -};
>> diff --git a/libpostproc/postprocess.c b/libpostproc/postprocess.c
>> deleted file mode 100644
>> index eab22289192..00000000000
>> --- a/libpostproc/postprocess.c
>> +++ /dev/null
>> @@ -1,992 +0,0 @@
>> -/*
>> - * Copyright (C) 2001-2003 Michael Niedermayer (michae...@gmx.at)
>> - *
>> - * AltiVec optimizations (C) 2004 Romain Dolbeau <rom...@dolbeau.org>
>> - *
>> - * 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
>> <https://www.google.com/maps/search/51+Franklin+Street?entry=gmail&source=g>,
>> Fifth Floor, Boston, MA 02110-1301 USA
>> - */
>> -
>> -/**
>> - * @file
>> - * postprocessing.
>> - */
>> -
>> -/*
>> -                        C       MMX     MMX2    AltiVec
>> -isVertDC                Ec      Ec              Ec
>> -isVertMinMaxOk          Ec      Ec              Ec
>> -doVertLowPass           E               e       Ec
>> -doVertDefFilter         Ec      Ec      e       Ec
>> -isHorizDC               Ec      Ec              Ec
>> -isHorizMinMaxOk         a       E               Ec
>> -doHorizLowPass          E               e       Ec
>> -doHorizDefFilter        Ec      Ec      e       Ec
>> -do_a_deblock            Ec      E       Ec
>> -deRing                  E               e       Ecp
>> -Vertical RKAlgo1        E               a
>> -Horizontal RKAlgo1                      a
>> -Vertical X1#            a               E
>> -Horizontal X1#          a               E
>> -LinIpolDeinterlace      e               E
>> -CubicIpolDeinterlace    a               e
>> -LinBlendDeinterlace     e               E
>> -MedianDeinterlace#      E       Ec      Ec
>> -TempDeNoiser#           E               e       Ec
>> -
>> -# more or less selfinvented filters so the exactness is not too
>> meaningful
>> -E = Exact implementation
>> -e = almost exact implementation (slightly different rounding,...)
>> -a = alternative / approximate impl
>> -c = checked against the other implementations (-vo md5)
>> -p = partially optimized, still some work to do
>> -*/
>> -
>> -/*
>> -TODO:
>> -reduce the time wasted on the mem transfer
>> -unroll stuff if instructions depend too much on the prior one
>> -move YScale thing to the end instead of fixing QP
>> -write a faster and higher quality deblocking filter :)
>> -make the mainloop more flexible (variable number of blocks at once
>> -        (the if/else stuff per block is slowing things down)
>> -compare the quality & speed of all filters
>> -split this huge file
>> -optimize c versions
>> -try to unroll inner for(x=0 ... loop to avoid these damn if(x ... checks
>> -...
>> -*/
>> -
>> -//Changelog: use git log
>> -
>> -#include <stddef.h>
>> -#include <stdlib.h>
>> -#include <string.h>
>> -
>> -#include "config.h"
>> -#include "libavutil/common.h"
>> -#include "libavutil/cpu.h"
>> -#include "libavutil/intreadwrite.h"
>> -#include "libavutil/mem.h"
>> -//#undef HAVE_MMXEXT_INLINE
>> -//#undef HAVE_MMX_INLINE
>> -//#undef ARCH_X86
>> -//#define DEBUG_BRIGHTNESS
>> -#include "postprocess.h"
>> -#include "postprocess_internal.h"
>> -#include "libavutil/avstring.h"
>> -
>> -#define GET_MODE_BUFFER_SIZE 500
>> -#define OPTIONS_ARRAY_SIZE 10
>> -#define BLOCK_SIZE 8
>> -#define TEMP_STRIDE 8
>> -//#define NUM_BLOCKS_AT_ONCE 16 //not used yet
>> -
>> -#define DERING_THRESHOLD 20
>> -
>> -#if ARCH_X86 && HAVE_INLINE_ASM
>> -DECLARE_ASM_CONST(8, uint64_t, w05)= 0x0005000500050005LL;
>> -DECLARE_ASM_CONST(8, uint64_t, w04)= 0x0004000400040004LL;
>> -DECLARE_ASM_CONST(8, uint64_t, w20)= 0x0020002000200020LL;
>> -DECLARE_ASM_CONST(8, uint64_t, b00)= 0x0000000000000000LL;
>> -DECLARE_ASM_CONST(8, uint64_t, b01)= 0x0101010101010101LL;
>> -DECLARE_ASM_CONST(8, uint64_t, b08)= 0x0808080808080808LL;
>> -DECLARE_ASM_CONST(8, uint64_t, b80)= 0x8080808080808080LL;
>> -#endif
>> -
>> -static const struct PPFilter filters[]=
>> -{
>> -    {"hb", "hdeblock",              1, 1, 3, H_DEBLOCK},
>> -    {"vb", "vdeblock",              1, 2, 4, V_DEBLOCK},
>> -/*  {"hr", "rkhdeblock",            1, 1, 3, H_RK1_FILTER},
>> -    {"vr", "rkvdeblock",            1, 2, 4, V_RK1_FILTER},*/
>> -    {"h1", "x1hdeblock",            1, 1, 3, H_X1_FILTER},
>> -    {"v1", "x1vdeblock",            1, 2, 4, V_X1_FILTER},
>> -    {"ha", "ahdeblock",             1, 1, 3, H_A_DEBLOCK},
>> -    {"va", "avdeblock",             1, 2, 4, V_A_DEBLOCK},
>> -    {"dr", "dering",                1, 5, 6, DERING},
>> -    {"al", "autolevels",            0, 1, 2, LEVEL_FIX},
>> -    {"lb", "linblenddeint",         1, 1, 4, LINEAR_BLEND_DEINT_FILTER},
>> -    {"li", "linipoldeint",          1, 1, 4, LINEAR_IPOL_DEINT_FILTER},
>> -    {"ci", "cubicipoldeint",        1, 1, 4, CUBIC_IPOL_DEINT_FILTER},
>> -    {"md", "mediandeint",           1, 1, 4, MEDIAN_DEINT_FILTER},
>> -    {"fd", "ffmpegdeint",           1, 1, 4, FFMPEG_DEINT_FILTER},
>> -    {"l5", "lowpass5",              1, 1, 4, LOWPASS5_DEINT_FILTER},
>> -    {"tn", "tmpnoise",              1, 7, 8, TEMP_NOISE_FILTER},
>> -    {"fq", "forcequant",            1, 0, 0, FORCE_QUANT},
>> -    {"be", "bitexact",              1, 0, 0, BITEXACT},
>> -    {"vi", "visualize",             1, 0, 0, VISUALIZE},
>> -    {NULL, NULL,0,0,0,0} //End Marker
>> -};
>> -
>> -static const char * const replaceTable[]=
>> -{
>> -    "default",      "hb:a,vb:a,dr:a",
>> -    "de",           "hb:a,vb:a,dr:a",
>> -    "fast",         "h1:a,v1:a,dr:a",
>> -    "fa",           "h1:a,v1:a,dr:a",
>> -    "ac",           "ha:a:128:7,va:a,dr:a",
>> -    NULL //End Marker
>> -};
>> -
>> -/* The horizontal functions exist only in C because the MMX
>> - * code is faster with vertical filters and transposing. */
>> -
>> -/**
>> - * Check if the given 8x8 Block is mostly "flat"
>> - */
>> -static inline int isHorizDC_C(const uint8_t src[], int stride, const
>> PPContext *c)
>> -{
>> -    int numEq= 0;
>> -    int y;
>> -    const int dcOffset= ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
>> -    const int dcThreshold= dcOffset*2 + 1;
>> -
>> -    for(y=0; y<BLOCK_SIZE; y++){
>> -        numEq += ((unsigned)(src[0] - src[1] + dcOffset)) < dcThreshold;
>> -        numEq += ((unsigned)(src[1] - src[2] + dcOffset)) < dcThreshold;
>> -        numEq += ((unsigned)(src[2] - src[3] + dcOffset)) < dcThreshold;
>> -        numEq += ((unsigned)(src[3] - src[4] + dcOffset)) < dcThreshold;
>> -        numEq += ((unsigned)(src[4] - src[5] + dcOffset)) < dcThreshold;
>> -        numEq += ((unsigned)(src[5] - src[6] + dcOffset)) < dcThreshold;
>> -        numEq += ((unsigned)(src[6] - src[7] + dcOffset)) < dcThreshold;
>> -        src+= stride;
>> -    }
>> -    return numEq > c->ppMode.flatnessThreshold;
>> -}
>> -
>> -/**
>> - * Check if the middle 8x8 Block in the given 8x16 block is flat
>> - */
>> -static inline int isVertDC_C(const uint8_t src[], int stride, const
>> PPContext *c)
>> -{
>> -    int numEq= 0;
>> -    int y;
>> -    const int dcOffset= ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
>> -    const int dcThreshold= dcOffset*2 + 1;
>> -
>> -    src+= stride*4; // src points to begin of the 8x8 Block
>> -    for(y=0; y<BLOCK_SIZE-1; y++){
>> -        numEq += ((unsigned)(src[0] - src[0+stride] + dcOffset)) <
>> dcThreshold;
>> -        numEq += ((unsigned)(src[1] - src[1+stride] + dcOffset)) <
>> dcThreshold;
>> -        numEq += ((unsigned)(src[2] - src[2+stride] + dcOffset)) <
>> dcThreshold;
>> -        numEq += ((unsigned)(src[3] - src[3+stride] + dcOffset)) <
>> dcThreshold;
>> -        numEq += ((unsigned)(src[4] - src[4+stride] + dcOffset)) <
>> dcThreshold;
>> -        numEq += ((unsigned)(src[5] - src[5+stride] + dcOffset)) <
>> dcThreshold;
>> -        numEq += ((unsigned)(src[6] - src[6+stride] + dcOffset)) <
>> dcThreshold;
>> -        numEq += ((unsigned)(src[7] - src[7+stride] + dcOffset)) <
>> dcThreshold;
>> -        src+= stride;
>> -    }
>> -    return numEq > c->ppMode.flatnessThreshold;
>> -}
>> -
>> -static inline int isHorizMinMaxOk_C(const uint8_t src[], int stride, int
>> QP)
>> -{
>> -    int i;
>> -    for(i=0; i<2; i++){
>> -        if((unsigned)(src[0] - src[5] + 2*QP) > 4*QP) return 0;
>> -        src += stride;
>> -        if((unsigned)(src[2] - src[7] + 2*QP) > 4*QP) return 0;
>> -        src += stride;
>> -        if((unsigned)(src[4] - src[1] + 2*QP) > 4*QP) return 0;
>> -        src += stride;
>> -        if((unsigned)(src[6] - src[3] + 2*QP) > 4*QP) return 0;
>> -        src += stride;
>> -    }
>> -    return 1;
>> -}
>> -
>> -static inline int isVertMinMaxOk_C(const uint8_t src[], int stride, int
>> QP)
>> -{
>> -    int x;
>> -    src+= stride*4;
>> -    for(x=0; x<BLOCK_SIZE; x+=4){
>> -        if((unsigned)(src[  x + 0*stride] - src[  x + 5*stride] + 2*QP)
>> > 4*QP) return 0;
>> -        if((unsigned)(src[1+x + 2*stride] - src[1+x + 7*stride] + 2*QP)
>> > 4*QP) return 0;
>> -        if((unsigned)(src[2+x + 4*stride] - src[2+x + 1*stride] + 2*QP)
>> > 4*QP) return 0;
>> -        if((unsigned)(src[3+x + 6*stride] - src[3+x + 3*stride] + 2*QP)
>> > 4*QP) return 0;
>> -    }
>> -    return 1;
>> -}
>> -
>> -static inline int horizClassify_C(const uint8_t src[], int stride, const
>> PPContext *c)
>> -{
>> -    if( isHorizDC_C(src, stride, c) ){
>> -        return isHorizMinMaxOk_C(src, stride, c->QP);
>> -    }else{
>> -        return 2;
>> -    }
>> -}
>> -
>> -static inline int vertClassify_C(const uint8_t src[], int stride, const
>> PPContext *c)
>> -{
>> -    if( isVertDC_C(src, stride, c) ){
>> -        return isVertMinMaxOk_C(src, stride, c->QP);
>> -    }else{
>> -        return 2;
>> -    }
>> -}
>> -
>> -static inline void doHorizDefFilter_C(uint8_t dst[], int stride, const
>> PPContext *c)
>> -{
>> -    int y;
>> -    for(y=0; y<BLOCK_SIZE; y++){
>> -        const int middleEnergy= 5*(dst[4] - dst[3]) + 2*(dst[2] -
>> dst[5]);
>> -
>> -        if(FFABS(middleEnergy) < 8*c->QP){
>> -            const int q=(dst[3] - dst[4])/2;
>> -            const int leftEnergy=  5*(dst[2] - dst[1]) + 2*(dst[0] -
>> dst[3]);
>> -            const int rightEnergy= 5*(dst[6] - dst[5]) + 2*(dst[4] -
>> dst[7]);
>> -
>> -            int d= FFABS(middleEnergy) - FFMIN( FFABS(leftEnergy),
>> FFABS(rightEnergy) );
>> -            d= FFMAX(d, 0);
>> -
>> -            d= (5*d + 32) >> 6;
>> -            d*= FFSIGN(-middleEnergy);
>> -
>> -            if(q>0)
>> -            {
>> -                d = FFMAX(d, 0);
>> -                d = FFMIN(d, q);
>> -            }
>> -            else
>> -            {
>> -                d = FFMIN(d, 0);
>> -                d = FFMAX(d, q);
>> -            }
>> -
>> -            dst[3]-= d;
>> -            dst[4]+= d;
>> -        }
>> -        dst+= stride;
>> -    }
>> -}
>> -
>> -/**
>> - * Do a horizontal low pass filter on the 10x8 block (dst points to
>> middle 8x8 Block)
>> - * using the 9-Tap Filter (1,1,2,2,4,2,2,1,1)/16 (C version)
>> - */
>> -static inline void doHorizLowPass_C(uint8_t dst[], int stride, const
>> PPContext *c)
>> -{
>> -    int y;
>> -    for(y=0; y<BLOCK_SIZE; y++){
>> -        const int first= FFABS(dst[-1] - dst[0]) < c->QP ? dst[-1] :
>> dst[0];
>> -        const int last= FFABS(dst[8] - dst[7]) < c->QP ? dst[8] : dst[7];
>> -
>> -        int sums[10];
>> -        sums[0] = 4*first + dst[0] + dst[1] + dst[2] + 4;
>> -        sums[1] = sums[0] - first  + dst[3];
>> -        sums[2] = sums[1] - first  + dst[4];
>> -        sums[3] = sums[2] - first  + dst[5];
>> -        sums[4] = sums[3] - first  + dst[6];
>> -        sums[5] = sums[4] - dst[0] + dst[7];
>> -        sums[6] = sums[5] - dst[1] + last;
>> -        sums[7] = sums[6] - dst[2] + last;
>> -        sums[8] = sums[7] - dst[3] + last;
>> -        sums[9] = sums[8] - dst[4] + last;
>> -
>> -        dst[0]= (sums[0] + sums[2] + 2*dst[0])>>4;
>> -        dst[1]= (sums[1] + sums[3] + 2*dst[1])>>4;
>> -        dst[2]= (sums[2] + sums[4] + 2*dst[2])>>4;
>> -        dst[3]= (sums[3] + sums[5] + 2*dst[3])>>4;
>> -        dst[4]= (sums[4] + sums[6] + 2*dst[4])>>4;
>> -        dst[5]= (sums[5] + sums[7] + 2*dst[5])>>4;
>> -        dst[6]= (sums[6] + sums[8] + 2*dst[6])>>4;
>> -        dst[7]= (sums[7] + sums[9] + 2*dst[7])>>4;
>> -
>> -        dst+= stride;
>> -    }
>> -}
>> -
>> -/**
>> - * Experimental Filter 1 (Horizontal)
>> - * will not damage linear gradients
>> - * Flat blocks should look like they were passed through the
>> (1,1,2,2,4,2,2,1,1) 9-Tap filter
>> - * can only smooth blocks at the expected locations (it cannot smooth
>> them if they did move)
>> - * MMX2 version does correct clipping C version does not
>> - * not identical with the vertical one
>> - */
>> -static inline void horizX1Filter(uint8_t *src, int stride, int QP)
>> -{
>> -    int y;
>> -    static uint64_t lut[256];
>> -    if(!lut[255])
>> -    {
>> -        int i;
>> -        for(i=0; i<256; i++)
>> -        {
>> -            int v= i < 128 ? 2*i : 2*(i-256);
>> -/*
>> -//Simulate 112242211 9-Tap filter
>> -            uint64_t a= (v/16)  & 0xFF;
>> -            uint64_t b= (v/8)   & 0xFF;
>> -            uint64_t c= (v/4)   & 0xFF;
>> -            uint64_t d= (3*v/8) & 0xFF;
>> -*/
>> -//Simulate piecewise linear interpolation
>> -            uint64_t a= (v/16)   & 0xFF;
>> -            uint64_t b= (v*3/16) & 0xFF;
>> -            uint64_t c= (v*5/16) & 0xFF;
>> -            uint64_t d= (7*v/16) & 0xFF;
>> -            uint64_t A= (0x100 - a)&0xFF;
>> -            uint64_t B= (0x100 - b)&0xFF;
>> -            uint64_t C= (0x100 - c)&0xFF;
>> -            uint64_t D= (0x100 - c)&0xFF;
>> -
>> -            lut[i]   = (a<<56) | (b<<48) | (c<<40) | (d<<32) |
>> -                       (D<<24) | (C<<16) | (B<<8)  | (A);
>> -            //lut[i] = (v<<32) | (v<<24);
>> -        }
>> -    }
>> -
>> -    for(y=0; y<BLOCK_SIZE; y++){
>> -        int a= src[1] - src[2];
>> -        int b= src[3] - src[4];
>> -        int c= src[5] - src[6];
>> -
>> -        int d= FFMAX(FFABS(b) - (FFABS(a) + FFABS(c))/2, 0);
>> -
>> -        if(d < QP){
>> -            int v = d * FFSIGN(-b);
>> -
>> -            src[1] +=v/8;
>> -            src[2] +=v/4;
>> -            src[3] +=3*v/8;
>> -            src[4] -=3*v/8;
>> -            src[5] -=v/4;
>> -            src[6] -=v/8;
>> -        }
>> -        src+=stride;
>> -    }
>> -}
>> -
>> -/**
>> - * accurate deblock filter
>> - */
>> -static av_always_inline void do_a_deblock_C(uint8_t *src, int step,
>> -                                            int stride, const PPContext
>> *c, int mode)
>> -{
>> -    int y;
>> -    const int QP= c->QP;
>> -    const int dcOffset= ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
>> -    const int dcThreshold= dcOffset*2 + 1;
>> -
>> -    src+= step*4; // src points to begin of the 8x8 Block
>> -    for(y=0; y<8; y++){
>> -        int numEq= 0;
>> -
>> -        numEq += ((unsigned)(src[-1*step] - src[0*step] + dcOffset)) <
>> dcThreshold;
>> -        numEq += ((unsigned)(src[ 0*step] - src[1*step] + dcOffset)) <
>> dcThreshold;
>> -        numEq += ((unsigned)(src[ 1*step] - src[2*step] + dcOffset)) <
>> dcThreshold;
>> -        numEq += ((unsigned)(src[ 2*step] - src[3*step] + dcOffset)) <
>> dcThreshold;
>> -        numEq += ((unsigned)(src[ 3*step] - src[4*step] + dcOffset)) <
>> dcThreshold;
>> -        numEq += ((unsigned)(src[ 4*step] - src[5*step] + dcOffset)) <
>> dcThreshold;
>> -        numEq += ((unsigned)(src[ 5*step] - src[6*step] + dcOffset)) <
>> dcThreshold;
>> -        numEq += ((unsigned)(src[ 6*step] - src[7*step] + dcOffset)) <
>> dcThreshold;
>> -        numEq += ((unsigned)(src[ 7*step] - src[8*step] + dcOffset)) <
>> dcThreshold;
>> -        if(numEq > c->ppMode.flatnessThreshold){
>> -            int min, max, x;
>> -
>> -            if(src[0] > src[step]){
>> -                max= src[0];
>> -                min= src[step];
>> -            }else{
>> -                max= src[step];
>> -                min= src[0];
>> -            }
>> -            for(x=2; x<8; x+=2){
>> -                if(src[x*step] > src[(x+1)*step]){
>> -                        if(src[x    *step] > max) max= src[ x   *step];
>> -                        if(src[(x+1)*step] < min) min= src[(x+1)*step];
>> -                }else{
>> -                        if(src[(x+1)*step] > max) max= src[(x+1)*step];
>> -                        if(src[ x   *step] < min) min= src[ x   *step];
>> -                }
>> -            }
>> -            if(max-min < 2*QP){
>> -                const int first= FFABS(src[-1*step] - src[0]) < QP ?
>> src[-1*step] : src[0];
>> -                const int last= FFABS(src[8*step] - src[7*step]) < QP ?
>> src[8*step] : src[7*step];
>> -
>> -                int sums[10];
>> -                sums[0] = 4*first + src[0*step] + src[1*step] +
>> src[2*step] + 4;
>> -                sums[1] = sums[0] - first       + src[3*step];
>> -                sums[2] = sums[1] - first       + src[4*step];
>> -                sums[3] = sums[2] - first       + src[5*step];
>> -                sums[4] = sums[3] - first       + src[6*step];
>> -                sums[5] = sums[4] - src[0*step] + src[7*step];
>> -                sums[6] = sums[5] - src[1*step] + last;
>> -                sums[7] = sums[6] - src[2*step] + last;
>> -                sums[8] = sums[7] - src[3*step] + last;
>> -                sums[9] = sums[8] - src[4*step] + last;
>> -
>> -                if (mode & VISUALIZE) {
>> -                    src[0*step] =
>> -                    src[1*step] =
>> -                    src[2*step] =
>> -                    src[3*step] =
>> -                    src[4*step] =
>> -                    src[5*step] =
>> -                    src[6*step] =
>> -                    src[7*step] = 128;
>> -                }
>> -                src[0*step]= (sums[0] + sums[2] + 2*src[0*step])>>4;
>> -                src[1*step]= (sums[1] + sums[3] + 2*src[1*step])>>4;
>> -                src[2*step]= (sums[2] + sums[4] + 2*src[2*step])>>4;
>> -                src[3*step]= (sums[3] + sums[5] + 2*src[3*step])>>4;
>> -                src[4*step]= (sums[4] + sums[6] + 2*src[4*step])>>4;
>> -                src[5*step]= (sums[5] + sums[7] + 2*src[5*step])>>4;
>> -                src[6*step]= (sums[6] + sums[8] + 2*src[6*step])>>4;
>> -                src[7*step]= (sums[7] + sums[9] + 2*src[7*step])>>4;
>> -            }
>> -        }else{
>> -            const int middleEnergy= 5*(src[4*step] - src[3*step]) +
>> 2*(src[2*step] - src[5*step]);
>> -
>> -            if(FFABS(middleEnergy) < 8*QP){
>> -                const int q=(src[3*step] - src[4*step])/2;
>> -                const int leftEnergy=  5*(src[2*step] - src[1*step]) +
>> 2*(src[0*step] - src[3*step]);
>> -                const int rightEnergy= 5*(src[6*step] - src[5*step]) +
>> 2*(src[4*step] - src[7*step]);
>> -
>> -                int d= FFABS(middleEnergy) - FFMIN( FFABS(leftEnergy),
>> FFABS(rightEnergy) );
>> -                d= FFMAX(d, 0);
>> -
>> -                d= (5*d + 32) >> 6;
>> -                d*= FFSIGN(-middleEnergy);
>> -
>> -                if(q>0){
>> -                    d = FFMAX(d, 0);
>> -                    d = FFMIN(d, q);
>> -                }else{
>> -                    d = FFMIN(d, 0);
>> -                    d = FFMAX(d, q);
>> -                }
>> -
>> -                if ((mode & VISUALIZE) && d) {
>> -                    d= (d < 0) ? 32 : -32;
>> -                    src[3*step]= av_clip_uint8(src[3*step] - d);
>> -                    src[4*step]= av_clip_uint8(src[4*step] + d);
>> -                    d = 0;
>> -                }
>> -
>> -                src[3*step]-= d;
>> -                src[4*step]+= d;
>> -            }
>> -        }
>> -
>> -        src += stride;
>> -    }
>> -}
>> -
>> -//Note: we have C and SSE2 version (which uses MMX(EXT) when
>> advantageous)
>> -//Plain C versions
>> -//we always compile C for testing which needs bitexactness
>> -#define TEMPLATE_PP_C 1
>> -#include "postprocess_template.c"
>> -
>> -#if HAVE_ALTIVEC
>> -#include "libavutil/ppc/util_altivec.h"
>> -
>> -#   define TEMPLATE_PP_ALTIVEC 1
>> -#   include "postprocess_altivec_template.c"
>> -#   include "postprocess_template.c"
>> -#endif
>> -
>> -#if ARCH_X86 && HAVE_INLINE_ASM
>> -#    if CONFIG_RUNTIME_CPUDETECT
>> -#        define TEMPLATE_PP_SSE2 1
>> -#        include "postprocess_template.c"
>> -#    else
>> -#        if HAVE_SSE2_INLINE
>> -#            define TEMPLATE_PP_SSE2 1
>> -#            include "postprocess_template.c"
>> -#        endif
>> -#    endif
>> -#endif
>> -
>> -typedef void (*pp_fn)(const uint8_t src[], int srcStride, uint8_t dst[],
>> int dstStride, int width, int height,
>> -                      const int8_t QPs[], int QPStride, int isColor,
>> PPContext *c2);
>> -
>> -static inline void postProcess(const uint8_t src[], int srcStride,
>> uint8_t dst[], int dstStride, int width, int height,
>> -        const int8_t QPs[], int QPStride, int isColor, pp_mode *vm,
>> pp_context *vc)
>> -{
>> -    pp_fn pp = postProcess_C;
>> -    PPContext *c= (PPContext *)vc;
>> -    PPMode *ppMode= (PPMode *)vm;
>> -    c->ppMode= *ppMode; //FIXME
>> -
>> -    if (!(ppMode->lumMode & BITEXACT)) {
>> -#if CONFIG_RUNTIME_CPUDETECT
>> -#if ARCH_X86 && HAVE_INLINE_ASM
>> -        // ordered per speed fastest first
>> -        if      (c->cpuCaps & AV_CPU_FLAG_SSE2)     pp =
>> postProcess_SSE2;
>> -#elif HAVE_ALTIVEC
>> -        if      (c->cpuCaps & AV_CPU_FLAG_ALTIVEC)  pp =
>> postProcess_altivec;
>> -#endif
>> -#else /* CONFIG_RUNTIME_CPUDETECT */
>> -#if     HAVE_SSE2_INLINE
>> -        pp = postProcess_SSE2;
>> -#elif HAVE_ALTIVEC
>> -        pp = postProcess_altivec;
>> -#endif
>> -#endif /* !CONFIG_RUNTIME_CPUDETECT */
>> -    }
>> -
>> -    pp(src, srcStride, dst, dstStride, width, height, QPs, QPStride,
>> isColor, c);
>> -}
>> -
>> -/* -pp Command line Help
>> -*/
>> -const char pp_help[] =
>> -"Available postprocessing filters:\n"
>> -"Filters                        Options\n"
>> -"short  long name       short   long option     Description\n"
>> -"*      *               a       autoq           CPU power dependent
>> enabler\n"
>> -"                       c       chrom           chrominance filtering
>> enabled\n"
>> -"                       y       nochrom         chrominance filtering
>> disabled\n"
>> -"                       n       noluma          luma filtering
>> disabled\n"
>> -"hb     hdeblock        (2 threshold)           horizontal deblocking
>> filter\n"
>> -"       1. difference factor: default=32, higher -> more deblocking\n"
>> -"       2. flatness threshold: default=39, lower -> more deblocking\n"
>> -"                       the h & v deblocking filters share these\n"
>> -"                       so you can't set different thresholds for h /
>> v\n"
>> -"vb     vdeblock        (2 threshold)           vertical deblocking
>> filter\n"
>> -"ha     hadeblock       (2 threshold)           horizontal deblocking
>> filter\n"
>> -"va     vadeblock       (2 threshold)           vertical deblocking
>> filter\n"
>> -"h1     x1hdeblock                              experimental h deblock
>> filter 1\n"
>> -"v1     x1vdeblock                              experimental v deblock
>> filter 1\n"
>> -"dr     dering                                  deringing filter\n"
>> -"al     autolevels                              automatic brightness /
>> contrast\n"
>> -"                       f        fullyrange     stretch luminance to
>> (0..255)\n"
>> -"lb     linblenddeint                           linear blend
>> deinterlacer\n"
>> -"li     linipoldeint                            linear interpolating
>> deinterlace\n"
>> -"ci     cubicipoldeint                          cubic interpolating
>> deinterlacer\n"
>> -"md     mediandeint                             median deinterlacer\n"
>> -"fd     ffmpegdeint                             ffmpeg deinterlacer\n"
>> -"l5     lowpass5                                FIR lowpass
>> deinterlacer\n"
>> -"de     default                                 hb:a,vb:a,dr:a\n"
>> -"fa     fast                                    h1:a,v1:a,dr:a\n"
>> -"ac                                             ha:a:128:7,va:a,dr:a\n"
>> -"tn     tmpnoise        (3 threshold)           temporal noise reducer\n"
>> -"                     1. <= 2. <= 3.            larger -> stronger
>> filtering\n"
>> -"fq     forceQuant      <quantizer>             force quantizer\n"
>> -"Usage:\n"
>>
>> -"<filterName>[:<option>[:<option>...]][[,|/][-]<filterName>[:<option>...]]...\n"
>> -"long form example:\n"
>> -"vdeblock:autoq/hdeblock:autoq/linblenddeint    default,-vdeblock\n"
>> -"short form example:\n"
>> -"vb:a/hb:a/lb                                   de,-vb\n"
>> -"more examples:\n"
>> -"tn:64:128:256\n"
>> -"\n"
>> -;
>> -
>> -pp_mode *pp_get_mode_by_name_and_quality(const char *name, int quality)
>> -{
>> -    char temp[GET_MODE_BUFFER_SIZE];
>> -    char *p= temp;
>> -    static const char filterDelimiters[] = ",/";
>> -    static const char optionDelimiters[] = ":|";
>> -    struct PPMode *ppMode;
>> -    char *filterToken;
>> -
>> -    if (!name)  {
>> -        av_log(NULL, AV_LOG_ERROR, "pp: Missing argument\n");
>> -        return NULL;
>> -    }
>> -
>> -    if (!strcmp(name, "help")) {
>> -        const char *p;
>> -        for (p = pp_help; strchr(p, '\n'); p = strchr(p, '\n') + 1) {
>> -            av_strlcpy(temp, p, FFMIN(sizeof(temp), strchr(p, '\n') - p
>> + 2));
>> -            av_log(NULL, AV_LOG_INFO, "%s", temp);
>> -        }
>> -        return NULL;
>> -    }
>> -
>> -    ppMode= av_malloc(sizeof(PPMode));
>> -    if (!ppMode)
>> -        return NULL;
>> -
>> -    ppMode->lumMode= 0;
>> -    ppMode->chromMode= 0;
>> -    ppMode->maxTmpNoise[0]= 700;
>> -    ppMode->maxTmpNoise[1]= 1500;
>> -    ppMode->maxTmpNoise[2]= 3000;
>> -    ppMode->maxAllowedY= 234;
>> -    ppMode->minAllowedY= 16;
>> -    ppMode->baseDcDiff= 256/8;
>> -    ppMode->flatnessThreshold= 56-16-1;
>> -    ppMode->maxClippedThreshold= (AVRational){1,100};
>> -    ppMode->error=0;
>> -
>> -    memset(temp, 0, GET_MODE_BUFFER_SIZE);
>> -    av_strlcpy(temp, name, GET_MODE_BUFFER_SIZE - 1);
>> -
>> -    av_log(NULL, AV_LOG_DEBUG, "pp: %s\n", name);
>> -
>> -    for(;;){
>> -        const char *filterName;
>> -        int q= 1000000; //PP_QUALITY_MAX;
>> -        int chrom=-1;
>> -        int luma=-1;
>> -        const char *option;
>> -        const char *options[OPTIONS_ARRAY_SIZE];
>> -        int i;
>> -        int filterNameOk=0;
>> -        int numOfUnknownOptions=0;
>> -        int enable=1; //does the user want us to enabled or disabled the
>> filter
>> -        char *tokstate;
>> -
>> -        filterToken= av_strtok(p, filterDelimiters, &tokstate);
>> -        if(!filterToken) break;
>> -        p+= strlen(filterToken) + 1; // p points to next filterToken
>> -        filterName= av_strtok(filterToken, optionDelimiters, &tokstate);
>> -        if (!filterName) {
>> -            ppMode->error++;
>> -            break;
>> -        }
>> -        av_log(NULL, AV_LOG_DEBUG, "pp: %s::%s\n", filterToken,
>> filterName);
>> -
>> -        if(*filterName == '-'){
>> -            enable=0;
>> -            filterName++;
>> -        }
>> -
>> -        for(;;){ //for all options
>> -            option= av_strtok(NULL, optionDelimiters, &tokstate);
>> -            if(!option) break;
>> -
>> -            av_log(NULL, AV_LOG_DEBUG, "pp: option: %s\n", option);
>> -            if(!strcmp("autoq", option) || !strcmp("a", option)) q=
>> quality;
>> -            else if(!strcmp("nochrom", option) || !strcmp("y", option))
>> chrom=0;
>> -            else if(!strcmp("chrom", option) || !strcmp("c", option))
>> chrom=1;
>> -            else if(!strcmp("noluma", option) || !strcmp("n", option))
>> luma=0;
>> -            else{
>> -                options[numOfUnknownOptions] = option;
>> -                numOfUnknownOptions++;
>> -            }
>> -            if(numOfUnknownOptions >= OPTIONS_ARRAY_SIZE-1) break;
>> -        }
>> -        options[numOfUnknownOptions] = NULL;
>> -
>> -        /* replace stuff from the replace Table */
>> -        for(i=0; replaceTable[2*i]; i++){
>> -            if(!strcmp(replaceTable[2*i], filterName)){
>> -                size_t newlen = strlen(replaceTable[2*i + 1]);
>> -                int plen;
>> -                int spaceLeft;
>> -
>> -                p--, *p=',';
>> -
>> -                plen= strlen(p);
>> -                spaceLeft= p - temp + plen;
>> -                if(spaceLeft + newlen  >= GET_MODE_BUFFER_SIZE - 1){
>> -                    ppMode->error++;
>> -                    break;
>> -                }
>> -                memmove(p + newlen, p, plen+1);
>> -                memcpy(p, replaceTable[2*i + 1], newlen);
>> -                filterNameOk=1;
>> -            }
>> -        }
>> -
>> -        for(i=0; filters[i].shortName; i++){
>> -            if(   !strcmp(filters[i].longName, filterName)
>> -               || !strcmp(filters[i].shortName, filterName)){
>> -                ppMode->lumMode &= ~filters[i].mask;
>> -                ppMode->chromMode &= ~filters[i].mask;
>> -
>> -                filterNameOk=1;
>> -                if(!enable) break; // user wants to disable it
>> -
>> -                if(q >= filters[i].minLumQuality && luma)
>> -                    ppMode->lumMode|= filters[i].mask;
>> -                if(chrom==1 || (chrom==-1 && filters[i].chromDefault))
>> -                    if(q >= filters[i].minChromQuality)
>> -                            ppMode->chromMode|= filters[i].mask;
>> -
>> -                if(filters[i].mask == LEVEL_FIX){
>> -                    int o;
>> -                    ppMode->minAllowedY= 16;
>> -                    ppMode->maxAllowedY= 234;
>> -                    for(o=0; options[o]; o++){
>> -                        if(  !strcmp(options[o],"fullyrange")
>> -                           ||!strcmp(options[o],"f")){
>> -                            ppMode->minAllowedY= 0;
>> -                            ppMode->maxAllowedY= 255;
>> -                            numOfUnknownOptions--;
>> -                        }
>> -                    }
>> -                }
>> -                else if(filters[i].mask == TEMP_NOISE_FILTER)
>> -                {
>> -                    int o;
>> -                    int numOfNoises=0;
>> -
>> -                    for(o=0; options[o]; o++){
>> -                        char *tail;
>> -                        ppMode->maxTmpNoise[numOfNoises]=
>> -                            strtol(options[o], &tail, 0);
>> -                        if(tail!=options[o]){
>> -                            numOfNoises++;
>> -                            numOfUnknownOptions--;
>> -                            if(numOfNoises >= 3) break;
>> -                        }
>> -                    }
>> -                }
>> -                else if(filters[i].mask == V_DEBLOCK   ||
>> filters[i].mask == H_DEBLOCK
>> -                     || filters[i].mask == V_A_DEBLOCK ||
>> filters[i].mask == H_A_DEBLOCK){
>> -                    int o;
>> -
>> -                    for(o=0; options[o] && o<2; o++){
>> -                        char *tail;
>> -                        int val= strtol(options[o], &tail, 0);
>> -                        if(tail==options[o]) break;
>> -
>> -                        numOfUnknownOptions--;
>> -                        if(o==0) ppMode->baseDcDiff= val;
>> -                        else ppMode->flatnessThreshold= val;
>> -                    }
>> -                }
>> -                else if(filters[i].mask == FORCE_QUANT){
>> -                    int o;
>> -                    ppMode->forcedQuant= 15;
>> -
>> -                    for(o=0; options[o] && o<1; o++){
>> -                        char *tail;
>> -                        int val= strtol(options[o], &tail, 0);
>> -                        if(tail==options[o]) break;
>> -
>> -                        numOfUnknownOptions--;
>> -                        ppMode->forcedQuant= val;
>> -                    }
>> -                }
>> -            }
>> -        }
>> -        if(!filterNameOk) ppMode->error++;
>> -        ppMode->error += numOfUnknownOptions;
>> -    }
>> -
>> -    av_log(NULL, AV_LOG_DEBUG, "pp: lumMode=%X, chromMode=%X\n",
>> ppMode->lumMode, ppMode->chromMode);
>> -    if(ppMode->error){
>> -        av_log(NULL, AV_LOG_ERROR, "%d errors in postprocess string
>> \"%s\"\n", ppMode->error, name);
>> -        av_free(ppMode);
>> -        return NULL;
>> -    }
>> -    return ppMode;
>> -}
>> -
>> -void pp_free_mode(pp_mode *mode){
>> -    av_free(mode);
>> -}
>> -
>> -static void reallocAlign(void **p, int size){
>> -    av_free(*p);
>> -    *p= av_mallocz(size);
>> -}
>> -
>> -static void reallocBuffers(PPContext *c, int width, int height, int
>> stride, int qpStride){
>> -    int mbWidth = (width+15)>>4;
>> -    int mbHeight= (height+15)>>4;
>> -    int i;
>> -
>> -    c->stride= stride;
>> -    c->qpStride= qpStride;
>> -
>> -    reallocAlign((void **)&c->tempDst, stride*24+32);
>> -    reallocAlign((void **)&c->tempSrc, stride*24);
>> -    reallocAlign((void **)&c->tempBlocks, 2*16*8);
>> -    reallocAlign((void **)&c->yHistogram, 256*sizeof(uint64_t));
>> -    for(i=0; i<256; i++)
>> -            c->yHistogram[i]= width*height/64*15/256;
>> -
>> -    for(i=0; i<3; i++){
>> -        //Note: The +17*1024 is just there so I do not have to worry
>> about r/w over the end.
>> -        reallocAlign((void **)&c->tempBlurred[i], stride*mbHeight*16 +
>> 17*1024);
>> -        reallocAlign((void **)&c->tempBlurredPast[i],
>> 256*((height+7)&(~7))/2 + 17*1024);//FIXME size
>> -    }
>> -
>> -    reallocAlign((void **)&c->deintTemp, 2*width+32);
>> -    reallocAlign((void **)&c->nonBQPTable,
>> qpStride*mbHeight*sizeof(int8_t));
>> -    reallocAlign((void **)&c->stdQPTable,
>> qpStride*mbHeight*sizeof(int8_t));
>> -    reallocAlign((void **)&c->forcedQPTable, mbWidth*sizeof(int8_t));
>> -}
>> -
>> -static const char * context_to_name(void * ptr) {
>> -    return "postproc";
>> -}
>> -
>> -static const AVClass av_codec_context_class = { "Postproc",
>> context_to_name, NULL };
>> -
>> -av_cold pp_context *pp_get_context(int width, int height, int cpuCaps){
>> -    PPContext *c= av_mallocz(sizeof(PPContext));
>> -    int stride= FFALIGN(width, 16);  //assumed / will realloc if needed
>> -    int qpStride= (width+15)/16 + 2; //assumed / will realloc if needed
>> -
>> -    if (!c)
>> -        return NULL;
>> -
>> -    c->av_class = &av_codec_context_class;
>> -    if(cpuCaps&PP_FORMAT){
>> -        c->hChromaSubSample= cpuCaps&0x3;
>> -        c->vChromaSubSample= (cpuCaps>>4)&0x3;
>> -    }else{
>> -        c->hChromaSubSample= 1;
>> -        c->vChromaSubSample= 1;
>> -    }
>> -    if (cpuCaps & PP_CPU_CAPS_AUTO) {
>> -        c->cpuCaps = av_get_cpu_flags();
>> -    } else {
>> -        c->cpuCaps = 0;
>> -        if (cpuCaps & PP_CPU_CAPS_ALTIVEC)  c->cpuCaps |=
>> AV_CPU_FLAG_ALTIVEC;
>> -    }
>> -
>> -    reallocBuffers(c, width, height, stride, qpStride);
>> -
>> -    c->frameNum=-1;
>> -
>> -    return c;
>> -}
>> -
>> -av_cold void pp_free_context(void *vc){
>> -    PPContext *c = (PPContext*)vc;
>> -    int i;
>> -
>> -    for(i=0; i<FF_ARRAY_ELEMS(c->tempBlurred); i++)
>> -        av_free(c->tempBlurred[i]);
>> -    for(i=0; i<FF_ARRAY_ELEMS(c->tempBlurredPast); i++)
>> -        av_free(c->tempBlurredPast[i]);
>> -
>> -    av_free(c->tempBlocks);
>> -    av_free(c->yHistogram);
>> -    av_free(c->tempDst);
>> -    av_free(c->tempSrc);
>> -    av_free(c->deintTemp);
>> -    av_free(c->stdQPTable);
>> -    av_free(c->nonBQPTable);
>> -    av_free(c->forcedQPTable);
>> -
>> -    memset(c, 0, sizeof(PPContext));
>> -
>> -    av_free(c);
>> -}
>> -
>> -void  pp_postprocess(const uint8_t * src[3], const int srcStride[3],
>> -                     uint8_t * dst[3], const int dstStride[3],
>> -                     int width, int height,
>> -                     const int8_t *QP_store,  int QPStride,
>> -                     pp_mode *vm,  void *vc, int pict_type)
>> -{
>> -    int mbWidth = (width+15)>>4;
>> -    int mbHeight= (height+15)>>4;
>> -    PPMode *mode = vm;
>> -    PPContext *c = vc;
>> -    int minStride= FFMAX(FFABS(srcStride[0]), FFABS(dstStride[0]));
>> -    int absQPStride = FFABS(QPStride);
>> -
>> -    if (width < 16 || height < 16) {
>> -        av_log(c, AV_LOG_ERROR, "Postproc is designed to filter 16x16
>> macroblock based formats, the minimum size is 1 macroblock\n");
>> -        return;
>> -    }
>> -
>> -    // c->stride and c->QPStride are always positive
>> -    if(c->stride < minStride || c->qpStride < absQPStride)
>> -        reallocBuffers(c, width, height,
>> -                       FFMAX(minStride, c->stride),
>> -                       FFMAX(c->qpStride, absQPStride));
>> -
>> -    if(!QP_store || (mode->lumMode & FORCE_QUANT)){
>> -        int i;
>> -        QP_store= c->forcedQPTable;
>> -        absQPStride = QPStride = 0;
>> -        if(mode->lumMode & FORCE_QUANT)
>> -            for(i=0; i<mbWidth; i++) c->forcedQPTable[i]=
>> mode->forcedQuant;
>> -        else
>> -            for(i=0; i<mbWidth; i++) c->forcedQPTable[i]= 1;
>> -    }
>> -
>> -    if(pict_type & PP_PICT_TYPE_QP2){
>> -        int i;
>> -        const int count= FFMAX(mbHeight * absQPStride, mbWidth);
>> -        for(i=0; i<(count>>2); i++){
>> -            AV_WN32(c->stdQPTable + (i<<2), AV_RN32(QP_store + (i<<2))
>> >> 1 & 0x7F7F7F7F);
>> -        }
>> -        for(i<<=2; i<count; i++){
>> -            c->stdQPTable[i] = QP_store[i]>>1;
>> -        }
>> -        QP_store= c->stdQPTable;
>> -        QPStride= absQPStride;
>> -    }
>> -
>> -    if(0){
>> -        int x,y;
>> -        for(y=0; y<mbHeight; y++){
>> -            for(x=0; x<mbWidth; x++){
>> -                av_log(c, AV_LOG_INFO, "%2d ", QP_store[x + y*QPStride]);
>> -            }
>> -            av_log(c, AV_LOG_INFO, "\n");
>> -        }
>> -        av_log(c, AV_LOG_INFO, "\n");
>> -    }
>> -
>> -    if((pict_type&7)!=3){
>> -        if (QPStride >= 0){
>> -            int i;
>> -            const int count= FFMAX(mbHeight * QPStride, mbWidth);
>> -            for(i=0; i<(count>>2); i++){
>> -                AV_WN32(c->nonBQPTable + (i<<2), AV_RN32(QP_store +
>> (i<<2)) & 0x3F3F3F3F);
>> -            }
>> -            for(i<<=2; i<count; i++){
>> -                c->nonBQPTable[i] = QP_store[i] & 0x3F;
>> -            }
>> -        } else {
>> -            int i,j;
>> -            for(i=0; i<mbHeight; i++) {
>> -                for(j=0; j<absQPStride; j++) {
>> -                    c->nonBQPTable[i*absQPStride+j] =
>> QP_store[i*QPStride+j] & 0x3F;
>> -                }
>> -            }
>> -        }
>> -    }
>> -
>> -    av_log(c, AV_LOG_DEBUG, "using npp filters 0x%X/0x%X\n",
>> -           mode->lumMode, mode->chromMode);
>> -
>> -    postProcess(src[0], srcStride[0], dst[0], dstStride[0],
>> -                width, height, QP_store, QPStride, 0, mode, c);
>> -
>> -    if (!(src[1] && src[2] && dst[1] && dst[2]))
>> -        return;
>> -
>> -    width  = (width )>>c->hChromaSubSample;
>> -    height = (height)>>c->vChromaSubSample;
>> -
>> -    if(mode->chromMode){
>> -        postProcess(src[1], srcStride[1], dst[1], dstStride[1],
>> -                    width, height, QP_store, QPStride, 1, mode, c);
>> -        postProcess(src[2], srcStride[2], dst[2], dstStride[2],
>> -                    width, height, QP_store, QPStride, 2, mode, c);
>> -    }
>> -    else if(srcStride[1] == dstStride[1] && srcStride[2] ==
>> dstStride[2]){
>> -        linecpy(dst[1], src[1], height, srcStride[1]);
>> -        linecpy(dst[2], src[2], height, srcStride[2]);
>> -    }else{
>> -        int y;
>> -        for(y=0; y<height; y++){
>> -            memcpy(&(dst[1][y*dstStride[1]]), &(src[1][y*srcStride[1]]),
>> width);
>> -            memcpy(&(dst[2][y*dstStride[2]]), &(src[2][y*srcStride[2]]),
>> width);
>> -        }
>> -    }
>> -}
>> diff --git a/libpostproc/postprocess.h b/libpostproc/postprocess.h
>> deleted file mode 100644
>> index d2adb6ccad7..00000000000
>> --- a/libpostproc/postprocess.h
>> +++ /dev/null
>> @@ -1,109 +0,0 @@
>> -/*
>> - * Copyright (C) 2001-2003 Michael Niedermayer (michae...@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
>> <https://www.google.com/maps/search/51+Franklin+Street?entry=gmail&source=g>,
>> Fifth Floor, Boston, MA 02110-1301 USA
>> - */
>> -
>> -#ifndef POSTPROC_POSTPROCESS_H
>> -#define POSTPROC_POSTPROCESS_H
>> -
>> -/**
>> - * @file
>> - * @ingroup lpp
>> - * external API header
>> - */
>> -
>> -/**
>> - * @defgroup lpp libpostproc
>> - * Video postprocessing library.
>> - *
>> - * @{
>> - */
>> -
>> -#include "libpostproc/version_major.h"
>> -#ifndef HAVE_AV_CONFIG_H
>> -/* When included as part of the ffmpeg build, only include the major
>> version
>> - * to avoid unnecessary rebuilds. When included externally, keep
>> including
>> - * the full version information. */
>> -#include "libpostproc/version.h"
>> -#endif
>> -
>> -/**
>> - * Return the LIBPOSTPROC_VERSION_INT constant.
>> - */
>> -unsigned postproc_version(void);
>> -
>> -/**
>> - * Return the libpostproc build-time configuration.
>> - */
>> -const char *postproc_configuration(void);
>> -
>> -/**
>> - * Return the libpostproc license.
>> - */
>> -const char *postproc_license(void);
>> -
>> -#define PP_QUALITY_MAX 6
>> -
>> -#include <inttypes.h>
>> -
>> -typedef void pp_context;
>> -typedef void pp_mode;
>> -
>> -extern const char pp_help[]; ///< a simple help text
>> -
>> -void  pp_postprocess(const uint8_t * src[3], const int srcStride[3],
>> -                     uint8_t * dst[3], const int dstStride[3],
>> -                     int horizontalSize, int verticalSize,
>> -                     const int8_t *QP_store,  int QP_stride,
>> -                     pp_mode *mode, pp_context *ppContext, int
>> pict_type);
>> -
>> -
>> -/**
>> - * Return a pp_mode or NULL if an error occurred.
>> - *
>> - * @param name    the string after "-pp" on the command line
>> - * @param quality a number from 0 to PP_QUALITY_MAX
>> - */
>> -pp_mode *pp_get_mode_by_name_and_quality(const char *name, int quality);
>> -void pp_free_mode(pp_mode *mode);
>> -
>> -pp_context *pp_get_context(int width, int height, int flags);
>> -void pp_free_context(pp_context *ppContext);
>> -
>> -#define PP_CPU_CAPS_MMX   0x80000000
>> -#define PP_CPU_CAPS_MMX2  0x20000000
>> -#if FF_API_PP_AMD_3DNOW
>> -#define PP_CPU_CAPS_3DNOW 0x40000000
>> -#endif
>> -#define PP_CPU_CAPS_ALTIVEC 0x10000000
>> -#define PP_CPU_CAPS_AUTO  0x00080000
>> -
>> -#define PP_FORMAT         0x00000008
>> -#define PP_FORMAT_420    (0x00000011|PP_FORMAT)
>> -#define PP_FORMAT_422    (0x00000001|PP_FORMAT)
>> -#define PP_FORMAT_411    (0x00000002|PP_FORMAT)
>> -#define PP_FORMAT_444    (0x00000000|PP_FORMAT)
>> -#define PP_FORMAT_440    (0x00000010|PP_FORMAT)
>> -
>> -#define PP_PICT_TYPE_QP2  0x00000010 ///< MPEG2 style QScale
>> -
>> -/**
>> - * @}
>> - */
>> -
>> -#endif /* POSTPROC_POSTPROCESS_H */
>> diff --git a/libpostproc/postprocess_altivec_template.c
>> b/libpostproc/postprocess_altivec_template.c
>> deleted file mode 100644
>> index feddab50356..00000000000
>> --- a/libpostproc/postprocess_altivec_template.c
>> +++ /dev/null
>> @@ -1,1214 +0,0 @@
>> -/*
>> - * AltiVec optimizations (C) 2004 Romain Dolbeau <rom...@dolbeau.org>
>> - *
>> - * based on code by Copyright (C) 2001-2003 Michael Niedermayer (
>> michae...@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
>> - */
>> -
>> -#include "libavutil/avutil.h"
>> -#include "libavutil/mem_internal.h"
>> -
>> -#define
>> ALTIVEC_TRANSPOSE_8x8_SHORT(src_a,src_b,src_c,src_d,src_e,src_f,src_g,src_h)
>> \
>> -    do {                                                          \
>> -        __typeof__(src_a) tempA1, tempB1, tempC1, tempD1;         \
>> -        __typeof__(src_a) tempE1, tempF1, tempG1, tempH1;         \
>> -        __typeof__(src_a) tempA2, tempB2, tempC2, tempD2;         \
>> -        __typeof__(src_a) tempE2, tempF2, tempG2, tempH2;         \
>> -        tempA1 = vec_mergeh (src_a, src_e);                       \
>> -        tempB1 = vec_mergel (src_a, src_e);                       \
>> -        tempC1 = vec_mergeh (src_b, src_f);                       \
>> -        tempD1 = vec_mergel (src_b, src_f);                       \
>> -        tempE1 = vec_mergeh (src_c, src_g);                       \
>> -        tempF1 = vec_mergel (src_c, src_g);                       \
>> -        tempG1 = vec_mergeh (src_d, src_h);                       \
>> -        tempH1 = vec_mergel (src_d, src_h);                       \
>> -        tempA2 = vec_mergeh (tempA1, tempE1);                     \
>> -        tempB2 = vec_mergel (tempA1, tempE1);                     \
>> -        tempC2 = vec_mergeh (tempB1, tempF1);                     \
>> -        tempD2 = vec_mergel (tempB1, tempF1);                     \
>> -        tempE2 = vec_mergeh (tempC1, tempG1);                     \
>> -        tempF2 = vec_mergel (tempC1, tempG1);                     \
>> -        tempG2 = vec_mergeh (tempD1, tempH1);                     \
>> -        tempH2 = vec_mergel (tempD1, tempH1);                     \
>> -        src_a = vec_mergeh (tempA2, tempE2);                      \
>> -        src_b = vec_mergel (tempA2, tempE2);                      \
>> -        src_c = vec_mergeh (tempB2, tempF2);                      \
>> -        src_d = vec_mergel (tempB2, tempF2);                      \
>> -        src_e = vec_mergeh (tempC2, tempG2);                      \
>> -        src_f = vec_mergel (tempC2, tempG2);                      \
>> -        src_g = vec_mergeh (tempD2, tempH2);                      \
>> -        src_h = vec_mergel (tempD2, tempH2);                      \
>> -    } while (0)
>> -
>> -
>> -static inline int vertClassify_altivec(uint8_t src[], int stride,
>> PPContext *c) {
>> -    /*
>> -    this code makes no assumption on src or stride.
>> -    One could remove the recomputation of the perm
>> -    vector by assuming (stride % 16) == 0, unfortunately
>> -    this is not always true.
>> -    */
>> -    short data_0 = ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
>> -    DECLARE_ALIGNED(16, short, data)[8] =
>> -                    {
>> -                        data_0,
>> -                        data_0 * 2 + 1,
>> -                        c->QP * 2,
>> -                        c->QP * 4
>> -                    };
>> -    int numEq;
>> -    uint8_t *src2 = src;
>> -    vector signed short v_dcOffset;
>> -    vector signed short v2QP;
>> -    vector unsigned short v4QP;
>> -    vector unsigned short v_dcThreshold;
>> -    const int properStride = (stride % 16);
>> -    const int srcAlign = ((unsigned long)src2 % 16);
>> -    const int two_vectors = ((srcAlign > 8) || properStride) ? 1 : 0;
>> -    const vector signed int zero = vec_splat_s32(0);
>> -    const vector signed short mask = vec_splat_s16(1);
>> -    vector signed int v_numEq = vec_splat_s32(0);
>> -    vector signed short v_data = vec_ld(0, data);
>> -    vector signed short v_srcAss0, v_srcAss1, v_srcAss2, v_srcAss3,
>> -                        v_srcAss4, v_srcAss5, v_srcAss6, v_srcAss7;
>> -//FIXME avoid this mess if possible
>> -    register int j0 = 0,
>> -                 j1 = stride,
>> -                 j2 = 2 * stride,
>> -                 j3 = 3 * stride,
>> -                 j4 = 4 * stride,
>> -                 j5 = 5 * stride,
>> -                 j6 = 6 * stride,
>> -                 j7 = 7 * stride;
>> -    vector unsigned char v_srcA0, v_srcA1, v_srcA2, v_srcA3,
>> -                         v_srcA4, v_srcA5, v_srcA6, v_srcA7;
>> -
>> -    v_dcOffset = vec_splat(v_data, 0);
>> -    v_dcThreshold = (vector unsigned short)vec_splat(v_data, 1);
>> -    v2QP = vec_splat(v_data, 2);
>> -    v4QP = (vector unsigned short)vec_splat(v_data, 3);
>> -
>> -    src2 += stride * 4;
>> -
>> -#define LOAD_LINE(i)                                                    \
>> -    {                                                                   \
>> -    vector unsigned char perm##i = vec_lvsl(j##i, src2);                \
>> -    vector unsigned char v_srcA2##i;                                    \
>> -    vector unsigned char v_srcA1##i = vec_ld(j##i, src2);               \
>> -    if (two_vectors)                                                    \
>> -        v_srcA2##i = vec_ld(j##i + 16, src2);                           \
>> -    v_srcA##i =                                                         \
>> -        vec_perm(v_srcA1##i, v_srcA2##i, perm##i);                      \
>> -    v_srcAss##i =                                                       \
>> -        (vector signed short)vec_mergeh((vector signed char)zero,       \
>> -                                        (vector signed char)v_srcA##i); }
>> -
>> -#define LOAD_LINE_ALIGNED(i)                                            \
>> -    v_srcA##i = vec_ld(j##i, src2);                                     \
>> -    v_srcAss##i =                                                       \
>> -        (vector signed short)vec_mergeh((vector signed char)zero,       \
>> -                                        (vector signed char)v_srcA##i)
>> -
>> -    /* Special-casing the aligned case is worthwhile, as all calls from
>> -     * the (transposed) horizontable deblocks will be aligned, in
>> addition
>> -     * to the naturally aligned vertical deblocks. */
>> -    if (properStride && srcAlign) {
>> -        LOAD_LINE_ALIGNED(0);
>> -        LOAD_LINE_ALIGNED(1);
>> -        LOAD_LINE_ALIGNED(2);
>> -        LOAD_LINE_ALIGNED(3);
>> -        LOAD_LINE_ALIGNED(4);
>> -        LOAD_LINE_ALIGNED(5);
>> -        LOAD_LINE_ALIGNED(6);
>> -        LOAD_LINE_ALIGNED(7);
>> -    } else {
>> -        LOAD_LINE(0);
>> -        LOAD_LINE(1);
>> -        LOAD_LINE(2);
>> -        LOAD_LINE(3);
>> -        LOAD_LINE(4);
>> -        LOAD_LINE(5);
>> -        LOAD_LINE(6);
>> -        LOAD_LINE(7);
>> -    }
>> -#undef LOAD_LINE
>> -#undef LOAD_LINE_ALIGNED
>> -
>> -#define ITER(i, j)                                                      \
>> -    const vector signed short v_diff##i =                               \
>> -        vec_sub(v_srcAss##i, v_srcAss##j);                              \
>> -    const vector signed short v_sum##i =                                \
>> -        vec_add(v_diff##i, v_dcOffset);                                 \
>> -    const vector signed short v_comp##i =                               \
>> -        (vector signed short)vec_cmplt((vector unsigned short)v_sum##i, \
>> -                                       v_dcThreshold);                  \
>> -    const vector signed short v_part##i = vec_and(mask, v_comp##i);
>> -
>> -    {
>> -        ITER(0, 1)
>> -        ITER(1, 2)
>> -        ITER(2, 3)
>> -        ITER(3, 4)
>> -        ITER(4, 5)
>> -        ITER(5, 6)
>> -        ITER(6, 7)
>> -
>> -        v_numEq = vec_sum4s(v_part0, v_numEq);
>> -        v_numEq = vec_sum4s(v_part1, v_numEq);
>> -        v_numEq = vec_sum4s(v_part2, v_numEq);
>> -        v_numEq = vec_sum4s(v_part3, v_numEq);
>> -        v_numEq = vec_sum4s(v_part4, v_numEq);
>> -        v_numEq = vec_sum4s(v_part5, v_numEq);
>> -        v_numEq = vec_sum4s(v_part6, v_numEq);
>> -    }
>> -
>> -#undef ITER
>> -
>> -    v_numEq = vec_sums(v_numEq, zero);
>> -
>> -    v_numEq = vec_splat(v_numEq, 3);
>> -    vec_ste(v_numEq, 0, &numEq);
>> -
>> -    if (numEq > c->ppMode.flatnessThreshold){
>> -        const vector unsigned char mmoP1 = (const vector unsigned char)
>> -            {0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
>> -             0x00, 0x01, 0x12, 0x13, 0x08, 0x09, 0x1A, 0x1B};
>> -        const vector unsigned char mmoP2 = (const vector unsigned char)
>> -            {0x04, 0x05, 0x16, 0x17, 0x0C, 0x0D, 0x1E, 0x1F,
>> -             0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f};
>> -        const vector unsigned char mmoP = (const vector unsigned char)
>> -            vec_lvsl(8, (unsigned char*)0);
>> -
>> -        vector signed short mmoL1 = vec_perm(v_srcAss0, v_srcAss2,
>> mmoP1);
>> -        vector signed short mmoL2 = vec_perm(v_srcAss4, v_srcAss6,
>> mmoP2);
>> -        vector signed short mmoL = vec_perm(mmoL1, mmoL2, mmoP);
>> -        vector signed short mmoR1 = vec_perm(v_srcAss5, v_srcAss7,
>> mmoP1);
>> -        vector signed short mmoR2 = vec_perm(v_srcAss1, v_srcAss3,
>> mmoP2);
>> -        vector signed short mmoR = vec_perm(mmoR1, mmoR2, mmoP);
>> -        vector signed short mmoDiff = vec_sub(mmoL, mmoR);
>> -        vector unsigned short mmoSum = (vector unsigned
>> short)vec_add(mmoDiff, v2QP);
>> -
>> -        if (vec_any_gt(mmoSum, v4QP))
>> -            return 0;
>> -        else
>> -            return 1;
>> -    }
>> -    else return 2;
>> -}
>> -
>> -static inline void doVertLowPass_altivec(uint8_t *src, int stride,
>> PPContext *c) {
>> -    /*
>> -    this code makes no assumption on src or stride.
>> -    One could remove the recomputation of the perm
>> -    vector by assuming (stride % 16) == 0, unfortunately
>> -    this is not always true. Quite a lot of load/stores
>> -    can be removed by assuming proper alignment of
>> -    src & stride :-(
>> -    */
>> -    uint8_t *src2 = src;
>> -    const vector signed int zero = vec_splat_s32(0);
>> -    const int properStride = (stride % 16);
>> -    const int srcAlign = ((unsigned long)src2 % 16);
>> -    DECLARE_ALIGNED(16, short, qp)[8] = {c->QP};
>> -    vector signed short vqp = vec_ld(0, qp);
>> -    vector signed short vb0, vb1, vb2, vb3, vb4, vb5, vb6, vb7, vb8, vb9;
>> -    vector unsigned char vbA0, av_uninit(vbA1), av_uninit(vbA2),
>> av_uninit(vbA3), av_uninit(vbA4), av_uninit(vbA5), av_uninit(vbA6),
>> av_uninit(vbA7), av_uninit(vbA8), vbA9;
>> -    vector unsigned char vbB0, av_uninit(vbB1), av_uninit(vbB2),
>> av_uninit(vbB3), av_uninit(vbB4), av_uninit(vbB5), av_uninit(vbB6),
>> av_uninit(vbB7), av_uninit(vbB8), vbB9;
>> -    vector unsigned char vbT0, vbT1, vbT2, vbT3, vbT4, vbT5, vbT6, vbT7,
>> vbT8, vbT9;
>> -    vector unsigned char perml0, perml1, perml2, perml3, perml4,
>> -                         perml5, perml6, perml7, perml8, perml9;
>> -    register int j0 = 0,
>> -                 j1 = stride,
>> -                 j2 = 2 * stride,
>> -                 j3 = 3 * stride,
>> -                 j4 = 4 * stride,
>> -                 j5 = 5 * stride,
>> -                 j6 = 6 * stride,
>> -                 j7 = 7 * stride,
>> -                 j8 = 8 * stride,
>> -                 j9 = 9 * stride;
>> -
>> -    vqp = vec_splat(vqp, 0);
>> -
>> -    src2 += stride*3;
>> -
>> -#define LOAD_LINE(i)                                                    \
>> -    perml##i = vec_lvsl(i * stride, src2);                              \
>> -    vbA##i = vec_ld(i * stride, src2);                                  \
>> -    vbB##i = vec_ld(i * stride + 16, src2);                             \
>> -    vbT##i = vec_perm(vbA##i, vbB##i, perml##i);                        \
>> -    vb##i =                                                             \
>> -        (vector signed short)vec_mergeh((vector unsigned char)zero,     \
>> -                                        (vector unsigned char)vbT##i)
>> -
>> -#define LOAD_LINE_ALIGNED(i)                                            \
>> -    vbT##i = vec_ld(j##i, src2);                                        \
>> -    vb##i =                                                             \
>> -        (vector signed short)vec_mergeh((vector signed char)zero,       \
>> -                                        (vector signed char)vbT##i)
>> -
>> -      /* Special-casing the aligned case is worthwhile, as all calls from
>> -       * the (transposed) horizontable deblocks will be aligned, in
>> addition
>> -       * to the naturally aligned vertical deblocks. */
>> -    if (properStride && srcAlign) {
>> -          LOAD_LINE_ALIGNED(0);
>> -          LOAD_LINE_ALIGNED(1);
>> -          LOAD_LINE_ALIGNED(2);
>> -          LOAD_LINE_ALIGNED(3);
>> -          LOAD_LINE_ALIGNED(4);
>> -          LOAD_LINE_ALIGNED(5);
>> -          LOAD_LINE_ALIGNED(6);
>> -          LOAD_LINE_ALIGNED(7);
>> -          LOAD_LINE_ALIGNED(8);
>> -          LOAD_LINE_ALIGNED(9);
>> -    } else {
>> -          LOAD_LINE(0);
>> -          LOAD_LINE(1);
>> -          LOAD_LINE(2);
>> -          LOAD_LINE(3);
>> -          LOAD_LINE(4);
>> -          LOAD_LINE(5);
>> -          LOAD_LINE(6);
>> -          LOAD_LINE(7);
>> -          LOAD_LINE(8);
>> -          LOAD_LINE(9);
>> -    }
>> -#undef LOAD_LINE
>> -#undef LOAD_LINE_ALIGNED
>> -    {
>> -        const vector unsigned short v_2 = vec_splat_u16(2);
>> -        const vector unsigned short v_4 = vec_splat_u16(4);
>> -
>> -        const vector signed short v_diff01 = vec_sub(vb0, vb1);
>> -        const vector unsigned short v_cmp01 =
>> -            (const vector unsigned short) vec_cmplt(vec_abs(v_diff01),
>> vqp);
>> -        const vector signed short v_first = vec_sel(vb1, vb0, v_cmp01);
>> -        const vector signed short v_diff89 = vec_sub(vb8, vb9);
>> -        const vector unsigned short v_cmp89 =
>> -            (const vector unsigned short) vec_cmplt(vec_abs(v_diff89),
>> vqp);
>> -        const vector signed short v_last = vec_sel(vb8, vb9, v_cmp89);
>> -
>> -        const vector signed short temp01 = vec_mladd(v_first, (vector
>> signed short)v_4, vb1);
>> -        const vector signed short temp02 = vec_add(vb2, vb3);
>> -        const vector signed short temp03 = vec_add(temp01, (vector
>> signed short)v_4);
>> -        const vector signed short v_sumsB0 = vec_add(temp02, temp03);
>> -
>> -        const vector signed short temp11 = vec_sub(v_sumsB0, v_first);
>> -        const vector signed short v_sumsB1 = vec_add(temp11, vb4);
>> -
>> -        const vector signed short temp21 = vec_sub(v_sumsB1, v_first);
>> -        const vector signed short v_sumsB2 = vec_add(temp21, vb5);
>> -
>> -        const vector signed short temp31 = vec_sub(v_sumsB2, v_first);
>> -        const vector signed short v_sumsB3 = vec_add(temp31, vb6);
>> -
>> -        const vector signed short temp41 = vec_sub(v_sumsB3, v_first);
>> -        const vector signed short v_sumsB4 = vec_add(temp41, vb7);
>> -
>> -        const vector signed short temp51 = vec_sub(v_sumsB4, vb1);
>> -        const vector signed short v_sumsB5 = vec_add(temp51, vb8);
>> -
>> -        const vector signed short temp61 = vec_sub(v_sumsB5, vb2);
>> -        const vector signed short v_sumsB6 = vec_add(temp61, v_last);
>> -
>> -        const vector signed short temp71 = vec_sub(v_sumsB6, vb3);
>> -        const vector signed short v_sumsB7 = vec_add(temp71, v_last);
>> -
>> -        const vector signed short temp81 = vec_sub(v_sumsB7, vb4);
>> -        const vector signed short v_sumsB8 = vec_add(temp81, v_last);
>> -
>> -        const vector signed short temp91 = vec_sub(v_sumsB8, vb5);
>> -        const vector signed short v_sumsB9 = vec_add(temp91, v_last);
>> -
>> -    #define COMPUTE_VR(i, j, k)
>>    \
>> -        const vector signed short temps1##i =
>>    \
>> -            vec_add(v_sumsB##i, v_sumsB##k);
>>     \
>> -        const vector signed short temps2##i =
>>    \
>> -            vec_mladd(vb##j, (vector signed short)v_2, temps1##i);
>>     \
>> -        const vector signed short  vr##j = vec_sra(temps2##i, v_4)
>> -
>> -        COMPUTE_VR(0, 1, 2);
>> -        COMPUTE_VR(1, 2, 3);
>> -        COMPUTE_VR(2, 3, 4);
>> -        COMPUTE_VR(3, 4, 5);
>> -        COMPUTE_VR(4, 5, 6);
>> -        COMPUTE_VR(5, 6, 7);
>> -        COMPUTE_VR(6, 7, 8);
>> -        COMPUTE_VR(7, 8, 9);
>> -
>> -        const vector signed char neg1 = vec_splat_s8(-1);
>> -        const vector unsigned char permHH = (const vector unsigned
>> char){0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
>> -
>>  0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F};
>> -
>> -#define PACK_AND_STORE(i)                                       \
>> -{   const vector unsigned char perms##i =                       \
>> -        vec_lvsr(i * stride, src2);                             \
>> -    const vector unsigned char vf##i =                          \
>> -        vec_packsu(vr##i, (vector signed short)zero);           \
>> -    const vector unsigned char vg##i =                          \
>> -        vec_perm(vf##i, vbT##i, permHH);                        \
>> -    const vector unsigned char mask##i =                        \
>> -        vec_perm((vector unsigned char)zero, (vector unsigned char)neg1,
>> perms##i); \
>> -    const vector unsigned char vg2##i =                         \
>> -        vec_perm(vg##i, vg##i, perms##i);                       \
>> -    const vector unsigned char svA##i =                         \
>> -        vec_sel(vbA##i, vg2##i, mask##i);                       \
>> -    const vector unsigned char svB##i =                         \
>> -        vec_sel(vg2##i, vbB##i, mask##i);                       \
>> -    vec_st(svA##i, i * stride, src2);                           \
>> -    vec_st(svB##i, i * stride + 16, src2);}
>> -
>> -#define PACK_AND_STORE_ALIGNED(i)                               \
>> -{   const vector unsigned char vf##i =                          \
>> -        vec_packsu(vr##i, (vector signed short)zero);           \
>> -    const vector unsigned char vg##i =                          \
>> -        vec_perm(vf##i, vbT##i, permHH);                        \
>> -    vec_st(vg##i, i * stride, src2);}
>> -
>> -        /* Special-casing the aligned case is worthwhile, as all calls
>> from
>> -         * the (transposed) horizontable deblocks will be aligned, in
>> addition
>> -         * to the naturally aligned vertical deblocks. */
>> -        if (properStride && srcAlign) {
>> -            PACK_AND_STORE_ALIGNED(1)
>> -            PACK_AND_STORE_ALIGNED(2)
>> -            PACK_AND_STORE_ALIGNED(3)
>> -            PACK_AND_STORE_ALIGNED(4)
>> -            PACK_AND_STORE_ALIGNED(5)
>> -            PACK_AND_STORE_ALIGNED(6)
>> -            PACK_AND_STORE_ALIGNED(7)
>> -            PACK_AND_STORE_ALIGNED(8)
>> -        } else {
>> -            PACK_AND_STORE(1)
>> -            PACK_AND_STORE(2)
>> -            PACK_AND_STORE(3)
>> -            PACK_AND_STORE(4)
>> -            PACK_AND_STORE(5)
>> -            PACK_AND_STORE(6)
>> -            PACK_AND_STORE(7)
>> -            PACK_AND_STORE(8)
>> -        }
>> -    #undef PACK_AND_STORE
>> -    #undef PACK_AND_STORE_ALIGNED
>> -    }
>> -}
>> -
>> -
>> -
>> -static inline void doVertDefFilter_altivec(uint8_t src[], int stride,
>> PPContext *c) {
>> -    /*
>> -    this code makes no assumption on src or stride.
>> -    One could remove the recomputation of t
>
>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to