Tidying.
[libdcp.git] / src / dcp_time.h
1 /*
2     Copyright (C) 2012-2021 Carl Hetherington <cth@carlh.net>
3
4     This file is part of libdcp.
5
6     libdcp is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     libdcp is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with libdcp.  If not, see <http://www.gnu.org/licenses/>.
18
19     In addition, as a special exception, the copyright holders give
20     permission to link the code of portions of this program with the
21     OpenSSL library under certain conditions as described in each
22     individual source file, and distribute linked combinations
23     including the two.
24
25     You must obey the GNU General Public License in all respects
26     for all of the code used other than OpenSSL.  If you modify
27     file(s) with this exception, you may extend this exception to your
28     version of the file(s), but you are not obligated to do so.  If you
29     do not wish to do so, delete this exception statement from your
30     version.  If you delete this exception statement from all source
31     files in the program, then also delete it here.
32 */
33
34
35 /** @file  src/dcp_time.h
36  *  @brief Time class
37  */
38
39
40 #ifndef LIBDCP_TIME_H
41 #define LIBDCP_TIME_H
42
43
44 #include "types.h"
45 #include <boost/optional.hpp>
46 #include <stdint.h>
47 #include <string>
48 #include <iostream>
49
50
51 namespace dcp {
52
53
54 class Time;
55
56
57 extern bool operator== (Time const & a, Time const & b);
58 extern bool operator!= (Time const & a, Time const & b);
59 extern bool operator<= (Time const & a, Time const & b);
60 extern bool operator< (Time const & a, Time const & b);
61 extern bool operator> (Time const & a, Time const & b);
62 extern bool operator>= (Time const & a, Time const & b);
63 extern std::ostream & operator<< (std::ostream & s, Time const & t);
64 extern Time operator+ (Time a, Time b);
65 extern Time operator- (Time a, Time b);
66 extern float operator/ (Time a, Time const & b);
67
68
69 /** @class Time
70  *  @brief A representation of time within a DCP.
71  */
72 class Time
73 {
74 public:
75         /** Construct a zero Time */
76         Time () {}
77
78         /** Construct a Time.
79          *  @param frame Frame index (starting from 0).
80          *  @param frames_per_second Frames per second.
81          *  @param tcr Timecode rate.
82          */
83         Time (int frame, double frames_per_second, int tcr);
84
85         /** Construct a Time from hours, minutes, seconds, editable units and a timecode rate.
86          *  @param h_ Hours.
87          *  @param m_ Minutes.
88          *  @param s_ Seconds.
89          *  @param e_ Editable units (where 1 editable unit is 1 / tcr_ seconds)
90          *  @param tcr_ Timecode rate; i.e. number of editable units per second.
91          */
92         Time (int h_, int m_, int s_, int e_, int tcr_)
93                 : h (h_)
94                 , m (m_)
95                 , s (s_)
96                 , e (e_)
97                 , tcr (tcr_)
98         {}
99
100         /** Construct a Time from a number of seconds and a timecode rate
101          *
102          *  @param seconds A number of seconds
103          *  @param tcr_ Timecode rate
104          */
105         Time (double seconds, int tcr);
106
107         /** @param time String of the form
108          *     HH:MM:SS:EE                          for SMPTE
109          *     HH:MM:SS:E[E[E]] or HH:MM:SS.s[s[s]] for Interop
110          *  where HH are hours, MM minutes, SS seconds, EE editable units and
111          *  sss millseconds.
112          *
113          *  @param tcr_ Timecode rate if this is a SMPTE time, otherwise empty for an Interop time
114          */
115         Time (std::string time, boost::optional<int> tcr);
116
117         int h = 0; ///<   hours
118         int m = 0; ///<   minutes
119         int s = 0; ///<   seconds
120         int e = 0; ///<   editable units (where 1 editable unit is 1 / tcr_ seconds)
121         int tcr = 1; ///< timecode rate: the number of editable units per second.
122
123         /** @return A string of the form h:m:s:e padded as in 00:00:00:000 (for Interop) or 00:00:00:00 (for SMPTE) */
124         std::string as_string (Standard standard) const;
125
126         /** @return the total number of seconds that this time consists of */
127         double as_seconds () const;
128
129         /** @param tcr_ Timecode rate with which the return value should be counted
130          *  @return the total number of editable units that this time consists of at the specified timecode rate, rounded up
131          *  to the nearest editable unit. For example, as_editable_units (24) returns the total time in frames at 24fps.
132          */
133         int64_t as_editable_units (int tcr_) const;
134
135         /** @param tcr_ New timecode rate
136          *  @return A new Time which is this time at the spcified new timecode rate
137          */
138         Time rebase (int tcr_) const;
139
140         Time& operator+= (Time const & o) {
141                 *this = *this + o;
142                 return *this;
143         }
144
145 private:
146         void set (double seconds, int tcr);
147 };
148
149
150 }
151
152
153 #endif