Merge master.
[dcpomatic.git] / src / lib / dcpomatic_time.h
index 05b4e1a5d7d1d2061fe26327068632e03c79c78b..2a871889a529be2ec7e7f6bcc7c0c15c2f2cf5c8 100644 (file)
@@ -21,6 +21,7 @@
 #define DCPOMATIC_TIME_H
 
 #include <cmath>
+#include <ostream>
 #include <stdint.h>
 #include "frame_rate_change.h"
 
@@ -55,10 +56,6 @@ public:
                return rint (_t * r / HZ);
        }
 
-       operator bool () const {
-               return _t != 0;
-       }
-
 protected:
        friend class dcptime_round_up_test;
        
@@ -109,6 +106,10 @@ public:
                return *this;
        }
 
+       ContentTime operator- () const {
+               return ContentTime (-_t);
+       }
+
        ContentTime operator- (ContentTime const & o) const {
                return ContentTime (_t - o._t);
        }
@@ -118,14 +119,48 @@ public:
                return *this;
        }
 
+       /** Round up to the nearest sampling interval
+        *  at some sampling rate.
+        *  @param r Sampling rate.
+        */
+       ContentTime round_up (float r) {
+               int64_t const n = rint (HZ / r);
+               int64_t const a = _t + n - 1;
+               return ContentTime (a - (a % n));
+       }
+
        static ContentTime from_seconds (double s) {
                return ContentTime (s * HZ);
        }
 
        template <class T>
        static ContentTime from_frames (int64_t f, T r) {
+               assert (r > 0);
                return ContentTime (f * HZ / r);
        }
+
+       static ContentTime max () {
+               return ContentTime (INT64_MAX);
+       }
+};
+
+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);
+       }
 };
 
 class DCPTime : public Time
@@ -168,6 +203,10 @@ public:
                return *this;
        }
 
+       DCPTime operator- () const {
+               return DCPTime (-_t);
+       }
+
        DCPTime operator- (DCPTime const & o) const {
                return DCPTime (_t - o._t);
        }
@@ -181,8 +220,8 @@ public:
         *  at some sampling rate.
         *  @param r Sampling rate.
         */
-       DCPTime round_up (int r) {
-               int64_t const n = HZ / r;
+       DCPTime round_up (float r) {
+               int64_t const n = rint (HZ / r);
                int64_t const a = _t + n - 1;
                return DCPTime (a - (a % n));
        }
@@ -197,6 +236,7 @@ public:
 
        template <class T>
        static DCPTime from_frames (int64_t f, T r) {
+               assert (r > 0);
                return DCPTime (f * HZ / r);
        }
 
@@ -210,5 +250,6 @@ public:
 };
 
 DCPTime min (DCPTime a, DCPTime b);
+std::ostream& operator<< (std::ostream& s, DCPTime t);
 
 #endif