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 {