Mercurial > libavcodec.hg
comparison dct-test.c @ 2967:ef2149182f1c libavcodec
COSMETICS: Remove all trailing whitespace.
author | diego |
---|---|
date | Sat, 17 Dec 2005 18:14:38 +0000 |
parents | 062b2d5d1eba |
children | bfabfdf9ce55 |
comparison
equal
deleted
inserted
replaced
2966:564788471dd4 | 2967:ef2149182f1c |
---|---|
1 /** | 1 /** |
2 * @file dct-test.c | 2 * @file dct-test.c |
3 * DCT test. (c) 2001 Fabrice Bellard. | 3 * DCT test. (c) 2001 Fabrice Bellard. |
4 * Started from sample code by Juan J. Sierralta P. | 4 * Started from sample code by Juan J. Sierralta P. |
5 */ | 5 */ |
6 | 6 |
7 #include <stdlib.h> | 7 #include <stdlib.h> |
8 #include <stdio.h> | 8 #include <stdio.h> |
63 #define NB_ITS_SPEED 50000 | 63 #define NB_ITS_SPEED 50000 |
64 | 64 |
65 static short idct_mmx_perm[64]; | 65 static short idct_mmx_perm[64]; |
66 | 66 |
67 static short idct_simple_mmx_perm[64]={ | 67 static short idct_simple_mmx_perm[64]={ |
68 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D, | 68 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D, |
69 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D, | 69 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D, |
70 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D, | 70 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D, |
71 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F, | 71 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F, |
72 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F, | 72 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F, |
73 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D, | 73 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D, |
74 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F, | 74 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F, |
75 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F, | 75 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F, |
76 }; | 76 }; |
77 | 77 |
78 void idct_mmx_init(void) | 78 void idct_mmx_init(void) |
79 { | 79 { |
108 for(i=0; i<64; i++) sysErr[i]=0; | 108 for(i=0; i<64; i++) sysErr[i]=0; |
109 for(it=0;it<NB_ITS;it++) { | 109 for(it=0;it<NB_ITS;it++) { |
110 for(i=0;i<64;i++) | 110 for(i=0;i<64;i++) |
111 block1[i] = 0; | 111 block1[i] = 0; |
112 switch(test){ | 112 switch(test){ |
113 case 0: | 113 case 0: |
114 for(i=0;i<64;i++) | 114 for(i=0;i<64;i++) |
115 block1[i] = (random() % 512) -256; | 115 block1[i] = (random() % 512) -256; |
116 if (is_idct){ | 116 if (is_idct){ |
117 fdct(block1); | 117 fdct(block1); |
118 | 118 |
134 #if 0 // simulate mismatch control | 134 #if 0 // simulate mismatch control |
135 { int sum=0; | 135 { int sum=0; |
136 for(i=0;i<64;i++) | 136 for(i=0;i<64;i++) |
137 sum+=block1[i]; | 137 sum+=block1[i]; |
138 | 138 |
139 if((sum&1)==0) block1[63]^=1; | 139 if((sum&1)==0) block1[63]^=1; |
140 } | 140 } |
141 #endif | 141 #endif |
142 | 142 |
143 for(i=0; i<64; i++) | 143 for(i=0; i<64; i++) |
144 block_org[i]= block1[i]; | 144 block_org[i]= block1[i]; |
158 #if 0 // simulate mismatch control for tested IDCT but not the ref | 158 #if 0 // simulate mismatch control for tested IDCT but not the ref |
159 { int sum=0; | 159 { int sum=0; |
160 for(i=0;i<64;i++) | 160 for(i=0;i<64;i++) |
161 sum+=block[i]; | 161 sum+=block[i]; |
162 | 162 |
163 if((sum&1)==0) block[63]^=1; | 163 if((sum&1)==0) block[63]^=1; |
164 } | 164 } |
165 #endif | 165 #endif |
166 | 166 |
167 fdct_func(block); | 167 fdct_func(block); |
168 emms(); /* for ff_mmx_idct */ | 168 emms(); /* for ff_mmx_idct */ |
169 | 169 |
170 if (fdct_func == fdct_ifast | 170 if (fdct_func == fdct_ifast |
171 #ifndef FAAN_POSTSCALE | 171 #ifndef FAAN_POSTSCALE |
172 || fdct_func == ff_faandct | 172 || fdct_func == ff_faandct |
173 #endif | 173 #endif |
174 ) { | 174 ) { |
175 for(i=0; i<64; i++) { | 175 for(i=0; i<64; i++) { |
176 scale = 8*(1 << (AANSCALE_BITS + 11)) / aanscales[i]; | 176 scale = 8*(1 << (AANSCALE_BITS + 11)) / aanscales[i]; |
204 } | 204 } |
205 } | 205 } |
206 #endif | 206 #endif |
207 } | 207 } |
208 for(i=0; i<64; i++) sysErrMax= MAX(sysErrMax, ABS(sysErr[i])); | 208 for(i=0; i<64; i++) sysErrMax= MAX(sysErrMax, ABS(sysErr[i])); |
209 | 209 |
210 #if 1 // dump systematic errors | 210 #if 1 // dump systematic errors |
211 for(i=0; i<64; i++){ | 211 for(i=0; i<64; i++){ |
212 if(i%8==0) printf("\n"); | 212 if(i%8==0) printf("\n"); |
213 printf("%5d ", (int)sysErr[i]); | 213 printf("%5d ", (int)sysErr[i]); |
214 } | 214 } |
215 printf("\n"); | 215 printf("\n"); |
216 #endif | 216 #endif |
217 | 217 |
218 printf("%s %s: err_inf=%d err2=%0.8f syserr=%0.8f maxout=%d blockSumErr=%d\n", | 218 printf("%s %s: err_inf=%d err2=%0.8f syserr=%0.8f maxout=%d blockSumErr=%d\n", |
219 is_idct ? "IDCT" : "DCT", | 219 is_idct ? "IDCT" : "DCT", |
220 name, err_inf, (double)err2 / NB_ITS / 64.0, (double)sysErrMax / NB_ITS, maxout, blockSumErrMax); | 220 name, err_inf, (double)err2 / NB_ITS / 64.0, (double)sysErrMax / NB_ITS, maxout, blockSumErrMax); |
221 #if 1 //Speed test | 221 #if 1 //Speed test |
222 /* speed test */ | 222 /* speed test */ |
223 for(i=0;i<64;i++) | 223 for(i=0;i<64;i++) |
224 block1[i] = 0; | 224 block1[i] = 0; |
225 switch(test){ | 225 switch(test){ |
226 case 0: | 226 case 0: |
227 for(i=0;i<64;i++) | 227 for(i=0;i<64;i++) |
228 block1[i] = (random() % 512) -256; | 228 block1[i] = (random() % 512) -256; |
229 if (is_idct){ | 229 if (is_idct){ |
230 fdct(block1); | 230 fdct(block1); |
231 | 231 |
296 s = (i==0) ? sqrt(1.0/8.0) : sqrt(1.0/4.0); | 296 s = (i==0) ? sqrt(1.0/8.0) : sqrt(1.0/4.0); |
297 c8[i][j] = s * cos(M_PI * i * (j + 0.5) / 8.0); | 297 c8[i][j] = s * cos(M_PI * i * (j + 0.5) / 8.0); |
298 sum += c8[i][j] * c8[i][j]; | 298 sum += c8[i][j] * c8[i][j]; |
299 } | 299 } |
300 } | 300 } |
301 | 301 |
302 for(i=0;i<4;i++) { | 302 for(i=0;i<4;i++) { |
303 sum = 0; | 303 sum = 0; |
304 for(j=0;j<4;j++) { | 304 for(j=0;j<4;j++) { |
305 s = (i==0) ? sqrt(1.0/4.0) : sqrt(1.0/2.0); | 305 s = (i==0) ? sqrt(1.0/4.0) : sqrt(1.0/2.0); |
306 c4[i][j] = s * cos(M_PI * i * (j + 0.5) / 4.0); | 306 c4[i][j] = s * cos(M_PI * i * (j + 0.5) / 4.0); |
356 dest[i * linesize + j] = (int)rint(v); | 356 dest[i * linesize + j] = (int)rint(v); |
357 } | 357 } |
358 } | 358 } |
359 } | 359 } |
360 | 360 |
361 void idct248_error(const char *name, | 361 void idct248_error(const char *name, |
362 void (*idct248_put)(uint8_t *dest, int line_size, int16_t *block)) | 362 void (*idct248_put)(uint8_t *dest, int line_size, int16_t *block)) |
363 { | 363 { |
364 int it, i, it1, ti, ti1, err_max, v; | 364 int it, i, it1, ti, ti1, err_max, v; |
365 | 365 |
366 srandom(0); | 366 srandom(0); |
367 | 367 |
368 /* just one test to see if code is correct (precision is less | 368 /* just one test to see if code is correct (precision is less |
369 important here) */ | 369 important here) */ |
370 err_max = 0; | 370 err_max = 0; |
371 for(it=0;it<NB_ITS;it++) { | 371 for(it=0;it<NB_ITS;it++) { |
372 | 372 |
373 /* XXX: use forward transform to generate values */ | 373 /* XXX: use forward transform to generate values */ |
374 for(i=0;i<64;i++) | 374 for(i=0;i<64;i++) |
375 block1[i] = (random() % 256) - 128; | 375 block1[i] = (random() % 256) - 128; |
376 block1[0] += 1024; | 376 block1[0] += 1024; |
377 | 377 |
378 for(i=0; i<64; i++) | 378 for(i=0; i<64; i++) |
379 block[i]= block1[i]; | 379 block[i]= block1[i]; |
380 idct248_ref(img_dest1, 8, block); | 380 idct248_ref(img_dest1, 8, block); |
381 | 381 |
382 for(i=0; i<64; i++) | 382 for(i=0; i<64; i++) |
383 block[i]= block1[i]; | 383 block[i]= block1[i]; |
384 idct248_put(img_dest, 8, block); | 384 idct248_put(img_dest, 8, block); |
385 | 385 |
386 for(i=0;i<64;i++) { | 386 for(i=0;i<64;i++) { |
387 v = abs((int)img_dest[i] - (int)img_dest1[i]); | 387 v = abs((int)img_dest[i] - (int)img_dest1[i]); |
388 if (v == 255) | 388 if (v == 255) |
389 printf("%d %d\n", img_dest[i], img_dest1[i]); | 389 printf("%d %d\n", img_dest[i], img_dest1[i]); |
390 if (v > err_max) | 390 if (v > err_max) |
397 for(j=0;j<8;j++) { | 397 for(j=0;j<8;j++) { |
398 printf(" %3d", img_dest1[i*8+j]); | 398 printf(" %3d", img_dest1[i*8+j]); |
399 } | 399 } |
400 printf("\n"); | 400 printf("\n"); |
401 } | 401 } |
402 | 402 |
403 printf("out=\n"); | 403 printf("out=\n"); |
404 for(i=0;i<8;i++) { | 404 for(i=0;i<8;i++) { |
405 int j; | 405 int j; |
406 for(j=0;j<8;j++) { | 406 for(j=0;j<8;j++) { |
407 printf(" %3d", img_dest[i*8+j]); | 407 printf(" %3d", img_dest[i*8+j]); |
457 for(i=0;i<256;i++) cropTbl[i + MAX_NEG_CROP] = i; | 457 for(i=0;i<256;i++) cropTbl[i + MAX_NEG_CROP] = i; |
458 for(i=0;i<MAX_NEG_CROP;i++) { | 458 for(i=0;i<MAX_NEG_CROP;i++) { |
459 cropTbl[i] = 0; | 459 cropTbl[i] = 0; |
460 cropTbl[i + MAX_NEG_CROP + 256] = 255; | 460 cropTbl[i + MAX_NEG_CROP + 256] = 255; |
461 } | 461 } |
462 | 462 |
463 for(;;) { | 463 for(;;) { |
464 c = getopt(argc, argv, "ih4"); | 464 c = getopt(argc, argv, "ih4"); |
465 if (c == -1) | 465 if (c == -1) |
466 break; | 466 break; |
467 switch(c) { | 467 switch(c) { |
475 case 'h': | 475 case 'h': |
476 help(); | 476 help(); |
477 break; | 477 break; |
478 } | 478 } |
479 } | 479 } |
480 | 480 |
481 if(optind <argc) test= atoi(argv[optind]); | 481 if(optind <argc) test= atoi(argv[optind]); |
482 | 482 |
483 printf("ffmpeg DCT/IDCT test\n"); | 483 printf("ffmpeg DCT/IDCT test\n"); |
484 | 484 |
485 if (test_248_dct) { | 485 if (test_248_dct) { |
486 idct248_error("SIMPLE-C", simple_idct248_put); | 486 idct248_error("SIMPLE-C", simple_idct248_put); |
487 } else { | 487 } else { |