/*
 *  Copyright (c) 2011 The WebRTC 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 <stdlib.h>
#include <string.h>

#include "gflags/gflags.h"
#include "webrtc/modules/video_coding/include/video_coding.h"
#include "webrtc/modules/video_coding/test/receiver_tests.h"
#include "webrtc/test/testsupport/fileutils.h"

DEFINE_string(codec, "VP8", "Codec to use (VP8 or I420).");
DEFINE_int32(width, 352, "Width in pixels of the frames in the input file.");
DEFINE_int32(height, 288, "Height in pixels of the frames in the input file.");
DEFINE_int32(rtt, 0, "RTT (round-trip time), in milliseconds.");
DEFINE_string(input_filename,
              webrtc::test::ProjectRootPath() + "/resources/foreman_cif.yuv",
              "Input file.");
DEFINE_string(output_filename,
              webrtc::test::OutputPath() +
                  "video_coding_test_output_352x288.yuv",
              "Output file.");

namespace webrtc {

/*
 * Build with EVENT_DEBUG defined
 * to build the tests with simulated events.
 */

int vcmMacrosTests = 0;
int vcmMacrosErrors = 0;

int ParseArguments(CmdArgs* args) {
  args->width = FLAGS_width;
  args->height = FLAGS_height;
  if (args->width < 1 || args->height < 1) {
    return -1;
  }
  args->codecName = FLAGS_codec;
  if (args->codecName == "VP8") {
    args->codecType = kVideoCodecVP8;
  } else if (args->codecName == "VP9") {
    args->codecType = kVideoCodecVP9;
  } else if (args->codecName == "I420") {
    args->codecType = kVideoCodecI420;
  } else {
    printf("Invalid codec: %s\n", args->codecName.c_str());
    return -1;
  }
  args->inputFile = FLAGS_input_filename;
  args->outputFile = FLAGS_output_filename;
  args->rtt = FLAGS_rtt;
  return 0;
}
}  // namespace webrtc

int main(int argc, char** argv) {
  // Initialize WebRTC fileutils.h so paths to resources can be resolved.
  webrtc::test::SetExecutablePath(argv[0]);
  google::ParseCommandLineFlags(&argc, &argv, true);

  CmdArgs args;
  if (webrtc::ParseArguments(&args) != 0) {
    printf("Unable to parse input arguments\n");
    return -1;
  }

  printf("Running video coding tests...\n");
  return RtpPlay(args);
}
