mmf.c: Do not write metadata into the SMAF Contents Info chunk.
[ffmpeg.git] / tests / tiny_psnr.c
index a9db98e..264aa4d 100644 (file)
@@ -24,6 +24,8 @@
 #include <inttypes.h>
 #include <assert.h>
 
+#include "libavutil/intfloat.h"
+
 #define FFMIN(a, b) ((a) > (b) ? (b) : (a))
 #define F 100
 #define SIZE 2048
@@ -103,6 +105,23 @@ static uint64_t int_sqrt(uint64_t a)
     return ret;
 }
 
+static 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;
+}
+
+static float get_f32l(uint8_t *p)
+{
+    union av_intfloat32 v;
+    v.i = p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24;
+    return v.f;
+}
+
 static int run_psnr(FILE *f[2], int len, int shift, int skip_bytes)
 {
     int i, j;
@@ -110,7 +129,7 @@ static int run_psnr(FILE *f[2], int len, int shift, int skip_bytes)
     uint64_t dev;
     uint8_t buf[2][SIZE];
     uint64_t psnr;
-    int64_t max    = (1 << (8 * len)) - 1;
+    int64_t max    = (1LL << (8 * len)) - 1;
     int size0      = 0;
     int size1      = 0;
     int maxdist    = 0;
@@ -120,43 +139,48 @@ static int run_psnr(FILE *f[2], int len, int shift, int skip_bytes)
              fseek(f[1], 0, SEEK_SET);
 
     if (!noseek) {
-        /* TODO reindent */
-    for (i = 0; i < 2; i++) {
-        uint8_t *p = buf[i];
-        if (fread(p, 1, 12, f[i]) != 12)
-            return 1;
-        if (!memcmp(p, "RIFF", 4) &&
-            !memcmp(p + 8, "WAVE", 4)) {
-            if (fread(p, 1, 8, f[i]) != 8)
+        for (i = 0; i < 2; i++) {
+            uint8_t *p = buf[i];
+            if (fread(p, 1, 12, f[i]) != 12)
                 return 1;
-            while (memcmp(p, "data", 4)) {
-                int s = p[4] | p[5] << 8 | p[6] << 16 | p[7] << 24;
-                fseek(f[i], s, SEEK_CUR);
+            if (!memcmp(p, "RIFF", 4) &&
+                !memcmp(p + 8, "WAVE", 4)) {
                 if (fread(p, 1, 8, f[i]) != 8)
                     return 1;
+                while (memcmp(p, "data", 4)) {
+                    int s = p[4] | p[5] << 8 | p[6] << 16 | p[7] << 24;
+                    fseek(f[i], s, SEEK_CUR);
+                    if (fread(p, 1, 8, f[i]) != 8)
+                        return 1;
+                }
+            } else {
+                fseek(f[i], -12, SEEK_CUR);
             }
-        } else {
-            fseek(f[i], -12, SEEK_CUR);
         }
-    }
 
-    fseek(f[shift < 0], abs(shift), SEEK_CUR);
+        fseek(f[shift < 0], abs(shift), SEEK_CUR);
 
-    fseek(f[0], skip_bytes, SEEK_CUR);
-    fseek(f[1], skip_bytes, SEEK_CUR);
+        fseek(f[0], skip_bytes, SEEK_CUR);
+        fseek(f[1], skip_bytes, SEEK_CUR);
     }
 
     for (;;) {
         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);
@@ -189,7 +213,7 @@ static int run_psnr(FILE *f[2], int len, int shift, int skip_bytes)
 int main(int argc, char *argv[])
 {
     FILE *f[2];
-    int len        = argc < 4 ? 1 : atoi(argv[3]);
+    int len = 1;
     int shift_first= argc < 5 ? 0 : atoi(argv[4]);
     int skip_bytes = argc < 6 ? 0 : atoi(argv[5]);
     int shift_last = shift_first + (argc < 7 ? 0 : atoi(argv[6]));
@@ -197,6 +221,23 @@ int main(int argc, char *argv[])
     int max_psnr   = -1;
     int max_psnr_shift = 0;
 
+    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 < 1 || len > 2) {
+                fprintf(stderr, "Unsupported sample format: %s\n", argv[3]);
+                return 1;
+            }
+        }
+    }
+
     if (argc < 3) {
         printf("tiny_psnr <file1> <file2> [<elem size> [<shift> [<skip bytes> [<shift search range>]]]]\n");
         printf("WAV headers are skipped automatically.\n");