Signed-off-by: Mans Rullgard <[email protected]>
---
The format selection is somewhat hackish to avoid changing all
existing uses.
---
 tests/tiny_psnr.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 50 insertions(+), 5 deletions(-)

diff --git a/tests/tiny_psnr.c b/tests/tiny_psnr.c
index 1583f2c..6a2c61e 100644
--- a/tests/tiny_psnr.c
+++ b/tests/tiny_psnr.c
@@ -88,6 +88,26 @@ static uint64_t int_sqrt(uint64_t a)
     return ret;
 }
 
+int16_t get_s16l(uint8_t *p)
+{
+    union {
+        uint16_t u;
+        int16_t  s;
+    } v;
+    v.u = p[0] | p[1] << 8;
+    return v.s;
+}
+
+float get_f32l(uint8_t *p)
+{
+    union {
+        uint32_t i;
+        float f;
+    } v;
+    v.i = p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24;
+    return v.f;
+}
+
 int main(int argc, char *argv[])
 {
     int i, j;
@@ -96,8 +116,8 @@ int main(int argc, char *argv[])
     FILE *f[2];
     uint8_t buf[2][SIZE];
     uint64_t psnr;
-    int len        = argc < 4 ? 1 : atoi(argv[3]);
-    int64_t max    = (1 << (8 * len)) - 1;
+    int len = 1;
+    int64_t max;
     int shift      = argc < 5 ? 0 : atoi(argv[4]);
     int skip_bytes = argc < 6 ? 0 : atoi(argv[5]);
     int size0      = 0;
@@ -110,6 +130,25 @@ int main(int argc, char *argv[])
         return 1;
     }
 
+    if (argc > 3) {
+        if (!strcmp(argv[3], "u8")) {
+            len = 1;
+        } else if (!strcmp(argv[3], "s16")) {
+            len = 2;
+        } else if (!strcmp(argv[3], "f32")) {
+            len = 4;
+        } else {
+            char *end;
+            len = strtol(argv[3], &end, 0);
+            if (*end || len > 2) {
+                fprintf(stderr, "Unsupported sample format: %s\n", argv[3]);
+                return 1;
+            }
+        }
+    }
+
+    max = (1 << (8 * len)) - 1;
+
     f[0] = fopen(argv[1], "rb");
     f[1] = fopen(argv[2], "rb");
     if (!f[0] || !f[1]) {
@@ -145,13 +184,19 @@ int main(int argc, char *argv[])
         int s0 = fread(buf[0], 1, SIZE, f[0]);
         int s1 = fread(buf[1], 1, SIZE, f[1]);
 
-        for (j = 0; j < FFMIN(s0, s1); j++) {
+        for (j = 0; j < FFMIN(s0, s1); j += len) {
             int64_t a = buf[0][j];
             int64_t b = buf[1][j];
             int dist;
             if (len == 2) {
-                a = (int16_t)(a | (buf[0][++j] << 8));
-                b = (int16_t)(b | (buf[1][  j] << 8));
+                a = get_s16l(buf[0] + j);
+                b = get_s16l(buf[1] + j);
+            } else if (len == 4) {
+                a = get_f32l(buf[0] + j) * (1 << 24);
+                b = get_f32l(buf[1] + j) * (1 << 24);
+            } else {
+                a = buf[0][j];
+                b = buf[1][j];
             }
             sse += (a - b) * (a - b);
             dist = abs(a - b);
-- 
1.7.11.1

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to