You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	Remove libpostproc
Libpostproc will be available as source plugin at https://github.com/michaelni/FFmpeg/tree/sourceplugin-libpostproc OR https://github.com/michaelni/libpostproc whatever turns out more convenient to maintain For the upcoming 8.0 release, libpostproc will be included, so as not to cause delays or inconveniences Sponsored-by: Sovereign Tech Fund Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
		| @@ -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` | ||||
|   | ||||
| @@ -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: | ||||
|   | ||||
							
								
								
									
										13
									
								
								configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								configure
									
									
									
									
										vendored
									
									
								
							| @@ -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 | ||||
|   | ||||
							
								
								
									
										175
									
								
								doc/filters.texi
									
									
									
									
									
								
							
							
						
						
									
										175
									
								
								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 | ||||
|   | ||||
| @@ -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); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
| @@ -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, 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, | ||||
| }; | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
| @@ -1,7 +0,0 @@ | ||||
| LIBPOSTPROC_MAJOR { | ||||
|     global: | ||||
|         postproc_*; | ||||
|         pp_*; | ||||
|     local: | ||||
|         *; | ||||
| }; | ||||
| @@ -1,992 +0,0 @@ | ||||
| /* | ||||
|  * Copyright (C) 2001-2003 Michael Niedermayer (michaelni@gmx.at) | ||||
|  * | ||||
|  * AltiVec optimizations (C) 2004 Romain Dolbeau <romain@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, 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); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,109 +0,0 @@ | ||||
| /* | ||||
|  * Copyright (C) 2001-2003 Michael Niedermayer (michaelni@gmx.at) | ||||
|  * | ||||
|  * This file is part of FFmpeg. | ||||
|  * | ||||
|  * FFmpeg is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * FFmpeg is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with FFmpeg; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
|  */ | ||||
|  | ||||
| #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 */ | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,185 +0,0 @@ | ||||
| /* | ||||
|  * Copyright (C) 2001-2002 Michael Niedermayer (michaelni@gmx.at) | ||||
|  * | ||||
|  * This file is part of FFmpeg. | ||||
|  * | ||||
|  * FFmpeg is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * FFmpeg is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with FFmpeg; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @file | ||||
|  * internal API header. | ||||
|  */ | ||||
|  | ||||
| #ifndef POSTPROC_POSTPROCESS_INTERNAL_H | ||||
| #define POSTPROC_POSTPROCESS_INTERNAL_H | ||||
|  | ||||
| #include <string.h> | ||||
| #include "libavutil/avutil.h" | ||||
| #include "libavutil/intmath.h" | ||||
| #include "libavutil/log.h" | ||||
| #include "libavutil/mem_internal.h" | ||||
| #include "postprocess.h" | ||||
|  | ||||
| #define V_DEBLOCK       0x01 | ||||
| #define H_DEBLOCK       0x02 | ||||
| #define DERING          0x04 | ||||
| #define LEVEL_FIX       0x08 ///< Brightness & Contrast | ||||
|  | ||||
| #define LUM_V_DEBLOCK   V_DEBLOCK               //   1 | ||||
| #define LUM_H_DEBLOCK   H_DEBLOCK               //   2 | ||||
| #define CHROM_V_DEBLOCK (V_DEBLOCK<<4)          //  16 | ||||
| #define CHROM_H_DEBLOCK (H_DEBLOCK<<4)          //  32 | ||||
| #define LUM_DERING      DERING                  //   4 | ||||
| #define CHROM_DERING    (DERING<<4)             //  64 | ||||
| #define LUM_LEVEL_FIX   LEVEL_FIX               //   8 | ||||
| #define CHROM_LEVEL_FIX (LEVEL_FIX<<4)          // 128 (not implemented yet) | ||||
|  | ||||
| // Experimental vertical filters | ||||
| #define V_X1_FILTER     0x0200                  // 512 | ||||
| #define V_A_DEBLOCK     0x0400 | ||||
|  | ||||
| // Experimental horizontal filters | ||||
| #define H_X1_FILTER     0x2000                  // 8192 | ||||
| #define H_A_DEBLOCK     0x4000 | ||||
|  | ||||
| /// select between full y range (255-0) or standard one (234-16) | ||||
| #define FULL_Y_RANGE    0x8000                  // 32768 | ||||
|  | ||||
| //Deinterlacing Filters | ||||
| #define LINEAR_IPOL_DEINT_FILTER        0x10000 // 65536 | ||||
| #define LINEAR_BLEND_DEINT_FILTER       0x20000 // 131072 | ||||
| #define CUBIC_BLEND_DEINT_FILTER        0x8000  // (not implemented yet) | ||||
| #define CUBIC_IPOL_DEINT_FILTER         0x40000 // 262144 | ||||
| #define MEDIAN_DEINT_FILTER             0x80000 // 524288 | ||||
| #define FFMPEG_DEINT_FILTER             0x400000 | ||||
| #define LOWPASS5_DEINT_FILTER           0x800000 | ||||
|  | ||||
| #define TEMP_NOISE_FILTER               0x100000 | ||||
| #define FORCE_QUANT                     0x200000 | ||||
| #define BITEXACT                        0x1000000 | ||||
| #define VISUALIZE                       0x2000000 | ||||
|  | ||||
| //use if you want a faster postprocessing code | ||||
| //cannot differentiate between chroma & luma filters (both on or both off) | ||||
| //obviously the -pp option on the command line has no effect except turning the here selected | ||||
| //filters on | ||||
| //#define COMPILE_TIME_MODE 0x77 | ||||
|  | ||||
| /** | ||||
|  * Postprocessing filter. | ||||
|  */ | ||||
| struct PPFilter{ | ||||
|     const char *shortName; | ||||
|     const char *longName; | ||||
|     int chromDefault;       ///< is chrominance filtering on by default if this filter is manually activated | ||||
|     int minLumQuality;      ///< minimum quality to turn luminance filtering on | ||||
|     int minChromQuality;    ///< minimum quality to turn chrominance filtering on | ||||
|     int mask;               ///< Bitmask to turn this filter on | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * Postprocessing mode. | ||||
|  */ | ||||
| typedef struct PPMode{ | ||||
|     int lumMode;                    ///< activates filters for luminance | ||||
|     int chromMode;                  ///< activates filters for chrominance | ||||
|     int error;                      ///< non zero on error | ||||
|  | ||||
|     int minAllowedY;                ///< for brightness correction | ||||
|     int maxAllowedY;                ///< for brightness correction | ||||
|     AVRational maxClippedThreshold; ///< amount of "black" you are willing to lose to get a brightness-corrected picture | ||||
|  | ||||
|     int maxTmpNoise[3];             ///< for Temporal Noise Reducing filter (Maximal sum of abs differences) | ||||
|  | ||||
|     int baseDcDiff; | ||||
|     int flatnessThreshold; | ||||
|  | ||||
|     int forcedQuant;                ///< quantizer if FORCE_QUANT is used | ||||
| } PPMode; | ||||
|  | ||||
| /** | ||||
|  * postprocess context. | ||||
|  */ | ||||
| typedef struct PPContext{ | ||||
|     /** | ||||
|      * info on struct for av_log | ||||
|      */ | ||||
|     const AVClass *av_class; | ||||
|  | ||||
|     uint8_t *tempBlocks; ///<used for the horizontal code | ||||
|  | ||||
|     /** | ||||
|      * luma histogram. | ||||
|      * we need 64bit here otherwise we'll going to have a problem | ||||
|      * after watching a black picture for 5 hours | ||||
|      */ | ||||
|     uint64_t *yHistogram; | ||||
|  | ||||
|     DECLARE_ALIGNED(8, uint64_t, packedYOffset); | ||||
|     DECLARE_ALIGNED(8, uint64_t, packedYScale); | ||||
|  | ||||
|     /** Temporal noise reducing buffers */ | ||||
|     uint8_t *tempBlurred[3]; | ||||
|     int32_t *tempBlurredPast[3]; | ||||
|  | ||||
|     /** Temporary buffers for handling the last row(s) */ | ||||
|     uint8_t *tempDst; | ||||
|     uint8_t *tempSrc; | ||||
|  | ||||
|     uint8_t *deintTemp; | ||||
|  | ||||
|     DECLARE_ALIGNED(8, uint64_t, pQPb); | ||||
|     DECLARE_ALIGNED(8, uint64_t, pQPb2); | ||||
|  | ||||
|     DECLARE_ALIGNED(32, uint64_t, pQPb_block)[4]; | ||||
|     DECLARE_ALIGNED(32, uint64_t, pQPb2_block)[4]; | ||||
|  | ||||
|     DECLARE_ALIGNED(32, uint64_t, mmxDcOffset)[64]; | ||||
|     DECLARE_ALIGNED(32, uint64_t, mmxDcThreshold)[64]; | ||||
|  | ||||
|     int8_t *stdQPTable;       ///< used to fix MPEG2 style qscale | ||||
|     int8_t *nonBQPTable; | ||||
|     int8_t *forcedQPTable; | ||||
|  | ||||
|     int QP; | ||||
|     int nonBQP; | ||||
|  | ||||
|     DECLARE_ALIGNED(32, int, QP_block)[4]; | ||||
|     DECLARE_ALIGNED(32, int, nonBQP_block)[4]; | ||||
|  | ||||
|     int frameNum; | ||||
|  | ||||
|     int cpuCaps; | ||||
|  | ||||
|     int qpStride; ///<size of qp buffers (needed to realloc them if needed) | ||||
|     int stride;   ///<size of some buffers (needed to realloc them if needed) | ||||
|  | ||||
|     int hChromaSubSample; | ||||
|     int vChromaSubSample; | ||||
|  | ||||
|     PPMode ppMode; | ||||
| } PPContext; | ||||
|  | ||||
|  | ||||
| static inline void linecpy(void *dest, const void *src, int lines, int stride) { | ||||
|     if (stride > 0) { | ||||
|         memcpy(dest, src, lines*stride); | ||||
|     } else { | ||||
|         memcpy((uint8_t*)dest+(lines-1)*stride, (const uint8_t*)src+(lines-1)*stride, -lines*stride); | ||||
|     } | ||||
| } | ||||
|  | ||||
| #endif /* POSTPROC_POSTPROCESS_INTERNAL_H */ | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,55 +0,0 @@ | ||||
| /* | ||||
|  * Windows resource file for libpostproc | ||||
|  * | ||||
|  * Copyright (C) 2012 James Almer | ||||
|  * Copyright (C) 2013 Tiancheng "Timothy" Gu | ||||
|  * | ||||
|  * This file is part of FFmpeg. | ||||
|  * | ||||
|  * FFmpeg is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 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 | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser 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 <windows.h> | ||||
| #include "libpostproc/version.h" | ||||
| #include "libavutil/ffversion.h" | ||||
| #include "config.h" | ||||
|  | ||||
| 1 VERSIONINFO | ||||
| FILEVERSION     LIBPOSTPROC_VERSION_MAJOR, LIBPOSTPROC_VERSION_MINOR, LIBPOSTPROC_VERSION_MICRO, 0 | ||||
| PRODUCTVERSION  LIBPOSTPROC_VERSION_MAJOR, LIBPOSTPROC_VERSION_MINOR, LIBPOSTPROC_VERSION_MICRO, 0 | ||||
| FILEFLAGSMASK   VS_FFI_FILEFLAGSMASK | ||||
| FILEOS          VOS_NT_WINDOWS32 | ||||
| FILETYPE        VFT_DLL | ||||
| { | ||||
|     BLOCK "StringFileInfo" | ||||
|     { | ||||
|         BLOCK "040904B0" | ||||
|         { | ||||
|             VALUE "CompanyName",      "FFmpeg Project" | ||||
|             VALUE "FileDescription",  "FFmpeg postprocessing library" | ||||
|             VALUE "FileVersion",      AV_STRINGIFY(LIBPOSTPROC_VERSION) | ||||
|             VALUE "InternalName",     "libpostproc" | ||||
|             VALUE "LegalCopyright",   "Copyright (C) 2000-" AV_STRINGIFY(CONFIG_THIS_YEAR) " FFmpeg Project" | ||||
|             VALUE "OriginalFilename", "postproc" BUILDSUF "-" AV_STRINGIFY(LIBPOSTPROC_VERSION_MAJOR) SLIBSUF | ||||
|             VALUE "ProductName",      "FFmpeg" | ||||
|             VALUE "ProductVersion",   FFMPEG_VERSION | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     BLOCK "VarFileInfo" | ||||
|     { | ||||
|         VALUE "Translation", 0x0409, 0x04B0 | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								libpostproc/tests/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								libpostproc/tests/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,3 +0,0 @@ | ||||
| /blocktest | ||||
| /stripetest | ||||
| /temptest | ||||
| @@ -1,113 +0,0 @@ | ||||
| /* | ||||
|  * Copyright (c) 2025 Michael Niedermayer | ||||
|  * | ||||
|  * This file is part of FFmpeg. | ||||
|  * | ||||
|  * FFmpeg is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 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 | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser 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/frame.h" | ||||
| #include "libavutil/adler32.h" | ||||
| #include "libpostproc/postprocess.h" | ||||
| #include "test_utils.h" | ||||
|  | ||||
| typedef const uint8_t *cuint8; | ||||
|  | ||||
| static void blocks(AVFrame *frame, int blocksize, int mul) | ||||
| { | ||||
|     for(int y=0; y<frame->height; y++) { | ||||
|         for(int x=0; x<frame->width; x++) { | ||||
|             frame->data[0][x + y*frame->linesize[0]] = x/blocksize*mul + y/blocksize*mul; | ||||
|         } | ||||
|     } | ||||
|     for(int y=0; y<(frame->height+1)/2; y++) { | ||||
|         for(int x=0; x<(frame->width+1)/2; x++) { | ||||
|             frame->data[1][x + y*frame->linesize[1]] = x/blocksize*mul + y/blocksize*mul; | ||||
|             frame->data[2][x + y*frame->linesize[2]] = x/blocksize * (y/blocksize)*mul; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| static int64_t test(int width, int height, const char * filter_string, int blocksize, int flags, int pict_type, int quality) { | ||||
|     AVFrame *in  = av_frame_alloc(); | ||||
|     AVFrame *out = av_frame_alloc(); | ||||
|     pp_context *context = pp_get_context(width, height, flags); | ||||
|     pp_mode *mode = pp_get_mode_by_name_and_quality(filter_string, quality); | ||||
|     int64_t ret; | ||||
| #define  QP_STRIDE (352/16) | ||||
|     int8_t qp[QP_STRIDE * 352/16]; | ||||
|  | ||||
|     if (!in || !out || !context || !mode) { | ||||
|         ret = AVERROR(ENOMEM); | ||||
|         goto end; | ||||
|     } | ||||
|  | ||||
|     in-> width = out->width  = width; | ||||
|     in->height = out->height = height; | ||||
|     in->format = out->format = AV_PIX_FMT_YUV420P; | ||||
|  | ||||
|     ret = av_frame_get_buffer(in, 0); | ||||
|     if (ret < 0) | ||||
|         goto end; | ||||
|  | ||||
|     ret = av_frame_get_buffer(out, 0); | ||||
|     if (ret < 0) | ||||
|         goto end; | ||||
|  | ||||
|     blocks(in, blocksize, 11); | ||||
|  | ||||
|     for(int i= 0; i<sizeof(qp); i++) | ||||
|         qp[i] = i % 31; | ||||
|  | ||||
|     pp_postprocess( (cuint8[]){in->data[0], in->data[1], in->data[2]}, in->linesize, | ||||
|                    out->data, out->linesize, | ||||
|                    width, height, qp, QP_STRIDE, | ||||
|                    mode, context, pict_type); | ||||
|  | ||||
|     ret = ff_chksum(out); | ||||
| end: | ||||
|     av_frame_free(&in); | ||||
|     av_frame_free(&out); | ||||
|     pp_free_context(context); | ||||
|     pp_free_mode(mode); | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int main(int argc, char **argv) { | ||||
|     const char *teststrings[] = { | ||||
|         "be,de", | ||||
|         "be,h1,v1", | ||||
|         "be,ha,va", | ||||
|         "be,al,de", | ||||
|         "be,vi,de", | ||||
|         "be,vi,ha,va", | ||||
|     }; | ||||
|  | ||||
|     for (int w=16; w< 352; w=w*3-16) { | ||||
|         for (int h=16; h< 352; h=h*5-16) { | ||||
|             for (int b=1; b<17; b*=2) { | ||||
|                 for (int c=0; c<6; c++) { | ||||
|                     for (int q=0; q<17; q = 2*q+1) { | ||||
|                         int64_t ret = test(w, h, teststrings[c], b, PP_FORMAT_420, 0, q); | ||||
|                         printf("blocktest %dx%d %s b:%d q:%d result %"PRIX64"\n", w, h, teststrings[c], b, q, ret); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
| @@ -1,115 +0,0 @@ | ||||
| /* | ||||
|  * Copyright (c) 2025 Michael Niedermayer | ||||
|  * | ||||
|  * This file is part of FFmpeg. | ||||
|  * | ||||
|  * FFmpeg is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 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 | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser 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/frame.h" | ||||
| #include "libavutil/adler32.h" | ||||
| #include "libpostproc/postprocess.h" | ||||
| #include "test_utils.h" | ||||
|  | ||||
| typedef const uint8_t *cuint8; | ||||
|  | ||||
| static void strips(AVFrame *frame, int mul) | ||||
| { | ||||
|     for(int y=0; y<frame->height; y++) { | ||||
|         for(int x=0; x<frame->width; x++) { | ||||
|             if (y&1) { | ||||
|                 frame->data[0][x + y*frame->linesize[0]] = x*x + y*mul; | ||||
|             } else { | ||||
|                 frame->data[0][x + y*frame->linesize[0]] = (y-x)*(y-x); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     for(int y=0; y<(frame->height+1)/2; y++) { | ||||
|         for(int x=0; x<(frame->width+1)/2; x++) { | ||||
|             if (y&1) { | ||||
|                 frame->data[1][x + y*frame->linesize[1]] = x + y + mul; | ||||
|                 frame->data[2][x + y*frame->linesize[2]] = mul*x - y*x; | ||||
|             } else { | ||||
|                 frame->data[1][x + y*frame->linesize[1]] = (x - y)/(mul+1); | ||||
|                 frame->data[2][x + y*frame->linesize[2]] = (y + x)/(mul+1); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| static int64_t test(int width, int height, const char *testname, int mul, int flags, int pict_type, int quality) { | ||||
|     AVFrame *in  = av_frame_alloc(); | ||||
|     AVFrame *out = av_frame_alloc(); | ||||
|     pp_context *context = pp_get_context(width, height, flags); | ||||
|     pp_mode *mode = pp_get_mode_by_name_and_quality(testname, quality); | ||||
|     int64_t ret; | ||||
|  | ||||
|     if (!in || !out || !context || !mode) { | ||||
|         ret = AVERROR(ENOMEM); | ||||
|         goto end; | ||||
|     } | ||||
|  | ||||
|     in-> width = out->width  = width; | ||||
|     in->height = out->height = height; | ||||
|     in->format = out->format = AV_PIX_FMT_YUV420P; | ||||
|  | ||||
|     ret = av_frame_get_buffer(in, 0); | ||||
|     if (ret < 0) | ||||
|         goto end; | ||||
|  | ||||
|     ret = av_frame_get_buffer(out, 0); | ||||
|     if (ret < 0) | ||||
|         goto end; | ||||
|  | ||||
|     strips(in, mul); | ||||
|  | ||||
|     pp_postprocess( (cuint8[]){in->data[0], in->data[1], in->data[2]}, in->linesize, | ||||
|                    out->data, out->linesize, | ||||
|                    width, height, NULL, 0, | ||||
|                    mode, context, pict_type); | ||||
|  | ||||
|     ret = ff_chksum(out); | ||||
| end: | ||||
|     av_frame_free(&in); | ||||
|     av_frame_free(&out); | ||||
|     pp_free_context(context); | ||||
|     pp_free_mode(mode); | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int main(int argc, char **argv) { | ||||
|     const char *teststrings[] = { | ||||
|         "be,lb", | ||||
|         "be,li", | ||||
|         "be,ci", | ||||
|         "be,md", | ||||
|         "be,fd", | ||||
|         "be,l5", | ||||
|     }; | ||||
|  | ||||
|     for (int w=16; w< 352; w=w*3-16) { | ||||
|         for (int h=16; h< 352; h=h*5-16) { | ||||
|             for (int b=0; b<6; b++) { | ||||
|                 for (int m=0; m<17; m = 2*m+1) { | ||||
|                     int64_t ret = test(w, h, teststrings[b], m, PP_FORMAT_420, 0, 11); | ||||
|                     printf("striptest %dx%d T:%s m:%d result %"PRIX64"\n", w, h, teststrings[b], m, ret); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
| @@ -1,106 +0,0 @@ | ||||
| /* | ||||
|  * Copyright (c) 2025 Michael Niedermayer | ||||
|  * | ||||
|  * This file is part of FFmpeg. | ||||
|  * | ||||
|  * FFmpeg is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 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 | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser 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/frame.h" | ||||
| #include "libavutil/adler32.h" | ||||
| #include "libpostproc/postprocess.h" | ||||
| #include "test_utils.h" | ||||
|  | ||||
| typedef const uint8_t *cuint8; | ||||
|  | ||||
| static void stuff(AVFrame *frame, unsigned *state, int mul) | ||||
| { | ||||
|     for(int y=0; y<frame->height; y++) { | ||||
|         for(int x=0; x<frame->width; x++) { | ||||
|             *state= *state*1664525+1013904223; | ||||
|             frame->data[0][x + y*frame->linesize[0]] = x*x + (y-x)*mul + ((((x+y)&0xFF)* (int64_t)(*state))>>32); | ||||
|         } | ||||
|     } | ||||
|     for(int y=0; y<(frame->height+1)/2; y++) { | ||||
|         for(int x=0; x<(frame->width+1)/2; x++) { | ||||
|             *state= *state*1664525+1013904223; | ||||
|             frame->data[1][x + y*frame->linesize[1]] = x + y + ((mul*(int64_t)(*state))>>32); | ||||
|             frame->data[2][x + y*frame->linesize[2]] = mul*x - ((y*x*(int64_t)(*state))>>32); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| static int64_t test(int width, int height, const char *testname, int mul, int flags, int pict_type, int quality) { | ||||
|     AVFrame *in  = av_frame_alloc(); | ||||
|     AVFrame *out = av_frame_alloc(); | ||||
|     pp_context *context = pp_get_context(width, height, flags); | ||||
|     pp_mode *mode = pp_get_mode_by_name_and_quality(testname, quality); | ||||
|     int64_t ret; | ||||
|  | ||||
|     if (!in || !out || !context || !mode) { | ||||
|         ret = AVERROR(ENOMEM); | ||||
|         goto end; | ||||
|     } | ||||
|  | ||||
|     in-> width = out->width  = width; | ||||
|     in->height = out->height = height; | ||||
|     in->format = out->format = AV_PIX_FMT_YUV420P; | ||||
|  | ||||
|     ret = av_frame_get_buffer(in, 0); | ||||
|     if (ret < 0) | ||||
|         goto end; | ||||
|  | ||||
|     ret = av_frame_get_buffer(out, 0); | ||||
|     if (ret < 0) | ||||
|         goto end; | ||||
|  | ||||
|     unsigned state = mul; | ||||
|     for(int f=0; f<10; f++) { | ||||
|         stuff(in, &state, mul); | ||||
|  | ||||
|         pp_postprocess( (cuint8[]){in->data[0], in->data[1], in->data[2]}, in->linesize, | ||||
|                     out->data, out->linesize, | ||||
|                     width, height, NULL, 0, | ||||
|                     mode, context, pict_type); | ||||
|  | ||||
|         ret += ff_chksum(out); | ||||
|         ret *= 1664525U; | ||||
|     } | ||||
| end: | ||||
|     av_frame_free(&in); | ||||
|     av_frame_free(&out); | ||||
|     pp_free_context(context); | ||||
|     pp_free_mode(mode); | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int main(int argc, char **argv) { | ||||
|  | ||||
|     for(int a=0; a<600000; a= 17*a+1) { | ||||
|         for(int b=a; b<600000; b= 17*b+1) { | ||||
|             for(int c=b; c<600000; c= 17*c+1) { | ||||
|                 for (int m=0; m<128; m = 3*m+1) { | ||||
|                     char buf[100]; | ||||
|                     snprintf(buf, sizeof(buf), "be,tn:%d:%d:%d", a, b, c); | ||||
|                     int64_t ret = test(352, 288, buf, m, PP_FORMAT_420, 0, 11); | ||||
|                     printf("temptest %d %d %d %d result %"PRIX64"\n", a,b,c,m, ret); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
| @@ -1,38 +0,0 @@ | ||||
| /* | ||||
|  * Copyright (c) 2025 Michael Niedermayer | ||||
|  * | ||||
|  * This file is part of FFmpeg. | ||||
|  * | ||||
|  * FFmpeg is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 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 | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser 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/frame.h" | ||||
| #include "libavutil/adler32.h" | ||||
| #include "test_utils.h" | ||||
|  | ||||
| int64_t ff_chksum(AVFrame *f) | ||||
| { | ||||
|     AVAdler a = 123; | ||||
|  | ||||
|     for(int y=0; y<f->height; y++) { | ||||
|         a = av_adler32_update(a, &f->data[0][y*f->linesize[0]], f->width); | ||||
|     } | ||||
|     for(int y=0; y<(f->height+1)/2; y++) { | ||||
|         a = av_adler32_update(a, &f->data[1][y*f->linesize[1]], (f->width+1)/2); | ||||
|         a = av_adler32_update(a, &f->data[2][y*f->linesize[2]], (f->width+1)/2); | ||||
|     } | ||||
|  | ||||
|     return a; | ||||
| } | ||||
| @@ -1,27 +0,0 @@ | ||||
| /* | ||||
|  * Copyright (c) 2025 Michael Niedermayer | ||||
|  * | ||||
|  * This file is part of FFmpeg. | ||||
|  * | ||||
|  * FFmpeg is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 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 | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser 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 | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef POSTPROC_TESTS_TEST_UTILS_H | ||||
| #define POSTPROC_TESTS_TEST_UTILS_H | ||||
|  | ||||
| int64_t ff_chksum(AVFrame *f); | ||||
|  | ||||
| #endif /* POSTPROC_TESTS_TEST_UTILS_H */ | ||||
| @@ -1,45 +0,0 @@ | ||||
| /* | ||||
|  * Version functions. | ||||
|  * | ||||
|  * This file is part of FFmpeg. | ||||
|  * | ||||
|  * FFmpeg is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 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 | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser 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 <assert.h> | ||||
|  | ||||
| #include "config.h" | ||||
| #include "postprocess.h" | ||||
| #include "version.h" | ||||
|  | ||||
| #include "libavutil/ffversion.h" | ||||
| const char postproc_ffversion[] = "FFmpeg version " FFMPEG_VERSION; | ||||
|  | ||||
| unsigned postproc_version(void) | ||||
| { | ||||
|     static_assert(LIBPOSTPROC_VERSION_MICRO >= 100, "micro version starts at 100"); | ||||
|     return LIBPOSTPROC_VERSION_INT; | ||||
| } | ||||
|  | ||||
| const char *postproc_configuration(void) | ||||
| { | ||||
|     return FFMPEG_CONFIGURATION; | ||||
| } | ||||
|  | ||||
| const char *postproc_license(void) | ||||
| { | ||||
| #define LICENSE_PREFIX "libpostproc license: " | ||||
|     return &LICENSE_PREFIX FFMPEG_LICENSE[sizeof(LICENSE_PREFIX) - 1]; | ||||
| } | ||||
| @@ -1,48 +0,0 @@ | ||||
| /* | ||||
|  * Version macros. | ||||
|  * | ||||
|  * This file is part of FFmpeg. | ||||
|  * | ||||
|  * FFmpeg is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 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 | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser 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 | ||||
|  */ | ||||
|  | ||||
| #ifndef POSTPROC_VERSION_H | ||||
| #define POSTPROC_VERSION_H | ||||
|  | ||||
| /** | ||||
|  * @file | ||||
|  * Libpostproc version macros | ||||
|  */ | ||||
|  | ||||
| #include "libavutil/version.h" | ||||
|  | ||||
| #include "version_major.h" | ||||
|  | ||||
| #define LIBPOSTPROC_VERSION_MINOR   1 | ||||
| #define LIBPOSTPROC_VERSION_MICRO 100 | ||||
|  | ||||
| #define LIBPOSTPROC_VERSION_INT AV_VERSION_INT(LIBPOSTPROC_VERSION_MAJOR, \ | ||||
|                                                LIBPOSTPROC_VERSION_MINOR, \ | ||||
|                                                LIBPOSTPROC_VERSION_MICRO) | ||||
| #define LIBPOSTPROC_VERSION     AV_VERSION(LIBPOSTPROC_VERSION_MAJOR, \ | ||||
|                                            LIBPOSTPROC_VERSION_MINOR, \ | ||||
|                                            LIBPOSTPROC_VERSION_MICRO) | ||||
| #define LIBPOSTPROC_BUILD       LIBPOSTPROC_VERSION_INT | ||||
|  | ||||
| #define LIBPOSTPROC_IDENT       "postproc" AV_STRINGIFY(LIBPOSTPROC_VERSION) | ||||
|  | ||||
| #define PP_AMD_3DNOW               (LIBPOSTPROC_VERSION_MAJOR < 60) | ||||
|  | ||||
| #endif /* POSTPROC_VERSION_H */ | ||||
| @@ -1,33 +0,0 @@ | ||||
| /* | ||||
|  * Version macros. | ||||
|  * | ||||
|  * This file is part of FFmpeg. | ||||
|  * | ||||
|  * FFmpeg is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 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 | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser 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 | ||||
|  */ | ||||
|  | ||||
| #ifndef POSTPROC_VERSION_MAJOR_H | ||||
| #define POSTPROC_VERSION_MAJOR_H | ||||
|  | ||||
| /** | ||||
|  * @file | ||||
|  * Libpostproc version macros | ||||
|  */ | ||||
|  | ||||
| #define LIBPOSTPROC_VERSION_MAJOR  59 | ||||
|  | ||||
| #define FF_API_PP_AMD_3DNOW      (LIBPOSTPROC_VERSION_MAJOR < 60) | ||||
|  | ||||
| #endif /* POSTPROC_VERSION_MAJOR_H */ | ||||
| @@ -208,7 +208,6 @@ include $(SRC_PATH)/tests/fate/libavformat.mak | ||||
| include $(SRC_PATH)/tests/fate/libavutil.mak | ||||
| include $(SRC_PATH)/tests/fate/libswresample.mak | ||||
| include $(SRC_PATH)/tests/fate/libswscale.mak | ||||
| include $(SRC_PATH)/tests/fate/libpostproc.mak | ||||
| include $(SRC_PATH)/tests/fate/lossless-audio.mak | ||||
| include $(SRC_PATH)/tests/fate/lossless-video.mak | ||||
| include $(SRC_PATH)/tests/fate/matroska.mak | ||||
|   | ||||
| @@ -533,19 +533,6 @@ fate-filter-idet: CMD = framecrc -flags bitexact -idct simple -i $(SRC) -vf idet | ||||
| FATE_FILTER_VSYNTH_VIDEO_FILTER-$(CONFIG_PAD_FILTER) += fate-filter-pad | ||||
| fate-filter-pad: CMD = video_filter "pad=iw*1.5:ih*1.5:iw*0.3:ih*0.2" | ||||
|  | ||||
| fate-filter-pp1: CMD = video_filter "pp=fq|4/be/hb/vb/tn/l5/al" | ||||
| fate-filter-pp2: CMD = video_filter "qp=2*(x+y),pp=be/h1/v1/lb" | ||||
| fate-filter-pp3: CMD = video_filter "qp=2*(x+y),pp=be/ha|128|7/va/li" | ||||
| fate-filter-pp4: CMD = video_filter "pp=be/ci" | ||||
| fate-filter-pp5: CMD = video_filter "pp=md" | ||||
| fate-filter-pp6: CMD = video_filter "pp=be/fd" | ||||
|  | ||||
| FATE_FILTER_VSYNTH_VIDEO_FILTER-$(CONFIG_PP_FILTER) += $(addprefix fate-filter-, pp1 pp4 pp5 pp6) | ||||
| FATE_FILTER_VSYNTH_VIDEO_FILTER-$(call ALLYES, PP_FILTER QP_FILTER) += fate-filter-pp2 fate-filter-pp3 | ||||
|  | ||||
| FATE_FILTER_VSYNTH1_MPEG4_QPRD-$(call FILTERDEMDEC, PP, AVI, MPEG4) += pp | ||||
| fate-filter-pp:  CMD = framecrc -flags bitexact -export_side_data venc_params -idct simple -i $(TARGET_PATH)/tests/data/fate/vsynth1-mpeg4-qprd.avi -frames:v 5 -flags +bitexact -vf "pp=be/hb/vb/tn/l5/al" | ||||
|  | ||||
| FATE_FILTER_VSYNTH1_MPEG4_QPRD-$(call FILTERDEMDEC, PP7, AVI, MPEG4) += pp7 | ||||
| fate-filter-pp7: CMD = framecrc -flags bitexact -export_side_data venc_params -idct simple -i $(TARGET_PATH)/tests/data/fate/vsynth1-mpeg4-qprd.avi -frames:v 5 -flags +bitexact -vf "pp7" | ||||
|  | ||||
| @@ -563,9 +550,6 @@ FATE_FILTER_VSYNTH-yes += $(FATE_FILTER_VSYNTH1_MPEG4_QPRD) | ||||
| $(FATE_FILTER_VSYNTH1_MPEG4_QPRD): fate-vsynth1-mpeg4-qprd | ||||
| fate-vsynth1-mpeg4-qprd: KEEP_FILES ?= 1 | ||||
|  | ||||
| FATE_FILTER_VSYNTH_VIDEO_FILTER-$(call ALLYES, QP_FILTER PP_FILTER) += fate-filter-qp | ||||
| fate-filter-qp: CMD = video_filter "qp=34,pp=be/hb/vb/tn/l5/al" | ||||
|  | ||||
| FATE_FILTER_VSYNTH-$(call FILTERDEMDEC, SELECT, IMAGE2, PGM) += fate-filter-select | ||||
| fate-filter-select: CMD = framecrc -flags bitexact -idct simple -i $(SRC) -vf "select=not(eq(mod(n\,2)\,0)+eq(mod(n\,3)\,0))" -frames:v 25 -flags +bitexact | ||||
|  | ||||
|   | ||||
| @@ -1,14 +0,0 @@ | ||||
| FATE_LIBPOSTPROC += fate-blocktest | ||||
| fate-blocktest: libpostproc/tests/blocktest$(EXESUF) | ||||
| fate-blocktest: CMD = run libpostproc/tests/blocktest$(EXESUF) | ||||
|  | ||||
| FATE_LIBPOSTPROC += fate-stripetest | ||||
| fate-stripetest: libpostproc/tests/stripetest$(EXESUF) | ||||
| fate-stripetest: CMD = run libpostproc/tests/stripetest$(EXESUF) | ||||
|  | ||||
| FATE_LIBPOSTPROC += fate-temptest | ||||
| fate-temptest: libpostproc/tests/temptest$(EXESUF) | ||||
| fate-temptest: CMD = run libpostproc/tests/temptest$(EXESUF) | ||||
|  | ||||
| FATE-$(CONFIG_POSTPROC) += $(FATE_LIBPOSTPROC) | ||||
| fate-libpostproc: $(FATE_LIBPOSTPROC) | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,10 +0,0 @@ | ||||
| #tb 0: 1/25 | ||||
| #media_type 0: video | ||||
| #codec_id 0: rawvideo | ||||
| #dimensions 0: 352x288 | ||||
| #sar 0: 1/1 | ||||
| 0,          1,          1,        1,   152064, 0x0af8a873 | ||||
| 0,          2,          2,        1,   152064, 0xaeb99897 | ||||
| 0,          3,          3,        1,   152064, 0x8f3712c8 | ||||
| 0,          4,          4,        1,   152064, 0x5bf6a64c | ||||
| 0,          5,          5,        1,   152064, 0x262de352 | ||||
| @@ -1 +0,0 @@ | ||||
| pp1                 1a45041dd20a941e36b7729116950107 | ||||
| @@ -1 +0,0 @@ | ||||
| pp2                 566d48ad25dfa7a9680de933cbdf66d9 | ||||
| @@ -1 +0,0 @@ | ||||
| pp3                 586fc14a52699540a865c070dd113229 | ||||
| @@ -1 +0,0 @@ | ||||
| pp4                 8a072806ae6b5c68c5c3c57197641e4a | ||||
| @@ -1 +0,0 @@ | ||||
| pp5                 5695b8193095a63b9f397fff8343d1a6 | ||||
| @@ -1 +0,0 @@ | ||||
| pp6                 f823b3330935cd1824d526041b429d9a | ||||
| @@ -1 +0,0 @@ | ||||
| qp                  2d4da13e883e073084d547a6b41ba688 | ||||
| @@ -1,360 +0,0 @@ | ||||
| striptest 16x16 T:be,lb m:0 result B75464A3 | ||||
| striptest 16x16 T:be,lb m:1 result B15C5EE1 | ||||
| striptest 16x16 T:be,lb m:3 result 92D058DD | ||||
| striptest 16x16 T:be,lb m:7 result 32044FFD | ||||
| striptest 16x16 T:be,lb m:15 result E10A5D71 | ||||
| striptest 16x16 T:be,li m:0 result BDD047EB | ||||
| striptest 16x16 T:be,li m:1 result 616441B0 | ||||
| striptest 16x16 T:be,li m:3 result 558C37C7 | ||||
| striptest 16x16 T:be,li m:7 result 7C432D31 | ||||
| striptest 16x16 T:be,li m:15 result A1EA2DE3 | ||||
| striptest 16x16 T:be,ci m:0 result B274814D | ||||
| striptest 16x16 T:be,ci m:1 result 87857BD2 | ||||
| striptest 16x16 T:be,ci m:3 result 22D37968 | ||||
| striptest 16x16 T:be,ci m:7 result 3DE37214 | ||||
| striptest 16x16 T:be,ci m:15 result 8DFC8C6B | ||||
| striptest 16x16 T:be,md m:0 result ECC6470F | ||||
| striptest 16x16 T:be,md m:1 result 26B8426B | ||||
| striptest 16x16 T:be,md m:3 result 29023B89 | ||||
| striptest 16x16 T:be,md m:7 result BE9D3241 | ||||
| striptest 16x16 T:be,md m:15 result A68334B7 | ||||
| striptest 16x16 T:be,fd m:0 result E1654815 | ||||
| striptest 16x16 T:be,fd m:1 result 47CB41A7 | ||||
| striptest 16x16 T:be,fd m:3 result 72937A6 | ||||
| striptest 16x16 T:be,fd m:7 result F1522C31 | ||||
| striptest 16x16 T:be,fd m:15 result 9AD82C81 | ||||
| striptest 16x16 T:be,l5 m:0 result 3C796608 | ||||
| striptest 16x16 T:be,l5 m:1 result E5DB5FD8 | ||||
| striptest 16x16 T:be,l5 m:3 result 8C405943 | ||||
| striptest 16x16 T:be,l5 m:7 result 11AE4FBB | ||||
| striptest 16x16 T:be,l5 m:15 result F9D5D70 | ||||
| striptest 16x64 T:be,lb m:0 result 1E6F2D39 | ||||
| striptest 16x64 T:be,lb m:1 result A4A45080 | ||||
| striptest 16x64 T:be,lb m:3 result E3F9754A | ||||
| striptest 16x64 T:be,lb m:7 result F07062E9 | ||||
| striptest 16x64 T:be,lb m:15 result 146B3ABB | ||||
| striptest 16x64 T:be,li m:0 result 902769D9 | ||||
| striptest 16x64 T:be,li m:1 result 587F5FDD | ||||
| striptest 16x64 T:be,li m:3 result 98C64F74 | ||||
| striptest 16x64 T:be,li m:7 result D04F2E9D | ||||
| striptest 16x64 T:be,li m:15 result B5BBEE5E | ||||
| striptest 16x64 T:be,ci m:0 result 3B54EFEC | ||||
| striptest 16x64 T:be,ci m:1 result 40553F60 | ||||
| striptest 16x64 T:be,ci m:3 result 6CD498B5 | ||||
| striptest 16x64 T:be,ci m:7 result 758F94A9 | ||||
| striptest 16x64 T:be,ci m:15 result D93F8464 | ||||
| striptest 16x64 T:be,md m:0 result 1534468B | ||||
| striptest 16x64 T:be,md m:1 result 51034B7D | ||||
| striptest 16x64 T:be,md m:3 result 8C8D5298 | ||||
| striptest 16x64 T:be,md m:7 result BFAE319B | ||||
| striptest 16x64 T:be,md m:15 result AF99F19A | ||||
| striptest 16x64 T:be,fd m:0 result 331B6F73 | ||||
| striptest 16x64 T:be,fd m:1 result F0BC60FD | ||||
| striptest 16x64 T:be,fd m:3 result CF484DC1 | ||||
| striptest 16x64 T:be,fd m:7 result 4A6D2CF6 | ||||
| striptest 16x64 T:be,fd m:15 result A66EEDEB | ||||
| striptest 16x64 T:be,l5 m:0 result 8D5B31DB | ||||
| striptest 16x64 T:be,l5 m:1 result BEF45364 | ||||
| striptest 16x64 T:be,l5 m:3 result 49DF773B | ||||
| striptest 16x64 T:be,l5 m:7 result 74C16528 | ||||
| striptest 16x64 T:be,l5 m:15 result FE573D47 | ||||
| striptest 16x304 T:be,lb m:0 result D64AF689 | ||||
| striptest 16x304 T:be,lb m:1 result 4A939516 | ||||
| striptest 16x304 T:be,lb m:3 result 6CC4A9F1 | ||||
| striptest 16x304 T:be,lb m:7 result B54DA3E6 | ||||
| striptest 16x304 T:be,lb m:15 result E8ED947D | ||||
| striptest 16x304 T:be,li m:0 result 18F45FFF | ||||
| striptest 16x304 T:be,li m:1 result 6CFD4AC3 | ||||
| striptest 16x304 T:be,li m:3 result 916325A | ||||
| striptest 16x304 T:be,li m:7 result 256D0CC4 | ||||
| striptest 16x304 T:be,li m:15 result 89DCCBAC | ||||
| striptest 16x304 T:be,ci m:0 result 126A89B2 | ||||
| striptest 16x304 T:be,ci m:1 result 792DD640 | ||||
| striptest 16x304 T:be,ci m:3 result F8B15D3 | ||||
| striptest 16x304 T:be,ci m:7 result 670C2E42 | ||||
| striptest 16x304 T:be,ci m:15 result 71EF500A | ||||
| striptest 16x304 T:be,md m:0 result AA5ECCA8 | ||||
| striptest 16x304 T:be,md m:1 result 99A74EF3 | ||||
| striptest 16x304 T:be,md m:3 result 732A49B6 | ||||
| striptest 16x304 T:be,md m:7 result 41152671 | ||||
| striptest 16x304 T:be,md m:15 result 556AE624 | ||||
| striptest 16x304 T:be,fd m:0 result 7338643 | ||||
| striptest 16x304 T:be,fd m:1 result 752146F0 | ||||
| striptest 16x304 T:be,fd m:3 result 4D4D2B2F | ||||
| striptest 16x304 T:be,fd m:7 result 296D03F3 | ||||
| striptest 16x304 T:be,fd m:15 result 8362C227 | ||||
| striptest 16x304 T:be,l5 m:0 result 2F06030A | ||||
| striptest 16x304 T:be,l5 m:1 result ECA299C7 | ||||
| striptest 16x304 T:be,l5 m:3 result 5844ADCA | ||||
| striptest 16x304 T:be,l5 m:7 result 8A9CA976 | ||||
| striptest 16x304 T:be,l5 m:15 result 8CDC9B7D | ||||
| striptest 32x16 T:be,lb m:0 result D62DF0CB | ||||
| striptest 32x16 T:be,lb m:1 result 303AE741 | ||||
| striptest 32x16 T:be,lb m:3 result 37BFDEB2 | ||||
| striptest 32x16 T:be,lb m:7 result 81F3CDB9 | ||||
| striptest 32x16 T:be,lb m:15 result 1E7EE673 | ||||
| striptest 32x16 T:be,li m:0 result D5CFBCDB | ||||
| striptest 32x16 T:be,li m:1 result 3151B49A | ||||
| striptest 32x16 T:be,li m:3 result 3964A991 | ||||
| striptest 32x16 T:be,li m:7 result 6E5D9B68 | ||||
| striptest 32x16 T:be,li m:15 result 450E9D09 | ||||
| striptest 32x16 T:be,ci m:0 result 160E24FC | ||||
| striptest 32x16 T:be,ci m:1 result 54B5199D | ||||
| striptest 32x16 T:be,ci m:3 result 6B4912C9 | ||||
| striptest 32x16 T:be,ci m:7 result 144FEB1 | ||||
| striptest 32x16 T:be,ci m:15 result E96E2EFB | ||||
| striptest 32x16 T:be,md m:0 result 46FEBFE7 | ||||
| striptest 32x16 T:be,md m:1 result ED2BBAD3 | ||||
| striptest 32x16 T:be,md m:3 result B352B490 | ||||
| striptest 32x16 T:be,md m:7 result 9ECDA45C | ||||
| striptest 32x16 T:be,md m:15 result B303A918 | ||||
| striptest 32x16 T:be,fd m:0 result 3236BCFF | ||||
| striptest 32x16 T:be,fd m:1 result A9B4B49F | ||||
| striptest 32x16 T:be,fd m:3 result DFEDA9A4 | ||||
| striptest 32x16 T:be,fd m:7 result 7BFC9A10 | ||||
| striptest 32x16 T:be,fd m:15 result 7DAA9BC1 | ||||
| striptest 32x16 T:be,l5 m:0 result EFE7F276 | ||||
| striptest 32x16 T:be,l5 m:1 result FA1DE825 | ||||
| striptest 32x16 T:be,l5 m:3 result 5005DF04 | ||||
| striptest 32x16 T:be,l5 m:7 result C1E4CD9A | ||||
| striptest 32x16 T:be,l5 m:15 result 8178E6BC | ||||
| striptest 32x64 T:be,lb m:0 result 8C56EF7 | ||||
| striptest 32x64 T:be,lb m:1 result F4DA575 | ||||
| striptest 32x64 T:be,lb m:3 result C53DC302 | ||||
| striptest 32x64 T:be,lb m:7 result 45489A36 | ||||
| striptest 32x64 T:be,lb m:15 result 6412575D | ||||
| striptest 32x64 T:be,li m:0 result 5C779137 | ||||
| striptest 32x64 T:be,li m:1 result 21DE74DF | ||||
| striptest 32x64 T:be,li m:3 result E3BC4E4D | ||||
| striptest 32x64 T:be,li m:7 result D8010B20 | ||||
| striptest 32x64 T:be,li m:15 result 97ED88B0 | ||||
| striptest 32x64 T:be,ci m:0 result F52C4BCA | ||||
| striptest 32x64 T:be,ci m:1 result 9F97D29C | ||||
| striptest 32x64 T:be,ci m:3 result 571D32E8 | ||||
| striptest 32x64 T:be,ci m:7 result B61244F | ||||
| striptest 32x64 T:be,ci m:15 result 411D20E5 | ||||
| striptest 32x64 T:be,md m:0 result 9D0A6629 | ||||
| striptest 32x64 T:be,md m:1 result E0BA6229 | ||||
| striptest 32x64 T:be,md m:3 result 895759F9 | ||||
| striptest 32x64 T:be,md m:7 result E56F1265 | ||||
| striptest 32x64 T:be,md m:15 result D56C91BF | ||||
| striptest 32x64 T:be,fd m:0 result B28194AC | ||||
| striptest 32x64 T:be,fd m:1 result DAFA71B2 | ||||
| striptest 32x64 T:be,fd m:3 result 46374997 | ||||
| striptest 32x64 T:be,fd m:7 result 49BD07FF | ||||
| striptest 32x64 T:be,fd m:15 result C37F87F8 | ||||
| striptest 32x64 T:be,l5 m:0 result 31C27724 | ||||
| striptest 32x64 T:be,l5 m:1 result 1E34AB3F | ||||
| striptest 32x64 T:be,l5 m:3 result 937CC78C | ||||
| striptest 32x64 T:be,l5 m:7 result E3AE9FA6 | ||||
| striptest 32x64 T:be,l5 m:15 result E3CB5D3A | ||||
| striptest 32x304 T:be,lb m:0 result 96873EC4 | ||||
| striptest 32x304 T:be,lb m:1 result F73560B0 | ||||
| striptest 32x304 T:be,lb m:3 result 23868DD | ||||
| striptest 32x304 T:be,lb m:7 result 660D5005 | ||||
| striptest 32x304 T:be,lb m:15 result 21D72EDC | ||||
| striptest 32x304 T:be,li m:0 result 3578C383 | ||||
| striptest 32x304 T:be,li m:1 result 7E372AB | ||||
| striptest 32x304 T:be,li m:3 result 72DC2E19 | ||||
| striptest 32x304 T:be,li m:7 result 5BF2D9DD | ||||
| striptest 32x304 T:be,li m:15 result 562D5100 | ||||
| striptest 32x304 T:be,ci m:0 result 9B18B34C | ||||
| striptest 32x304 T:be,ci m:1 result D6973C87 | ||||
| striptest 32x304 T:be,ci m:3 result 80A18C1C | ||||
| striptest 32x304 T:be,ci m:7 result D954AC92 | ||||
| striptest 32x304 T:be,ci m:15 result 182F259 | ||||
| striptest 32x304 T:be,md m:0 result 612A1191 | ||||
| striptest 32x304 T:be,md m:1 result 11D3893C | ||||
| striptest 32x304 T:be,md m:3 result AB4D607C | ||||
| striptest 32x304 T:be,md m:7 result AD580914 | ||||
| striptest 32x304 T:be,md m:15 result 6CB686E3 | ||||
| striptest 32x304 T:be,fd m:0 result 2DFBF2FD | ||||
| striptest 32x304 T:be,fd m:1 result 43C640C | ||||
| striptest 32x304 T:be,fd m:3 result 31FF1A7F | ||||
| striptest 32x304 T:be,fd m:7 result C845C5A8 | ||||
| striptest 32x304 T:be,fd m:15 result DFCD3EF6 | ||||
| striptest 32x304 T:be,l5 m:0 result 9E04521A | ||||
| striptest 32x304 T:be,l5 m:1 result DA7E69FB | ||||
| striptest 32x304 T:be,l5 m:3 result 65A87204 | ||||
| striptest 32x304 T:be,l5 m:7 result 5965E41 | ||||
| striptest 32x304 T:be,l5 m:15 result EC7C4054 | ||||
| striptest 80x16 T:be,lb m:0 result 111DA361 | ||||
| striptest 80x16 T:be,lb m:1 result BEE5807F | ||||
| striptest 80x16 T:be,lb m:3 result 211C7853 | ||||
| striptest 80x16 T:be,lb m:7 result 5450697F | ||||
| striptest 80x16 T:be,lb m:15 result 58E9478 | ||||
| striptest 80x16 T:be,li m:0 result 38874149 | ||||
| striptest 80x16 T:be,li m:1 result 2BBC2576 | ||||
| striptest 80x16 T:be,li m:3 result 8A5714ED | ||||
| striptest 80x16 T:be,li m:7 result 5B0CFB30 | ||||
| striptest 80x16 T:be,li m:15 result 66AA0055 | ||||
| striptest 80x16 T:be,ci m:0 result 824D064D | ||||
| striptest 80x16 T:be,ci m:1 result 66AEDA81 | ||||
| striptest 80x16 T:be,ci m:3 result A0EFD91E | ||||
| striptest 80x16 T:be,ci m:7 result F3BD56D | ||||
| striptest 80x16 T:be,ci m:15 result DF272622 | ||||
| striptest 80x16 T:be,md m:0 result AFA5463D | ||||
| striptest 80x16 T:be,md m:1 result AC1C2EEA | ||||
| striptest 80x16 T:be,md m:3 result B13928CA | ||||
| striptest 80x16 T:be,md m:7 result 623E0985 | ||||
| striptest 80x16 T:be,md m:15 result 11AD17F7 | ||||
| striptest 80x16 T:be,fd m:0 result F2E403A | ||||
| striptest 80x16 T:be,fd m:1 result 74442449 | ||||
| striptest 80x16 T:be,fd m:3 result 99161651 | ||||
| striptest 80x16 T:be,fd m:7 result 735FF9A0 | ||||
| striptest 80x16 T:be,fd m:15 result 52C70073 | ||||
| striptest 80x16 T:be,l5 m:0 result 502A713 | ||||
| striptest 80x16 T:be,l5 m:1 result 92B68284 | ||||
| striptest 80x16 T:be,l5 m:3 result 8379797F | ||||
| striptest 80x16 T:be,l5 m:7 result 60986B80 | ||||
| striptest 80x16 T:be,l5 m:15 result 172B954D | ||||
| striptest 80x64 T:be,lb m:0 result 5F5E1A40 | ||||
| striptest 80x64 T:be,lb m:1 result D4573B0B | ||||
| striptest 80x64 T:be,lb m:3 result 878952B3 | ||||
| striptest 80x64 T:be,lb m:7 result D8C714A1 | ||||
| striptest 80x64 T:be,lb m:15 result 2EF9CC8F | ||||
| striptest 80x64 T:be,li m:0 result 997474D1 | ||||
| striptest 80x64 T:be,li m:1 result 70B0FA2D | ||||
| striptest 80x64 T:be,li m:3 result A3D59129 | ||||
| striptest 80x64 T:be,li m:7 result 3D6A10FC | ||||
| striptest 80x64 T:be,li m:15 result B2A16481 | ||||
| striptest 80x64 T:be,ci m:0 result 8642BD76 | ||||
| striptest 80x64 T:be,ci m:1 result D9E472E9 | ||||
| striptest 80x64 T:be,ci m:3 result B68707CC | ||||
| striptest 80x64 T:be,ci m:7 result 3A580B8E | ||||
| striptest 80x64 T:be,ci m:15 result EF5E2771 | ||||
| striptest 80x64 T:be,md m:0 result 12FB40C9 | ||||
| striptest 80x64 T:be,md m:1 result 417FF439 | ||||
| striptest 80x64 T:be,md m:3 result 9887B9A9 | ||||
| striptest 80x64 T:be,md m:7 result AC03159 | ||||
| striptest 80x64 T:be,md m:15 result DC2B8B70 | ||||
| striptest 80x64 T:be,fd m:0 result 486E6CA9 | ||||
| striptest 80x64 T:be,fd m:1 result 4740E6D8 | ||||
| striptest 80x64 T:be,fd m:3 result FB284A3 | ||||
| striptest 80x64 T:be,fd m:7 result C6C409A5 | ||||
| striptest 80x64 T:be,fd m:15 result CA3F6366 | ||||
| striptest 80x64 T:be,l5 m:0 result 9DAA28DE | ||||
| striptest 80x64 T:be,l5 m:1 result ECE545D4 | ||||
| striptest 80x64 T:be,l5 m:3 result CD7D5CB2 | ||||
| striptest 80x64 T:be,l5 m:7 result 77382111 | ||||
| striptest 80x64 T:be,l5 m:15 result CFDED94C | ||||
| striptest 80x304 T:be,lb m:0 result 5F319B66 | ||||
| striptest 80x304 T:be,lb m:1 result 12EF231E | ||||
| striptest 80x304 T:be,lb m:3 result 550BD604 | ||||
| striptest 80x304 T:be,lb m:7 result B7327E26 | ||||
| striptest 80x304 T:be,lb m:15 result 3740245A | ||||
| striptest 80x304 T:be,li m:0 result D685F82D | ||||
| striptest 80x304 T:be,li m:1 result A0A30EB2 | ||||
| striptest 80x304 T:be,li m:3 result D8F4D287 | ||||
| striptest 80x304 T:be,li m:7 result E8ABBB88 | ||||
| striptest 80x304 T:be,li m:15 result CBE440B3 | ||||
| striptest 80x304 T:be,ci m:0 result 4DD92E38 | ||||
| striptest 80x304 T:be,ci m:1 result 80570956 | ||||
| striptest 80x304 T:be,ci m:3 result B9199E43 | ||||
| striptest 80x304 T:be,ci m:7 result 379900A8 | ||||
| striptest 80x304 T:be,ci m:15 result C9CC544 | ||||
| striptest 80x304 T:be,md m:0 result C9A0AA1 | ||||
| striptest 80x304 T:be,md m:1 result D71C6826 | ||||
| striptest 80x304 T:be,md m:3 result 358C53FF | ||||
| striptest 80x304 T:be,md m:7 result CC983926 | ||||
| striptest 80x304 T:be,md m:15 result F1FAC564 | ||||
| striptest 80x304 T:be,fd m:0 result 2CA4360A | ||||
| striptest 80x304 T:be,fd m:1 result CF71D48F | ||||
| striptest 80x304 T:be,fd m:3 result 5C849085 | ||||
| striptest 80x304 T:be,fd m:7 result 560B833A | ||||
| striptest 80x304 T:be,fd m:15 result 6A3C1C08 | ||||
| striptest 80x304 T:be,l5 m:0 result 659DC22A | ||||
| striptest 80x304 T:be,l5 m:1 result F5C03787 | ||||
| striptest 80x304 T:be,l5 m:3 result 462BF053 | ||||
| striptest 80x304 T:be,l5 m:7 result 82BDA906 | ||||
| striptest 80x304 T:be,l5 m:15 result ACD5942 | ||||
| striptest 224x16 T:be,lb m:0 result 356C0D23 | ||||
| striptest 224x16 T:be,lb m:1 result D00F7A2A | ||||
| striptest 224x16 T:be,lb m:3 result E5EA5D23 | ||||
| striptest 224x16 T:be,lb m:7 result 526D674E | ||||
| striptest 224x16 T:be,lb m:15 result BCE3B81D | ||||
| striptest 224x16 T:be,li m:0 result F1126804 | ||||
| striptest 224x16 T:be,li m:1 result AF23B0EC | ||||
| striptest 224x16 T:be,li m:3 result 42C4FC3 | ||||
| striptest 224x16 T:be,li m:7 result F87C00B2 | ||||
| striptest 224x16 T:be,li m:15 result EC6026F | ||||
| striptest 224x16 T:be,ci m:0 result 297FB291 | ||||
| striptest 224x16 T:be,ci m:1 result 1E673D4B | ||||
| striptest 224x16 T:be,ci m:3 result 8456644B | ||||
| striptest 224x16 T:be,ci m:7 result 3DC9CA10 | ||||
| striptest 224x16 T:be,ci m:15 result 73EB67B2 | ||||
| striptest 224x16 T:be,md m:0 result 43E06F84 | ||||
| striptest 224x16 T:be,md m:1 result 8B4BD0B4 | ||||
| striptest 224x16 T:be,md m:3 result F9E282D7 | ||||
| striptest 224x16 T:be,md m:7 result CF442864 | ||||
| striptest 224x16 T:be,md m:15 result 40FF4C35 | ||||
| striptest 224x16 T:be,fd m:0 result E9136713 | ||||
| striptest 224x16 T:be,fd m:1 result 5504AAD5 | ||||
| striptest 224x16 T:be,fd m:3 result 62CF4ED1 | ||||
| striptest 224x16 T:be,fd m:7 result 1FBFFEB5 | ||||
| striptest 224x16 T:be,fd m:15 result 1A8802F2 | ||||
| striptest 224x16 T:be,l5 m:0 result 6B4E140C | ||||
| striptest 224x16 T:be,l5 m:1 result 317D78DE | ||||
| striptest 224x16 T:be,l5 m:3 result 10D76452 | ||||
| striptest 224x16 T:be,l5 m:7 result B4157203 | ||||
| striptest 224x16 T:be,l5 m:15 result 7485BB4E | ||||
| striptest 224x64 T:be,lb m:0 result 2B8AC21B | ||||
| striptest 224x64 T:be,lb m:1 result 20901C76 | ||||
| striptest 224x64 T:be,lb m:3 result 9DD93F3D | ||||
| striptest 224x64 T:be,lb m:7 result 7344B91E | ||||
| striptest 224x64 T:be,lb m:15 result 1AF370A4 | ||||
| striptest 224x64 T:be,li m:0 result DBBDD6BD | ||||
| striptest 224x64 T:be,li m:1 result 11F7C325 | ||||
| striptest 224x64 T:be,li m:3 result 3CE50C42 | ||||
| striptest 224x64 T:be,li m:7 result 7E69E47E | ||||
| striptest 224x64 T:be,li m:15 result A4BBE1A1 | ||||
| striptest 224x64 T:be,ci m:0 result F82BA5E8 | ||||
| striptest 224x64 T:be,ci m:1 result 85115A85 | ||||
| striptest 224x64 T:be,ci m:3 result 58C651AE | ||||
| striptest 224x64 T:be,ci m:7 result A9126A8F | ||||
| striptest 224x64 T:be,ci m:15 result 7B9FDB4F | ||||
| striptest 224x64 T:be,md m:0 result C2526431 | ||||
| striptest 224x64 T:be,md m:1 result 827DC726 | ||||
| striptest 224x64 T:be,md m:3 result 8DA3941F | ||||
| striptest 224x64 T:be,md m:7 result 51B05951 | ||||
| striptest 224x64 T:be,md m:15 result ED5F5AD8 | ||||
| striptest 224x64 T:be,fd m:0 result 12A1C5DC | ||||
| striptest 224x64 T:be,fd m:1 result 73CF788F | ||||
| striptest 224x64 T:be,fd m:3 result DA0EC20B | ||||
| striptest 224x64 T:be,fd m:7 result 5F61C207 | ||||
| striptest 224x64 T:be,fd m:15 result D315E2C2 | ||||
| striptest 224x64 T:be,l5 m:0 result B838DBE8 | ||||
| striptest 224x64 T:be,l5 m:1 result 9DDA2818 | ||||
| striptest 224x64 T:be,l5 m:3 result 936E539F | ||||
| striptest 224x64 T:be,l5 m:7 result B72DD580 | ||||
| striptest 224x64 T:be,l5 m:15 result DEF9939C | ||||
| striptest 224x304 T:be,lb m:0 result 1FEC5688 | ||||
| striptest 224x304 T:be,lb m:1 result 90A34708 | ||||
| striptest 224x304 T:be,lb m:3 result A7392576 | ||||
| striptest 224x304 T:be,lb m:7 result 5CE6F508 | ||||
| striptest 224x304 T:be,lb m:15 result 1AED25A0 | ||||
| striptest 224x304 T:be,li m:0 result 9DDCEAD8 | ||||
| striptest 224x304 T:be,li m:1 result A0734E1E | ||||
| striptest 224x304 T:be,li m:3 result 1F7E2AA8 | ||||
| striptest 224x304 T:be,li m:7 result A77BC413 | ||||
| striptest 224x304 T:be,li m:15 result B2066E34 | ||||
| striptest 224x304 T:be,ci m:0 result A1F1930F | ||||
| striptest 224x304 T:be,ci m:1 result B0BCBBCB | ||||
| striptest 224x304 T:be,ci m:3 result BC517C16 | ||||
| striptest 224x304 T:be,ci m:7 result 42B87247 | ||||
| striptest 224x304 T:be,ci m:15 result 390F228A | ||||
| striptest 224x304 T:be,md m:0 result 26DE8A64 | ||||
| striptest 224x304 T:be,md m:1 result 422A5459 | ||||
| striptest 224x304 T:be,md m:3 result 3FBA4F6 | ||||
| striptest 224x304 T:be,md m:7 result 16B03C7E | ||||
| striptest 224x304 T:be,md m:15 result DC1EC11 | ||||
| striptest 224x304 T:be,fd m:0 result AAC476C5 | ||||
| striptest 224x304 T:be,fd m:1 result 43724E73 | ||||
| striptest 224x304 T:be,fd m:3 result A35E0764 | ||||
| striptest 224x304 T:be,fd m:7 result 7A17EA8D | ||||
| striptest 224x304 T:be,fd m:15 result FACA116D | ||||
| striptest 224x304 T:be,l5 m:0 result E9D6B236 | ||||
| striptest 224x304 T:be,l5 m:1 result B4336EAD | ||||
| striptest 224x304 T:be,l5 m:3 result 284B6451 | ||||
| striptest 224x304 T:be,l5 m:7 result 637B6C54 | ||||
| striptest 224x304 T:be,l5 m:15 result 3503C609 | ||||
| @@ -1,336 +0,0 @@ | ||||
| temptest 0 0 0 0 result 4747FD2B6BCBD98D | ||||
| temptest 0 0 0 1 result B131E49BB453EC88 | ||||
| temptest 0 0 0 4 result 38CC2AC032A60E8E | ||||
| temptest 0 0 0 13 result B2C1B45AE4547480 | ||||
| temptest 0 0 0 40 result 7CCF1AC011E2ACEB | ||||
| temptest 0 0 0 121 result CEFAC9CA19A5F777 | ||||
| temptest 0 0 1 0 result 4747FD2B6BCBD98D | ||||
| temptest 0 0 1 1 result B131E49BB453EC88 | ||||
| temptest 0 0 1 4 result 38CC2AC032A60E8E | ||||
| temptest 0 0 1 13 result B2C1B45AE4547480 | ||||
| temptest 0 0 1 40 result 7CCF1AC011E2ACEB | ||||
| temptest 0 0 1 121 result CEFAC9CA19A5F777 | ||||
| temptest 0 0 18 0 result 4747FD2B6BCBD98D | ||||
| temptest 0 0 18 1 result B131E49BB453EC88 | ||||
| temptest 0 0 18 4 result 38CC2AC032A60E8E | ||||
| temptest 0 0 18 13 result B2C1B45AE4547480 | ||||
| temptest 0 0 18 40 result 7CCF1AC011E2ACEB | ||||
| temptest 0 0 18 121 result CEFAC9CA19A5F777 | ||||
| temptest 0 0 307 0 result 4747FD2B6BCBD98D | ||||
| temptest 0 0 307 1 result B131E49BB453EC88 | ||||
| temptest 0 0 307 4 result 9A1F4C627F31E806 | ||||
| temptest 0 0 307 13 result B2C1B45AE4547480 | ||||
| temptest 0 0 307 40 result 7CCF1AC011E2ACEB | ||||
| temptest 0 0 307 121 result CEFAC9CA19A5F777 | ||||
| temptest 0 0 5220 0 result A3F4794F3A735E24 | ||||
| temptest 0 0 5220 1 result 2FEB559286787E28 | ||||
| temptest 0 0 5220 4 result E77D4EBDFA3E06BF | ||||
| temptest 0 0 5220 13 result D77446C32EEDD169 | ||||
| temptest 0 0 5220 40 result 7CCF1AC011E2ACEB | ||||
| temptest 0 0 5220 121 result CEFAC9CA19A5F777 | ||||
| temptest 0 0 88741 0 result FBDDA11DF717CD14 | ||||
| temptest 0 0 88741 1 result FB7C8CEBFD07B08B | ||||
| temptest 0 0 88741 4 result 677BF6D89305A705 | ||||
| temptest 0 0 88741 13 result AC256153D241FEAC | ||||
| temptest 0 0 88741 40 result 53E5C6EFC8DA58D1 | ||||
| temptest 0 0 88741 121 result 284B4DD880549A05 | ||||
| temptest 0 1 1 0 result 4747FD2B6BCBD98D | ||||
| temptest 0 1 1 1 result B131E49BB453EC88 | ||||
| temptest 0 1 1 4 result 38CC2AC032A60E8E | ||||
| temptest 0 1 1 13 result B2C1B45AE4547480 | ||||
| temptest 0 1 1 40 result 7CCF1AC011E2ACEB | ||||
| temptest 0 1 1 121 result CEFAC9CA19A5F777 | ||||
| temptest 0 1 18 0 result 4747FD2B6BCBD98D | ||||
| temptest 0 1 18 1 result B131E49BB453EC88 | ||||
| temptest 0 1 18 4 result 38CC2AC032A60E8E | ||||
| temptest 0 1 18 13 result B2C1B45AE4547480 | ||||
| temptest 0 1 18 40 result 7CCF1AC011E2ACEB | ||||
| temptest 0 1 18 121 result CEFAC9CA19A5F777 | ||||
| temptest 0 1 307 0 result 4747FD2B6BCBD98D | ||||
| temptest 0 1 307 1 result B131E49BB453EC88 | ||||
| temptest 0 1 307 4 result 9A1F4C627F31E806 | ||||
| temptest 0 1 307 13 result B2C1B45AE4547480 | ||||
| temptest 0 1 307 40 result 7CCF1AC011E2ACEB | ||||
| temptest 0 1 307 121 result CEFAC9CA19A5F777 | ||||
| temptest 0 1 5220 0 result A3F4794F3A735E24 | ||||
| temptest 0 1 5220 1 result 2FEB559286787E28 | ||||
| temptest 0 1 5220 4 result E77D4EBDFA3E06BF | ||||
| temptest 0 1 5220 13 result D77446C32EEDD169 | ||||
| temptest 0 1 5220 40 result 7CCF1AC011E2ACEB | ||||
| temptest 0 1 5220 121 result CEFAC9CA19A5F777 | ||||
| temptest 0 1 88741 0 result FBDDA11DF717CD14 | ||||
| temptest 0 1 88741 1 result FB7C8CEBFD07B08B | ||||
| temptest 0 1 88741 4 result 677BF6D89305A705 | ||||
| temptest 0 1 88741 13 result AC256153D241FEAC | ||||
| temptest 0 1 88741 40 result 53E5C6EFC8DA58D1 | ||||
| temptest 0 1 88741 121 result 284B4DD880549A05 | ||||
| temptest 0 18 18 0 result 4747FD2B6BCBD98D | ||||
| temptest 0 18 18 1 result B131E49BB453EC88 | ||||
| temptest 0 18 18 4 result 38CC2AC032A60E8E | ||||
| temptest 0 18 18 13 result B2C1B45AE4547480 | ||||
| temptest 0 18 18 40 result 7CCF1AC011E2ACEB | ||||
| temptest 0 18 18 121 result CEFAC9CA19A5F777 | ||||
| temptest 0 18 307 0 result 4747FD2B6BCBD98D | ||||
| temptest 0 18 307 1 result B131E49BB453EC88 | ||||
| temptest 0 18 307 4 result 9A1F4C627F31E806 | ||||
| temptest 0 18 307 13 result B2C1B45AE4547480 | ||||
| temptest 0 18 307 40 result 7CCF1AC011E2ACEB | ||||
| temptest 0 18 307 121 result CEFAC9CA19A5F777 | ||||
| temptest 0 18 5220 0 result E2D79A25DEB7D8A0 | ||||
| temptest 0 18 5220 1 result 6ECE76692ABCF8A4 | ||||
| temptest 0 18 5220 4 result E77D4EBDFA3E06BF | ||||
| temptest 0 18 5220 13 result D77446C32EEDD169 | ||||
| temptest 0 18 5220 40 result 7CCF1AC011E2ACEB | ||||
| temptest 0 18 5220 121 result CEFAC9CA19A5F777 | ||||
| temptest 0 18 88741 0 result FBDDA11DF717CD14 | ||||
| temptest 0 18 88741 1 result FB7C8CEBFD07B08B | ||||
| temptest 0 18 88741 4 result 677BF6D89305A705 | ||||
| temptest 0 18 88741 13 result AC256153D241FEAC | ||||
| temptest 0 18 88741 40 result 53E5C6EFC8DA58D1 | ||||
| temptest 0 18 88741 121 result 284B4DD880549A05 | ||||
| temptest 0 307 307 0 result 4747FD2B6BCBD98D | ||||
| temptest 0 307 307 1 result B131E49BB453EC88 | ||||
| temptest 0 307 307 4 result B17A67893E803FB9 | ||||
| temptest 0 307 307 13 result B2C1B45AE4547480 | ||||
| temptest 0 307 307 40 result 7CCF1AC011E2ACEB | ||||
| temptest 0 307 307 121 result CEFAC9CA19A5F777 | ||||
| temptest 0 307 5220 0 result 555181C06E0FA1AA | ||||
| temptest 0 307 5220 1 result 3235D486256EC1AE | ||||
| temptest 0 307 5220 4 result 964FE2F503607C70 | ||||
| temptest 0 307 5220 13 result D77446C32EEDD169 | ||||
| temptest 0 307 5220 40 result 7CCF1AC011E2ACEB | ||||
| temptest 0 307 5220 121 result CEFAC9CA19A5F777 | ||||
| temptest 0 307 88741 0 result 797EDCC74D223AE8 | ||||
| temptest 0 307 88741 1 result 791DC89553121E5F | ||||
| temptest 0 307 88741 4 result 46E37B54A5142319 | ||||
| temptest 0 307 88741 13 result AC256153D241FEAC | ||||
| temptest 0 307 88741 40 result 53E5C6EFC8DA58D1 | ||||
| temptest 0 307 88741 121 result 284B4DD880549A05 | ||||
| temptest 0 5220 5220 0 result 4A2207CA23BA4CC0 | ||||
| temptest 0 5220 5220 1 result E5B4E54A5D48B507 | ||||
| temptest 0 5220 5220 4 result EA39A4876A38648F | ||||
| temptest 0 5220 5220 13 result B6B4F5C1A6864CBD | ||||
| temptest 0 5220 5220 40 result 7CCF1AC011E2ACEB | ||||
| temptest 0 5220 5220 121 result CEFAC9CA19A5F777 | ||||
| temptest 0 5220 88741 0 result 706EBAB75F0C52EA | ||||
| temptest 0 5220 88741 1 result D4F0475270F0795C | ||||
| temptest 0 5220 88741 4 result DF8A5296FD69B527 | ||||
| temptest 0 5220 88741 13 result BB5686FA9BA23C7B | ||||
| temptest 0 5220 88741 40 result A9201E8DBD3B9B3 | ||||
| temptest 0 5220 88741 121 result 284B4DD880549A05 | ||||
| temptest 0 88741 88741 0 result CF4F8ABE751594E0 | ||||
| temptest 0 88741 88741 1 result 9222D52614EFA86B | ||||
| temptest 0 88741 88741 4 result DFC399F2247B7714 | ||||
| temptest 0 88741 88741 13 result 4781E2B92F5BD91B | ||||
| temptest 0 88741 88741 40 result 8986560C6636BCBA | ||||
| temptest 0 88741 88741 121 result 31FBA2F823230BBF | ||||
| temptest 1 1 1 0 result 4747FD2B6BCBD98D | ||||
| temptest 1 1 1 1 result B131E49BB453EC88 | ||||
| temptest 1 1 1 4 result 38CC2AC032A60E8E | ||||
| temptest 1 1 1 13 result B2C1B45AE4547480 | ||||
| temptest 1 1 1 40 result 7CCF1AC011E2ACEB | ||||
| temptest 1 1 1 121 result CEFAC9CA19A5F777 | ||||
| temptest 1 1 18 0 result 4747FD2B6BCBD98D | ||||
| temptest 1 1 18 1 result B131E49BB453EC88 | ||||
| temptest 1 1 18 4 result 38CC2AC032A60E8E | ||||
| temptest 1 1 18 13 result B2C1B45AE4547480 | ||||
| temptest 1 1 18 40 result 7CCF1AC011E2ACEB | ||||
| temptest 1 1 18 121 result CEFAC9CA19A5F777 | ||||
| temptest 1 1 307 0 result 4747FD2B6BCBD98D | ||||
| temptest 1 1 307 1 result B131E49BB453EC88 | ||||
| temptest 1 1 307 4 result 9A1F4C627F31E806 | ||||
| temptest 1 1 307 13 result B2C1B45AE4547480 | ||||
| temptest 1 1 307 40 result 7CCF1AC011E2ACEB | ||||
| temptest 1 1 307 121 result CEFAC9CA19A5F777 | ||||
| temptest 1 1 5220 0 result A3F4794F3A735E24 | ||||
| temptest 1 1 5220 1 result 2FEB559286787E28 | ||||
| temptest 1 1 5220 4 result E77D4EBDFA3E06BF | ||||
| temptest 1 1 5220 13 result D77446C32EEDD169 | ||||
| temptest 1 1 5220 40 result 7CCF1AC011E2ACEB | ||||
| temptest 1 1 5220 121 result CEFAC9CA19A5F777 | ||||
| temptest 1 1 88741 0 result FBDDA11DF717CD14 | ||||
| temptest 1 1 88741 1 result FB7C8CEBFD07B08B | ||||
| temptest 1 1 88741 4 result 677BF6D89305A705 | ||||
| temptest 1 1 88741 13 result AC256153D241FEAC | ||||
| temptest 1 1 88741 40 result 53E5C6EFC8DA58D1 | ||||
| temptest 1 1 88741 121 result 284B4DD880549A05 | ||||
| temptest 1 18 18 0 result 4747FD2B6BCBD98D | ||||
| temptest 1 18 18 1 result B131E49BB453EC88 | ||||
| temptest 1 18 18 4 result 38CC2AC032A60E8E | ||||
| temptest 1 18 18 13 result B2C1B45AE4547480 | ||||
| temptest 1 18 18 40 result 7CCF1AC011E2ACEB | ||||
| temptest 1 18 18 121 result CEFAC9CA19A5F777 | ||||
| temptest 1 18 307 0 result 4747FD2B6BCBD98D | ||||
| temptest 1 18 307 1 result B131E49BB453EC88 | ||||
| temptest 1 18 307 4 result 9A1F4C627F31E806 | ||||
| temptest 1 18 307 13 result B2C1B45AE4547480 | ||||
| temptest 1 18 307 40 result 7CCF1AC011E2ACEB | ||||
| temptest 1 18 307 121 result CEFAC9CA19A5F777 | ||||
| temptest 1 18 5220 0 result E2D79A25DEB7D8A0 | ||||
| temptest 1 18 5220 1 result 6ECE76692ABCF8A4 | ||||
| temptest 1 18 5220 4 result E77D4EBDFA3E06BF | ||||
| temptest 1 18 5220 13 result D77446C32EEDD169 | ||||
| temptest 1 18 5220 40 result 7CCF1AC011E2ACEB | ||||
| temptest 1 18 5220 121 result CEFAC9CA19A5F777 | ||||
| temptest 1 18 88741 0 result FBDDA11DF717CD14 | ||||
| temptest 1 18 88741 1 result FB7C8CEBFD07B08B | ||||
| temptest 1 18 88741 4 result 677BF6D89305A705 | ||||
| temptest 1 18 88741 13 result AC256153D241FEAC | ||||
| temptest 1 18 88741 40 result 53E5C6EFC8DA58D1 | ||||
| temptest 1 18 88741 121 result 284B4DD880549A05 | ||||
| temptest 1 307 307 0 result 4747FD2B6BCBD98D | ||||
| temptest 1 307 307 1 result B131E49BB453EC88 | ||||
| temptest 1 307 307 4 result B17A67893E803FB9 | ||||
| temptest 1 307 307 13 result B2C1B45AE4547480 | ||||
| temptest 1 307 307 40 result 7CCF1AC011E2ACEB | ||||
| temptest 1 307 307 121 result CEFAC9CA19A5F777 | ||||
| temptest 1 307 5220 0 result 555181C06E0FA1AA | ||||
| temptest 1 307 5220 1 result 3235D486256EC1AE | ||||
| temptest 1 307 5220 4 result 964FE2F503607C70 | ||||
| temptest 1 307 5220 13 result D77446C32EEDD169 | ||||
| temptest 1 307 5220 40 result 7CCF1AC011E2ACEB | ||||
| temptest 1 307 5220 121 result CEFAC9CA19A5F777 | ||||
| temptest 1 307 88741 0 result 797EDCC74D223AE8 | ||||
| temptest 1 307 88741 1 result 791DC89553121E5F | ||||
| temptest 1 307 88741 4 result 46E37B54A5142319 | ||||
| temptest 1 307 88741 13 result AC256153D241FEAC | ||||
| temptest 1 307 88741 40 result 53E5C6EFC8DA58D1 | ||||
| temptest 1 307 88741 121 result 284B4DD880549A05 | ||||
| temptest 1 5220 5220 0 result 4A2207CA23BA4CC0 | ||||
| temptest 1 5220 5220 1 result E5B4E54A5D48B507 | ||||
| temptest 1 5220 5220 4 result EA39A4876A38648F | ||||
| temptest 1 5220 5220 13 result B6B4F5C1A6864CBD | ||||
| temptest 1 5220 5220 40 result 7CCF1AC011E2ACEB | ||||
| temptest 1 5220 5220 121 result CEFAC9CA19A5F777 | ||||
| temptest 1 5220 88741 0 result 706EBAB75F0C52EA | ||||
| temptest 1 5220 88741 1 result D4F0475270F0795C | ||||
| temptest 1 5220 88741 4 result DF8A5296FD69B527 | ||||
| temptest 1 5220 88741 13 result BB5686FA9BA23C7B | ||||
| temptest 1 5220 88741 40 result A9201E8DBD3B9B3 | ||||
| temptest 1 5220 88741 121 result 284B4DD880549A05 | ||||
| temptest 1 88741 88741 0 result CF4F8ABE751594E0 | ||||
| temptest 1 88741 88741 1 result 9222D52614EFA86B | ||||
| temptest 1 88741 88741 4 result DFC399F2247B7714 | ||||
| temptest 1 88741 88741 13 result 4781E2B92F5BD91B | ||||
| temptest 1 88741 88741 40 result 8986560C6636BCBA | ||||
| temptest 1 88741 88741 121 result 31FBA2F823230BBF | ||||
| temptest 18 18 18 0 result 4747FD2B6BCBD98D | ||||
| temptest 18 18 18 1 result B131E49BB453EC88 | ||||
| temptest 18 18 18 4 result 38CC2AC032A60E8E | ||||
| temptest 18 18 18 13 result B2C1B45AE4547480 | ||||
| temptest 18 18 18 40 result 7CCF1AC011E2ACEB | ||||
| temptest 18 18 18 121 result CEFAC9CA19A5F777 | ||||
| temptest 18 18 307 0 result 4747FD2B6BCBD98D | ||||
| temptest 18 18 307 1 result B131E49BB453EC88 | ||||
| temptest 18 18 307 4 result 9A1F4C627F31E806 | ||||
| temptest 18 18 307 13 result B2C1B45AE4547480 | ||||
| temptest 18 18 307 40 result 7CCF1AC011E2ACEB | ||||
| temptest 18 18 307 121 result CEFAC9CA19A5F777 | ||||
| temptest 18 18 5220 0 result E2D79A25DEB7D8A0 | ||||
| temptest 18 18 5220 1 result 6ECE76692ABCF8A4 | ||||
| temptest 18 18 5220 4 result E77D4EBDFA3E06BF | ||||
| temptest 18 18 5220 13 result D77446C32EEDD169 | ||||
| temptest 18 18 5220 40 result 7CCF1AC011E2ACEB | ||||
| temptest 18 18 5220 121 result CEFAC9CA19A5F777 | ||||
| temptest 18 18 88741 0 result FBDDA11DF717CD14 | ||||
| temptest 18 18 88741 1 result FB7C8CEBFD07B08B | ||||
| temptest 18 18 88741 4 result 677BF6D89305A705 | ||||
| temptest 18 18 88741 13 result AC256153D241FEAC | ||||
| temptest 18 18 88741 40 result 53E5C6EFC8DA58D1 | ||||
| temptest 18 18 88741 121 result 284B4DD880549A05 | ||||
| temptest 18 307 307 0 result 4747FD2B6BCBD98D | ||||
| temptest 18 307 307 1 result B131E49BB453EC88 | ||||
| temptest 18 307 307 4 result B17A67893E803FB9 | ||||
| temptest 18 307 307 13 result B2C1B45AE4547480 | ||||
| temptest 18 307 307 40 result 7CCF1AC011E2ACEB | ||||
| temptest 18 307 307 121 result CEFAC9CA19A5F777 | ||||
| temptest 18 307 5220 0 result 555181C06E0FA1AA | ||||
| temptest 18 307 5220 1 result 3235D486256EC1AE | ||||
| temptest 18 307 5220 4 result 964FE2F503607C70 | ||||
| temptest 18 307 5220 13 result D77446C32EEDD169 | ||||
| temptest 18 307 5220 40 result 7CCF1AC011E2ACEB | ||||
| temptest 18 307 5220 121 result CEFAC9CA19A5F777 | ||||
| temptest 18 307 88741 0 result 797EDCC74D223AE8 | ||||
| temptest 18 307 88741 1 result 791DC89553121E5F | ||||
| temptest 18 307 88741 4 result 46E37B54A5142319 | ||||
| temptest 18 307 88741 13 result AC256153D241FEAC | ||||
| temptest 18 307 88741 40 result 53E5C6EFC8DA58D1 | ||||
| temptest 18 307 88741 121 result 284B4DD880549A05 | ||||
| temptest 18 5220 5220 0 result 4A2207CA23BA4CC0 | ||||
| temptest 18 5220 5220 1 result E5B4E54A5D48B507 | ||||
| temptest 18 5220 5220 4 result EA39A4876A38648F | ||||
| temptest 18 5220 5220 13 result B6B4F5C1A6864CBD | ||||
| temptest 18 5220 5220 40 result 7CCF1AC011E2ACEB | ||||
| temptest 18 5220 5220 121 result CEFAC9CA19A5F777 | ||||
| temptest 18 5220 88741 0 result 706EBAB75F0C52EA | ||||
| temptest 18 5220 88741 1 result D4F0475270F0795C | ||||
| temptest 18 5220 88741 4 result DF8A5296FD69B527 | ||||
| temptest 18 5220 88741 13 result BB5686FA9BA23C7B | ||||
| temptest 18 5220 88741 40 result A9201E8DBD3B9B3 | ||||
| temptest 18 5220 88741 121 result 284B4DD880549A05 | ||||
| temptest 18 88741 88741 0 result CF4F8ABE751594E0 | ||||
| temptest 18 88741 88741 1 result 9222D52614EFA86B | ||||
| temptest 18 88741 88741 4 result DFC399F2247B7714 | ||||
| temptest 18 88741 88741 13 result 4781E2B92F5BD91B | ||||
| temptest 18 88741 88741 40 result 8986560C6636BCBA | ||||
| temptest 18 88741 88741 121 result 31FBA2F823230BBF | ||||
| temptest 307 307 307 0 result 4747FD2B6BCBD98D | ||||
| temptest 307 307 307 1 result B131E49BB453EC88 | ||||
| temptest 307 307 307 4 result 8B1D395E5808B6DC | ||||
| temptest 307 307 307 13 result B2C1B45AE4547480 | ||||
| temptest 307 307 307 40 result 7CCF1AC011E2ACEB | ||||
| temptest 307 307 307 121 result CEFAC9CA19A5F777 | ||||
| temptest 307 307 5220 0 result A69033A091FC2080 | ||||
| temptest 307 307 5220 1 result 32870FE3DE014084 | ||||
| temptest 307 307 5220 4 result B2649AC2BCF207E4 | ||||
| temptest 307 307 5220 13 result D77446C32EEDD169 | ||||
| temptest 307 307 5220 40 result 7CCF1AC011E2ACEB | ||||
| temptest 307 307 5220 121 result CEFAC9CA19A5F777 | ||||
| temptest 307 307 88741 0 result 6148B9F1437BB580 | ||||
| temptest 307 307 88741 1 result 6F49A40209698F7 | ||||
| temptest 307 307 88741 4 result 9E9DD518954D5E5 | ||||
| temptest 307 307 88741 13 result AC256153D241FEAC | ||||
| temptest 307 307 88741 40 result 53E5C6EFC8DA58D1 | ||||
| temptest 307 307 88741 121 result 284B4DD880549A05 | ||||
| temptest 307 5220 5220 0 result 2A63D0D557F45750 | ||||
| temptest 307 5220 5220 1 result 9254608D71205E52 | ||||
| temptest 307 5220 5220 4 result E46F831B8295F417 | ||||
| temptest 307 5220 5220 13 result B6B4F5C1A6864CBD | ||||
| temptest 307 5220 5220 40 result 7CCF1AC011E2ACEB | ||||
| temptest 307 5220 5220 121 result CEFAC9CA19A5F777 | ||||
| temptest 307 5220 88741 0 result EADD24BF32F80792 | ||||
| temptest 307 5220 88741 1 result DABC179FB1931BE8 | ||||
| temptest 307 5220 88741 4 result 8AA934A713F0D4AD | ||||
| temptest 307 5220 88741 13 result BB5686FA9BA23C7B | ||||
| temptest 307 5220 88741 40 result A9201E8DBD3B9B3 | ||||
| temptest 307 5220 88741 121 result 284B4DD880549A05 | ||||
| temptest 307 88741 88741 0 result 1A2909BF51BC6E28 | ||||
| temptest 307 88741 88741 1 result 6614127EF76D81B3 | ||||
| temptest 307 88741 88741 4 result 9B0BC4A00B7DB1F2 | ||||
| temptest 307 88741 88741 13 result 4781E2B92F5BD91B | ||||
| temptest 307 88741 88741 40 result 8986560C6636BCBA | ||||
| temptest 307 88741 88741 121 result 31FBA2F823230BBF | ||||
| temptest 5220 5220 5220 0 result 7FE69B4F88AD274B | ||||
| temptest 5220 5220 5220 1 result 2262574F78791826 | ||||
| temptest 5220 5220 5220 4 result 597A21AB80E82FAC | ||||
| temptest 5220 5220 5220 13 result 7F930A71275853B8 | ||||
| temptest 5220 5220 5220 40 result 7CCF1AC011E2ACEB | ||||
| temptest 5220 5220 5220 121 result CEFAC9CA19A5F777 | ||||
| temptest 5220 5220 88741 0 result D5F7F8D19289D7C3 | ||||
| temptest 5220 5220 88741 1 result CD3256F7DFF12EE2 | ||||
| temptest 5220 5220 88741 4 result 84E2DB3DECECD065 | ||||
| temptest 5220 5220 88741 13 result A751FC922A9A8365 | ||||
| temptest 5220 5220 88741 40 result 2FA93067097FB349 | ||||
| temptest 5220 5220 88741 121 result 284B4DD880549A05 | ||||
| temptest 5220 88741 88741 0 result 684F350A49E03B23 | ||||
| temptest 5220 88741 88741 1 result 6E9FD32757E3AD46 | ||||
| temptest 5220 88741 88741 4 result 5F4C037B5CFEDACB | ||||
| temptest 5220 88741 88741 13 result 6B03209BFA60079D | ||||
| temptest 5220 88741 88741 40 result 8986560C6636BCBA | ||||
| temptest 5220 88741 88741 121 result 31FBA2F823230BBF | ||||
| temptest 88741 88741 88741 0 result B1D4DA59CAAF6224 | ||||
| temptest 88741 88741 88741 1 result 42DD8F9FBDC2D6C0 | ||||
| temptest 88741 88741 88741 4 result B40B6B1CAD3A609F | ||||
| temptest 88741 88741 88741 13 result 221AA124FEFA141C | ||||
| temptest 88741 88741 88741 40 result FC31041053B7B237 | ||||
| temptest 88741 88741 88741 121 result CB3E66FC05552055 | ||||
| @@ -42,7 +42,6 @@ EOF | ||||
| # gen-rc libavformat   "FFmpeg container format library" | ||||
| # gen-rc libavdevice   "FFmpeg device handling library" | ||||
| # gen-rc libavfilter   "FFmpeg audio/video filtering library" | ||||
| # gen-rc libpostproc   "FFmpeg postprocessing library" | ||||
| # gen-rc libswscale    "FFmpeg image rescaling library" | ||||
| # gen-rc libswresample "FFmpeg audio resampling library" | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user