1 #include "yuv4mpeg.hpp"
2 #include "yuvconvert.hpp"
3 #include "parseval.hpp"
6 int main(int argc
, char** argv
)
8 enum yuvc_csptype _csp
= CSP_REC601
;
9 std::string cspstr
= "rec601";
11 for(int i
= 1; i
< argc
; i
++) {
12 std::string arg
= argv
[i
];
14 if(r
= regex("--matrix=(.+)", arg
)) {
17 else if(r
[1] == "rec601")
19 else if(r
[1] == "pc709")
21 else if(r
[1] == "rec709")
23 else if(r
[1] == "pc2020")
25 else if(r
[1] == "rec2020")
28 std::cerr
<< "rgbtoyuv: Unrecognized matrix '" << r
[1] << "'" << std::endl
;
32 } else if(r
= regex("--8bit", arg
)) {
35 std::cerr
<< "rgbtoyuv: Unrecognized option '" << arg
<< "'" << std::endl
;
40 yuvc_converter
* converter
= yuvc_get_converter(RGB_RGB
, _csp
);
45 mark_pipe_as_binary(in
);
46 mark_pipe_as_binary(out
);
50 struct yuv4mpeg_stream_header
strmh(in
);
51 if(strmh
.chroma
!= "rgb")
52 throw std::runtime_error("Unsupported input chroma type (need rgb)");
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
);
65 buffer3
.resize(3 * strmh
.width
* strmh
.height
);
67 buffer3
.resize(6 * strmh
.width
* strmh
.height
);
71 if(!read_line2(in
, _framh
))
73 read_or_die(in
, &buffer
[0], buffer
.size());
74 struct yuv4mpeg_frame_header
framh(_framh
);
76 converter
->transform(reinterpret_cast<uint8_t*>(&buffer3
[0]),
77 reinterpret_cast<const uint8_t*>(&buffer
[0]), strmh
.width
* strmh
.height
);
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
;