X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fdcpomatic_time.h;h=4afc9ab40623e09a226965ce8cdfb7e7a77d7784;hb=194615b5f673214b1e4fc4211364f95eeb96af15;hp=59986e6d892994787301325b7a4fc15316d89911;hpb=2c0478d2b33906845b9d910668b12fe3e8f03a7c;p=dcpomatic.git diff --git a/src/lib/dcpomatic_time.h b/src/lib/dcpomatic_time.h index 59986e6d8..4afc9ab40 100644 --- a/src/lib/dcpomatic_time.h +++ b/src/lib/dcpomatic_time.h @@ -22,6 +22,8 @@ #include #include +#include +#include #include #include "frame_rate_change.h" @@ -56,6 +58,42 @@ public: return rint (_t * r / HZ); } + template + void split (T r, int& h, int& m, int& s, int& f) 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 (r); + + h = ff / (3600 * r); + ff -= h * 3600 * r; + m = ff / (60 * r); + ff -= m * 60 * r; + s = ff / r; + ff -= s * r; + + f = static_cast (ff); + } + + template + std::string timecode (T r) const { + int h; + int m; + int s; + int f; + split (r, h, m, s, f); + + std::ostringstream o; + o.width (2); + o.fill ('0'); + o << std::setw(2) << std::setfill('0') << h << ":" + << std::setw(2) << std::setfill('0') << m << ":" + << std::setw(2) << std::setfill('0') << s << ":" + << std::setw(2) << std::setfill('0') << f; + return o.str (); + } + protected: friend class dcptime_round_up_test; @@ -135,6 +173,7 @@ public: template static ContentTime from_frames (int64_t f, T r) { + assert (r > 0); return ContentTime (f * HZ / r); } @@ -145,6 +184,25 @@ public: std::ostream& operator<< (std::ostream& s, ContentTime t); +class ContentTimePeriod +{ +public: + ContentTimePeriod () {} + ContentTimePeriod (ContentTime f, ContentTime t) + : from (f) + , to (t) + {} + + ContentTime from; + ContentTime to; + + ContentTimePeriod operator+ (ContentTime const & o) const { + return ContentTimePeriod (from + o, to + o); + } + + bool overlaps (ContentTimePeriod const & o) const; +}; + class DCPTime : public Time { public: @@ -185,6 +243,10 @@ public: return *this; } + DCPTime operator- () const { + return DCPTime (-_t); + } + DCPTime operator- (DCPTime const & o) const { return DCPTime (_t - o._t); } @@ -214,6 +276,7 @@ public: template static DCPTime from_frames (int64_t f, T r) { + assert (r > 0); return DCPTime (f * HZ / r); }