/*
 *  Copyright (c) 2019 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>

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

ABSL_FLAG(std::string, input_config, "", "JSON file with config");
ABSL_FLAG(std::string, output_rtpdump, "", "Where to store the rtpdump");

int main(int argc, char* argv[]) {
  absl::ParseCommandLine(argc, argv);

  // TODO(bugs.webrtc.org/10616): Add program usage message when Abseil
  // flags supports it.
  // const std::string usage =
  //    "Generates custom configured rtpdumps for the purpose of testing.\n"
  //    "Example Usage:\n"
  //    "./rtp_generator --input_config=sender_config.json\n"
  //    "                --output_rtpdump=my.rtpdump\n";

  const std::string config_path = absl::GetFlag(FLAGS_input_config);
  const std::string rtp_dump_path = absl::GetFlag(FLAGS_output_rtpdump);

  if (rtp_dump_path.empty() || config_path.empty()) {
    return EXIT_FAILURE;
  }

  absl::optional<webrtc::RtpGeneratorOptions> options =
      webrtc::ParseRtpGeneratorOptionsFromFile(config_path);
  if (!options.has_value()) {
    return EXIT_FAILURE;
  }

  webrtc::RtpGenerator rtp_generator(*options);
  rtp_generator.GenerateRtpDump(rtp_dump_path);

  return EXIT_SUCCESS;
}
