summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dcp_time.cc5
-rw-r--r--test/dcp_time_test.cc6
2 files changed, 8 insertions, 3 deletions
diff --git a/src/dcp_time.cc b/src/dcp_time.cc
index e21eaf27..f08f2b1c 100644
--- a/src/dcp_time.cc
+++ b/src/dcp_time.cc
@@ -147,7 +147,8 @@ Time::Time (string time, optional<int> tcr_)
}
} else {
- /* SMPTE: HH:MM:SS:EE */
+ /* SMPTE: HH:MM:SS:EE[E].
+ * It seems like there can be any number of E digits but let's just allow 2 or 3 */
split (b, time, is_any_of (":"));
if (b.size() != 4) {
boost::throw_exception (ReadError (String::compose ("unrecognised time specification %1; does not have 4 parts", time)));
@@ -159,7 +160,7 @@ Time::Time (string time, optional<int> tcr_)
boost::throw_exception (ReadError (String::compose ("unrecognised time specification %1; %2 has bad length", time, b[2])));
}
s = raw_convert<int> (b[2]);
- if (b[3].empty() || b[3].length() > 2) {
+ if (b[3].empty() || b[3].length() > 3) {
boost::throw_exception (ReadError (String::compose ("unrecognised time specification %1; %2 has bad length", time, b[3])));
}
e = raw_convert<int> (b[3]);
diff --git a/test/dcp_time_test.cc b/test/dcp_time_test.cc
index 4b529be6..3e0050b4 100644
--- a/test/dcp_time_test.cc
+++ b/test/dcp_time_test.cc
@@ -131,6 +131,11 @@ BOOST_AUTO_TEST_CASE (dcp_time)
/* SMPTE */
a = dcp::Time ("01:23:45:12", 250);
BOOST_CHECK_EQUAL (a, dcp::Time (1, 23, 45, 12, 250));
+ /* The editable units field can be any length (depending on the timecode rate)
+ * but in practice I think 3 is enough.
+ */
+ a = dcp::Time("00:05:01:519", 250);
+ BOOST_CHECK_EQUAL(a, dcp::Time(0, 5, 1, 519, 250));
/* Check some disallowed constructions from string */
BOOST_CHECK_THROW (dcp::Time ("01:23:45:1234", optional<int>()), dcp::ReadError);
@@ -145,7 +150,6 @@ BOOST_AUTO_TEST_CASE (dcp_time)
BOOST_CHECK_THROW (dcp::Time ("01:23:.123", optional<int>()), dcp::ReadError);
BOOST_CHECK_THROW (dcp::Time ("01::45.123", optional<int>()), dcp::ReadError);
BOOST_CHECK_THROW (dcp::Time (":23:45.123", optional<int>()), dcp::ReadError);
- BOOST_CHECK_THROW (dcp::Time ("01:23:45:123", 250), dcp::ReadError);
BOOST_CHECK_THROW (dcp::Time ("01:23:45:123:66", 250), dcp::ReadError);
BOOST_CHECK_THROW (dcp::Time ("01:23:45:", 250), dcp::ReadError);
BOOST_CHECK_THROW (dcp::Time ("01:23::123", 250), dcp::ReadError);