2 Copyright (C) 2012-2021 Carl Hetherington <cth@carlh.net>
4 This file is part of libdcp.
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.
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.
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/>.
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
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.
35 /** @file src/dcp_time.h
45 #include <boost/optional.hpp>
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);
70 * @brief A representation of time within a DCP.
75 /** Construct a zero Time */
79 * @param frame Frame index (starting from 0).
80 * @param frames_per_second Frames per second.
81 * @param tcr Timecode rate.
83 Time (int frame, double frames_per_second, int tcr);
85 /** Construct a Time from hours, minutes, seconds, editable units and a timecode rate.
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.
92 Time (int h_, int m_, int s_, int e_, int tcr_)
100 /** Construct a Time from a number of seconds and a timecode rate
102 * @param seconds A number of seconds
103 * @param tcr_ Timecode rate
105 Time (double seconds, int tcr);
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
113 * @param tcr_ Timecode rate if this is a SMPTE time, otherwise empty for an Interop time
115 Time (std::string time, boost::optional<int> tcr);
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.
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;
126 /** @return the total number of seconds that this time consists of */
127 double as_seconds () const;
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 down
131 * to the nearest editable unit. For example, as_editable_units_floor(24) returns the total time in frames at 24fps.
133 int64_t as_editable_units_floor (int tcr_) const;
135 /** @param tcr_ Timecode rate with which the return value should be counted
136 * @return the total number of editable units that this time consists of at the specified timecode rate, rounded up
137 * to the nearest editable unit. For example, as_editable_units_ceil(24) returns the total time in frames at 24fps.
139 int64_t as_editable_units_ceil (int tcr_) const;
141 /** @param tcr_ New timecode rate
142 * @return A new Time which is this time at the spcified new timecode rate
144 Time rebase (int tcr_) const;
146 Time& operator+= (Time const & o) {
151 Time& operator-= (Time const & o) {
157 void set (double seconds, int tcr);