tests: Remove disabled code.
[libav.git] / tests / tiny_psnr.c
CommitLineData
67cbe681
MN
1/*
2 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
3 *
2912e87a 4 * This file is part of Libav.
244e1e64 5 *
2912e87a 6 * Libav 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 *
2912e87a 11 * Libav 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
2912e87a 17 * License along with Libav; 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>
c43d77c1 23#include <string.h>
67cbe681 24#include <inttypes.h>
9e2a16e1 25#include <assert.h>
67cbe681 26
1e90317b 27#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
67cbe681
MN
28#define F 100
29#define SIZE 2048
30
0c90161f 31uint64_t exp16_table[21]={
9e2a16e1
MN
32 65537,
33 65538,
34 65540,
35 65544,
36 65552,
37 65568,
38 65600,
39 65664,
40 65793,
41 66050,
42 66568,
43 67616,
44 69763,
45 74262,
46 84150,
47 108051,
48 178145,
49 484249,
50 3578144,
51 195360063,
0c90161f 52 582360139072LL,
9e2a16e1 53};
e9b67fe4 54
9e2a16e1 55// 16.16 fixpoint log()
0c90161f 56static int64_t log16(uint64_t a){
9e2a16e1
MN
57 int i;
58 int out=0;
0c90161f
MN
59
60 if(a < 1<<16)
61 return -log16((1LL<<32) / a);
9e2a16e1 62 a<<=16;
115329f1 63
0c90161f 64 for(i=20;i>=0;i--){
8176bd1a
MN
65 int64_t b= exp16_table[i];
66 if(a<(b<<16)) continue;
9e2a16e1 67 out |= 1<<i;
8176bd1a 68 a = ((a/b)<<16) + (((a%b)<<16) + b/2)/b;
9e2a16e1
MN
69 }
70 return out;
71}
72
67cbe681
MN
73static uint64_t int_sqrt(uint64_t a)
74{
75 uint64_t ret=0;
76 int s;
77 uint64_t ret_sq=0;
78
79 for(s=31; s>=0; s--){
80 uint64_t b= ret_sq + (1ULL<<(s*2)) + (ret<<s)*2;
81 if(b<=a){
82 ret_sq=b;
83 ret+= 1ULL<<s;
84 }
85 }
86 return ret;
87}
88
89int main(int argc,char* argv[]){
90 int i, j;
91 uint64_t sse=0;
92 uint64_t dev;
93 FILE *f[2];
94 uint8_t buf[2][SIZE];
9e2a16e1 95 uint64_t psnr;
ba96e97f 96 int len= argc<4 ? 1 : atoi(argv[3]);
0c90161f 97 int64_t max= (1<<(8*len))-1;
ba96e97f 98 int shift= argc<5 ? 0 : atoi(argv[4]);
b8889ea5 99 int skip_bytes = argc<6 ? 0 : atoi(argv[5]);
1e90317b
MN
100 int size0=0;
101 int size1=0;
cb0067ec 102 int maxdist = 0;
115329f1 103
0c90161f 104 if(argc<3){
b8889ea5 105 printf("tiny_psnr <file1> <file2> [<elem size> [<shift> [<skip bytes>]]]\n");
c43d77c1 106 printf("WAV headers are skipped automatically.\n");
3ec8d24a 107 return 1;
67cbe681 108 }
115329f1 109
0d6d0cf9
MN
110 f[0]= fopen(argv[1], "rb");
111 f[1]= fopen(argv[2], "rb");
e740c796 112 if(!f[0] || !f[1]){
cc8de8e8 113 fprintf(stderr, "Could not open input files.\n");
3ec8d24a 114 return 1;
e740c796 115 }
c43d77c1
MR
116
117 for (i = 0; i < 2; i++) {
118 uint8_t *p = buf[i];
cd3cb048
MR
119 if (fread(p, 1, 12, f[i]) != 12)
120 return 1;
c43d77c1
MR
121 if (!memcmp(p, "RIFF", 4) &&
122 !memcmp(p+8, "WAVE", 4)) {
cd3cb048
MR
123 if (fread(p, 1, 8, f[i]) != 8)
124 return 1;
c43d77c1
MR
125 while (memcmp(p, "data", 4)) {
126 int s = p[4] | p[5]<<8 | p[6]<<16 | p[7]<<24;
127 fseek(f[i], s, SEEK_CUR);
cd3cb048
MR
128 if (fread(p, 1, 8, f[i]) != 8)
129 return 1;
c43d77c1
MR
130 }
131 } else {
132 fseek(f[i], -12, SEEK_CUR);
133 }
134 }
135
f6dddd33 136 fseek(f[shift<0], abs(shift), SEEK_CUR);
67cbe681 137
b8889ea5
BL
138 fseek(f[0],skip_bytes,SEEK_CUR);
139 fseek(f[1],skip_bytes,SEEK_CUR);
140
1e90317b
MN
141 for(;;){
142 int s0= fread(buf[0], 1, SIZE, f[0]);
143 int s1= fread(buf[1], 1, SIZE, f[1]);
115329f1 144
1e90317b 145 for(j=0; j<FFMIN(s0,s1); j++){
0c90161f
MN
146 int64_t a= buf[0][j];
147 int64_t b= buf[1][j];
cb0067ec 148 int dist;
0c90161f
MN
149 if(len==2){
150 a= (int16_t)(a | (buf[0][++j]<<8));
151 b= (int16_t)(b | (buf[1][ j]<<8));
152 }
67cbe681 153 sse += (a-b) * (a-b);
cb0067ec
VS
154 dist = abs(a-b);
155 if (dist > maxdist) maxdist = dist;
67cbe681 156 }
1e90317b
MN
157 size0 += s0;
158 size1 += s1;
159 if(s0+s1<=0)
160 break;
67cbe681 161 }
115329f1 162
1e90317b 163 i= FFMIN(size0,size1)/len;
eeaa742c 164 if(!i) i=1;
0c90161f 165 dev= int_sqrt( ((sse/i)*F*F) + (((sse%i)*F*F) + i/2)/i );
9e2a16e1 166 if(sse)
b00803e0 167 psnr= ((2*log16(max<<16) + log16(i) - log16(sse))*284619LL*F + (1LL<<31)) / (1LL<<32);
9e2a16e1 168 else
1e90317b 169 psnr= 1000*F-1; //floating point free infinity :)
115329f1 170
cb0067ec 171 printf("stddev:%5d.%02d PSNR:%3d.%02d MAXDIFF:%5d bytes:%9d/%9d\n",
115329f1 172 (int)(dev/F), (int)(dev%F),
9e2a16e1 173 (int)(psnr/F), (int)(psnr%F),
cb0067ec 174 maxdist,
1e90317b 175 size0, size1);
67cbe681
MN
176 return 0;
177}
9e2a16e1
MN
178
179