diff options
| -rw-r--r-- | src/dcp_time.cc | 5 | ||||
| -rw-r--r-- | src/verify.cc | 24 | ||||
| -rw-r--r-- | test/dcp_time_test.cc | 6 |
3 files changed, 22 insertions, 13 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/src/verify.cc b/src/verify.cc index 0ef4ada5..9715c020 100644 --- a/src/verify.cc +++ b/src/verify.cc @@ -1904,16 +1904,20 @@ dcp::verify ( } for (auto cpl: dcp->cpls()) { - verify_cpl( - dcp, - cpl, - stage, - *xsd_dtd_directory, - progress, - options, - notes, - state - ); + try { + verify_cpl( + dcp, + cpl, + stage, + *xsd_dtd_directory, + progress, + options, + notes, + state + ); + } catch (ReadError& e) { + notes.push_back({VerificationNote::Type::ERROR, VerificationNote::Code::FAILED_READ, string(e.what())}); + } } for (auto pkl: dcp->pkls()) { 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); |
