X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fdct-test.c;h=0f7f5c3fe3acde50fa327f25bfa35e0de30ea9b5;hb=5932e2d7d2c0b2d6a3a6184e964e923fb7a9d076;hp=136f5c4742bf3d0360ca251f7a2b35b8e58fa4e8;hpb=e7a972e113ddf3271c4c0e01a2d57e23ac5195f1;p=ffmpeg diff --git a/libavcodec/dct-test.c b/libavcodec/dct-test.c index 136f5c4742b..0f7f5c3fe3a 100644 --- a/libavcodec/dct-test.c +++ b/libavcodec/dct-test.c @@ -25,17 +25,21 @@ * Started from sample code by Juan J. Sierralta P. */ +#include "config.h" #include #include #include -#include +#if HAVE_UNISTD_H #include +#endif #include #include "libavutil/cpu.h" #include "libavutil/common.h" #include "libavutil/lfg.h" +#include "libavutil/time.h" +#include "dct.h" #include "simple_idct.h" #include "aandcttab.h" #include "faandct.h" @@ -45,59 +49,47 @@ #undef printf -void ff_mmx_idct(DCTELEM *data); -void ff_mmxext_idct(DCTELEM *data); - -void odivx_idct_c(short *block); - // BFIN -void ff_bfin_idct(DCTELEM *block); -void ff_bfin_fdct(DCTELEM *block); +void ff_bfin_idct(int16_t *block); +void ff_bfin_fdct(int16_t *block); // ALTIVEC -void fdct_altivec(DCTELEM *block); -//void idct_altivec(DCTELEM *block);?? no routine +void ff_fdct_altivec(int16_t *block); // ARM -void ff_j_rev_dct_arm(DCTELEM *data); -void ff_simple_idct_arm(DCTELEM *data); -void ff_simple_idct_armv5te(DCTELEM *data); -void ff_simple_idct_armv6(DCTELEM *data); -void ff_simple_idct_neon(DCTELEM *data); +void ff_j_rev_dct_arm(int16_t *data); +void ff_simple_idct_arm(int16_t *data); +void ff_simple_idct_armv5te(int16_t *data); +void ff_simple_idct_armv6(int16_t *data); +void ff_simple_idct_neon(int16_t *data); -void ff_simple_idct_axp(DCTELEM *data); +void ff_simple_idct_axp(int16_t *data); struct algo { const char *name; - void (*func)(DCTELEM *block); + void (*func)(int16_t *block); enum formattag { NO_PERM, MMX_PERM, MMX_SIMPLE_PERM, SCALE_PERM, SSE2_PERM, PARTTRANS_PERM } format; int mm_support; int nonspec; }; -#ifndef FAAN_POSTSCALE -#define FAAN_SCALE SCALE_PERM -#else -#define FAAN_SCALE NO_PERM -#endif - static int cpu_flags; static const struct algo fdct_tab[] = { { "REF-DBL", ff_ref_fdct, NO_PERM }, - { "FAAN", ff_faandct, FAAN_SCALE }, - { "IJG-AAN-INT", fdct_ifast, SCALE_PERM }, - { "IJG-LLM-INT", ff_jpeg_fdct_islow, NO_PERM }, + { "FAAN", ff_faandct, NO_PERM }, + { "IJG-AAN-INT", ff_fdct_ifast, SCALE_PERM }, + { "IJG-LLM-INT", ff_jpeg_fdct_islow_8, NO_PERM }, -#if HAVE_MMX +#if HAVE_MMX_INLINE { "MMX", ff_fdct_mmx, NO_PERM, AV_CPU_FLAG_MMX }, - { "MMX2", ff_fdct_mmx2, NO_PERM, AV_CPU_FLAG_MMX2 }, + { "MMXEXT", ff_fdct_mmxext, NO_PERM, AV_CPU_FLAG_MMXEXT }, { "SSE2", ff_fdct_sse2, NO_PERM, AV_CPU_FLAG_SSE2 }, #endif #if HAVE_ALTIVEC - { "altivecfdct", fdct_altivec, NO_PERM, AV_CPU_FLAG_ALTIVEC }, + { "altivecfdct", ff_fdct_altivec, NO_PERM, AV_CPU_FLAG_ALTIVEC }, #endif #if ARCH_BFIN @@ -110,17 +102,13 @@ static const struct algo fdct_tab[] = { static const struct algo idct_tab[] = { { "FAANI", ff_faanidct, NO_PERM }, { "REF-DBL", ff_ref_idct, NO_PERM }, - { "INT", j_rev_dct, MMX_PERM }, + { "INT", ff_j_rev_dct, MMX_PERM }, { "SIMPLE-C", ff_simple_idct_8, NO_PERM }, -#if HAVE_MMX -#if CONFIG_GPL - { "LIBMPEG2-MMX", ff_mmx_idct, MMX_PERM, AV_CPU_FLAG_MMX, 1 }, - { "LIBMPEG2-MMX2", ff_mmxext_idct, MMX_PERM, AV_CPU_FLAG_MMX2, 1 }, -#endif +#if HAVE_MMX_INLINE { "SIMPLE-MMX", ff_simple_idct_mmx, MMX_SIMPLE_PERM, AV_CPU_FLAG_MMX }, { "XVID-MMX", ff_idct_xvid_mmx, NO_PERM, AV_CPU_FLAG_MMX, 1 }, - { "XVID-MMX2", ff_idct_xvid_mmx2, NO_PERM, AV_CPU_FLAG_MMX2, 1 }, + { "XVID-MMXEXT", ff_idct_xvid_mmxext, NO_PERM, AV_CPU_FLAG_MMXEXT, 1 }, { "XVID-SSE2", ff_idct_xvid_sse2, SSE2_PERM, AV_CPU_FLAG_SSE2, 1 }, #endif @@ -133,13 +121,13 @@ static const struct algo idct_tab[] = { { "INT-ARM", ff_j_rev_dct_arm, MMX_PERM }, #endif #if HAVE_ARMV5TE - { "SIMPLE-ARMV5TE", ff_simple_idct_armv5te,NO_PERM }, + { "SIMPLE-ARMV5TE", ff_simple_idct_armv5te,NO_PERM, AV_CPU_FLAG_ARMV5TE }, #endif #if HAVE_ARMV6 - { "SIMPLE-ARMV6", ff_simple_idct_armv6, MMX_PERM }, + { "SIMPLE-ARMV6", ff_simple_idct_armv6, MMX_PERM, AV_CPU_FLAG_ARMV6 }, #endif #if HAVE_NEON - { "SIMPLE-NEON", ff_simple_idct_neon, PARTTRANS_PERM }, + { "SIMPLE-NEON", ff_simple_idct_neon, PARTTRANS_PERM, AV_CPU_FLAG_NEON }, #endif #if ARCH_ALPHA @@ -151,15 +139,6 @@ static const struct algo idct_tab[] = { #define AANSCALE_BITS 12 -uint8_t cropTbl[256 + 2 * MAX_NEG_CROP]; - -static int64_t gettime(void) -{ - struct timeval tv; - gettimeofday(&tv, NULL); - return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec; -} - #define NB_ITS 20000 #define NB_ITS_SPEED 50000 @@ -188,20 +167,62 @@ static void idct_mmx_init(void) } } -DECLARE_ALIGNED(16, static DCTELEM, block)[64]; -DECLARE_ALIGNED(8, static DCTELEM, block1)[64]; +DECLARE_ALIGNED(16, static int16_t, block)[64]; +DECLARE_ALIGNED(8, static int16_t, block1)[64]; -static inline void mmx_emms(void) +static void init_block(int16_t block[64], int test, int is_idct, AVLFG *prng) { -#if HAVE_MMX - if (cpu_flags & AV_CPU_FLAG_MMX) - __asm__ volatile ("emms\n\t"); -#endif + int i, j; + + memset(block, 0, 64 * sizeof(*block)); + + switch (test) { + case 0: + for (i = 0; i < 64; i++) + block[i] = (av_lfg_get(prng) % 512) - 256; + if (is_idct) { + ff_ref_fdct(block); + for (i = 0; i < 64; i++) + block[i] >>= 3; + } + break; + case 1: + j = av_lfg_get(prng) % 10 + 1; + for (i = 0; i < j; i++) + block[av_lfg_get(prng) % 64] = av_lfg_get(prng) % 512 - 256; + break; + case 2: + block[ 0] = av_lfg_get(prng) % 4096 - 2048; + block[63] = (block[0] & 1) ^ 1; + break; + } +} + +static void permute(int16_t dst[64], const int16_t src[64], int perm) +{ + int i; + + if (perm == MMX_PERM) { + for (i = 0; i < 64; i++) + dst[idct_mmx_perm[i]] = src[i]; + } else if (perm == MMX_SIMPLE_PERM) { + for (i = 0; i < 64; i++) + dst[idct_simple_mmx_perm[i]] = src[i]; + } else if (perm == SSE2_PERM) { + for (i = 0; i < 64; i++) + dst[(i & 0x38) | idct_sse2_row_perm[i & 7]] = src[i]; + } else if (perm == PARTTRANS_PERM) { + for (i = 0; i < 64; i++) + dst[(i & 0x24) | ((i & 3) << 3) | ((i >> 3) & 3)] = src[i]; + } else { + for (i = 0; i < 64; i++) + dst[i] = src[i]; + } } static int dct_error(const struct algo *dct, int test, int is_idct, int speed) { - void (*ref)(DCTELEM *block) = is_idct ? ff_ref_idct : ff_ref_fdct; + void (*ref)(int16_t *block) = is_idct ? ff_ref_idct : ff_ref_fdct; int it, i, scale; int err_inf, v; int64_t err2, ti, ti1, it1, err_sum = 0; @@ -219,50 +240,11 @@ static int dct_error(const struct algo *dct, int test, int is_idct, int speed) for (i = 0; i < 64; i++) sysErr[i] = 0; for (it = 0; it < NB_ITS; it++) { - for (i = 0; i < 64; i++) - block1[i] = 0; - switch (test) { - case 0: - for (i = 0; i < 64; i++) - block1[i] = (av_lfg_get(&prng) % 512) - 256; - if (is_idct) { - ff_ref_fdct(block1); - for (i = 0; i < 64; i++) - block1[i] >>= 3; - } - break; - case 1: { - int num = av_lfg_get(&prng) % 10 + 1; - for (i = 0; i < num; i++) - block1[av_lfg_get(&prng) % 64] = - av_lfg_get(&prng) % 512 - 256; - } - break; - case 2: - block1[0] = av_lfg_get(&prng) % 4096 - 2048; - block1[63] = (block1[0] & 1) ^ 1; - break; - } - - if (dct->format == MMX_PERM) { - for (i = 0; i < 64; i++) - block[idct_mmx_perm[i]] = block1[i]; - } else if (dct->format == MMX_SIMPLE_PERM) { - for (i = 0; i < 64; i++) - block[idct_simple_mmx_perm[i]] = block1[i]; - } else if (dct->format == SSE2_PERM) { - for (i = 0; i < 64; i++) - block[(i & 0x38) | idct_sse2_row_perm[i & 7]] = block1[i]; - } else if (dct->format == PARTTRANS_PERM) { - for (i = 0; i < 64; i++) - block[(i & 0x24) | ((i & 3) << 3) | ((i >> 3) & 3)] = block1[i]; - } else { - for (i = 0; i < 64; i++) - block[i] = block1[i]; - } + init_block(block1, test, is_idct, &prng); + permute(block, block1, dct->format); dct->func(block); - mmx_emms(); + emms_c(); if (dct->format == SCALE_PERM) { for (i = 0; i < 64; i++) { @@ -316,51 +298,20 @@ static int dct_error(const struct algo *dct, int test, int is_idct, int speed) return 0; /* speed test */ - for (i = 0; i < 64; i++) - block1[i] = 0; + init_block(block, test, is_idct, &prng); + permute(block1, block, dct->format); - switch (test) { - case 0: - for (i = 0; i < 64; i++) - block1[i] = av_lfg_get(&prng) % 512 - 256; - if (is_idct) { - ff_ref_fdct(block1); - for (i = 0; i < 64; i++) - block1[i] >>= 3; - } - break; - case 1: - case 2: - block1[0] = av_lfg_get(&prng) % 512 - 256; - block1[1] = av_lfg_get(&prng) % 512 - 256; - block1[2] = av_lfg_get(&prng) % 512 - 256; - block1[3] = av_lfg_get(&prng) % 512 - 256; - break; - } - - if (dct->format == MMX_PERM) { - for (i = 0; i < 64; i++) - block[idct_mmx_perm[i]] = block1[i]; - } else if (dct->format == MMX_SIMPLE_PERM) { - for (i = 0; i < 64; i++) - block[idct_simple_mmx_perm[i]] = block1[i]; - } else { - for (i = 0; i < 64; i++) - block[i] = block1[i]; - } - - ti = gettime(); + ti = av_gettime(); it1 = 0; do { for (it = 0; it < NB_ITS_SPEED; it++) { - for (i = 0; i < 64; i++) - block[i] = block1[i]; + memcpy(block, block1, sizeof(block)); dct->func(block); } it1 += NB_ITS_SPEED; - ti1 = gettime() - ti; + ti1 = av_gettime() - ti; } while (ti1 < 1000000); - mmx_emms(); + emms_c(); printf("%s %s: %0.1f kdct/s\n", is_idct ? "IDCT" : "DCT", dct->name, (double) it1 * 1000.0 / (double) ti1); @@ -491,7 +442,7 @@ static void idct248_error(const char *name, if (!speed) return; - ti = gettime(); + ti = av_gettime(); it1 = 0; do { for (it = 0; it < NB_ITS_SPEED; it++) { @@ -500,9 +451,9 @@ static void idct248_error(const char *name, idct248_put(img_dest, 8, block); } it1 += NB_ITS_SPEED; - ti1 = gettime() - ti; + ti1 = av_gettime() - ti; } while (ti1 < 1000000); - mmx_emms(); + emms_c(); printf("%s %s: %0.1f kdct/s\n", 1 ? "IDCT248" : "DCT248", name, (double) it1 * 1000.0 / (double) ti1); @@ -519,6 +470,10 @@ static void help(void) "-t speed test\n"); } +#if !HAVE_GETOPT +#include "compat/getopt.c" +#endif + int main(int argc, char **argv) { int test_idct = 0, test_248_dct = 0; @@ -532,13 +487,6 @@ int main(int argc, char **argv) ff_ref_dct_init(); idct_mmx_init(); - for (i = 0; i < 256; i++) - cropTbl[i + MAX_NEG_CROP] = i; - for (i = 0; i < MAX_NEG_CROP; i++) { - cropTbl[i] = 0; - cropTbl[i + MAX_NEG_CROP + 256] = 255; - } - for (;;) { c = getopt(argc, argv, "ih4t"); if (c == -1) @@ -563,7 +511,7 @@ int main(int argc, char **argv) if (optind < argc) test = atoi(argv[optind]); - printf("ffmpeg DCT/IDCT test\n"); + printf("Libav DCT/IDCT test\n"); if (test_248_dct) { idct248_error("SIMPLE-C", ff_simple_idct248_put, speed);