Browse code

fixpoint log() for tiny_psnr so it can output actual PSNR

Originally committed as revision 2640 to svn://svn.ffmpeg.org/ffmpeg/trunk

Michael Niedermayer authored on 2003/12/31 11:32:54
Showing 3 changed files
... ...
@@ -1,70 +1,70 @@
1 1
 ffmpeg regression test
2 2
 74e25b401f34321aeb854e264ef62df8 *./data/a-mpeg1.mpg
3 3
 1ee8816bd078efe66be0090b1d9b0af1 *./data/out.yuv
4
-stddev:  7.63 bytes:7602176
4
+stddev:  7.63 PSNR:30.47 bytes:7602176
5 5
 b588110bebb48b5a1815ac26d0f0c9cc *./data/a-mpeg2.mpg
6 6
 ddfa5c618dab54df0f47976ddd55d90f *./data/out.yuv
7
-stddev:  7.65 bytes:7602176
7
+stddev:  7.65 PSNR:30.44 bytes:7602176
8 8
 345b79f7afe43abc0128a7b1d5fff949 *./data/a-mpeg2i.mpg
9 9
 5df468301367ed2dde5f064bf4c17301 *./data/out.yuv
10
-stddev:  7.96 bytes:7602176
10
+stddev:  7.96 PSNR:30.10 bytes:7602176
11 11
 d0dc46dd831398237a690ebbeff18b64 *./data/a-msmpeg4v2.avi
12 12
 712aa6c959d1d90a78fe98657cbff19c *./data/out.yuv
13
-stddev:  8.11 bytes:7602176
13
+stddev:  8.11 PSNR:29.94 bytes:7602176
14 14
 dae855177b45cbe6e40c6777f95095ef *./data/a-msmpeg4.avi
15 15
 8786aa956838234fe3e48d0ef8cbd46c *./data/out.yuv
16
-stddev:  8.12 bytes:7602176
16
+stddev:  8.12 PSNR:29.93 bytes:7602176
17 17
 6633a1111c734c9156729b8b7e198c17 *./data/a-wmv1.avi
18 18
 7261e23fd8ad1de6efee022051b936be *./data/out.yuv
19
-stddev:  8.10 bytes:7602176
19
+stddev:  8.10 PSNR:29.94 bytes:7602176
20 20
 30dcbbe391149d981162a1f4727c43d6 *./data/a-wmv2.avi
21 21
 7261e23fd8ad1de6efee022051b936be *./data/out.yuv
22
-stddev:  8.10 bytes:7602176
22
+stddev:  8.10 PSNR:29.94 bytes:7602176
23 23
 4bf9df20cdeb1aa01115761642b4e80b *./data/a-h263.avi
24 24
 545df74e0aa443499600faedd10a7065 *./data/out.yuv
25
-stddev:  8.18 bytes:7602176
25
+stddev:  8.18 PSNR:29.86 bytes:7602176
26 26
 920a0a8a0063655d1f34dcaad7857f98 *./data/a-h263p.avi
27 27
 0eb167c9dfcbeeecbf3debed8af8f811 *./data/out.yuv
28
-stddev:  2.08 bytes:7602176
28
+stddev:  2.08 PSNR:41.74 bytes:7602176
29 29
 66f8b4b5b4f0655cff7bdbc44969cab3 *./data/a-odivx.mp4
30 30
 5bd332c77ef45e58b7017e06a0467dd3 *./data/out.yuv
31
-stddev:  7.94 bytes:7602176
31
+stddev:  7.94 PSNR:30.12 bytes:7602176
32 32
 5704a082cc5c5970620123ae20566286 *./data/a-huffyuv.avi
33 33
 799d3db687f6cdd7a837ec156efc171f *./data/out.yuv
34
-stddev:  0.00 bytes:7602176
34
+stddev:  0.00 PSNR:99.99 bytes:7602176
35 35
 e9f63126859b97cd23cd1413038f8f7b *./data/a-mpeg4-rc.avi
36 36
 90a159074b1b109569914ee63f387860 *./data/out.yuv
37
-stddev: 10.18 bytes:7145472
37
+stddev: 10.18 PSNR:27.96 bytes:7145472
38 38
 d7d295f97a1e07b633f973d2325880ce *./data/a-mpeg4-adv.avi
39 39
 612f79510c8098f1421aa154047e2bf2 *./data/out.yuv
40
-stddev:  7.25 bytes:7602176
40
+stddev:  7.25 PSNR:30.91 bytes:7602176
41 41
 f863f4198521bd76930ea33991b47273 *./data/a-error-mpeg4-adv.avi
42 42
 ba7fcd126c7c9fead5a5de71aaaf0624 *./data/out.yuv
43
-stddev: 16.80 bytes:7602176
43
+stddev: 16.80 PSNR:23.61 bytes:7602176
44 44
 328ebd044362116e274739e23c482ee7 *./data/a-mpeg1b.mpg
45 45
 788a9d500dc8986231a18076fc80fd73 *./data/out.yuv
46
-stddev: 10.07 bytes:7145472
46
+stddev: 10.07 PSNR:28.06 bytes:7145472
47 47
 07042f42b3119c39eb26537a84a451df *./data/a-mjpeg.avi
48 48
 f23a9e50a559e174766ee808c48fea22 *./data/out.yuv
49
-stddev:  8.87 bytes:7602176
49
+stddev:  8.87 PSNR:29.15 bytes:7602176
50 50
 1d565db4a3a054261af95f2483a37cd6 *./data/a-ljpeg.avi
51 51
 799d3db687f6cdd7a837ec156efc171f *./data/out.yuv
52
-stddev:  0.00 bytes:7602176
52
+stddev:  0.00 PSNR:99.99 bytes:7602176
53 53
 4b37703d3dc03873f99603165c0fe11e *./data/a-rv10.rm
54 54
 255469fef47bee94cfb2e3385ebb736b *./data/out.yuv
55
-stddev: 13.42 bytes:7602176
55
+stddev: 13.42 PSNR:25.56 bytes:7602176
56 56
 89ad858355f9b0a92d024c5ba6e369dd *./data/a-asv1.avi
57 57
 b3e1696d73071c8f7f0ff4e10c1677ca *./data/out.yuv
58
-stddev: 19.19 bytes:7602176
58
+stddev: 19.19 PSNR:22.46 bytes:7602176
59 59
 3909db39c3d2e9a72a952254e8685ff7 *./data/a-asv2.avi
60 60
 551b263bfb2acb9ea6dd2000f184494f *./data/out.yuv
61
-stddev: 17.98 bytes:7602176
61
+stddev: 17.98 PSNR:23.02 bytes:7602176
62 62
 37a528aa9efc28c5c3cc8191da90e012 *./data/a-flv.flv
63 63
 57ea0821ec4377e96647adc22717a4ba *./data/out.yuv
64
-stddev:  8.19 bytes:7602176
64
+stddev:  8.19 PSNR:29.85 bytes:7602176
65 65
 0ed9b02681d6d44bf8c390ba6c4f5c66 *./data/a-ffv1.avi
66 66
 799d3db687f6cdd7a837ec156efc171f *./data/out.yuv
67
-stddev:  0.00 bytes:7602176
67
+stddev:  0.00 PSNR:99.99 bytes:7602176
68 68
 21f8ff9f1daacd9133683bb4ea0f50a4 *./data/a-mp2.mp2
69 69
 624d9789f3ac193bbae4af3bd8cb02b7 *./data/out.wav
70 70
 d056da679e6d6682812fffb28a7f0db6 *./data/a-ac3.rm
... ...
@@ -1,70 +1,70 @@
1 1
 ffmpeg regression test
2 2
 a6ccb5e768c7bed7a08f8e4343d81871 *./data/a-mpeg1.mpg
3 3
 9364e15902bc56603dfb453f8bf146e0 *./data/out.yuv
4
-stddev:  4.93 bytes:7602176
4
+stddev:  4.93 PSNR:34.25 bytes:7602176
5 5
 aa0f088777131d8ffb627e6ff37312ca *./data/a-mpeg2.mpg
6 6
 830e7d798089ea6213e0867fd7676fde *./data/out.yuv
7
-stddev:  4.95 bytes:7602176
7
+stddev:  4.95 PSNR:34.22 bytes:7602176
8 8
 ed480119089c61ba5a5a8668675c7d49 *./data/a-mpeg2i.mpg
9 9
 a6ec3343ce12d72ccc7d0d8303b84781 *./data/out.yuv
10
-stddev:  4.96 bytes:7602176
10
+stddev:  4.96 PSNR:34.20 bytes:7602176
11 11
 14db391f167b52b21a983157b410affc *./data/a-msmpeg4v2.avi
12 12
 fc8881e0904af9491d5fa0163183954b *./data/out.yuv
13
-stddev:  5.29 bytes:7602176
13
+stddev:  5.29 PSNR:33.64 bytes:7602176
14 14
 484b4dccac1e552f0f29971f4a066598 *./data/a-msmpeg4.avi
15 15
 dd82e8badc40ad5f76b0ffc1d6945b1c *./data/out.yuv
16
-stddev:  5.29 bytes:7602176
16
+stddev:  5.29 PSNR:33.64 bytes:7602176
17 17
 d63c0cbb6d845bfd8e2735b4ea733a53 *./data/a-wmv1.avi
18 18
 407c23671e7c7265c19c91966dbba317 *./data/out.yuv
19
-stddev:  5.29 bytes:7602176
19
+stddev:  5.29 PSNR:33.65 bytes:7602176
20 20
 ba4616dc4db0db636a7c26bc8f2de04e *./data/a-wmv2.avi
21 21
 407c23671e7c7265c19c91966dbba317 *./data/out.yuv
22
-stddev:  5.29 bytes:7602176
22
+stddev:  5.29 PSNR:33.65 bytes:7602176
23 23
 f980b5e38c4b919fbe5b660fe12fcf1a *./data/a-h263.avi
24 24
 8bcc9f78373ec424e864b40734e124ba *./data/out.yuv
25
-stddev:  5.41 bytes:7602176
25
+stddev:  5.41 PSNR:33.45 bytes:7602176
26 26
 f7828488c31ccb6787367ef4e4a2ad42 *./data/a-h263p.avi
27 27
 7d39d1f272205a6a231d0e0baf32ff9d *./data/out.yuv
28
-stddev:  1.91 bytes:7602176
28
+stddev:  1.91 PSNR:42.49 bytes:7602176
29 29
 a831828595e5764e6ee30c2d9e548385 *./data/a-odivx.mp4
30 30
 ad75d173bd30d642147f00da21df0012 *./data/out.yuv
31
-stddev:  5.27 bytes:7602176
31
+stddev:  5.27 PSNR:33.67 bytes:7602176
32 32
 242a7a18c2793e115007bc163861ef4e *./data/a-huffyuv.avi
33 33
 dde5895817ad9d219f79a52d0bdfb001 *./data/out.yuv
34
-stddev:  0.00 bytes:7602176
34
+stddev:  0.00 PSNR:99.99 bytes:7602176
35 35
 6a469f42ce6946dd4c708f9e51e3da6a *./data/a-mpeg4-rc.avi
36 36
 df9de7134d961119705b4e0cabca1f12 *./data/out.yuv
37
-stddev:  4.20 bytes:7145472
37
+stddev:  4.20 PSNR:35.64 bytes:7145472
38 38
 483504d060b0bd8ac1acfa3a823c2ad7 *./data/a-mpeg4-adv.avi
39 39
 08d24bdd7da80cffaf8abaa3e71b1843 *./data/out.yuv
40
-stddev:  4.96 bytes:7602176
40
+stddev:  4.96 PSNR:34.20 bytes:7602176
41 41
 03ff35856faefb4882eaf4d86d95bea7 *./data/a-error-mpeg4-adv.avi
42 42
 8550acff0851ee915bd5800f1e20f37c *./data/out.yuv
43
-stddev:  9.66 bytes:7602176
43
+stddev:  9.66 PSNR:28.42 bytes:7602176
44 44
 671802a2c5078e69f7f422765ea87f2a *./data/a-mpeg1b.mpg
45 45
 d3d5876cef34b728602d5a22eee9249f *./data/out.yuv
46
-stddev:  5.93 bytes:7145472
46
+stddev:  5.93 PSNR:32.66 bytes:7145472
47 47
 e9218a1db885fe0262e88f9df630307d *./data/a-mjpeg.avi
48 48
 a365b4da246ad68caf96b702b7f961a1 *./data/out.yuv
49
-stddev:  4.76 bytes:7602176
49
+stddev:  4.76 PSNR:34.56 bytes:7602176
50 50
 defd90b44bced2772c6ca0d8eb75f668 *./data/a-ljpeg.avi
51 51
 dde5895817ad9d219f79a52d0bdfb001 *./data/out.yuv
52
-stddev:  0.00 bytes:7602176
52
+stddev:  0.00 PSNR:99.99 bytes:7602176
53 53
 1b46671251277c14f3a24a034648c458 *./data/a-rv10.rm
54 54
 e1923bc2940a017858e354c3fb0e6244 *./data/out.yuv
55
-stddev: 13.18 bytes:7602176
55
+stddev: 13.18 PSNR:25.72 bytes:7602176
56 56
 9c4f5a4613a5595c90c6b99bf143b6a9 *./data/a-asv1.avi
57 57
 4251d7f496bbf362251b065e840a1b73 *./data/out.yuv
58
-stddev:  9.80 bytes:7602176
58
+stddev:  9.80 PSNR:28.29 bytes:7602176
59 59
 19652f2aac2d4d0379d37ce17e0bbea7 *./data/a-asv2.avi
60 60
 7d887519f7884e7c49c591831c11ac50 *./data/out.yuv
61
-stddev:  9.71 bytes:7602176
61
+stddev:  9.71 PSNR:28.37 bytes:7602176
62 62
 bee27a404ab6a1b7ab1d3551eb4f1877 *./data/a-flv.flv
63 63
 86da6ee46d2df190b4a0d72523b14a25 *./data/out.yuv
64
-stddev:  5.29 bytes:7602176
64
+stddev:  5.29 PSNR:33.64 bytes:7602176
65 65
 0db09835ebc3d22f166f30879f3ccc38 *./data/a-ffv1.avi
66 66
 dde5895817ad9d219f79a52d0bdfb001 *./data/out.yuv
67
-stddev:  0.00 bytes:7602176
67
+stddev:  0.00 PSNR:99.99 bytes:7602176
68 68
 21f8ff9f1daacd9133683bb4ea0f50a4 *./data/a-mp2.mp2
69 69
 624d9789f3ac193bbae4af3bd8cb02b7 *./data/out.wav
70 70
 d056da679e6d6682812fffb28a7f0db6 *./data/a-ac3.rm
... ...
@@ -19,10 +19,63 @@
19 19
 
20 20
 #include <stdio.h>
21 21
 #include <inttypes.h>
22
+#include <assert.h>
22 23
 
23 24
 #define F 100
24 25
 #define SIZE 2048
25 26
 
27
+uint64_t exp16_table[20]={
28
+     65537,
29
+     65538,
30
+     65540,
31
+     65544,
32
+     65552,
33
+     65568,
34
+     65600,
35
+     65664,
36
+     65793,
37
+     66050,
38
+     66568,
39
+     67616,
40
+     69763,
41
+     74262,
42
+     84150,
43
+    108051,
44
+    178145,
45
+    484249,
46
+   3578144,
47
+ 195360063,
48
+};
49
+#if 1
50
+// 16.16 fixpoint exp()
51
+static unsigned int exp16(unsigned int a){
52
+    int i;
53
+    int out= 1<<16;
54
+
55
+    for(i=19;i>=0;i--){
56
+        if(a&(1<<i))
57
+            out= (out*exp16_table[i] + (1<<15))>>16;
58
+    }
59
+
60
+    return out;
61
+}
62
+// 16.16 fixpoint log()
63
+static uint64_t log16(uint64_t a){
64
+    int i;
65
+    int out=0;
66
+    
67
+    assert(a >= (1<<16));
68
+    a<<=16;
69
+    
70
+    for(i=19;i>=0;i--){
71
+        if(a<(exp16_table[i]<<16)) continue;
72
+        out |= 1<<i;
73
+        a = ((a<<16) + exp16_table[i]/2)/exp16_table[i];
74
+    }
75
+    return out;
76
+}
77
+
78
+#endif
26 79
 static uint64_t int_sqrt(uint64_t a)
27 80
 {
28 81
     uint64_t ret=0;
... ...
@@ -45,6 +98,7 @@ int main(int argc,char* argv[]){
45 45
     uint64_t dev;
46 46
     FILE *f[2];
47 47
     uint8_t buf[2][SIZE];
48
+    uint64_t psnr;
48 49
     
49 50
     if(argc!=3){
50 51
         printf("tiny_psnr <file1> <file2>\n");
... ...
@@ -66,9 +120,16 @@ int main(int argc,char* argv[]){
66 66
     }
67 67
     
68 68
     dev= int_sqrt((sse*F*F)/i);
69
+    if(sse)
70
+        psnr= (log16(256*256*255*255LL*i/sse)*284619LL*F + (1<<31)) / (1LL<<32);
71
+    else
72
+        psnr= 100*F-1; //floating point free infinity :)
69 73
     
70
-    //FIXME someone should write a integer fixpoint log() function for bitexact PSNR scores ...
71
-    printf("stddev:%3d.%02d bytes:%d\n", (int)(dev/F), (int)(dev%F), i);
72
-    
74
+    printf("stddev:%3d.%02d PSNR:%2d.%02d bytes:%d\n", 
75
+        (int)(dev/F), (int)(dev%F), 
76
+        (int)(psnr/F), (int)(psnr%F),
77
+        i);
73 78
     return 0;
74 79
 }
80
+
81
+