From 9e2a16e1a7b244fef9621e5fc944afefe5410367 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 31 Dec 2003 02:32:54 +0000 Subject: fixpoint log() for tiny_psnr so it can output actual PSNR Originally committed as revision 2640 to svn://svn.ffmpeg.org/ffmpeg/trunk --- tests/tiny_psnr.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 3 deletions(-) (limited to 'tests/tiny_psnr.c') diff --git a/tests/tiny_psnr.c b/tests/tiny_psnr.c index 2104dd4726..84ad90ebce 100644 --- a/tests/tiny_psnr.c +++ b/tests/tiny_psnr.c @@ -19,10 +19,63 @@ #include #include +#include #define F 100 #define SIZE 2048 +uint64_t exp16_table[20]={ + 65537, + 65538, + 65540, + 65544, + 65552, + 65568, + 65600, + 65664, + 65793, + 66050, + 66568, + 67616, + 69763, + 74262, + 84150, + 108051, + 178145, + 484249, + 3578144, + 195360063, +}; +#if 1 +// 16.16 fixpoint exp() +static unsigned int exp16(unsigned int a){ + int i; + int out= 1<<16; + + for(i=19;i>=0;i--){ + if(a&(1<>16; + } + + return out; +} +// 16.16 fixpoint log() +static uint64_t log16(uint64_t a){ + int i; + int out=0; + + assert(a >= (1<<16)); + a<<=16; + + for(i=19;i>=0;i--){ + if(a<(exp16_table[i]<<16)) continue; + out |= 1< \n"); @@ -66,9 +120,16 @@ int main(int argc,char* argv[]){ } dev= int_sqrt((sse*F*F)/i); + if(sse) + psnr= (log16(256*256*255*255LL*i/sse)*284619LL*F + (1<<31)) / (1LL<<32); + else + psnr= 100*F-1; //floating point free infinity :) - //FIXME someone should write a integer fixpoint log() function for bitexact PSNR scores ... - printf("stddev:%3d.%02d bytes:%d\n", (int)(dev/F), (int)(dev%F), i); - + printf("stddev:%3d.%02d PSNR:%2d.%02d bytes:%d\n", + (int)(dev/F), (int)(dev%F), + (int)(psnr/F), (int)(psnr%F), + i); return 0; } + + -- cgit v1.2.3