]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/dct-test.c
correctly patch syncword for samples rates < 16000, decoder now fully support all...
[ffmpeg] / libavcodec / dct-test.c
index 451e92da752afb41dec31f16a8de0d06863cfb26..f3202cff14304c4609a228829919bac4de5fe978 100644 (file)
@@ -36,6 +36,8 @@
 
 #include "simple_idct.h"
 #include "faandct.h"
+#include "faanidct.h"
+#include "i386/idct_xvid.h"
 
 #ifndef MAX
 #define MAX(a, b)  (((a) > (b)) ? (a) : (b))
@@ -49,8 +51,6 @@ void *fast_memcpy(void *a, const void *b, size_t c){return memcpy(a,b,c);};
 /* reference fdct/idct */
 extern void fdct(DCTELEM *block);
 extern void idct(DCTELEM *block);
-extern void ff_idct_xvid_mmx(DCTELEM *block);
-extern void ff_idct_xvid_mmx2(DCTELEM *block);
 extern void init_fdct();
 
 extern void ff_mmx_idct(DCTELEM *data);
@@ -72,7 +72,8 @@ struct algo {
   enum { FDCT, IDCT } is_idct;
   void (* func) (DCTELEM *block);
   void (* ref)  (DCTELEM *block);
-  enum formattag { NO_PERM,MMX_PERM, MMX_SIMPLE_PERM, SCALE_PERM } format;
+  enum formattag { NO_PERM,MMX_PERM, MMX_SIMPLE_PERM, SCALE_PERM, SSE2_PERM } format;
+  int  mm_support;
 };
 
 #ifndef FAAN_POSTSCALE
@@ -81,40 +82,39 @@ struct algo {
 #define FAAN_SCALE NO_PERM
 #endif
 
-#define DCT_ERROR(name,is_idct,func,ref,form) {name,is_idct,func,ref,form}
-
-
 struct algo algos[] = {
-  DCT_ERROR( "REF-DBL",        0, fdct,               fdct, NO_PERM),
-  DCT_ERROR("FAAN",            0, ff_faandct,         fdct, FAAN_SCALE),
-  DCT_ERROR("IJG-AAN-INT",     0, fdct_ifast,         fdct, SCALE_PERM),
-  DCT_ERROR("IJG-LLM-INT",     0, ff_jpeg_fdct_islow, fdct, NO_PERM),
-  DCT_ERROR("REF-DBL",         1, idct,               idct, NO_PERM),
-  DCT_ERROR("INT",             1, j_rev_dct,          idct, MMX_PERM),
-  DCT_ERROR("SIMPLE-C",        1, simple_idct,        idct, NO_PERM),
+  {"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},
 
 #ifdef HAVE_MMX
-  DCT_ERROR("MMX",             0, ff_fdct_mmx,        fdct, NO_PERM),
+  {"MMX",             0, ff_fdct_mmx,        fdct, NO_PERM, MM_MMX},
 #ifdef HAVE_MMX2
-  DCT_ERROR("MMX2",            0, ff_fdct_mmx2,       fdct, NO_PERM),
+  {"MMX2",            0, ff_fdct_mmx2,       fdct, NO_PERM, MM_MMXEXT},
 #endif
 
 #ifdef CONFIG_GPL
-  DCT_ERROR("LIBMPEG2-MMX",    1, ff_mmx_idct,        idct, MMX_PERM),
-  DCT_ERROR("LIBMPEG2-MMXEXT", 1, ff_mmxext_idct,     idct, MMX_PERM),
+  {"LIBMPEG2-MMX",    1, ff_mmx_idct,        idct, MMX_PERM, MM_MMX},
+  {"LIBMPEG2-MMXEXT", 1, ff_mmxext_idct,     idct, MMX_PERM, MM_MMXEXT},
 #endif
-  DCT_ERROR("SIMPLE-MMX",      1, ff_simple_idct_mmx, idct, MMX_SIMPLE_PERM),
-  DCT_ERROR("XVID-MMX",        1, ff_idct_xvid_mmx,   idct, NO_PERM),
-  DCT_ERROR("XVID-MMX2",       1, ff_idct_xvid_mmx2,  idct, NO_PERM),
+  {"SIMPLE-MMX",      1, ff_simple_idct_mmx, idct, MMX_SIMPLE_PERM, MM_MMX},
+  {"XVID-MMX",        1, ff_idct_xvid_mmx,   idct, NO_PERM, MM_MMX},
+  {"XVID-MMX2",       1, ff_idct_xvid_mmx2,  idct, NO_PERM, MM_MMXEXT},
+  {"XVID-SSE2",       1, ff_idct_xvid_sse2,  idct, SSE2_PERM, MM_SSE2},
 #endif
 
 #ifdef HAVE_ALTIVEC
-  DCT_ERROR("altivecfdct",     0, fdct_altivec,       fdct, NO_PERM),
+  {"altivecfdct",     0, fdct_altivec,       fdct, NO_PERM, MM_ALTIVEC},
 #endif
 
 #ifdef ARCH_BFIN
-  DCT_ERROR("BFINfdct",        0, ff_bfin_fdct,       fdct, NO_PERM),
-  DCT_ERROR("BFINidct",        1, ff_bfin_idct,       idct, NO_PERM),
+  {"BFINfdct",        0, ff_bfin_fdct,       fdct, NO_PERM},
+  {"BFINidct",        1, ff_bfin_idct,       idct, NO_PERM},
 #endif
 
   { 0 }
@@ -158,6 +158,8 @@ static short idct_simple_mmx_perm[64]={
         0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
 };
 
+static const uint8_t idct_sse2_row_perm[8] = {0, 4, 1, 5, 2, 6, 3, 7};
+
 void idct_mmx_init(void)
 {
     int i;
@@ -169,7 +171,7 @@ void idct_mmx_init(void)
     }
 }
 
-static DCTELEM block[64] __attribute__ ((aligned (8)));
+static DCTELEM block[64] __attribute__ ((aligned (16)));
 static DCTELEM block1[64] __attribute__ ((aligned (8)));
 static DCTELEM block_org[64] __attribute__ ((aligned (8)));
 
@@ -233,6 +235,9 @@ void dct_error(const char *name, int is_idct,
             for(i=0;i<64;i++)
                 block[idct_simple_mmx_perm[i]] = block1[i];
 
+        } else if (form == SSE2_PERM) {
+            for(i=0; i<64; i++)
+                block[(i&0x38) | idct_sse2_row_perm[i&7]] = block1[i];
         } else {
             for(i=0; i<64; i++)
                 block[i]= block1[i];
@@ -529,6 +534,7 @@ int main(int argc, char **argv)
 
     init_fdct();
     idct_mmx_init();
+    mm_flags = mm_support();
 
     for(i=0;i<256;i++) cropTbl[i + MAX_NEG_CROP] = i;
     for(i=0;i<MAX_NEG_CROP;i++) {
@@ -559,10 +565,10 @@ int main(int argc, char **argv)
     printf("ffmpeg DCT/IDCT test\n");
 
     if (test_248_dct) {
-        idct248_error("SIMPLE-C", simple_idct248_put);
+        idct248_error("SIMPLE-C", ff_simple_idct248_put);
     } else {
       for (i=0;algos[i].name;i++)
-        if (algos[i].is_idct == test_idct) {
+        if (algos[i].is_idct == test_idct && !(~mm_flags & algos[i].mm_support)) {
           dct_error (algos[i].name, algos[i].is_idct, algos[i].func, algos[i].ref, algos[i].format, test);
         }
     }