ср, 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".