diff --git a/libavcodec/dct-test.c b/libavcodec/dct-test.c index 1da23a1d8e..98848dcbf8 100644 --- a/libavcodec/dct-test.c +++ b/libavcodec/dct-test.c @@ -6,12 +6,21 @@ #include #include #include +#include #include "dsputil.h" +#include "i386/mmx.h" + +/* reference fdct/idct */ extern void fdct(DCTELEM *block); +extern void idct(DCTELEM *block); extern void init_fdct(); +extern void j_rev_dct(DCTELEM *data); +extern void ff_mmx_idct(DCTELEM *data); +extern void ff_mmxext_idct(DCTELEM *data); + #define AANSCALE_BITS 12 static const unsigned short aanscales[64] = { /* precomputed values scaled up by 14 bits */ @@ -35,11 +44,26 @@ INT64 gettime(void) #define NB_ITS 20000 #define NB_ITS_SPEED 50000 -void dct_error(const char *name, - void (*fdct_func)(DCTELEM *block)) +static short idct_mmx_perm[64]; + +void idct_mmx_init(void) +{ + int i; + + /* the mmx/mmxext idct uses a reordered input, so we patch scan tables */ + for (i = 0; i < 64; i++) { + idct_mmx_perm[i] = (i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2); + } +} + +static DCTELEM block[64] __attribute__ ((aligned (8))); +static DCTELEM block1[64] __attribute__ ((aligned (8))); + +void dct_error(const char *name, int is_idct, + void (*fdct_func)(DCTELEM *block), + void (*fdct_ref)(DCTELEM *block)) { int it, i, scale; - DCTELEM block[64], block1[64]; int err_inf, v; INT64 err2, ti, ti1, it1; @@ -50,9 +74,22 @@ void dct_error(const char *name, for(it=0;it