1 | /**
|
---|
2 | * @file dct-test.c
|
---|
3 | * DCT test. (c) 2001 Fabrice Bellard.
|
---|
4 | * Started from sample code by Juan J. Sierralta P.
|
---|
5 | */
|
---|
6 |
|
---|
7 | #include <stdlib.h>
|
---|
8 | #include <stdio.h>
|
---|
9 | #include <string.h>
|
---|
10 | #include <sys/time.h>
|
---|
11 | #include <unistd.h>
|
---|
12 |
|
---|
13 | #include "dsputil.h"
|
---|
14 |
|
---|
15 | #include "simple_idct.h"
|
---|
16 | #include "faandct.h"
|
---|
17 |
|
---|
18 | #ifndef MAX
|
---|
19 | #define MAX(a, b) (((a) > (b)) ? (a) : (b))
|
---|
20 | #endif
|
---|
21 |
|
---|
22 | #undef printf
|
---|
23 |
|
---|
24 | void *fast_memcpy(void *a, const void *b, size_t c){return memcpy(a,b,c);};
|
---|
25 |
|
---|
26 | /* reference fdct/idct */
|
---|
27 | extern void fdct(DCTELEM *block);
|
---|
28 | extern void idct(DCTELEM *block);
|
---|
29 | extern void ff_idct_xvid_mmx(DCTELEM *block);
|
---|
30 | extern void ff_idct_xvid_mmx2(DCTELEM *block);
|
---|
31 | extern void init_fdct();
|
---|
32 |
|
---|
33 | extern void j_rev_dct(DCTELEM *data);
|
---|
34 | extern void ff_mmx_idct(DCTELEM *data);
|
---|
35 | extern void ff_mmxext_idct(DCTELEM *data);
|
---|
36 |
|
---|
37 | extern void odivx_idct_c (short *block);
|
---|
38 |
|
---|
39 | #define AANSCALE_BITS 12
|
---|
40 | static const unsigned short aanscales[64] = {
|
---|
41 | /* precomputed values scaled up by 14 bits */
|
---|
42 | 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
|
---|
43 | 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
|
---|
44 | 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
|
---|
45 | 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
|
---|
46 | 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
|
---|
47 | 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
|
---|
48 | 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,
|
---|
49 | 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247
|
---|
50 | };
|
---|
51 |
|
---|
52 | uint8_t cropTbl[256 + 2 * MAX_NEG_CROP];
|
---|
53 |
|
---|
54 | int64_t gettime(void)
|
---|
55 | {
|
---|
56 | struct timeval tv;
|
---|
57 | gettimeofday(&tv,NULL);
|
---|
58 | return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
|
---|
59 | }
|
---|
60 |
|
---|
61 | #define NB_ITS 20000
|
---|
62 | #define NB_ITS_SPEED 50000
|
---|
63 |
|
---|
64 | static short idct_mmx_perm[64];
|
---|
65 |
|
---|
66 | static short idct_simple_mmx_perm[64]={
|
---|
67 | 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D,
|
---|
68 | 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D,
|
---|
69 | 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D,
|
---|
70 | 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F,
|
---|
71 | 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F,
|
---|
72 | 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D,
|
---|
73 | 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F,
|
---|
74 | 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
|
---|
75 | };
|
---|
76 |
|
---|
77 | void idct_mmx_init(void)
|
---|
78 | {
|
---|
79 | int i;
|
---|
80 |
|
---|
81 | /* the mmx/mmxext idct uses a reordered input, so we patch scan tables */
|
---|
82 | for (i = 0; i < 64; i++) {
|
---|
83 | idct_mmx_perm[i] = (i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2);
|
---|
84 | // idct_simple_mmx_perm[i] = simple_block_permute_op(i);
|
---|
85 | }
|
---|
86 | }
|
---|
87 |
|
---|
88 | static DCTELEM block[64] __attribute__ ((aligned (8)));
|
---|
89 | static DCTELEM block1[64] __attribute__ ((aligned (8)));
|
---|
90 | static DCTELEM block_org[64] __attribute__ ((aligned (8)));
|
---|
91 |
|
---|
92 | void dct_error(const char *name, int is_idct,
|
---|
93 | void (*fdct_func)(DCTELEM *block),
|
---|
94 | void (*fdct_ref)(DCTELEM *block), int test)
|
---|
95 | {
|
---|
96 | int it, i, scale;
|
---|
97 | int err_inf, v;
|
---|
98 | int64_t err2, ti, ti1, it1;
|
---|
99 | int64_t sysErr[64], sysErrMax=0;
|
---|
100 | int maxout=0;
|
---|
101 | int blockSumErrMax=0, blockSumErr;
|
---|
102 |
|
---|
103 | srandom(0);
|
---|
104 |
|
---|
105 | err_inf = 0;
|
---|
106 | err2 = 0;
|
---|
107 | for(i=0; i<64; i++) sysErr[i]=0;
|
---|
108 | for(it=0;it<NB_ITS;it++) {
|
---|
109 | for(i=0;i<64;i++)
|
---|
110 | block1[i] = 0;
|
---|
111 | switch(test){
|
---|
112 | case 0:
|
---|
113 | for(i=0;i<64;i++)
|
---|
114 | block1[i] = (random() % 512) -256;
|
---|
115 | if (is_idct){
|
---|
116 | fdct(block1);
|
---|
117 |
|
---|
118 | for(i=0;i<64;i++)
|
---|
119 | block1[i]>>=3;
|
---|
120 | }
|
---|
121 | break;
|
---|
122 | case 1:{
|
---|
123 | int num= (random()%10)+1;
|
---|
124 | for(i=0;i<num;i++)
|
---|
125 | block1[random()%64] = (random() % 512) -256;
|
---|
126 | }break;
|
---|
127 | case 2:
|
---|
128 | block1[0]= (random()%4096)-2048;
|
---|
129 | block1[63]= (block1[0]&1)^1;
|
---|
130 | break;
|
---|
131 | }
|
---|
132 |
|
---|
133 | #if 0 // simulate mismatch control
|
---|
134 | { int sum=0;
|
---|
135 | for(i=0;i<64;i++)
|
---|
136 | sum+=block1[i];
|
---|
137 |
|
---|
138 | if((sum&1)==0) block1[63]^=1;
|
---|
139 | }
|
---|
140 | #endif
|
---|
141 |
|
---|
142 | for(i=0; i<64; i++)
|
---|
143 | block_org[i]= block1[i];
|
---|
144 |
|
---|
145 | if (fdct_func == ff_mmx_idct ||
|
---|
146 | fdct_func == j_rev_dct || fdct_func == ff_mmxext_idct) {
|
---|
147 | for(i=0;i<64;i++)
|
---|
148 | block[idct_mmx_perm[i]] = block1[i];
|
---|
149 | } else if(fdct_func == ff_simple_idct_mmx ) {
|
---|
150 | for(i=0;i<64;i++)
|
---|
151 | block[idct_simple_mmx_perm[i]] = block1[i];
|
---|
152 |
|
---|
153 | } else {
|
---|
154 | for(i=0; i<64; i++)
|
---|
155 | block[i]= block1[i];
|
---|
156 | }
|
---|
157 | #if 0 // simulate mismatch control for tested IDCT but not the ref
|
---|
158 | { int sum=0;
|
---|
159 | for(i=0;i<64;i++)
|
---|
160 | sum+=block[i];
|
---|
161 |
|
---|
162 | if((sum&1)==0) block[63]^=1;
|
---|
163 | }
|
---|
164 | #endif
|
---|
165 |
|
---|
166 | fdct_func(block);
|
---|
167 | emms(); /* for ff_mmx_idct */
|
---|
168 |
|
---|
169 | if (fdct_func == fdct_ifast
|
---|
170 | #ifndef FAAN_POSTSCALE
|
---|
171 | || fdct_func == ff_faandct
|
---|
172 | #endif
|
---|
173 | ) {
|
---|
174 | for(i=0; i<64; i++) {
|
---|
175 | scale = 8*(1 << (AANSCALE_BITS + 11)) / aanscales[i];
|
---|
176 | block[i] = (block[i] * scale /*+ (1<<(AANSCALE_BITS-1))*/) >> AANSCALE_BITS;
|
---|
177 | }
|
---|
178 | }
|
---|
179 |
|
---|
180 | fdct_ref(block1);
|
---|
181 |
|
---|
182 | blockSumErr=0;
|
---|
183 | for(i=0;i<64;i++) {
|
---|
184 | v = abs(block[i] - block1[i]);
|
---|
185 | if (v > err_inf)
|
---|
186 | err_inf = v;
|
---|
187 | err2 += v * v;
|
---|
188 | sysErr[i] += block[i] - block1[i];
|
---|
189 | blockSumErr += v;
|
---|
190 | if( abs(block[i])>maxout) maxout=abs(block[i]);
|
---|
191 | }
|
---|
192 | if(blockSumErrMax < blockSumErr) blockSumErrMax= blockSumErr;
|
---|
193 | #if 0 // print different matrix pairs
|
---|
194 | if(blockSumErr){
|
---|
195 | printf("\n");
|
---|
196 | for(i=0; i<64; i++){
|
---|
197 | if((i&7)==0) printf("\n");
|
---|
198 | printf("%4d ", block_org[i]);
|
---|
199 | }
|
---|
200 | for(i=0; i<64; i++){
|
---|
201 | if((i&7)==0) printf("\n");
|
---|
202 | printf("%4d ", block[i] - block1[i]);
|
---|
203 | }
|
---|
204 | }
|
---|
205 | #endif
|
---|
206 | }
|
---|
207 | for(i=0; i<64; i++) sysErrMax= MAX(sysErrMax, ABS(sysErr[i]));
|
---|
208 |
|
---|
209 | #if 1 // dump systematic errors
|
---|
210 | for(i=0; i<64; i++){
|
---|
211 | if(i%8==0) printf("\n");
|
---|
212 | printf("%5d ", (int)sysErr[i]);
|
---|
213 | }
|
---|
214 | printf("\n");
|
---|
215 | #endif
|
---|
216 |
|
---|
217 | printf("%s %s: err_inf=%d err2=%0.8f syserr=%0.8f maxout=%d blockSumErr=%d\n",
|
---|
218 | is_idct ? "IDCT" : "DCT",
|
---|
219 | name, err_inf, (double)err2 / NB_ITS / 64.0, (double)sysErrMax / NB_ITS, maxout, blockSumErrMax);
|
---|
220 | #if 1 //Speed test
|
---|
221 | /* speed test */
|
---|
222 | for(i=0;i<64;i++)
|
---|
223 | block1[i] = 0;
|
---|
224 | switch(test){
|
---|
225 | case 0:
|
---|
226 | for(i=0;i<64;i++)
|
---|
227 | block1[i] = (random() % 512) -256;
|
---|
228 | if (is_idct){
|
---|
229 | fdct(block1);
|
---|
230 |
|
---|
231 | for(i=0;i<64;i++)
|
---|
232 | block1[i]>>=3;
|
---|
233 | }
|
---|
234 | break;
|
---|
235 | case 1:{
|
---|
236 | case 2:
|
---|
237 | block1[0] = (random() % 512) -256;
|
---|
238 | block1[1] = (random() % 512) -256;
|
---|
239 | block1[2] = (random() % 512) -256;
|
---|
240 | block1[3] = (random() % 512) -256;
|
---|
241 | }break;
|
---|
242 | }
|
---|
243 |
|
---|
244 | if (fdct_func == ff_mmx_idct ||
|
---|
245 | fdct_func == j_rev_dct || fdct_func == ff_mmxext_idct) {
|
---|
246 | for(i=0;i<64;i++)
|
---|
247 | block[idct_mmx_perm[i]] = block1[i];
|
---|
248 | } else if(fdct_func == ff_simple_idct_mmx ) {
|
---|
249 | for(i=0;i<64;i++)
|
---|
250 | block[idct_simple_mmx_perm[i]] = block1[i];
|
---|
251 | } else {
|
---|
252 | for(i=0; i<64; i++)
|
---|
253 | block[i]= block1[i];
|
---|
254 | }
|
---|
255 |
|
---|
256 | ti = gettime();
|
---|
257 | it1 = 0;
|
---|
258 | do {
|
---|
259 | for(it=0;it<NB_ITS_SPEED;it++) {
|
---|
260 | for(i=0; i<64; i++)
|
---|
261 | block[i]= block1[i];
|
---|
262 | // memcpy(block, block1, sizeof(DCTELEM) * 64);
|
---|
263 | // dont memcpy especially not fastmemcpy because it does movntq !!!
|
---|
264 | fdct_func(block);
|
---|
265 | }
|
---|
266 | it1 += NB_ITS_SPEED;
|
---|
267 | ti1 = gettime() - ti;
|
---|
268 | } while (ti1 < 1000000);
|
---|
269 | emms();
|
---|
270 |
|
---|
271 | printf("%s %s: %0.1f kdct/s\n",
|
---|
272 | is_idct ? "IDCT" : "DCT",
|
---|
273 | name, (double)it1 * 1000.0 / (double)ti1);
|
---|
274 | #endif
|
---|
275 | }
|
---|
276 |
|
---|
277 | static uint8_t img_dest[64] __attribute__ ((aligned (8)));
|
---|
278 | static uint8_t img_dest1[64] __attribute__ ((aligned (8)));
|
---|
279 |
|
---|
280 | void idct248_ref(uint8_t *dest, int linesize, int16_t *block)
|
---|
281 | {
|
---|
282 | static int init;
|
---|
283 | static double c8[8][8];
|
---|
284 | static double c4[4][4];
|
---|
285 | double block1[64], block2[64], block3[64];
|
---|
286 | double s, sum, v;
|
---|
287 | int i, j, k;
|
---|
288 |
|
---|
289 | if (!init) {
|
---|
290 | init = 1;
|
---|
291 |
|
---|
292 | for(i=0;i<8;i++) {
|
---|
293 | sum = 0;
|
---|
294 | for(j=0;j<8;j++) {
|
---|
295 | s = (i==0) ? sqrt(1.0/8.0) : sqrt(1.0/4.0);
|
---|
296 | c8[i][j] = s * cos(M_PI * i * (j + 0.5) / 8.0);
|
---|
297 | sum += c8[i][j] * c8[i][j];
|
---|
298 | }
|
---|
299 | }
|
---|
300 |
|
---|
301 | for(i=0;i<4;i++) {
|
---|
302 | sum = 0;
|
---|
303 | for(j=0;j<4;j++) {
|
---|
304 | s = (i==0) ? sqrt(1.0/4.0) : sqrt(1.0/2.0);
|
---|
305 | c4[i][j] = s * cos(M_PI * i * (j + 0.5) / 4.0);
|
---|
306 | sum += c4[i][j] * c4[i][j];
|
---|
307 | }
|
---|
308 | }
|
---|
309 | }
|
---|
310 |
|
---|
311 | /* butterfly */
|
---|
312 | s = 0.5 * sqrt(2.0);
|
---|
313 | for(i=0;i<4;i++) {
|
---|
314 | for(j=0;j<8;j++) {
|
---|
315 | block1[8*(2*i)+j] = (block[8*(2*i)+j] + block[8*(2*i+1)+j]) * s;
|
---|
316 | block1[8*(2*i+1)+j] = (block[8*(2*i)+j] - block[8*(2*i+1)+j]) * s;
|
---|
317 | }
|
---|
318 | }
|
---|
319 |
|
---|
320 | /* idct8 on lines */
|
---|
321 | for(i=0;i<8;i++) {
|
---|
322 | for(j=0;j<8;j++) {
|
---|
323 | sum = 0;
|
---|
324 | for(k=0;k<8;k++)
|
---|
325 | sum += c8[k][j] * block1[8*i+k];
|
---|
326 | block2[8*i+j] = sum;
|
---|
327 | }
|
---|
328 | }
|
---|
329 |
|
---|
330 | /* idct4 */
|
---|
331 | for(i=0;i<8;i++) {
|
---|
332 | for(j=0;j<4;j++) {
|
---|
333 | /* top */
|
---|
334 | sum = 0;
|
---|
335 | for(k=0;k<4;k++)
|
---|
336 | sum += c4[k][j] * block2[8*(2*k)+i];
|
---|
337 | block3[8*(2*j)+i] = sum;
|
---|
338 |
|
---|
339 | /* bottom */
|
---|
340 | sum = 0;
|
---|
341 | for(k=0;k<4;k++)
|
---|
342 | sum += c4[k][j] * block2[8*(2*k+1)+i];
|
---|
343 | block3[8*(2*j+1)+i] = sum;
|
---|
344 | }
|
---|
345 | }
|
---|
346 |
|
---|
347 | /* clamp and store the result */
|
---|
348 | for(i=0;i<8;i++) {
|
---|
349 | for(j=0;j<8;j++) {
|
---|
350 | v = block3[8*i+j];
|
---|
351 | if (v < 0)
|
---|
352 | v = 0;
|
---|
353 | else if (v > 255)
|
---|
354 | v = 255;
|
---|
355 | dest[i * linesize + j] = (int)rint(v);
|
---|
356 | }
|
---|
357 | }
|
---|
358 | }
|
---|
359 |
|
---|
360 | void idct248_error(const char *name,
|
---|
361 | void (*idct248_put)(uint8_t *dest, int line_size, int16_t *block))
|
---|
362 | {
|
---|
363 | int it, i, it1, ti, ti1, err_max, v;
|
---|
364 |
|
---|
365 | srandom(0);
|
---|
366 |
|
---|
367 | /* just one test to see if code is correct (precision is less
|
---|
368 | important here) */
|
---|
369 | err_max = 0;
|
---|
370 | for(it=0;it<NB_ITS;it++) {
|
---|
371 |
|
---|
372 | /* XXX: use forward transform to generate values */
|
---|
373 | for(i=0;i<64;i++)
|
---|
374 | block1[i] = (random() % 256) - 128;
|
---|
375 | block1[0] += 1024;
|
---|
376 |
|
---|
377 | for(i=0; i<64; i++)
|
---|
378 | block[i]= block1[i];
|
---|
379 | idct248_ref(img_dest1, 8, block);
|
---|
380 |
|
---|
381 | for(i=0; i<64; i++)
|
---|
382 | block[i]= block1[i];
|
---|
383 | idct248_put(img_dest, 8, block);
|
---|
384 |
|
---|
385 | for(i=0;i<64;i++) {
|
---|
386 | v = abs((int)img_dest[i] - (int)img_dest1[i]);
|
---|
387 | if (v == 255)
|
---|
388 | printf("%d %d\n", img_dest[i], img_dest1[i]);
|
---|
389 | if (v > err_max)
|
---|
390 | err_max = v;
|
---|
391 | }
|
---|
392 | #if 0
|
---|
393 | printf("ref=\n");
|
---|
394 | for(i=0;i<8;i++) {
|
---|
395 | int j;
|
---|
396 | for(j=0;j<8;j++) {
|
---|
397 | printf(" %3d", img_dest1[i*8+j]);
|
---|
398 | }
|
---|
399 | printf("\n");
|
---|
400 | }
|
---|
401 |
|
---|
402 | printf("out=\n");
|
---|
403 | for(i=0;i<8;i++) {
|
---|
404 | int j;
|
---|
405 | for(j=0;j<8;j++) {
|
---|
406 | printf(" %3d", img_dest[i*8+j]);
|
---|
407 | }
|
---|
408 | printf("\n");
|
---|
409 | }
|
---|
410 | #endif
|
---|
411 | }
|
---|
412 | printf("%s %s: err_inf=%d\n",
|
---|
413 | 1 ? "IDCT248" : "DCT248",
|
---|
414 | name, err_max);
|
---|
415 |
|
---|
416 | ti = gettime();
|
---|
417 | it1 = 0;
|
---|
418 | do {
|
---|
419 | for(it=0;it<NB_ITS_SPEED;it++) {
|
---|
420 | for(i=0; i<64; i++)
|
---|
421 | block[i]= block1[i];
|
---|
422 | // memcpy(block, block1, sizeof(DCTELEM) * 64);
|
---|
423 | // dont memcpy especially not fastmemcpy because it does movntq !!!
|
---|
424 | idct248_put(img_dest, 8, block);
|
---|
425 | }
|
---|
426 | it1 += NB_ITS_SPEED;
|
---|
427 | ti1 = gettime() - ti;
|
---|
428 | } while (ti1 < 1000000);
|
---|
429 | emms();
|
---|
430 |
|
---|
431 | printf("%s %s: %0.1f kdct/s\n",
|
---|
432 | 1 ? "IDCT248" : "DCT248",
|
---|
433 | name, (double)it1 * 1000.0 / (double)ti1);
|
---|
434 | }
|
---|
435 |
|
---|
436 | void help(void)
|
---|
437 | {
|
---|
438 | printf("dct-test [-i] [<test-number>]\n"
|
---|
439 | "test-number 0 -> test with random matrixes\n"
|
---|
440 | " 1 -> test with random sparse matrixes\n"
|
---|
441 | " 2 -> do 3. test from mpeg4 std\n"
|
---|
442 | "-i test IDCT implementations\n"
|
---|
443 | "-4 test IDCT248 implementations\n");
|
---|
444 | exit(1);
|
---|
445 | }
|
---|
446 |
|
---|
447 | int main(int argc, char **argv)
|
---|
448 | {
|
---|
449 | int test_idct = 0, test_248_dct = 0;
|
---|
450 | int c,i;
|
---|
451 | int test=1;
|
---|
452 |
|
---|
453 | init_fdct();
|
---|
454 | idct_mmx_init();
|
---|
455 |
|
---|
456 | for(i=0;i<256;i++) cropTbl[i + MAX_NEG_CROP] = i;
|
---|
457 | for(i=0;i<MAX_NEG_CROP;i++) {
|
---|
458 | cropTbl[i] = 0;
|
---|
459 | cropTbl[i + MAX_NEG_CROP + 256] = 255;
|
---|
460 | }
|
---|
461 |
|
---|
462 | for(;;) {
|
---|
463 | c = getopt(argc, argv, "ih4");
|
---|
464 | if (c == -1)
|
---|
465 | break;
|
---|
466 | switch(c) {
|
---|
467 | case 'i':
|
---|
468 | test_idct = 1;
|
---|
469 | break;
|
---|
470 | case '4':
|
---|
471 | test_248_dct = 1;
|
---|
472 | break;
|
---|
473 | default :
|
---|
474 | case 'h':
|
---|
475 | help();
|
---|
476 | break;
|
---|
477 | }
|
---|
478 | }
|
---|
479 |
|
---|
480 | if(optind <argc) test= atoi(argv[optind]);
|
---|
481 |
|
---|
482 | printf("ffmpeg DCT/IDCT test\n");
|
---|
483 |
|
---|
484 | if (test_248_dct) {
|
---|
485 | idct248_error("SIMPLE-C", simple_idct248_put);
|
---|
486 | } else {
|
---|
487 | if (!test_idct) {
|
---|
488 | dct_error("REF-DBL", 0, fdct, fdct, test); /* only to verify code ! */
|
---|
489 | dct_error("IJG-AAN-INT", 0, fdct_ifast, fdct, test);
|
---|
490 | dct_error("IJG-LLM-INT", 0, ff_jpeg_fdct_islow, fdct, test);
|
---|
491 | dct_error("MMX", 0, ff_fdct_mmx, fdct, test);
|
---|
492 | dct_error("MMX2", 0, ff_fdct_mmx2, fdct, test);
|
---|
493 | dct_error("FAAN", 0, ff_faandct, fdct, test);
|
---|
494 | } else {
|
---|
495 | dct_error("REF-DBL", 1, idct, idct, test);
|
---|
496 | dct_error("INT", 1, j_rev_dct, idct, test);
|
---|
497 | dct_error("LIBMPEG2-MMX", 1, ff_mmx_idct, idct, test);
|
---|
498 | dct_error("LIBMPEG2-MMXEXT", 1, ff_mmxext_idct, idct, test);
|
---|
499 | dct_error("SIMPLE-C", 1, simple_idct, idct, test);
|
---|
500 | dct_error("SIMPLE-MMX", 1, ff_simple_idct_mmx, idct, test);
|
---|
501 | dct_error("XVID-MMX", 1, ff_idct_xvid_mmx, idct, test);
|
---|
502 | dct_error("XVID-MMX2", 1, ff_idct_xvid_mmx2, idct, test);
|
---|
503 | // dct_error("ODIVX-C", 1, odivx_idct_c, idct);
|
---|
504 | //printf(" test against odivx idct\n");
|
---|
505 | // dct_error("REF", 1, idct, odivx_idct_c);
|
---|
506 | // dct_error("INT", 1, j_rev_dct, odivx_idct_c);
|
---|
507 | // dct_error("MMX", 1, ff_mmx_idct, odivx_idct_c);
|
---|
508 | // dct_error("MMXEXT", 1, ff_mmxext_idct, odivx_idct_c);
|
---|
509 | // dct_error("SIMPLE-C", 1, simple_idct, odivx_idct_c);
|
---|
510 | // dct_error("SIMPLE-MMX", 1, ff_simple_idct_mmx, odivx_idct_c);
|
---|
511 | // dct_error("ODIVX-C", 1, odivx_idct_c, odivx_idct_c);
|
---|
512 | }
|
---|
513 | }
|
---|
514 | return 0;
|
---|
515 | }
|
---|