diff options
| author | Carl Hetherington <cth@carlh.net> | 2021-03-20 10:19:46 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2021-03-20 10:19:46 +0100 |
| commit | ef31a94cd00dcc88fc83093cbc709b5b79acc4b6 (patch) | |
| tree | a88f220a15d474e0db5757268d9514404b77f22f /src/lib | |
| parent | 62bfae1511bb8d33ef4cd71b5822bb0b74a5389c (diff) | |
Tidy up HMSF handling in a few places.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/dcpomatic_time.h | 63 | ||||
| -rw-r--r-- | src/lib/reel_writer.cc | 5 | ||||
| -rw-r--r-- | src/lib/writer.cc | 15 |
3 files changed, 53 insertions, 30 deletions
diff --git a/src/lib/dcpomatic_time.h b/src/lib/dcpomatic_time.h index 62d8a28cc..00a31a7a7 100644 --- a/src/lib/dcpomatic_time.h +++ b/src/lib/dcpomatic_time.h @@ -39,6 +39,26 @@ struct dcpomatic_time_floor_test; namespace dcpomatic { + +class HMSF +{ +public: + HMSF () {} + + HMSF (int h_, int m_, int s_, int f_) + : h(h_) + , m(m_) + , s(s_) + , f(f_) + {} + + int h = 0; + int m = 0; + int s = 0; + int f = 0; +}; + + /** A time in seconds, expressed as a number scaled up by Time::HZ. We want two different * versions of this class, dcpomatic::ContentTime and dcpomatic::DCPTime, and we want it to be impossible to * convert implicitly between the two. Hence there's this template hack. I'm not @@ -67,6 +87,16 @@ public: /* Explicit conversion from type O */ Time (Time<O, S> d, FrameRateChange f); + /** @param hmsf Hours, minutes, seconds, frames. + * @param fps Frame rate + */ + Time (HMSF const& hmsf, float fps) { + *this = from_seconds (hmsf.h * 3600) + + from_seconds (hmsf.m * 60) + + from_seconds (hmsf.s) + + from_frames (hmsf.f, fps); + } + Type get () const { return _t; } @@ -170,39 +200,34 @@ public: /** Split a time into hours, minutes, seconds and frames. * @param r Frames per second. - * @param h Returned hours. - * @param m Returned minutes. - * @param s Returned seconds. - * @param f Returned frames. + * @return Split time. */ template <typename T> - void split (T r, int& h, int& m, int& s, int& f) const + HMSF split (T r) const { /* Do this calculation with frames so that we can round to a frame boundary at the start rather than the end. */ - int64_t ff = frames_round (r); + auto ff = frames_round (r); + HMSF hmsf; - h = ff / (3600 * r); - ff -= h * 3600 * r; - m = ff / (60 * r); - ff -= m * 60 * r; - s = ff / r; - ff -= s * r; + hmsf.h = ff / (3600 * r); + ff -= hmsf.h * 3600 * r; + hmsf.m = ff / (60 * r); + ff -= hmsf.m * 60 * r; + hmsf.s = ff / r; + ff -= hmsf.s * r; - f = static_cast<int> (ff); + hmsf.f = static_cast<int> (ff); + return hmsf; } template <typename T> std::string timecode (T r) const { - int h; - int m; - int s; - int f; - split (r, h, m, s, f); + auto hmsf = split (r); char buffer[128]; - snprintf (buffer, sizeof (buffer), "%02d:%02d:%02d:%02d", h, m, s, f); + snprintf (buffer, sizeof(buffer), "%02d:%02d:%02d:%02d", hmsf.h, hmsf.m, hmsf.s, hmsf.f); return buffer; } diff --git a/src/lib/reel_writer.cc b/src/lib/reel_writer.cc index 184707373..294c0b7b6 100644 --- a/src/lib/reel_writer.cc +++ b/src/lib/reel_writer.cc @@ -691,10 +691,9 @@ ReelWriter::create_reel_markers (shared_ptr<dcp::Reel> reel) const if (!reel_markers.empty ()) { auto ma = make_shared<dcp::ReelMarkersAsset>(dcp::Fraction(film()->video_frame_rate(), 1), reel->duration(), 0); for (auto const& i: reel_markers) { - int h, m, s, f; DCPTime relative = i.second - _period.from; - relative.split (film()->video_frame_rate(), h, m, s, f); - ma->set (i.first, dcp::Time(h, m, s, f, film()->video_frame_rate())); + auto hmsf = relative.split (film()->video_frame_rate()); + ma->set (i.first, dcp::Time(hmsf.h, hmsf.m, hmsf.s, hmsf.f, film()->video_frame_rate())); } reel->add (ma); } diff --git a/src/lib/writer.cc b/src/lib/writer.cc index 035fc2b1d..54e7473e8 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -733,15 +733,14 @@ Writer::write_cover_sheet (boost::filesystem::path output_dcp) } boost::algorithm::replace_all (text, "$AUDIO", description); - int h, m, s, fr; - film()->length().split(film()->video_frame_rate(), h, m, s, fr); + auto const hmsf = film()->length().split(film()->video_frame_rate()); string length; - if (h == 0 && m == 0) { - length = String::compose("%1s", s); - } else if (h == 0 && m > 0) { - length = String::compose("%1m%2s", m, s); - } else if (h > 0 && m > 0) { - length = String::compose("%1h%2m%3s", h, m, s); + if (hmsf.h == 0 && hmsf.m == 0) { + length = String::compose("%1s", hmsf.s); + } else if (hmsf.h == 0 && hmsf.m > 0) { + length = String::compose("%1m%2s", hmsf.m, hmsf.s); + } else if (hmsf.h > 0 && hmsf.m > 0) { + length = String::compose("%1h%2m%3s", hmsf.h, hmsf.m, hmsf.s); } boost::algorithm::replace_all (text, "$LENGTH", length); |
