| @@ -144,6 +144,7 @@ Component options: | |||
| --disable-mdct disable MDCT code | |||
| --disable-rdft disable RDFT code | |||
| --disable-fft disable FFT code | |||
| --disable-pixelutils disable pixel utils in libavutil | |||
| Hardware accelerators: | |||
| --disable-dxva2 disable DXVA2 code [autodetect] | |||
| @@ -1451,6 +1452,7 @@ SUBSYSTEM_LIST=" | |||
| lsp | |||
| lzo | |||
| mdct | |||
| pixelutils | |||
| network | |||
| rdft | |||
| " | |||
| @@ -15,6 +15,9 @@ libavutil: 2012-10-22 | |||
| API changes, most recent first: | |||
| 2014-08-02 - xxxxxxx - lavu 52.98.100 - pixelutils.h | |||
| Add pixelutils API with SAD functions | |||
| 2014-08-xx - xxxxxxx - lavu 53.22.0 - pixfmt.h | |||
| Add AV_PIX_FMT_YA16 pixel format for 16 bit packed gray with alpha. | |||
| @@ -44,6 +44,7 @@ HEADERS = adler32.h \ | |||
| opt.h \ | |||
| parseutils.h \ | |||
| pixdesc.h \ | |||
| pixelutils.h \ | |||
| pixfmt.h \ | |||
| random_seed.h \ | |||
| replaygain.h \ | |||
| @@ -113,6 +114,7 @@ OBJS = adler32.o \ | |||
| opt.o \ | |||
| parseutils.o \ | |||
| pixdesc.o \ | |||
| pixelutils.o \ | |||
| random_seed.o \ | |||
| rational.o \ | |||
| rc4.o \ | |||
| @@ -170,6 +172,7 @@ TESTPROGS = adler32 \ | |||
| pca \ | |||
| parseutils \ | |||
| pixdesc \ | |||
| pixelutils \ | |||
| random_seed \ | |||
| rational \ | |||
| ripemd \ | |||
| @@ -0,0 +1,153 @@ | |||
| /* | |||
| * 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 "config.h" | |||
| #include "common.h" | |||
| #include "pixelutils.h" | |||
| #if CONFIG_PIXELUTILS | |||
| #include "x86/pixelutils.h" | |||
| static av_always_inline int sad_wxh(const uint8_t *src1, ptrdiff_t stride1, | |||
| const uint8_t *src2, ptrdiff_t stride2, | |||
| int w, int h) | |||
| { | |||
| int x, y, sum = 0; | |||
| for (y = 0; y < h; y++) { | |||
| for (x = 0; x < w; x++) | |||
| sum += abs(src1[x] - src2[x]); | |||
| src1 += stride1; | |||
| src2 += stride2; | |||
| } | |||
| return sum; | |||
| } | |||
| #define DECLARE_BLOCK_FUNCTIONS(size) \ | |||
| static int block_sad_##size##x##size##_c(const uint8_t *src1, ptrdiff_t stride1, \ | |||
| const uint8_t *src2, ptrdiff_t stride2) \ | |||
| { \ | |||
| return sad_wxh(src1, stride1, src2, stride2, size, size); \ | |||
| } | |||
| DECLARE_BLOCK_FUNCTIONS(2) | |||
| DECLARE_BLOCK_FUNCTIONS(4) | |||
| DECLARE_BLOCK_FUNCTIONS(8) | |||
| DECLARE_BLOCK_FUNCTIONS(16) | |||
| static const av_pixelutils_sad_fn sad_c[] = { | |||
| block_sad_2x2_c, | |||
| block_sad_4x4_c, | |||
| block_sad_8x8_c, | |||
| block_sad_16x16_c, | |||
| }; | |||
| #endif /* CONFIG_PIXELUTILS */ | |||
| av_pixelutils_sad_fn av_pixelutils_get_sad_fn(int w_bits, int h_bits, int aligned, void *log_ctx) | |||
| { | |||
| #if !CONFIG_PIXELUTILS | |||
| av_log(log_ctx, AV_LOG_ERROR, "pixelutils support is required " | |||
| "but libavutil is not compiled with it\n"); | |||
| return NULL; | |||
| #else | |||
| av_pixelutils_sad_fn sad[FF_ARRAY_ELEMS(sad_c)]; | |||
| memcpy(sad, sad_c, sizeof(sad)); | |||
| if (w_bits < 1 || w_bits > FF_ARRAY_ELEMS(sad) || | |||
| h_bits < 1 || h_bits > FF_ARRAY_ELEMS(sad)) | |||
| return NULL; | |||
| if (w_bits != h_bits) // only squared sad for now | |||
| return NULL; | |||
| #if ARCH_X86 | |||
| ff_pixelutils_sad_init_x86(sad, aligned); | |||
| #endif | |||
| return sad[w_bits - 1]; | |||
| #endif | |||
| } | |||
| #ifdef TEST | |||
| #define W1 320 | |||
| #define H1 240 | |||
| #define W2 640 | |||
| #define H2 480 | |||
| static int run_test(const char *test, | |||
| const uint32_t *b1, const uint32_t *b2) | |||
| { | |||
| int i, a, ret = 0; | |||
| for (a = 0; a < 3; a++) { | |||
| const uint8_t *block1 = (const uint8_t *)b1; | |||
| const uint8_t *block2 = (const uint8_t *)b2; | |||
| switch (a) { | |||
| case 0: block1++; block2++; break; | |||
| case 1: block2++; break; | |||
| case 2: break; | |||
| } | |||
| for (i = 1; i <= FF_ARRAY_ELEMS(sad_c); i++) { | |||
| av_pixelutils_sad_fn f_ref = sad_c[i - 1]; | |||
| av_pixelutils_sad_fn f_out = av_pixelutils_get_sad_fn(i, i, a, NULL); | |||
| const int out = f_out(block1, W1, block2, W2); | |||
| const int ref = f_ref(block1, W1, block2, W2); | |||
| printf("[%s] [%c%c] SAD [%s] %dx%d=%d ref=%d\n", | |||
| out == ref ? "OK" : "FAIL", | |||
| a ? 'A' : 'U', a == 2 ? 'A' : 'U', | |||
| test, 1<<i, 1<<i, out, ref); | |||
| if (out != ref) | |||
| ret = 1; | |||
| } | |||
| } | |||
| return ret; | |||
| } | |||
| int main(void) | |||
| { | |||
| int i, ret; | |||
| DECLARE_ALIGNED(32, uint32_t, buf1)[W1*H1]; | |||
| DECLARE_ALIGNED(32, uint32_t, buf2)[W2*H2]; | |||
| uint32_t state = 0; | |||
| for (i = 0; i < W1*H1; i++) { | |||
| state = state * 1664525 + 1013904223; | |||
| buf1[i] = state; | |||
| } | |||
| for (i = 0; i < W2*H2; i++) { | |||
| state = state * 1664525 + 1013904223; | |||
| buf2[i] = state; | |||
| } | |||
| ret = run_test("random", buf1, buf2); | |||
| if (ret < 0) | |||
| return ret; | |||
| memset(buf1, 0xff, sizeof(buf1)); | |||
| memset(buf2, 0x00, sizeof(buf2)); | |||
| ret = run_test("max", buf1, buf2); | |||
| if (ret < 0) | |||
| return ret; | |||
| memset(buf1, 0x90, sizeof(buf1)); | |||
| memset(buf2, 0x90, sizeof(buf2)); | |||
| return run_test("min", buf1, buf2); | |||
| } | |||
| #endif /* TEST */ | |||
| @@ -0,0 +1,52 @@ | |||
| /* | |||
| * 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 AVUTIL_PIXELUTILS_H | |||
| #define AVUTIL_PIXELUTILS_H | |||
| #include <stddef.h> | |||
| #include <stdint.h> | |||
| #include "common.h" | |||
| /** | |||
| * Sum of abs(src1[x] - src2[x]) | |||
| */ | |||
| typedef int (*av_pixelutils_sad_fn)(const uint8_t *src1, ptrdiff_t stride1, | |||
| const uint8_t *src2, ptrdiff_t stride2); | |||
| /** | |||
| * Get a potentially optimized pointer to a Sum-of-absolute-differences | |||
| * function (see the av_pixelutils_sad_fn prototype). | |||
| * | |||
| * @param w_bits 1<<w_bits is the requested width of the block size | |||
| * @param h_bits 1<<h_bits is the requested height of the block size | |||
| * @param aligned If set to 2, the returned sad function will assume src1 and | |||
| * src2 addresses are aligned on the block size. | |||
| * If set to 1, the returned sad function will assume src1 is | |||
| * aligned on the block size. | |||
| * If set to 0, the returned sad function assume no particular | |||
| * alignment. | |||
| * @param log_ctx context used for logging, can be NULL | |||
| * | |||
| * @return a pointer to the SAD function or NULL in case of error (because of | |||
| * invalid parameters) | |||
| */ | |||
| av_pixelutils_sad_fn av_pixelutils_get_sad_fn(int w_bits, int h_bits, | |||
| int aligned, void *log_ctx); | |||
| #endif /* AVUTIL_PIXELUTILS_H */ | |||
| @@ -56,7 +56,7 @@ | |||
| */ | |||
| #define LIBAVUTIL_VERSION_MAJOR 52 | |||
| #define LIBAVUTIL_VERSION_MINOR 97 | |||
| #define LIBAVUTIL_VERSION_MINOR 98 | |||
| #define LIBAVUTIL_VERSION_MICRO 100 | |||
| #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | |||
| @@ -2,7 +2,11 @@ OBJS += x86/cpu.o \ | |||
| x86/float_dsp_init.o \ | |||
| x86/lls_init.o \ | |||
| OBJS-$(CONFIG_PIXELUTILS) += x86/pixelutils_init.o \ | |||
| YASM-OBJS += x86/cpuid.o \ | |||
| x86/emms.o \ | |||
| x86/float_dsp.o \ | |||
| x86/lls.o \ | |||
| YASM-OBJS-$(CONFIG_PIXELUTILS) += x86/pixelutils.o \ | |||
| @@ -0,0 +1,155 @@ | |||
| ;****************************************************************************** | |||
| ;* Pixel utilities SIMD | |||
| ;* | |||
| ;* Copyright (C) 2002-2004 Michael Niedermayer <michaelni@gmx.at> | |||
| ;* Copyright (C) 2014 Clément Bœsch <u pkh me> | |||
| ;* | |||
| ;* 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 "x86util.asm" | |||
| SECTION_TEXT | |||
| ;------------------------------------------------------------------------------- | |||
| ; int ff_pixelutils_sad_8x8_mmx(const uint8_t *src1, ptrdiff_t stride1, | |||
| ; const uint8_t *src2, ptrdiff_t stride2); | |||
| ;------------------------------------------------------------------------------- | |||
| INIT_MMX mmx | |||
| cglobal pixelutils_sad_8x8, 4,4,0, src1, stride1, src2, stride2 | |||
| pxor m7, m7 | |||
| pxor m6, m6 | |||
| %rep 4 | |||
| mova m0, [src1q] | |||
| mova m2, [src1q + stride1q] | |||
| mova m1, [src2q] | |||
| mova m3, [src2q + stride2q] | |||
| psubusb m4, m0, m1 | |||
| psubusb m5, m2, m3 | |||
| psubusb m1, m0 | |||
| psubusb m3, m2 | |||
| por m1, m4 | |||
| por m3, m5 | |||
| punpcklbw m0, m1, m7 | |||
| punpcklbw m2, m3, m7 | |||
| punpckhbw m1, m7 | |||
| punpckhbw m3, m7 | |||
| paddw m0, m1 | |||
| paddw m2, m3 | |||
| paddw m0, m2 | |||
| paddw m6, m0 | |||
| lea src1q, [src1q + 2*stride1q] | |||
| lea src2q, [src2q + 2*stride2q] | |||
| %endrep | |||
| psrlq m0, m6, 32 | |||
| paddw m6, m0 | |||
| psrlq m0, m6, 16 | |||
| paddw m6, m0 | |||
| movd eax, m6 | |||
| movzx eax, ax | |||
| RET | |||
| ;------------------------------------------------------------------------------- | |||
| ; int ff_pixelutils_sad_8x8_mmxext(const uint8_t *src1, ptrdiff_t stride1, | |||
| ; const uint8_t *src2, ptrdiff_t stride2); | |||
| ;------------------------------------------------------------------------------- | |||
| INIT_MMX mmxext | |||
| cglobal pixelutils_sad_8x8, 4,4,0, src1, stride1, src2, stride2 | |||
| pxor m2, m2 | |||
| %rep 4 | |||
| mova m0, [src1q] | |||
| mova m1, [src1q + stride1q] | |||
| psadbw m0, [src2q] | |||
| psadbw m1, [src2q + stride2q] | |||
| paddw m2, m0 | |||
| paddw m2, m1 | |||
| lea src1q, [src1q + 2*stride1q] | |||
| lea src2q, [src2q + 2*stride2q] | |||
| %endrep | |||
| movd eax, m2 | |||
| RET | |||
| ;------------------------------------------------------------------------------- | |||
| ; int ff_pixelutils_sad_16x16_mmxext(const uint8_t *src1, ptrdiff_t stride1, | |||
| ; const uint8_t *src2, ptrdiff_t stride2); | |||
| ;------------------------------------------------------------------------------- | |||
| INIT_MMX mmxext | |||
| cglobal pixelutils_sad_16x16, 4,4,0, src1, stride1, src2, stride2 | |||
| pxor m2, m2 | |||
| %rep 16 | |||
| mova m0, [src1q] | |||
| mova m1, [src1q + 8] | |||
| psadbw m0, [src2q] | |||
| psadbw m1, [src2q + 8] | |||
| paddw m2, m0 | |||
| paddw m2, m1 | |||
| add src1q, stride1q | |||
| add src2q, stride2q | |||
| %endrep | |||
| movd eax, m2 | |||
| RET | |||
| ;------------------------------------------------------------------------------- | |||
| ; int ff_pixelutils_sad_16x16_sse(const uint8_t *src1, ptrdiff_t stride1, | |||
| ; const uint8_t *src2, ptrdiff_t stride2); | |||
| ;------------------------------------------------------------------------------- | |||
| INIT_XMM sse2 | |||
| cglobal pixelutils_sad_16x16, 4,4,5, src1, stride1, src2, stride2 | |||
| pxor m4, m4 | |||
| %rep 8 | |||
| movu m0, [src1q] | |||
| movu m1, [src1q + stride1q] | |||
| movu m2, [src2q] | |||
| movu m3, [src2q + stride2q] | |||
| psadbw m0, m2 | |||
| psadbw m1, m3 | |||
| paddw m4, m0 | |||
| paddw m4, m1 | |||
| lea src1q, [src1q + 2*stride1q] | |||
| lea src2q, [src2q + 2*stride2q] | |||
| %endrep | |||
| movhlps m0, m4 | |||
| paddw m4, m0 | |||
| movd eax, m4 | |||
| RET | |||
| ;------------------------------------------------------------------------------- | |||
| ; int ff_pixelutils_sad_[au]_16x16_sse(const uint8_t *src1, ptrdiff_t stride1, | |||
| ; const uint8_t *src2, ptrdiff_t stride2); | |||
| ;------------------------------------------------------------------------------- | |||
| %macro SAD_XMM_16x16 1 | |||
| INIT_XMM sse2 | |||
| cglobal pixelutils_sad_%1_16x16, 4,4,3, src1, stride1, src2, stride2 | |||
| pxor m2, m2 | |||
| %rep 8 | |||
| mov%1 m0, [src2q] | |||
| mov%1 m1, [src2q + stride2q] | |||
| psadbw m0, [src1q] | |||
| psadbw m1, [src1q + stride1q] | |||
| paddw m2, m0 | |||
| paddw m2, m1 | |||
| lea src1q, [src1q + 2*stride1q] | |||
| lea src2q, [src2q + 2*stride2q] | |||
| %endrep | |||
| movhlps m0, m2 | |||
| paddw m2, m0 | |||
| movd eax, m2 | |||
| RET | |||
| %endmacro | |||
| SAD_XMM_16x16 a | |||
| SAD_XMM_16x16 u | |||
| @@ -0,0 +1,26 @@ | |||
| /* | |||
| * 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 AVUTIL_X86_PIXELUTILS_H | |||
| #define AVUTIL_X86_PIXELUTILS_H | |||
| #include "libavutil/pixelutils.h" | |||
| void ff_pixelutils_sad_init_x86(av_pixelutils_sad_fn *sad, int aligned); | |||
| #endif /* AVUTIL_X86_PIXELUTILS_H */ | |||
| @@ -0,0 +1,58 @@ | |||
| /* | |||
| * 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 "config.h" | |||
| #include "pixelutils.h" | |||
| #include "cpu.h" | |||
| int ff_pixelutils_sad_8x8_mmx(const uint8_t *src1, ptrdiff_t stride1, | |||
| const uint8_t *src2, ptrdiff_t stride2); | |||
| int ff_pixelutils_sad_8x8_mmxext(const uint8_t *src1, ptrdiff_t stride1, | |||
| const uint8_t *src2, ptrdiff_t stride2); | |||
| int ff_pixelutils_sad_16x16_mmxext(const uint8_t *src1, ptrdiff_t stride1, | |||
| const uint8_t *src2, ptrdiff_t stride2); | |||
| int ff_pixelutils_sad_16x16_sse2(const uint8_t *src1, ptrdiff_t stride1, | |||
| const uint8_t *src2, ptrdiff_t stride2); | |||
| int ff_pixelutils_sad_a_16x16_sse2(const uint8_t *src1, ptrdiff_t stride1, | |||
| const uint8_t *src2, ptrdiff_t stride2); | |||
| int ff_pixelutils_sad_u_16x16_sse2(const uint8_t *src1, ptrdiff_t stride1, | |||
| const uint8_t *src2, ptrdiff_t stride2); | |||
| void ff_pixelutils_sad_init_x86(av_pixelutils_sad_fn *sad, int aligned) | |||
| { | |||
| int cpu_flags = av_get_cpu_flags(); | |||
| if (EXTERNAL_MMX(cpu_flags)) { | |||
| sad[2] = ff_pixelutils_sad_8x8_mmx; | |||
| } | |||
| if (EXTERNAL_MMXEXT(cpu_flags)) { | |||
| sad[2] = ff_pixelutils_sad_8x8_mmxext; | |||
| sad[3] = ff_pixelutils_sad_16x16_mmxext; | |||
| } | |||
| if (EXTERNAL_SSE2(cpu_flags)) { | |||
| switch (aligned) { | |||
| case 0: sad[3] = ff_pixelutils_sad_16x16_sse2; break; // src1 unaligned, src2 unaligned | |||
| case 1: sad[3] = ff_pixelutils_sad_u_16x16_sse2; break; // src1 aligned, src2 unaligned | |||
| case 2: sad[3] = ff_pixelutils_sad_a_16x16_sse2; break; // src1 aligned, src2 aligned | |||
| } | |||
| } | |||
| } | |||
| @@ -73,6 +73,10 @@ FATE_LIBAVUTIL += fate-parseutils | |||
| fate-parseutils: libavutil/parseutils-test$(EXESUF) | |||
| fate-parseutils: CMD = run libavutil/parseutils-test | |||
| FATE_LIBAVUTIL-$(CONFIG_PIXELUTILS) += fate-pixelutils | |||
| fate-pixelutils: libavutil/pixelutils-test$(EXESUF) | |||
| fate-pixelutils: CMD = run libavutil/pixelutils-test | |||
| FATE_LIBAVUTIL += fate-random_seed | |||
| fate-random_seed: libavutil/random_seed-test$(EXESUF) | |||
| fate-random_seed: CMD = run libavutil/random_seed-test | |||
| @@ -98,5 +102,6 @@ FATE_LIBAVUTIL += fate-xtea | |||
| fate-xtea: libavutil/xtea-test$(EXESUF) | |||
| fate-xtea: CMD = run libavutil/xtea-test | |||
| FATE_LIBAVUTIL += $(FATE_LIBAVUTIL-yes) | |||
| FATE-$(CONFIG_AVUTIL) += $(FATE_LIBAVUTIL) | |||
| fate-libavutil: $(FATE_LIBAVUTIL) | |||
| @@ -0,0 +1,36 @@ | |||
| [OK] [UU] SAD [random] 2x2=314 ref=314 | |||
| [OK] [UU] SAD [random] 4x4=1129 ref=1129 | |||
| [OK] [UU] SAD [random] 8x8=4936 ref=4936 | |||
| [OK] [UU] SAD [random] 16x16=20704 ref=20704 | |||
| [OK] [AU] SAD [random] 2x2=440 ref=440 | |||
| [OK] [AU] SAD [random] 4x4=1317 ref=1317 | |||
| [OK] [AU] SAD [random] 8x8=5262 ref=5262 | |||
| [OK] [AU] SAD [random] 16x16=21040 ref=21040 | |||
| [OK] [AA] SAD [random] 2x2=196 ref=196 | |||
| [OK] [AA] SAD [random] 4x4=1225 ref=1225 | |||
| [OK] [AA] SAD [random] 8x8=4712 ref=4712 | |||
| [OK] [AA] SAD [random] 16x16=21184 ref=21184 | |||
| [OK] [UU] SAD [max] 2x2=1020 ref=1020 | |||
| [OK] [UU] SAD [max] 4x4=4080 ref=4080 | |||
| [OK] [UU] SAD [max] 8x8=16320 ref=16320 | |||
| [OK] [UU] SAD [max] 16x16=65280 ref=65280 | |||
| [OK] [AU] SAD [max] 2x2=1020 ref=1020 | |||
| [OK] [AU] SAD [max] 4x4=4080 ref=4080 | |||
| [OK] [AU] SAD [max] 8x8=16320 ref=16320 | |||
| [OK] [AU] SAD [max] 16x16=65280 ref=65280 | |||
| [OK] [AA] SAD [max] 2x2=1020 ref=1020 | |||
| [OK] [AA] SAD [max] 4x4=4080 ref=4080 | |||
| [OK] [AA] SAD [max] 8x8=16320 ref=16320 | |||
| [OK] [AA] SAD [max] 16x16=65280 ref=65280 | |||
| [OK] [UU] SAD [min] 2x2=0 ref=0 | |||
| [OK] [UU] SAD [min] 4x4=0 ref=0 | |||
| [OK] [UU] SAD [min] 8x8=0 ref=0 | |||
| [OK] [UU] SAD [min] 16x16=0 ref=0 | |||
| [OK] [AU] SAD [min] 2x2=0 ref=0 | |||
| [OK] [AU] SAD [min] 4x4=0 ref=0 | |||
| [OK] [AU] SAD [min] 8x8=0 ref=0 | |||
| [OK] [AU] SAD [min] 16x16=0 ref=0 | |||
| [OK] [AA] SAD [min] 2x2=0 ref=0 | |||
| [OK] [AA] SAD [min] 4x4=0 ref=0 | |||
| [OK] [AA] SAD [min] 8x8=0 ref=0 | |||
| [OK] [AA] SAD [min] 16x16=0 ref=0 | |||