Fix loop filter with CAVLC 8x8dct.
[libav.git] / tests / tiny_psnr.c
CommitLineData
67cbe681
MN
1/*
2 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
3 *
244e1e64
DB
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
67cbe681
MN
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
244e1e64 9 * version 2.1 of the License, or (at your option) any later version.
67cbe681 10 *
244e1e64 11 * FFmpeg is distributed in the hope that it will be useful,
67cbe681
MN
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
244e1e64 17 * License along with FFmpeg; if not, write to the Free Software
5509bffa 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
67cbe681
MN
19 */
20
21#include <stdio.h>
ba96e97f 22#include <stdlib.h>
67cbe681 23#include <inttypes.h>
9e2a16e1 24#include <assert.h>
67cbe681
MN
25
26#define F 100
27#define SIZE 2048
28
0c90161f 29uint64_t exp16_table[21]={
9e2a16e1
MN
30 65537,
31 65538,
32 65540,
33 65544,
34 65552,
35 65568,
36 65600,
37 65664,
38 65793,
39 66050,
40 66568,
41 67616,
42 69763,
43 74262,
44 84150,
45 108051,
46 178145,
47 484249,
48 3578144,
49 195360063,
0c90161f 50 582360139072LL,
9e2a16e1 51};
e9b67fe4
DB
52
53#if 0
2d2fe557
DB
54// 16.16 fixpoint exp()
55static unsigned int exp16(unsigned int a){
56 int i;
57 int out= 1<<16;
58
59 for(i=19;i>=0;i--){
60 if(a&(1<<i))
61 out= (out*exp16_table[i] + (1<<15))>>16;
62 }
9e2a16e1 63
2d2fe557
DB
64 return out;
65}
e9b67fe4
DB
66#endif
67
9e2a16e1 68// 16.16 fixpoint log()
0c90161f 69static int64_t log16(uint64_t a){
9e2a16e1
MN
70 int i;
71 int out=0;
0c90161f
MN
72
73 if(a < 1<<16)
74 return -log16((1LL<<32) / a);
9e2a16e1 75 a<<=16;
115329f1 76
0c90161f 77 for(i=20;i>=0;i--){
8176bd1a
MN
78 int64_t b= exp16_table[i];
79 if(a<(b<<16)) continue;
9e2a16e1 80 out |= 1<<i;
8176bd1a 81 a = ((a/b)<<16) + (((a%b)<<16) + b/2)/b;
9e2a16e1
MN
82 }
83 return out;
84}
85
67cbe681
MN
86static uint64_t int_sqrt(uint64_t a)
87{
88 uint64_t ret=0;
89 int s;
90 uint64_t ret_sq=0;
91
92 for(s=31; s>=0; s--){
93 uint64_t b= ret_sq + (1ULL<<(s*2)) + (ret<<s)*2;
94 if(b<=a){
95 ret_sq=b;
96 ret+= 1ULL<<s;
97 }
98 }
99 return ret;
100}
101
102int main(int argc,char* argv[]){
103 int i, j;
104 uint64_t sse=0;
105 uint64_t dev;
106 FILE *f[2];
107 uint8_t buf[2][SIZE];
9e2a16e1 108 uint64_t psnr;
ba96e97f 109 int len= argc<4 ? 1 : atoi(argv[3]);
0c90161f 110 int64_t max= (1<<(8*len))-1;
ba96e97f 111 int shift= argc<5 ? 0 : atoi(argv[4]);
b8889ea5 112 int skip_bytes = argc<6 ? 0 : atoi(argv[5]);
115329f1 113
0c90161f 114 if(argc<3){
b8889ea5 115 printf("tiny_psnr <file1> <file2> [<elem size> [<shift> [<skip bytes>]]]\n");
cc8de8e8 116 printf("For WAV files use the following:\n");
b8889ea5 117 printf("./tiny_psnr file1.wav file2.wav 2 0 44 to skip the header.\n");
67cbe681
MN
118 return -1;
119 }
115329f1 120
0d6d0cf9
MN
121 f[0]= fopen(argv[1], "rb");
122 f[1]= fopen(argv[2], "rb");
e740c796 123 if(!f[0] || !f[1]){
cc8de8e8 124 fprintf(stderr, "Could not open input files.\n");
e740c796
MN
125 return -1;
126 }
ba96e97f 127 fseek(f[shift<0], shift < 0 ? -shift : shift, SEEK_SET);
67cbe681 128
b8889ea5
BL
129 fseek(f[0],skip_bytes,SEEK_CUR);
130 fseek(f[1],skip_bytes,SEEK_CUR);
131
67cbe681
MN
132 for(i=0;;){
133 if( fread(buf[0], SIZE, 1, f[0]) != 1) break;
134 if( fread(buf[1], SIZE, 1, f[1]) != 1) break;
115329f1 135
67cbe681 136 for(j=0; j<SIZE; i++,j++){
0c90161f
MN
137 int64_t a= buf[0][j];
138 int64_t b= buf[1][j];
139 if(len==2){
140 a= (int16_t)(a | (buf[0][++j]<<8));
141 b= (int16_t)(b | (buf[1][ j]<<8));
142 }
67cbe681
MN
143 sse += (a-b) * (a-b);
144 }
145 }
115329f1 146
eeaa742c 147 if(!i) i=1;
0c90161f 148 dev= int_sqrt( ((sse/i)*F*F) + (((sse%i)*F*F) + i/2)/i );
9e2a16e1 149 if(sse)
0c90161f 150 psnr= ((2*log16(max<<16) + log16(i) - log16(sse))*284619LL*F + (1<<31)) / (1LL<<32);
9e2a16e1
MN
151 else
152 psnr= 100*F-1; //floating point free infinity :)
115329f1
DB
153
154 printf("stddev:%3d.%02d PSNR:%2d.%02d bytes:%d\n",
155 (int)(dev/F), (int)(dev%F),
9e2a16e1 156 (int)(psnr/F), (int)(psnr%F),
ddbddce5 157 i*len);
67cbe681
MN
158 return 0;
159}
9e2a16e1
MN
160
161