X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fdcp_time.cc;h=025a48590ed51aafcc4ff02c8670e0997a3e4724;hb=8d56ea4bbff391dd72981f86001245a595fa9c62;hp=526c784c95b09bff127aba1900d501281972a5d6;hpb=e4d5298e7a179d4103581cba05cbc516f94acf60;p=libdcp.git diff --git a/src/dcp_time.cc b/src/dcp_time.cc index 526c784c..025a4859 100644 --- a/src/dcp_time.cc +++ b/src/dcp_time.cc @@ -39,6 +39,7 @@ #include "dcp_time.h" #include "exceptions.h" #include "compose.hpp" +#include "dcp_assert.h" #include #include #include @@ -107,7 +108,7 @@ Time::Time (string time, optional tcr_) split (b, time, is_any_of (":")); if (b.size() < 3 || b[0].empty() || b[1].empty() || b[0].length() > 2 || b[1].length() > 2) { - boost::throw_exception (DCPReadError (String::compose ("unrecognised time specification %1", time))); + boost::throw_exception (ReadError (String::compose ("unrecognised time specification %1", time))); } if (!tcr_) { @@ -117,17 +118,17 @@ Time::Time (string time, optional tcr_) vector bs; split (bs, b[2], is_any_of (".")); if (bs.size() != 2) { - boost::throw_exception (DCPReadError (String::compose ("unrecognised time specification %1", time))); + boost::throw_exception (ReadError (String::compose ("unrecognised time specification %1", time))); } h = raw_convert (b[0]); m = raw_convert (b[1]); if (bs[0].empty() || bs[0].length() > 2) { - boost::throw_exception (DCPReadError (String::compose ("unrecognised time specification %1; %2 has bad length", time, bs[0]))); + boost::throw_exception (ReadError (String::compose ("unrecognised time specification %1; %2 has bad length", time, bs[0]))); } s = raw_convert (bs[0]); if (bs[1].empty() || bs[1].length() > 3) { - boost::throw_exception (DCPReadError (String::compose ("unrecognised time specification %1; %2 has bad length", time, bs[1]))); + boost::throw_exception (ReadError (String::compose ("unrecognised time specification %1; %2 has bad length", time, bs[1]))); } e = raw_convert (bs[1]); tcr = 1000; @@ -136,33 +137,33 @@ Time::Time (string time, optional tcr_) h = raw_convert (b[0]); m = raw_convert (b[1]); if (b[2].empty() || b[2].length() > 2) { - boost::throw_exception (DCPReadError (String::compose ("unrecognised time specification %1; %2 has bad length", time, b[2]))); + boost::throw_exception (ReadError (String::compose ("unrecognised time specification %1; %2 has bad length", time, b[2]))); } s = raw_convert (b[2]); if (b[3].empty() || b[3].length() > 3) { - boost::throw_exception (DCPReadError (String::compose ("unrecognised time specification %1; %2 has bad length", time, b[3]))); + boost::throw_exception (ReadError (String::compose ("unrecognised time specification %1; %2 has bad length", time, b[3]))); } e = raw_convert (b[3]); tcr = 250; } else { - boost::throw_exception (DCPReadError (String::compose ("unrecognised time specification %1", time))); + boost::throw_exception (ReadError (String::compose ("unrecognised time specification %1", time))); } } else { /* SMPTE: HH:MM:SS:EE */ split (b, time, is_any_of (":")); if (b.size() != 4) { - boost::throw_exception (DCPReadError (String::compose ("unrecognised time specification %1; does not have 4 parts", time))); + boost::throw_exception (ReadError (String::compose ("unrecognised time specification %1; does not have 4 parts", time))); } h = raw_convert (b[0]); m = raw_convert (b[1]); if (b[2].empty() || b[2].length() > 2) { - boost::throw_exception (DCPReadError (String::compose ("unrecognised time specification %1; %2 has bad length", time, b[2]))); + boost::throw_exception (ReadError (String::compose ("unrecognised time specification %1; %2 has bad length", time, b[2]))); } s = raw_convert (b[2]); if (b[3].empty() || b[3].length() > 2) { - boost::throw_exception (DCPReadError (String::compose ("unrecognised time specification %1; %2 has bad length", time, b[3]))); + boost::throw_exception (ReadError (String::compose ("unrecognised time specification %1; %2 has bad length", time, b[3]))); } e = raw_convert (b[3]); tcr = tcr_.get(); @@ -208,11 +209,7 @@ dcp::operator< (Time const & a, Time const & b) return a.s < b.s; } - if ((a.e * b.tcr) != (b.e * a.tcr)) { - return (a.e * b.tcr) < (b.e * a.tcr); - } - - return true; + return (a.e * b.tcr) < (b.e * a.tcr); } bool @@ -230,11 +227,7 @@ dcp::operator> (Time const & a, Time const & b) return a.s > b.s; } - if ((a.e * b.tcr) != (b.e * a.tcr)) { - return (a.e * b.tcr) > (b.e * a.tcr); - } - - return true; + return (a.e * b.tcr) > (b.e * a.tcr); } ostream & @@ -330,18 +323,15 @@ dcp::operator/ (Time a, Time const & b) string Time::as_string (Standard standard) const { - locked_stringstream str; - str << setw(2) << setfill('0') << h << ":" - << setw(2) << setfill('0') << m << ":" - << setw(2) << setfill('0') << s << ":"; + char buffer[64]; if (standard == SMPTE) { - str << setw(2) << setfill('0') << e; + snprintf (buffer, sizeof(buffer), "%02d:%02d:%02d:%02d", h, m, s, e); } else { - str << setw(3) << setfill('0') << e; + snprintf (buffer, sizeof(buffer), "%02d:%02d:%02d:%03d", h, m, s, e); } - return str.str (); + return buffer; } /** @param tcr_ Timecode rate with which the return value should be counted. @@ -367,5 +357,22 @@ Time::as_seconds () const Time Time::rebase (int tcr_) const { - return Time (h, m, s, floor (float (e) * tcr_ / tcr), tcr_); + long int e_ = lrintf (float (e) * tcr_ / tcr); + int s_ = s; + if (e_ >= tcr_) { + e_ -= tcr_; + ++s_; + } + int m_ = m; + if (s_ >= 60) { + s_ -= 60; + ++m_; + } + int h_ = h; + if (m_ >= 60) { + m_ -= 60; + ++h_; + } + + return Time (h_, m_, s_, e_, tcr_); }