/*
 *  Copyright 2012 The LibYuv Project Authors. All rights reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS. All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#include "libyuv/basic_types.h"
#include "libyuv/compare.h"
#include "libyuv/version.h"

int main(int argc, char** argv) {
  if (argc < 1) {
    printf("libyuv compare v%d\n", LIBYUV_VERSION);
    printf("compare file1.yuv file2.yuv\n");
    return -1;
  }
  char* name1 = argv[1];
  char* name2 = (argc > 2) ? argv[2] : NULL;
  FILE* fin1 = fopen(name1, "rb");
  FILE* fin2 = name2 ? fopen(name2, "rb") : NULL;

  const int kBlockSize = 32768;
  uint8 buf1[kBlockSize];
  uint8 buf2[kBlockSize];
  uint32 hash1 = 5381;
  uint32 hash2 = 5381;
  uint64 sum_square_err = 0;
  uint64 size_min = 0;
  int amt1 = 0;
  int amt2 = 0;
  do {
    amt1 = static_cast<int>(fread(buf1, 1, kBlockSize, fin1));
    if (amt1 > 0) hash1 = libyuv::HashDjb2(buf1, amt1, hash1);
    if (fin2) {
      amt2 = static_cast<int>(fread(buf2, 1, kBlockSize, fin2));
      if (amt2 > 0) hash2 = libyuv::HashDjb2(buf2, amt2, hash2);
      int amt_min = (amt1 < amt2) ? amt1 : amt2;
      size_min += amt_min;
      sum_square_err += libyuv::ComputeSumSquareError(buf1, buf2, amt_min);
    }
  } while (amt1 > 0 || amt2 > 0);

  printf("hash1 %x", hash1);
  if (fin2) {
    printf(", hash2 %x", hash2);
    double mse = static_cast<double>(sum_square_err) /
                 static_cast<double>(size_min);
    printf(", mse %.2f", mse);
    double psnr = libyuv::SumSquareErrorToPsnr(sum_square_err, size_min);
    printf(", psnr %.2f\n", psnr);
    fclose(fin2);
  }
  fclose(fin1);
}
