Mercurial > libavcodec.hg
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 } |