mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-24 00:02:52 +00:00
signed 16bit support
Originally committed as revision 3913 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
b2eef2f0ea
commit
0c90161f0f
@ -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 :)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user