comparison dct-test.c @ 4755:b7c27288e509 libavcodec

platform-independent restructuring and code simplification patch by Marc Hoffman, mmh pleasantst com
author diego
date Sat, 31 Mar 2007 17:24:09 +0000
parents 0c378ce84378
children b77f43ff3991
comparison
equal deleted inserted replaced
4754:0c378ce84378 4755:b7c27288e509
1 /* 1 /*
2 * (c) 2001 Fabrice Bellard 2 * (c) 2001 Fabrice Bellard
3 * 2007 Marc Hoffman <marc.hoffman@analog.com>
3 * 4 *
4 * This file is part of FFmpeg. 5 * This file is part of FFmpeg.
5 * 6 *
6 * FFmpeg is free software; you can redistribute it and/or 7 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public 8 * modify it under the terms of the GNU Lesser General Public
54 extern void ff_mmx_idct(DCTELEM *data); 55 extern void ff_mmx_idct(DCTELEM *data);
55 extern void ff_mmxext_idct(DCTELEM *data); 56 extern void ff_mmxext_idct(DCTELEM *data);
56 57
57 extern void odivx_idct_c (short *block); 58 extern void odivx_idct_c (short *block);
58 59
60 // BFIN
61 extern void ff_bfin_idct (DCTELEM *block) ;
62 extern void ff_bfin_fdct (DCTELEM *block) ;
63
64 // ALTIVEC
65 extern void fdct_altivec (DCTELEM *block);
66 //extern void idct_altivec (DCTELEM *block);?? no routine
67
68
69 struct algo {
70 char *name;
71 enum { FDCT, IDCT } is_idct;
72 void (* func) (DCTELEM *block);
73 void (* ref) (DCTELEM *block);
74 enum formattag { NO_PERM,MMX_PERM, MMX_SIMPLE_PERM, SCALE_PERM } format;
75 };
76
77 #ifndef FAAN_POSTSCALE
78 #define FAAN_SCALE SCALE_PERM
79 #else
80 #define FAAN_SCALE NO_PERM
81 #endif
82
83 #define DCT_ERROR(name,is_idct,func,ref,form) {name,is_idct,func,ref,form}
84
85
86 struct algo algos[] = {
87 DCT_ERROR( "REF-DBL", 0, fdct, fdct, NO_PERM),
88 DCT_ERROR("IJG-AAN-INT", 0, fdct_ifast, fdct, SCALE_PERM),
89 DCT_ERROR("IJG-LLM-INT", 0, ff_jpeg_fdct_islow, fdct, NO_PERM),
90 DCT_ERROR("REF-DBL", 1, idct, idct, NO_PERM),
91 DCT_ERROR("INT", 1, j_rev_dct, idct, MMX_PERM),
92 DCT_ERROR("SIMPLE-C", 1, simple_idct, idct, NO_PERM),
93
94 #ifdef ARCH_X86
95 DCT_ERROR("MMX", 0, ff_fdct_mmx, fdct, NO_PERM),
96 DCT_ERROR("MMX2", 0, ff_fdct_mmx2, fdct, NO_PERM),
97 DCT_ERROR("FAAN", 0, ff_faandct, fdct, FAAN_SCALE),
98
99 DCT_ERROR("LIBMPEG2-MMX", 1, ff_mmx_idct, idct, MMX_PERM),
100 DCT_ERROR("LIBMPEG2-MMXEXT", 1, ff_mmxext_idct, idct, MMX_PERM),
101 DCT_ERROR("SIMPLE-MMX", 1, ff_simple_idct_mmx, idct, MMX_SIMPLE_PERM),
102 DCT_ERROR("XVID-MMX", 1, ff_idct_xvid_mmx, idct, NO_PERM),
103 DCT_ERROR("XVID-MMX2", 1, ff_idct_xvid_mmx2, idct, NO_PERM),
104 #endif
105
106 #ifdef HAVE_ALTIVEC
107 DCT_ERROR("altivecfdct", 0, fdct_altivec, fdct, NO_PERM),
108 #endif
109
110 #ifdef ARCH_BFIN
111 DCT_ERROR("BFINfdct", 0, ff_bfin_fdct, fdct, NO_PERM),
112 DCT_ERROR("BFINidct", 1, ff_bfin_idct, idct, NO_PERM),
113 #endif
114
115 { 0 }
116 };
117
59 #define AANSCALE_BITS 12 118 #define AANSCALE_BITS 12
60 static const unsigned short aanscales[64] = { 119 static const unsigned short aanscales[64] = {
61 /* precomputed values scaled up by 14 bits */ 120 /* precomputed values scaled up by 14 bits */
62 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, 121 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
63 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, 122 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
109 static DCTELEM block1[64] __attribute__ ((aligned (8))); 168 static DCTELEM block1[64] __attribute__ ((aligned (8)));
110 static DCTELEM block_org[64] __attribute__ ((aligned (8))); 169 static DCTELEM block_org[64] __attribute__ ((aligned (8)));
111 170
112 void dct_error(const char *name, int is_idct, 171 void dct_error(const char *name, int is_idct,
113 void (*fdct_func)(DCTELEM *block), 172 void (*fdct_func)(DCTELEM *block),
114 void (*fdct_ref)(DCTELEM *block), int test) 173 void (*fdct_ref)(DCTELEM *block), int form, int test)
115 { 174 {
116 int it, i, scale; 175 int it, i, scale;
117 int err_inf, v; 176 int err_inf, v;
118 int64_t err2, ti, ti1, it1; 177 int64_t err2, ti, ti1, it1;
119 int64_t sysErr[64], sysErrMax=0; 178 int64_t sysErr[64], sysErrMax=0;
160 #endif 219 #endif
161 220
162 for(i=0; i<64; i++) 221 for(i=0; i<64; i++)
163 block_org[i]= block1[i]; 222 block_org[i]= block1[i];
164 223
165 if (fdct_func == ff_mmx_idct || 224 if (form == MMX_PERM) {
166 fdct_func == j_rev_dct || fdct_func == ff_mmxext_idct) {
167 for(i=0;i<64;i++) 225 for(i=0;i<64;i++)
168 block[idct_mmx_perm[i]] = block1[i]; 226 block[idct_mmx_perm[i]] = block1[i];
169 } else if(fdct_func == ff_simple_idct_mmx ) { 227 } else if (form == MMX_SIMPLE_PERM) {
170 for(i=0;i<64;i++) 228 for(i=0;i<64;i++)
171 block[idct_simple_mmx_perm[i]] = block1[i]; 229 block[idct_simple_mmx_perm[i]] = block1[i];
172 230
173 } else { 231 } else {
174 for(i=0; i<64; i++) 232 for(i=0; i<64; i++)
184 #endif 242 #endif
185 243
186 fdct_func(block); 244 fdct_func(block);
187 emms_c(); /* for ff_mmx_idct */ 245 emms_c(); /* for ff_mmx_idct */
188 246
189 if (fdct_func == fdct_ifast 247 if (form == SCALE_PERM) {
190 #ifndef FAAN_POSTSCALE
191 || fdct_func == ff_faandct
192 #endif
193 ) {
194 for(i=0; i<64; i++) { 248 for(i=0; i<64; i++) {
195 scale = 8*(1 << (AANSCALE_BITS + 11)) / aanscales[i]; 249 scale = 8*(1 << (AANSCALE_BITS + 11)) / aanscales[i];
196 block[i] = (block[i] * scale /*+ (1<<(AANSCALE_BITS-1))*/) >> AANSCALE_BITS; 250 block[i] = (block[i] * scale /*+ (1<<(AANSCALE_BITS-1))*/) >> AANSCALE_BITS;
197 } 251 }
198 } 252 }
259 block1[2] = (random() % 512) -256; 313 block1[2] = (random() % 512) -256;
260 block1[3] = (random() % 512) -256; 314 block1[3] = (random() % 512) -256;
261 }break; 315 }break;
262 } 316 }
263 317
264 if (fdct_func == ff_mmx_idct || 318 if (form == MMX_PERM) {
265 fdct_func == j_rev_dct || fdct_func == ff_mmxext_idct) {
266 for(i=0;i<64;i++) 319 for(i=0;i<64;i++)
267 block[idct_mmx_perm[i]] = block1[i]; 320 block[idct_mmx_perm[i]] = block1[i];
268 } else if(fdct_func == ff_simple_idct_mmx ) { 321 } else if(form == MMX_SIMPLE_PERM) {
269 for(i=0;i<64;i++) 322 for(i=0;i<64;i++)
270 block[idct_simple_mmx_perm[i]] = block1[i]; 323 block[idct_simple_mmx_perm[i]] = block1[i];
271 } else { 324 } else {
272 for(i=0; i<64; i++) 325 for(i=0; i<64; i++)
273 block[i]= block1[i]; 326 block[i]= block1[i];
501 printf("ffmpeg DCT/IDCT test\n"); 554 printf("ffmpeg DCT/IDCT test\n");
502 555
503 if (test_248_dct) { 556 if (test_248_dct) {
504 idct248_error("SIMPLE-C", simple_idct248_put); 557 idct248_error("SIMPLE-C", simple_idct248_put);
505 } else { 558 } else {
506 if (!test_idct) { 559 for (i=0;algos[i].name;i++)
507 dct_error("REF-DBL", 0, fdct, fdct, test); /* only to verify code ! */ 560 if (algos[i].is_idct == test_idct) {
508 dct_error("IJG-AAN-INT", 0, fdct_ifast, fdct, test); 561 dct_error (algos[i].name, algos[i].is_idct, algos[i].func, algos[i].ref, algos[i].format, test);
509 dct_error("IJG-LLM-INT", 0, ff_jpeg_fdct_islow, fdct, test);
510 dct_error("MMX", 0, ff_fdct_mmx, fdct, test);
511 dct_error("MMX2", 0, ff_fdct_mmx2, fdct, test);
512 dct_error("FAAN", 0, ff_faandct, fdct, test);
513 } else {
514 dct_error("REF-DBL", 1, idct, idct, test);
515 dct_error("INT", 1, j_rev_dct, idct, test);
516 dct_error("LIBMPEG2-MMX", 1, ff_mmx_idct, idct, test);
517 dct_error("LIBMPEG2-MMXEXT", 1, ff_mmxext_idct, idct, test);
518 dct_error("SIMPLE-C", 1, simple_idct, idct, test);
519 dct_error("SIMPLE-MMX", 1, ff_simple_idct_mmx, idct, test);
520 dct_error("XVID-MMX", 1, ff_idct_xvid_mmx, idct, test);
521 dct_error("XVID-MMX2", 1, ff_idct_xvid_mmx2, idct, test);
522 // dct_error("ODIVX-C", 1, odivx_idct_c, idct);
523 //printf(" test against odivx idct\n");
524 // dct_error("REF", 1, idct, odivx_idct_c);
525 // dct_error("INT", 1, j_rev_dct, odivx_idct_c);
526 // dct_error("MMX", 1, ff_mmx_idct, odivx_idct_c);
527 // dct_error("MMXEXT", 1, ff_mmxext_idct, odivx_idct_c);
528 // dct_error("SIMPLE-C", 1, simple_idct, odivx_idct_c);
529 // dct_error("SIMPLE-MMX", 1, ff_simple_idct_mmx, odivx_idct_c);
530 // dct_error("ODIVX-C", 1, odivx_idct_c, odivx_idct_c);
531 } 562 }
532 } 563 }
533 return 0; 564 return 0;
534 } 565 }