Fix integer overflow in ft_rendered_size_line
[ilaris-y4m-tools.git] / marker.cpp
blobf7866029825d13275dd3d902c6de1fbb27a374c6
1 #include "marker.hpp"
2 #include "parseval.hpp"
4 timemarker::timemarker()
6 mode = 0;
9 timemarker::timemarker(const std::string& tspec)
11 regex_results r;
12 if(r = regex("(0|[1-9][0-9]*)", tspec)) {
13 mode = 1;
14 frame = parse_value<uint64_t>(r[1]);
15 } else if(r = regex("(0|[1-9][0-9]*):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])(\\.([0-9]+))?", tspec)) {
16 mode = 2;
17 timepos = parse_value<uint64_t>(r[1]) * 3600 +
18 parse_value<uint64_t>(r[2]) * 60 +
19 parse_value<uint64_t>(r[3]);
20 if(r[4] != "")
21 timepos += parse_value<double>("0" + r[4]);
22 } else if(r = regex("([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])(\\.([0-9]+))?", tspec)) {
23 mode = 2;
24 timepos = parse_value<uint64_t>(r[1]) * 60 +
25 parse_value<uint64_t>(r[2]);
26 if(r[3] != "")
27 timepos += parse_value<double>("0" + r[3]);
28 } else if(r = regex("(0|[1-9][0-9]*)(\\.([0-9]+))?", tspec)) {
29 mode = 2;
30 timepos = parse_value<uint64_t>(r[1]);
31 if(r[2] != "")
32 timepos += parse_value<double>("0" + r[2]);
33 } else
34 throw std::runtime_error("Bad timespec");
37 uint64_t timemarker::get_frame(double fps, uint64_t dflt) const
39 if(mode == 0)
40 return dflt;
41 if(mode == 1)
42 return frame;
43 if(mode == 2)
44 return fps * timepos + 0.5;
45 return dflt;