summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2018-05-02 22:16:03 +0100
committerCarl Hetherington <cth@carlh.net>2018-05-02 22:16:03 +0100
commit7b03aba8bc4e9df269430d79ce4ee2c6bd5f344c (patch)
tree38f0a72117bbf1a3cade0f418355fa2715377091
parent0bfa05b5c0c23cb4df482ee64222ca176c0e1b90 (diff)
rebase() would round up and so it was possible for ticks to go out of range.
Now it still rounds up but then copes with overflow.
-rw-r--r--src/dcp_time.cc20
-rw-r--r--test/dcp_time_test.cc4
2 files changed, 22 insertions, 2 deletions
diff --git a/src/dcp_time.cc b/src/dcp_time.cc
index f0b7e231..acc9723f 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 <boost/algorithm/string.hpp>
#include <boost/optional.hpp>
#include <iostream>
@@ -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_);
}
diff --git a/test/dcp_time_test.cc b/test/dcp_time_test.cc
index 48a35b5a..405640f8 100644
--- a/test/dcp_time_test.cc
+++ b/test/dcp_time_test.cc
@@ -102,7 +102,9 @@ BOOST_AUTO_TEST_CASE (dcp_time)
b = dcp::Time (9, 12, 41, 17, 99);
BOOST_CHECK_EQUAL (b.rebase(250), dcp::Time(9, 12, 41, 43, 250));
a = dcp::Time (0, 2, 57, 999, 1000);
- BOOST_CHECK_EQUAL (a.rebase(250), dcp::Time(0, 2, 57, 250, 250));
+ BOOST_CHECK_EQUAL (a.rebase(250), dcp::Time(0, 2, 58, 0, 250));
+ a = dcp::Time (0, 47, 9, 998, 1000);
+ BOOST_CHECK_EQUAL (a.rebase(250), dcp::Time(0, 47, 10, 0, 250));
/* Check some allowed constructions from string */