1 #include "yuv4mpeg.hpp"
2 #include "parseval.hpp"
3 #include "fpschanger.hpp"
6 int main(int argc
, char** argv
)
15 for(int i
= 1; i
< argc
; i
++) {
16 std::string arg
= argv
[i
];
18 if(r
= regex("--fps=([1-9][0-9]*)", arg
)) {
20 fps_n
= parse_value
<unsigned>(r
[1]);
22 } catch(std::exception
& e
) {
23 std::cerr
<< "changefps: Bad fps '" << r
[1] << "'" << std::endl
;
26 } else if(r
= regex("--fps=([1-9][0-9]*)/([1-9][0-9]*)", arg
)) {
28 fps_n
= parse_value
<unsigned>(r
[1]);
29 fps_d
= parse_value
<unsigned>(r
[2]);
30 } catch(std::exception
& e
) {
31 std::cerr
<< "changefps: Bad fps '" << r
[1] << "/" << r
[2] << "'" << std::endl
;
35 std::cerr
<< "changefps: Unrecognized option '" << arg
<< "'" << std::endl
;
43 mark_pipe_as_binary(in
);
44 mark_pipe_as_binary(out
);
49 struct yuv4mpeg_stream_header
strmh(in
);
50 if(strmh
.chroma
== "rgb")
51 framesize
= 3 * strmh
.width
* strmh
.height
;
52 else if(strmh
.chroma
== "420")
53 framesize
= 3 * strmh
.width
* strmh
.height
/ 2;
54 else if(strmh
.chroma
== "420p16")
55 framesize
= 6 * strmh
.width
* strmh
.height
/ 2;
56 else if(strmh
.chroma
== "422")
57 framesize
= 2 * strmh
.width
* strmh
.height
;
58 else if(strmh
.chroma
== "422p16")
59 framesize
= 4 * strmh
.width
* strmh
.height
;
60 else if(strmh
.chroma
== "444")
61 framesize
= 3 * strmh
.width
* strmh
.height
;
62 else if(strmh
.chroma
== "444p16")
63 framesize
= 6 * strmh
.width
* strmh
.height
;
65 throw std::runtime_error("Unsupported input chroma type '" + strmh
.chroma
+ "'");
66 if(strmh
.fps_n
&& strmh
.fps_d
) {
77 strmh
.delete_extensions("VFR");
78 std::string _strmh
= std::string(strmh
);
79 write_or_die(out
, _strmh
);
81 unsigned duration
= 0;
83 fpschanger
timer(fps_n
, fps_d
, ofps_n
, ofps_d
);
84 std::string _framh
, _framh2
;
85 std::vector
<char> buffer
;
86 buffer
.resize(framesize
);
87 struct yuv4mpeg_frame_header framh
;
91 if(!read_line2(in
, _framh
))
93 framh
= yuv4mpeg_frame_header(_framh
);
95 read_or_die(in
, &buffer
[0], buffer
.size());
96 duration
= framh
.duration
; //Default.
97 count
= timer
.duration(duration
);
98 for(unsigned i
= 0; i
< count
; i
++) {
101 std::string _framh2
= framh
;
102 write_or_die(out
, _framh2
);
103 write_or_die(out
, &buffer
[0], framesize
);
106 } catch(std::exception
& e
) {
107 std::cerr
<< "changefps: Error: " << e
.what() << std::endl
;
110 std::cerr
<< "changefps: Read " << infr
<< " frames, wrote " << outfr
<< " frames." << std::endl
;