diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2005-02-01 01:21:32 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2005-02-01 01:21:32 +0000 |
commit | 0c90161f0fb905a79bc7c876f57c83f1e776419d (patch) | |
tree | 6bccd26d44fdeb7d51bd344c78f022f08324300a /tests/tiny_psnr.c | |
parent | b2eef2f0eae21b3f1075db63f84be906ba4df05c (diff) | |
download | ffmpeg-0c90161f0fb905a79bc7c876f57c83f1e776419d.tar.gz |
signed 16bit support
Originally committed as revision 3913 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'tests/tiny_psnr.c')
-rw-r--r-- | tests/tiny_psnr.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/tests/tiny_psnr.c b/tests/tiny_psnr.c index 996f040496..2f35670979 100644 --- a/tests/tiny_psnr.c +++ b/tests/tiny_psnr.c @@ -24,7 +24,7 @@ #define F 100 #define SIZE 2048 -uint64_t exp16_table[20]={ +uint64_t exp16_table[21]={ 65537, 65538, 65540, @@ -45,6 +45,7 @@ uint64_t exp16_table[20]={ 484249, 3578144, 195360063, + 582360139072LL, }; #if 1 // 16.16 fixpoint exp() @@ -60,14 +61,15 @@ static unsigned int exp16(unsigned int a){ return out; } // 16.16 fixpoint log() -static uint64_t log16(uint64_t a){ +static int64_t log16(uint64_t a){ int i; int out=0; - - assert(a >= (1<<16)); + + if(a < 1<<16) + return -log16((1LL<<32) / a); a<<=16; - for(i=19;i>=0;i--){ + for(i=20;i>=0;i--){ int64_t b= exp16_table[i]; if(a<(b<<16)) continue; out |= 1<<i; @@ -100,8 +102,10 @@ int main(int argc,char* argv[]){ FILE *f[2]; uint8_t buf[2][SIZE]; uint64_t psnr; + int len= argc<4 ? 1 : 2; + int64_t max= (1<<(8*len))-1; - if(argc!=3){ + if(argc<3){ printf("tiny_psnr <file1> <file2>\n"); return -1; } @@ -114,16 +118,20 @@ int main(int argc,char* argv[]){ if( fread(buf[1], SIZE, 1, f[1]) != 1) break; for(j=0; j<SIZE; i++,j++){ - const int a= buf[0][j]; - const int b= buf[1][j]; + int64_t a= buf[0][j]; + int64_t b= buf[1][j]; + if(len==2){ + a= (int16_t)(a | (buf[0][++j]<<8)); + b= (int16_t)(b | (buf[1][ j]<<8)); + } sse += (a-b) * (a-b); } } if(!i) i=1; - dev= int_sqrt((sse*F*F)/i); + dev= int_sqrt( ((sse/i)*F*F) + (((sse%i)*F*F) + i/2)/i ); if(sse) - psnr= (log16(256*256*255*255LL*i/sse)*284619LL*F + (1<<31)) / (1LL<<32); + psnr= ((2*log16(max<<16) + log16(i) - log16(sse))*284619LL*F + (1<<31)) / (1LL<<32); else psnr= 100*F-1; //floating point free infinity :) |