*/
/**
- * @file dct-test.c
- * DCT test. (c) 2001 Fabrice Bellard.
+ * @file
+ * DCT test (c) 2001 Fabrice Bellard
* Started from sample code by Juan J. Sierralta P.
*/
#include <unistd.h>
#include <math.h>
+#include "libavutil/cpu.h"
#include "libavutil/common.h"
+#include "libavutil/lfg.h"
#include "simple_idct.h"
#include "aandcttab.h"
#include "faandct.h"
#include "faanidct.h"
#include "x86/idct_xvid.h"
+#include "dctref.h"
#undef printf
-#undef random
-
-void *fast_memcpy(void *a, const void *b, size_t c){return memcpy(a,b,c);};
-
-/* reference fdct/idct */
-void fdct(DCTELEM *block);
-void idct(DCTELEM *block);
-void init_fdct();
void ff_mmx_idct(DCTELEM *data);
void ff_mmxext_idct(DCTELEM *data);
//void idct_altivec(DCTELEM *block);?? no routine
// ARM
-void j_rev_dct_ARM(DCTELEM *data);
-void simple_idct_ARM(DCTELEM *data);
-void simple_idct_armv5te(DCTELEM *data);
+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_simple_idct_axp(DCTELEM *data);
+
struct algo {
const char *name;
enum { FDCT, IDCT } is_idct;
static int cpu_flags;
struct algo algos[] = {
- {"REF-DBL", 0, fdct, fdct, NO_PERM},
- {"FAAN", 0, ff_faandct, fdct, FAAN_SCALE},
- {"FAANI", 1, ff_faanidct, idct, NO_PERM},
- {"IJG-AAN-INT", 0, fdct_ifast, fdct, SCALE_PERM},
- {"IJG-LLM-INT", 0, ff_jpeg_fdct_islow, fdct, NO_PERM},
- {"REF-DBL", 1, idct, idct, NO_PERM},
- {"INT", 1, j_rev_dct, idct, MMX_PERM},
- {"SIMPLE-C", 1, ff_simple_idct, idct, NO_PERM},
+ {"REF-DBL", 0, ff_ref_fdct, ff_ref_fdct, NO_PERM},
+ {"FAAN", 0, ff_faandct, ff_ref_fdct, FAAN_SCALE},
+ {"FAANI", 1, ff_faanidct, ff_ref_idct, NO_PERM},
+ {"IJG-AAN-INT", 0, fdct_ifast, ff_ref_fdct, SCALE_PERM},
+ {"IJG-LLM-INT", 0, ff_jpeg_fdct_islow, ff_ref_fdct, NO_PERM},
+ {"REF-DBL", 1, ff_ref_idct, ff_ref_idct, NO_PERM},
+ {"INT", 1, j_rev_dct, ff_ref_idct, MMX_PERM},
+ {"SIMPLE-C", 1, ff_simple_idct, ff_ref_idct, NO_PERM},
#if HAVE_MMX
- {"MMX", 0, ff_fdct_mmx, fdct, NO_PERM, FF_MM_MMX},
+ {"MMX", 0, ff_fdct_mmx, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_MMX},
#if HAVE_MMX2
- {"MMX2", 0, ff_fdct_mmx2, fdct, NO_PERM, FF_MM_MMXEXT},
- {"SSE2", 0, ff_fdct_sse2, fdct, NO_PERM, FF_MM_SSE2},
+ {"MMX2", 0, ff_fdct_mmx2, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_MMX2},
+ {"SSE2", 0, ff_fdct_sse2, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_SSE2},
#endif
#if CONFIG_GPL
- {"LIBMPEG2-MMX", 1, ff_mmx_idct, idct, MMX_PERM, FF_MM_MMX},
- {"LIBMPEG2-MMXEXT", 1, ff_mmxext_idct, idct, MMX_PERM, FF_MM_MMXEXT},
+ {"LIBMPEG2-MMX", 1, ff_mmx_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX},
+ {"LIBMPEG2-MMX2", 1, ff_mmxext_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX2},
#endif
- {"SIMPLE-MMX", 1, ff_simple_idct_mmx, idct, MMX_SIMPLE_PERM, FF_MM_MMX},
- {"XVID-MMX", 1, ff_idct_xvid_mmx, idct, NO_PERM, FF_MM_MMX},
- {"XVID-MMX2", 1, ff_idct_xvid_mmx2, idct, NO_PERM, FF_MM_MMXEXT},
- {"XVID-SSE2", 1, ff_idct_xvid_sse2, idct, SSE2_PERM, FF_MM_SSE2},
+ {"SIMPLE-MMX", 1, ff_simple_idct_mmx, ff_ref_idct, MMX_SIMPLE_PERM, AV_CPU_FLAG_MMX},
+ {"XVID-MMX", 1, ff_idct_xvid_mmx, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX},
+ {"XVID-MMX2", 1, ff_idct_xvid_mmx2, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX2},
+ {"XVID-SSE2", 1, ff_idct_xvid_sse2, ff_ref_idct, SSE2_PERM, AV_CPU_FLAG_SSE2},
#endif
#if HAVE_ALTIVEC
- {"altivecfdct", 0, fdct_altivec, fdct, NO_PERM, FF_MM_ALTIVEC},
+ {"altivecfdct", 0, fdct_altivec, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_ALTIVEC},
#endif
#if ARCH_BFIN
- {"BFINfdct", 0, ff_bfin_fdct, fdct, NO_PERM},
- {"BFINidct", 1, ff_bfin_idct, idct, NO_PERM},
+ {"BFINfdct", 0, ff_bfin_fdct, ff_ref_fdct, NO_PERM},
+ {"BFINidct", 1, ff_bfin_idct, ff_ref_idct, NO_PERM},
#endif
#if ARCH_ARM
- {"SIMPLE-ARM", 1, simple_idct_ARM, idct, NO_PERM },
- {"INT-ARM", 1, j_rev_dct_ARM, idct, MMX_PERM },
+ {"SIMPLE-ARM", 1, ff_simple_idct_arm, ff_ref_idct, NO_PERM },
+ {"INT-ARM", 1, ff_j_rev_dct_arm, ff_ref_idct, MMX_PERM },
#if HAVE_ARMV5TE
- {"SIMPLE-ARMV5TE", 1, simple_idct_armv5te, idct, NO_PERM },
+ {"SIMPLE-ARMV5TE", 1, ff_simple_idct_armv5te, ff_ref_idct, NO_PERM },
#endif
#if HAVE_ARMV6
- {"SIMPLE-ARMV6", 1, ff_simple_idct_armv6, idct, MMX_PERM },
+ {"SIMPLE-ARMV6", 1, ff_simple_idct_armv6, ff_ref_idct, MMX_PERM },
#endif
#if HAVE_NEON
- {"SIMPLE-NEON", 1, ff_simple_idct_neon, idct, PARTTRANS_PERM },
+ {"SIMPLE-NEON", 1, ff_simple_idct_neon, ff_ref_idct, PARTTRANS_PERM },
#endif
#endif /* ARCH_ARM */
+#if ARCH_ALPHA
+ {"SIMPLE-ALPHA", 1, ff_simple_idct_axp, ff_ref_idct, NO_PERM },
+#endif
+
{ 0 }
};
uint8_t cropTbl[256 + 2 * MAX_NEG_CROP];
-int64_t gettime(void)
+static int64_t gettime(void)
{
struct timeval tv;
gettimeofday(&tv,NULL);
static const uint8_t idct_sse2_row_perm[8] = {0, 4, 1, 5, 2, 6, 3, 7};
-void idct_mmx_init(void)
+static void idct_mmx_init(void)
{
int i;
}
}
-static DCTELEM block[64] __attribute__ ((aligned (16)));
-static DCTELEM block1[64] __attribute__ ((aligned (8)));
-static DCTELEM block_org[64] __attribute__ ((aligned (8)));
+DECLARE_ALIGNED(16, static DCTELEM, block)[64];
+DECLARE_ALIGNED(8, static DCTELEM, block1)[64];
+DECLARE_ALIGNED(8, static DCTELEM, block_org)[64];
static inline void mmx_emms(void)
{
#if HAVE_MMX
- if (cpu_flags & FF_MM_MMX)
+ if (cpu_flags & AV_CPU_FLAG_MMX)
__asm__ volatile ("emms\n\t");
#endif
}
-void dct_error(const char *name, int is_idct,
+static void dct_error(const char *name, int is_idct,
void (*fdct_func)(DCTELEM *block),
void (*fdct_ref)(DCTELEM *block), int form, int test)
{
int64_t sysErr[64], sysErrMax=0;
int maxout=0;
int blockSumErrMax=0, blockSumErr;
+ AVLFG prng;
- srandom(0);
+ av_lfg_init(&prng, 1);
err_inf = 0;
err2 = 0;
switch(test){
case 0:
for(i=0;i<64;i++)
- block1[i] = (random() % 512) -256;
+ block1[i] = (av_lfg_get(&prng) % 512) -256;
if (is_idct){
- fdct(block1);
+ ff_ref_fdct(block1);
for(i=0;i<64;i++)
block1[i]>>=3;
}
break;
case 1:{
- int num= (random()%10)+1;
+ int num = av_lfg_get(&prng) % 10 + 1;
for(i=0;i<num;i++)
- block1[random()%64] = (random() % 512) -256;
+ block1[av_lfg_get(&prng) % 64] = av_lfg_get(&prng) % 512 -256;
}break;
case 2:
- block1[0]= (random()%4096)-2048;
+ block1[0] = av_lfg_get(&prng) % 4096 - 2048;
block1[63]= (block1[0]&1)^1;
break;
}
#if 1 // dump systematic errors
for(i=0; i<64; i++){
if(i%8==0) printf("\n");
- printf("%5d ", (int)sysErr[i]);
+ printf("%7d ", (int)sysErr[i]);
}
printf("\n");
#endif
switch(test){
case 0:
for(i=0;i<64;i++)
- block1[i] = (random() % 512) -256;
+ block1[i] = av_lfg_get(&prng) % 512 -256;
if (is_idct){
- fdct(block1);
+ ff_ref_fdct(block1);
for(i=0;i<64;i++)
block1[i]>>=3;
break;
case 1:{
case 2:
- block1[0] = (random() % 512) -256;
- block1[1] = (random() % 512) -256;
- block1[2] = (random() % 512) -256;
- block1[3] = (random() % 512) -256;
+ 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;
}
#endif
}
-static uint8_t img_dest[64] __attribute__ ((aligned (8)));
-static uint8_t img_dest1[64] __attribute__ ((aligned (8)));
+DECLARE_ALIGNED(8, static uint8_t, img_dest)[64];
+DECLARE_ALIGNED(8, static uint8_t, img_dest1)[64];
-void idct248_ref(uint8_t *dest, int linesize, int16_t *block)
+static void idct248_ref(uint8_t *dest, int linesize, int16_t *block)
{
static int init;
static double c8[8][8];
}
}
-void idct248_error(const char *name,
+static void idct248_error(const char *name,
void (*idct248_put)(uint8_t *dest, int line_size, int16_t *block))
{
int it, i, it1, ti, ti1, err_max, v;
- srandom(0);
+ AVLFG prng;
+
+ av_lfg_init(&prng, 1);
/* just one test to see if code is correct (precision is less
important here) */
/* XXX: use forward transform to generate values */
for(i=0;i<64;i++)
- block1[i] = (random() % 256) - 128;
+ block1[i] = av_lfg_get(&prng) % 256 - 128;
block1[0] += 1024;
for(i=0; i<64; i++)
name, (double)it1 * 1000.0 / (double)ti1);
}
-void help(void)
+static void help(void)
{
printf("dct-test [-i] [<test-number>]\n"
"test-number 0 -> test with random matrixes\n"
int test_idct = 0, test_248_dct = 0;
int c,i;
int test=1;
- cpu_flags = mm_support();
+ cpu_flags = av_get_cpu_flags();
- init_fdct();
+ ff_ref_dct_init();
idct_mmx_init();
for(i=0;i<256;i++) cropTbl[i + MAX_NEG_CROP] = i;