Fix handling of timing in SMPTE subtitles.
[libdcp.git] / src / dcp_time.h
index 70bc55735111e297ae14f7f98479f7d5ab44be5b..23f860cf084fb678a6c79e8eb327cf419d2dd53d 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2014 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -37,41 +37,41 @@ namespace dcp {
 class Time
 {
 public:
-       Time () : h (0), m (0), s (0), t (0) {}
+       Time () : h (0), m (0), s (0), e (0), tcr (1) {}
 
-       Time (int64_t ticks);
-
-       /** Construct a Time from a frame index (starting from 0)
-        *  and a frames per second count.
+       /** Construct a Time from a frame index (starting from 0),
+        *  a frames per second count and a timecode rate.
         */
-       Time (int frame, int frames_per_second);
+       Time (int frame, int frames_per_second, int tcr);
 
-       /** Construct a Time from hours, minutes, seconds and ticks.
+       /** Construct a Time from hours, minutes, seconds, editable units and a timecode rate.
         *  @param h_ Hours.
         *  @param m_ Minutes.
         *  @param s_ Seconds.
-        *  @param t_ Ticks (where 1 tick is 4 milliseconds).
+        *  @param e_ Editable units (where 1 editable unit is 1 / tcr_ seconds)
+        *  @param tcr_ Timecode rate; i.e. number of editable units per second.
         */
-       Time (int h_, int m_, int s_, int t_)
+       Time (int h_, int m_, int s_, int e_, int tcr_)
                : h (h_)
                , m (m_)
                , s (s_)
-               , t (t_)
+               , e (e_)
+               , tcr (tcr_)
        {}
 
-       Time (std::string time);
+       Time (std::string time, int tcr);
 
-       int h; ///< hours
-       int m; ///< minutes
-       int s; ///< seconds
-       int t; ///< `ticks', where 1 tick is 4 milliseconds
+       int h; ///<   hours
+       int m; ///<   minutes
+       int s; ///<   seconds
+       int e; ///<   editable units (where 1 editable unit is 1 / tcr_ seconds)
+       int tcr; ///< timecode rate: the number of editable units per second.
 
        std::string to_string () const;
-       int64_t to_ticks () const;
-       double to_seconds () const;
+       int64_t to_editable_units (int tcr_) const;
 
 private:
-       void set (double);
+       void set (double seconds, int tcr);
 };
 
 extern bool operator== (Time const & a, Time const & b);
@@ -81,8 +81,8 @@ extern bool operator< (Time const & a, Time const & b);
 extern bool operator> (Time const & a, Time const & b);
 extern bool operator>= (Time const & a, Time const & b);
 extern std::ostream & operator<< (std::ostream & s, Time const & t);
-extern Time operator+ (Time a, Time const & b);        
-extern Time operator- (Time a, Time const & b);
+extern Time operator+ (Time a, Time b);        
+extern Time operator- (Time a, Time b);
 extern float operator/ (Time a, Time const & b);
 
 }