1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
113f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <stdio.h>
123f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <stdlib.h>
133f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <map>
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <string>
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <vector>
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
18cff5c03bbf63004ab85478a5660d341d3366ef63pbos@webrtc.org#include "webrtc/tools/converter/converter.h"
19cff5c03bbf63004ab85478a5660d341d3366ef63pbos@webrtc.org#include "webrtc/tools/simple_command_line_parser.h"
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * A command-line tool based on libyuv to convert a set of RGBA files to a YUV
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * video.
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Usage:
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * rgba_to_i420_converter --frames_dir=<directory_to_rgba_frames>
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * --output_file=<output_yuv_file> --width=<width_of_input_frames>
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * --height=<height_of_input_frames>
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint main(int argc, char** argv) {
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string program_name = argv[0];
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string usage = "Converts RGBA raw image files to I420 frames for YUV.\n"
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    "Example usage:\n" + program_name +
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    " --frames_dir=. --output_file=output.yuv --width=320 --height=240\n"
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    "IMPORTANT: If you pass the --delete_frames command line parameter, the "
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    "tool will delete the input frames after conversion.\n"
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    "Command line flags:\n"
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    "  - width(int): Width in pixels of the frames in the input file."
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    " Default: -1\n"
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    "  - height(int): Height in pixels of the frames in the input file."
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    " Default: -1\n"
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    "  - frames_dir(string): The path to the directory where the frames reside."
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    " Default: .\n"
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    "  - output_file(string): The output file to which frames are written."
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    " Default: output.yuv\n"
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    "  - delete_frames(bool): Whether or not to delete the input frames after"
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    " the conversion. Default: false.\n";
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::test::CommandLineParser parser;
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Init the parser and set the usage message
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  parser.Init(argc, argv);
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  parser.SetUsageMessage(usage);
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  parser.SetFlag("width", "-1");
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  parser.SetFlag("height", "-1");
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  parser.SetFlag("frames_dir", ".");
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  parser.SetFlag("output_file", "output.yuv");
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  parser.SetFlag("delete_frames", "false");
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  parser.SetFlag("help", "false");
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  parser.ProcessFlags();
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (parser.GetFlag("help") == "true") {
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    parser.PrintUsageMessage();
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  parser.PrintEnteredFlags();
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int width = strtol((parser.GetFlag("width")).c_str(), NULL, 10);
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int height = strtol((parser.GetFlag("height")).c_str(), NULL, 10);
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (width <= 0 || height <= 0) {
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    fprintf(stderr, "Error: width or height cannot be <= 0!\n");
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool del_frames = (parser.GetFlag("delete_frames") == "true") ? true : false;
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::test::Converter converter(width, height);
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool success = converter.ConvertRGBAToI420Video(parser.GetFlag("frames_dir"),
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                  parser.GetFlag("output_file"),
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                  del_frames);
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (success) {
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    fprintf(stdout, "Successful conversion of RGBA frames to YUV video!\n");
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  } else {
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    fprintf(stdout, "Unsuccessful conversion of RGBA frames to YUV video!\n");
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
90