Fix integer overflow in ft_rendered_size_line
[ilaris-y4m-tools.git] / rgbtoyuv.cpp
blobfab04ebf3466b2320cefd4aa2323cdee61a76a22
1 #include "yuv4mpeg.hpp"
2 #include "yuvconvert.hpp"
3 #include "parseval.hpp"
4 #include <iostream>
6 int main(int argc, char** argv)
8 enum yuvc_csptype _csp = CSP_REC601;
9 std::string cspstr = "rec601";
10 bool bits8 = false;
11 for(int i = 1; i < argc; i++) {
12 std::string arg = argv[i];
13 regex_results r;
14 if(r = regex("--matrix=(.+)", arg)) {
15 if(r[1] == "pc601")
16 _csp = CSP_PC601;
17 else if(r[1] == "rec601")
18 _csp = CSP_REC601;
19 else if(r[1] == "pc709")
20 _csp = CSP_PC709;
21 else if(r[1] == "rec709")
22 _csp = CSP_REC709;
23 else if(r[1] == "pc2020")
24 _csp = CSP_PC2020;
25 else if(r[1] == "rec2020")
26 _csp = CSP_REC2020;
27 else {
28 std::cerr << "rgbtoyuv: Unrecognized matrix '" << r[1] << "'" << std::endl;
29 return 1;
31 cspstr = r[1];
32 } else if(r = regex("--8bit", arg)) {
33 bits8 = true;
34 } else {
35 std::cerr << "rgbtoyuv: Unrecognized option '" << arg << "'" << std::endl;
36 return 1;
40 yuvc_converter* converter = yuvc_get_converter(RGB_RGB, _csp);
42 //Open files.
43 FILE* in = stdin;
44 FILE* out = stdout;
45 mark_pipe_as_binary(in);
46 mark_pipe_as_binary(out);
48 //Fixup header.
49 try {
50 struct yuv4mpeg_stream_header strmh(in);
51 if(strmh.chroma != "rgb")
52 throw std::runtime_error("Unsupported input chroma type (need rgb)");
53 if(bits8)
54 strmh.chroma = "444";
55 else
56 strmh.chroma = "444p16";
57 strmh.extension.push_back("yuvmatrix=" + cspstr);
58 std::string _strmh = std::string(strmh);
59 write_or_die(out, _strmh);
61 std::vector<char> buffer;
62 std::vector<char> buffer3;
63 buffer.resize(3 * strmh.width * strmh.height);
64 if(bits8)
65 buffer3.resize(3 * strmh.width * strmh.height);
66 else
67 buffer3.resize(6 * strmh.width * strmh.height);
68 //Write frames.
69 while(true) {
70 std::string _framh;
71 if(!read_line2(in, _framh))
72 break;
73 read_or_die(in, &buffer[0], buffer.size());
74 struct yuv4mpeg_frame_header framh(_framh);
75 if(bits8)
76 converter->transform(reinterpret_cast<uint8_t*>(&buffer3[0]),
77 reinterpret_cast<const uint8_t*>(&buffer[0]), strmh.width * strmh.height);
78 else
79 converter->transform(reinterpret_cast<uint16_t*>(&buffer3[0]),
80 reinterpret_cast<const uint8_t*>(&buffer[0]), strmh.width * strmh.height);
81 write_or_die(out, _framh);
82 write_or_die(out, &buffer3[0], buffer3.size());
84 } catch(std::exception& e) {
85 std::cerr << "rgbtoyuv: Error: " << e.what() << std::endl;
86 return 1;
88 return 0;