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

#include "absl/flags/flag.h"
#include "absl/flags/parse.h"
#include "rtc_tools/converter/converter.h"

ABSL_FLAG(int, width, -1, "Width in pixels of the frames in the input file");
ABSL_FLAG(int, height, -1, "Height in pixels of the frames in the input file");
ABSL_FLAG(std::string,
          frames_dir,
          ".",
          "The path to the directory where the frames reside");
ABSL_FLAG(std::string,
          output_file,
          "output.yuv",
          " The output file to which frames are written");
ABSL_FLAG(bool,
          delete_frames,
          false,
          " Whether or not to delete the input frames after the conversion");

/*
 * A command-line tool based on libyuv to convert a set of RGBA files to a YUV
 * video.
 * Usage:
 * rgba_to_i420_converter --frames_dir=<directory_to_rgba_frames>
 * --output_file=<output_yuv_file> --width=<width_of_input_frames>
 * --height=<height_of_input_frames>
 */
int main(int argc, char* argv[]) {
  absl::ParseCommandLine(argc, argv);
  // TODO(bugs.webrtc.org/10616): Add program usage message when Abseil
  // flags supports it.
  // std::string usage =
  //     "Converts RGBA raw image files to I420 frames for YUV.\n"
  //     "Example usage:\n" +
  //     program_name +
  //     " --frames_dir=. --output_file=output.yuv --width=320 --height=240\n"
  //     "IMPORTANT: If you pass the --delete_frames command line parameter, the
  //     " "tool will delete the input frames after conversion.\n" "Command line
  //     flags:\n" "  - width(int): Width in pixels of the frames in the input
  //     file." " Default: -1\n" "  - height(int): Height in pixels of the
  //     frames in the input file." " Default: -1\n" "  - frames_dir(string):
  //     The path to the directory where the frames " "reside." " Default: .\n"
  //     "  - output_file(string): The output file to which frames are written."
  //     " Default: output.yuv\n"
  //     "  - delete_frames(bool): Whether or not to delete the input frames
  //     after" " the conversion. Default: false.\n";

  int width = absl::GetFlag(FLAGS_width);
  int height = absl::GetFlag(FLAGS_height);

  if (width <= 0 || height <= 0) {
    fprintf(stderr, "Error: width or height cannot be <= 0!\n");
    return -1;
  }

  bool del_frames = absl::GetFlag(FLAGS_delete_frames);

  webrtc::test::Converter converter(width, height);
  bool success = converter.ConvertRGBAToI420Video(
      absl::GetFlag(FLAGS_frames_dir), absl::GetFlag(FLAGS_output_file),
      del_frames);

  if (success) {
    fprintf(stdout, "Successful conversion of RGBA frames to YUV video!\n");
    return 0;
  } else {
    fprintf(stdout, "Unsuccessful conversion of RGBA frames to YUV video!\n");
    return -1;
  }
}
