comparison dct-test.c @ 722:ff90043f4a2d libavcodec

in fact IDCT248 needs to be normalized as I suspected
author bellard
date Thu, 03 Oct 2002 21:03:59 +0000
parents 409bdaa0b964
children 0c32f81b42b2
comparison
equal deleted inserted replaced
721:71f669e9f633 722:ff90043f4a2d
297 } 297 }
298 } 298 }
299 } 299 }
300 300
301 /* butterfly */ 301 /* butterfly */
302 s = 0.5 * sqrt(2.0);
302 for(i=0;i<4;i++) { 303 for(i=0;i<4;i++) {
303 for(j=0;j<8;j++) { 304 for(j=0;j<8;j++) {
304 block1[8*(2*i)+j] = (block[8*(2*i)+j] + block[8*(2*i+1)+j]) * 0.5; 305 block1[8*(2*i)+j] = (block[8*(2*i)+j] + block[8*(2*i+1)+j]) * s;
305 block1[8*(2*i+1)+j] = (block[8*(2*i)+j] - block[8*(2*i+1)+j]) * 0.5; 306 block1[8*(2*i+1)+j] = (block[8*(2*i)+j] - block[8*(2*i+1)+j]) * s;
306 } 307 }
307 } 308 }
308 309
309 /* idct8 on lines */ 310 /* idct8 on lines */
310 for(i=0;i<8;i++) { 311 for(i=0;i<8;i++) {
334 } 335 }
335 336
336 /* clamp and store the result */ 337 /* clamp and store the result */
337 for(i=0;i<8;i++) { 338 for(i=0;i<8;i++) {
338 for(j=0;j<8;j++) { 339 for(j=0;j<8;j++) {
339 v = block3[8*i+j] + 128.0; 340 v = block3[8*i+j];
340 if (v < 0) 341 if (v < 0)
341 v = 0; 342 v = 0;
342 else if (v > 255) 343 else if (v > 255)
343 v = 255; 344 v = 255;
344 dest[i * linesize + j] = (int)rint(v); 345 dest[i * linesize + j] = (int)rint(v);
355 356
356 /* just one test to see if code is correct (precision is less 357 /* just one test to see if code is correct (precision is less
357 important here) */ 358 important here) */
358 err_max = 0; 359 err_max = 0;
359 for(it=0;it<NB_ITS;it++) { 360 for(it=0;it<NB_ITS;it++) {
360 for(i=0;i<64;i++)
361 block1[i] = (random() % 512) - 256;
362 361
362 /* XXX: use forward transform to generate values */
363 for(i=0;i<64;i++)
364 block1[i] = (random() % 256) - 128;
365 block1[0] += 1024;
366
363 for(i=0; i<64; i++) 367 for(i=0; i<64; i++)
364 block[i]= block1[i]; 368 block[i]= block1[i];
365 idct248_ref(img_dest1, 8, block); 369 idct248_ref(img_dest1, 8, block);
366 370
371 for(i=0; i<64; i++)
372 block[i]= block1[i];
373 idct248_put(img_dest, 8, block);
374
375 for(i=0;i<64;i++) {
376 v = abs((int)img_dest[i] - (int)img_dest1[i]);
377 if (v == 255)
378 printf("%d %d\n", img_dest[i], img_dest1[i]);
379 if (v > err_max)
380 err_max = v;
381 }
367 #if 0 382 #if 0
368 printf("ref=\n"); 383 printf("ref=\n");
369 for(i=0;i<8;i++) { 384 for(i=0;i<8;i++) {
370 int j; 385 int j;
371 for(j=0;j<8;j++) { 386 for(j=0;j<8;j++) {
372 printf(" %3d", img_dest1[i*8+j]); 387 printf(" %3d", img_dest1[i*8+j]);
373 } 388 }
374 printf("\n"); 389 printf("\n");
375 } 390 }
376 #endif
377 391
378 for(i=0; i<64; i++)
379 block[i]= block1[i];
380 idct248_put(img_dest, 8, block);
381
382 #if 0
383 printf("out=\n"); 392 printf("out=\n");
384 for(i=0;i<8;i++) { 393 for(i=0;i<8;i++) {
385 int j; 394 int j;
386 for(j=0;j<8;j++) { 395 for(j=0;j<8;j++) {
387 printf(" %3d", img_dest[i*8+j]); 396 printf(" %3d", img_dest[i*8+j]);
388 } 397 }
389 printf("\n"); 398 printf("\n");
390 } 399 }
391 #endif 400 #endif
392 for(i=0;i<64;i++) {
393 v = abs(img_dest[i] - img_dest1[i]);
394 if (v > err_max)
395 err_max = v;
396 }
397 } 401 }
398 printf("%s %s: err_inf=%d\n", 402 printf("%s %s: err_inf=%d\n",
399 1 ? "IDCT248" : "DCT248", 403 1 ? "IDCT248" : "DCT248",
400 name, err_max); 404 name, err_max);
401 405