X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fdcp_time.cc;h=7a4a67d667ead2ad0a0559f94e210da12c5163eb;hb=76e3325a16cdf6d7220a61e2b5cfdb9c804cc32c;hp=f0b7e231c6935669d6942467f75b6c25380e06bb;hpb=f964e99d63f5f5999ae4f245e6b25ced014d8383;p=libdcp.git diff --git a/src/dcp_time.cc b/src/dcp_time.cc index f0b7e231..7a4a67d6 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(); @@ -324,7 +325,7 @@ Time::as_string (Standard standard) const { char buffer[64]; - if (standard == SMPTE) { + if (standard == Standard::SMPTE) { snprintf (buffer, sizeof(buffer), "%02d:%02d:%02d:%02d", h, m, s, e); } else { snprintf (buffer, sizeof(buffer), "%02d:%02d:%02d:%03d", h, m, s, e); @@ -356,5 +357,22 @@ Time::as_seconds () const Time Time::rebase (int tcr_) const { - return Time (h, m, s, lrintf (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_); }