X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fdcp_time.h;h=21b59921e478879b261f592ef72a6b77520f67c4;hb=3d53fb23efa153e10c37071a4ecac48b74c2dbd6;hp=88a4d8a10b75ac3d606478d7a56b546c0284bda3;hpb=635c3ae7aee1cad4b871fcf0ddf02a8be1cdce78;p=libdcp.git diff --git a/src/dcp_time.h b/src/dcp_time.h index 88a4d8a1..21b59921 100644 --- a/src/dcp_time.h +++ b/src/dcp_time.h @@ -1,35 +1,71 @@ /* - Copyright (C) 2012-2015 Carl Hetherington + Copyright (C) 2012-2021 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of libdcp. + + libdcp is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + libdcp is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - + along with libdcp. If not, see . + + In addition, as a special exception, the copyright holders give + permission to link the code of portions of this program with the + OpenSSL library under certain conditions as described in each + individual source file, and distribute linked combinations + including the two. + + You must obey the GNU General Public License in all respects + for all of the code used other than OpenSSL. If you modify + file(s) with this exception, you may extend this exception to your + version of the file(s), but you are not obligated to do so. If you + do not wish to do so, delete this exception statement from your + version. If you delete this exception statement from all source + files in the program, then also delete it here. */ + /** @file src/dcp_time.h - * @brief Time class. + * @brief Time class */ -#ifndef LIBDCP_TIME_H -#define LIBDCP_TIME_H +#ifndef LIBDCP_DCP_TIME_H +#define LIBDCP_DCP_TIME_H + + +#include "types.h" +#include #include #include #include + namespace dcp { + +class Time; + + +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 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 b); +extern Time operator- (Time a, Time b); +extern float operator/ (Time a, Time const & b); + + /** @class Time * @brief A representation of time within a DCP. */ @@ -37,14 +73,14 @@ class Time { public: /** Construct a zero Time */ - Time () : h (0), m (0), s (0), e (0), tcr (1) {} + Time () {} /** Construct a Time. - * @param Frame index (starting from 0). + * @param frame Frame index (starting from 0). * @param frames_per_second Frames per second. * @param tcr Timecode rate. */ - Time (int frame, int frames_per_second, int tcr); + Time (int frame, double frames_per_second, int tcr); /** Construct a Time from hours, minutes, seconds, editable units and a timecode rate. * @param h_ Hours. @@ -61,36 +97,68 @@ public: , tcr (tcr_) {} - Time (double seconds); + /** Construct a Time from a number of seconds and a timecode rate + * + * @param seconds A number of seconds + * @param tcr_ Timecode rate + */ + Time (double seconds, int tcr); + + /** @param time String of the form + * HH:MM:SS:EE for SMPTE + * HH:MM:SS:E[E[E]] or HH:MM:SS.s[s[s]] for Interop + * where HH are hours, MM minutes, SS seconds, EE editable units and + * sss milliseconds. + * + * @param tcr_ Timecode rate if this is a SMPTE time, otherwise empty for an Interop time + */ + Time (std::string time, boost::optional tcr); - Time (std::string time, int tcr); + int h = 0; ///< hours + int m = 0; ///< minutes + int s = 0; ///< seconds + int e = 0; ///< editable units (where 1 editable unit is 1 / tcr_ seconds) + int tcr = 1; ///< timecode rate: the number of editable units per second. - 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. + /** @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) */ + std::string as_string (Standard standard) const; - std::string as_string () const; + /** @return the total number of seconds that this time consists of */ double as_seconds () const; - int64_t as_editable_units (int tcr_) const; + + /** @param tcr_ Timecode rate with which the return value should be counted + * @return the total number of editable units that this time consists of at the specified timecode rate, rounded down + * to the nearest editable unit. For example, as_editable_units_floor(24) returns the total time in frames at 24fps. + */ + int64_t as_editable_units_floor (int tcr_) const; + + /** @param tcr_ Timecode rate with which the return value should be counted + * @return the total number of editable units that this time consists of at the specified timecode rate, rounded up + * to the nearest editable unit. For example, as_editable_units_ceil(24) returns the total time in frames at 24fps. + */ + int64_t as_editable_units_ceil (int tcr_) const; + + /** @param tcr_ New timecode rate + * @return A new Time which is this time at the specified new timecode rate + */ Time rebase (int tcr_) const; + Time& operator+= (Time const & o) { + *this = *this + o; + return *this; + } + + Time& operator-= (Time const & o) { + *this = *this - o; + return *this; + } + private: void set (double seconds, int tcr); }; -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 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 b); -extern Time operator- (Time a, Time b); -extern float operator/ (Time a, Time const & b); } + #endif