1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-10 06:10:52 +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:
Michael Niedermayer
2025-05-05 19:40:24 +02:00
parent 9537d91e8f
commit 8c920c4c39
42 changed files with 1 additions and 9342 deletions

View File

@@ -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`

View File

@@ -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
View File

@@ -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

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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)

View File

@@ -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

View File

@@ -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;

View File

@@ -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,
};

View File

@@ -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

View File

@@ -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

View File

@@ -1,7 +0,0 @@
LIBPOSTPROC_MAJOR {
global:
postproc_*;
pp_*;
local:
*;
};

View File

@@ -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);
}
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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
}
}

View File

@@ -1,3 +0,0 @@
/blocktest
/stripetest
/temptest

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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 */

View File

@@ -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];
}

View File

@@ -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 */

View File

@@ -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 */

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -1 +0,0 @@
pp1 1a45041dd20a941e36b7729116950107

View File

@@ -1 +0,0 @@
pp2 566d48ad25dfa7a9680de933cbdf66d9

View File

@@ -1 +0,0 @@
pp3 586fc14a52699540a865c070dd113229

View File

@@ -1 +0,0 @@
pp4 8a072806ae6b5c68c5c3c57197641e4a

View File

@@ -1 +0,0 @@
pp5 5695b8193095a63b9f397fff8343d1a6

View File

@@ -1 +0,0 @@
pp6 f823b3330935cd1824d526041b429d9a

View File

@@ -1 +0,0 @@
qp 2d4da13e883e073084d547a6b41ba688

View File

@@ -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

View File

@@ -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

View File

@@ -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"