Commit 3da72429 authored by michael's avatar michael

signed 16bit support


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@3913 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 28967e59
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#define F 100 #define F 100
#define SIZE 2048 #define SIZE 2048
uint64_t exp16_table[20]={ uint64_t exp16_table[21]={
65537, 65537,
65538, 65538,
65540, 65540,
...@@ -45,6 +45,7 @@ uint64_t exp16_table[20]={ ...@@ -45,6 +45,7 @@ uint64_t exp16_table[20]={
484249, 484249,
3578144, 3578144,
195360063, 195360063,
582360139072LL,
}; };
#if 1 #if 1
// 16.16 fixpoint exp() // 16.16 fixpoint exp()
...@@ -60,14 +61,15 @@ static unsigned int exp16(unsigned int a){ ...@@ -60,14 +61,15 @@ static unsigned int exp16(unsigned int a){
return out; return out;
} }
// 16.16 fixpoint log() // 16.16 fixpoint log()
static uint64_t log16(uint64_t a){ static int64_t log16(uint64_t a){
int i; int i;
int out=0; int out=0;
assert(a >= (1<<16)); if(a < 1<<16)
return -log16((1LL<<32) / a);
a<<=16; a<<=16;
for(i=19;i>=0;i--){ for(i=20;i>=0;i--){
int64_t b= exp16_table[i]; int64_t b= exp16_table[i];
if(a<(b<<16)) continue; if(a<(b<<16)) continue;
out |= 1<<i; out |= 1<<i;
...@@ -100,8 +102,10 @@ int main(int argc,char* argv[]){ ...@@ -100,8 +102,10 @@ int main(int argc,char* argv[]){
FILE *f[2]; FILE *f[2];
uint8_t buf[2][SIZE]; uint8_t buf[2][SIZE];
uint64_t psnr; 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"); printf("tiny_psnr <file1> <file2>\n");
return -1; return -1;
} }
...@@ -114,16 +118,20 @@ int main(int argc,char* argv[]){ ...@@ -114,16 +118,20 @@ int main(int argc,char* argv[]){
if( fread(buf[1], SIZE, 1, f[1]) != 1) break; if( fread(buf[1], SIZE, 1, f[1]) != 1) break;
for(j=0; j<SIZE; i++,j++){ for(j=0; j<SIZE; i++,j++){
const int a= buf[0][j]; int64_t a= buf[0][j];
const int b= buf[1][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); sse += (a-b) * (a-b);
} }
} }
if(!i) i=1; 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) 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 else
psnr= 100*F-1; //floating point free infinity :) psnr= 100*F-1; //floating point free infinity :)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment