Assorted image subtitle fixes.
[dcpomatic.git] / src / lib / dcpomatic_time.h
index 4afc9ab40623e09a226965ce8cdfb7e7a77d7784..ae8f251996088814f507ff63f0b2c6427ea68d97 100644 (file)
 #ifndef DCPOMATIC_TIME_H
 #define DCPOMATIC_TIME_H
 
+#include "frame_rate_change.h"
+#include "safe_stringstream.h"
+#include "dcpomatic_assert.h"
+#include <stdint.h>
 #include <cmath>
 #include <ostream>
 #include <sstream>
 #include <iomanip>
-#include <stdint.h>
-#include "frame_rate_change.h"
 
 class dcpomatic_round_up_test;
 
@@ -39,13 +41,15 @@ public:
                : _t (0)
        {}
 
-       explicit Time (int64_t t)
+       typedef int64_t Type;
+
+       explicit Time (Type t)
                : _t (t)
        {}
 
        virtual ~Time () {}
 
-       int64_t get () const {
+       Type get () const {
                return _t;
        }
 
@@ -55,9 +59,10 @@ public:
 
        template <typename T>
        int64_t frames (T r) const {
-               return rint (_t * r / HZ);
+               return rint (double (_t) * r / HZ);
        }
 
+       /** @param r Frames per second */
        template <typename T>
        void split (T r, int& h, int& m, int& s, int& f) const
        {
@@ -84,7 +89,7 @@ public:
                int f;
                split (r, h, m, s, f);
 
-               std::ostringstream o;
+               SafeStringStream o;
                o.width (2);
                o.fill ('0');
                o << std::setw(2) << std::setfill('0') << h << ":"
@@ -95,9 +100,9 @@ public:
        }
 
 protected:
-       friend class dcptime_round_up_test;
+       friend struct dcptime_round_up_test;
        
-       int64_t _t;
+       Type _t;
        static const int HZ = 96000;
 };
 
@@ -107,8 +112,8 @@ class ContentTime : public Time
 {
 public:
        ContentTime () : Time () {}
-       explicit ContentTime (int64_t t) : Time (t) {}
-       ContentTime (int64_t n, int64_t d) : Time (n * HZ / d) {}
+       explicit ContentTime (Type t) : Time (t) {}
+       ContentTime (Type n, Type d) : Time (n * HZ / d) {}
        ContentTime (DCPTime d, FrameRateChange f);
 
        bool operator< (ContentTime const & o) const {
@@ -162,8 +167,8 @@ public:
         *  @param r Sampling rate.
         */
        ContentTime round_up (float r) {
-               int64_t const n = rint (HZ / r);
-               int64_t const a = _t + n - 1;
+               Type const n = rint (HZ / r);
+               Type const a = _t + n - 1;
                return ContentTime (a - (a % n));
        }
 
@@ -173,7 +178,7 @@ public:
 
        template <class T>
        static ContentTime from_frames (int64_t f, T r) {
-               assert (r > 0);
+               DCPOMATIC_ASSERT (r > 0);
                return ContentTime (f * HZ / r);
        }
 
@@ -188,6 +193,7 @@ class ContentTimePeriod
 {
 public:
        ContentTimePeriod () {}
+       
        ContentTimePeriod (ContentTime f, ContentTime t)
                : from (f)
                , to (t)
@@ -201,13 +207,14 @@ public:
        }
 
        bool overlaps (ContentTimePeriod const & o) const;
+       bool contains (ContentTime const & o) const;
 };
 
 class DCPTime : public Time
 {
 public:
        DCPTime () : Time () {}
-       explicit DCPTime (int64_t t) : Time (t) {}
+       explicit DCPTime (Type t) : Time (t) {}
        DCPTime (ContentTime t, FrameRateChange c) : Time (rint (t.get() / c.speed_up)) {}
 
        bool operator< (DCPTime const & o) const {
@@ -261,8 +268,8 @@ public:
         *  @param r Sampling rate.
         */
        DCPTime round_up (float r) {
-               int64_t const n = rint (HZ / r);
-               int64_t const a = _t + n - 1;
+               Type const n = rint (HZ / r);
+               Type const a = _t + n - 1;
                return DCPTime (a - (a % n));
        }
 
@@ -276,7 +283,7 @@ public:
 
        template <class T>
        static DCPTime from_frames (int64_t f, T r) {
-               assert (r > 0);
+               DCPOMATIC_ASSERT (r > 0);
                return DCPTime (f * HZ / r);
        }