133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp/*
233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *  Copyright 2012 The LibYuv Project Authors. All rights reserved.
333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *
433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *  Use of this source code is governed by a BSD-style license
533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *  that can be found in the LICENSE file in the root of the source
633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *  tree. An additional intellectual property rights grant can be found
733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *  in the file PATENTS.  All contributing project authors may
833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *  be found in the AUTHORS file in the root of the source tree.
933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp */
1033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
1133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include <stdio.h>
1233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include <stdlib.h>
1333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include <string.h>
1433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include <time.h>
1533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
1633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include "libyuv/basic_types.h"
1733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include "libyuv/compare.h"
1833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include "libyuv/version.h"
1933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
2033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampint main(int argc, char** argv) {
2133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  if (argc < 1) {
2233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    printf("libyuv compare v%d\n", LIBYUV_VERSION);
2333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    printf("compare file1.yuv file2.yuv\n");
2433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    return -1;
2533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
2633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  char* name1 = argv[1];
2733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  char* name2 = (argc > 2) ? argv[2] : NULL;
2833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  FILE* fin1 = fopen(name1, "rb");
2933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  FILE* fin2 = name2 ? fopen(name2, "rb") : NULL;
3033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
3133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  const int kBlockSize = 32768;
3233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  uint8 buf1[kBlockSize];
3333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  uint8 buf2[kBlockSize];
3433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  uint32 hash1 = 5381;
3533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  uint32 hash2 = 5381;
3633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  uint64 sum_square_err = 0;
3733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  uint64 size_min = 0;
3833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int amt1 = 0;
3933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  int amt2 = 0;
4033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  do {
4133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    amt1 = fread(buf1, 1, kBlockSize, fin1);
4233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    if (amt1 > 0) hash1 = libyuv::HashDjb2(buf1, amt1, hash1);
4333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    if (fin2) {
4433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      amt2 = fread(buf2, 1, kBlockSize, fin2);
4533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      if (amt2 > 0) hash2 = libyuv::HashDjb2(buf2, amt2, hash2);
4633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      int amt_min = (amt1 < amt2) ? amt1 : amt2;
4733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      size_min += amt_min;
4833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp      sum_square_err += libyuv::ComputeSumSquareError(buf1, buf2, amt_min);
4933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    }
5033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  } while (amt1 > 0 || amt2 > 0);
5133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
5233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  printf("hash1 %x", hash1);
5333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  if (fin2) {
5433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    printf(", hash2 %x", hash2);
5533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    double mse = static_cast<double>(sum_square_err) /
5633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                 static_cast<double>(size_min);
5733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    printf(", mse %.2f", mse);
5833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    double psnr = libyuv::SumSquareErrorToPsnr(sum_square_err, size_min);
5933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    printf(", psnr %.2f\n", psnr);
6033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp    fclose(fin2);
6133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  }
6233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  fclose(fin1);
6333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
6433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
65