summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2020-03-08 22:47:33 +0100
committerCarl Hetherington <cth@carlh.net>2020-03-08 22:47:33 +0100
commit82d3db851257dbd460cff1c7eed2640a39b8ebfe (patch)
tree3dc74f799bb3d56027ae569a73c5be90bb4349b8
parent900ad47ca6e2addab8ac376daed834dd7b28c01d (diff)
Add verification checks too see if reel assets' Duration or IntrinsicDuration are too small.
-rw-r--r--src/verify.cc16
-rw-r--r--src/verify.h6
-rw-r--r--test/verify_test.cc22
3 files changed, 42 insertions, 2 deletions
diff --git a/src/verify.cc b/src/verify.cc
index 10e91320..a8c5001c 100644
--- a/src/verify.cc
+++ b/src/verify.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2018-2019 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2018-2020 Carl Hetherington <cth@carlh.net>
This file is part of libdcp.
@@ -371,6 +371,16 @@ dcp::verify (
BOOST_FOREACH (shared_ptr<Reel> reel, cpl->reels()) {
stage ("Checking reel", optional<boost::filesystem::path>());
+
+ BOOST_FOREACH (shared_ptr<ReelAsset> i, reel->assets()) {
+ if (i->duration() && (i->duration().get() * i->edit_rate().denominator / i->edit_rate().numerator) < 1) {
+ notes.push_back (VerificationNote(VerificationNote::VERIFY_ERROR, VerificationNote::DURATION_TOO_SMALL, i->id()));
+ }
+ if ((i->intrinsic_duration() * i->edit_rate().denominator / i->edit_rate().numerator) < 1) {
+ notes.push_back (VerificationNote(VerificationNote::VERIFY_ERROR, VerificationNote::INTRINSIC_DURATION_TOO_SMALL, i->id()));
+ }
+ }
+
if (reel->main_picture()) {
/* Check reel stuff */
Fraction const frame_rate = reel->main_picture()->frame_rate();
@@ -472,6 +482,10 @@ dcp::note_to_string (dcp::VerificationNote note)
return "The DCP contains both SMPTE and Interop parts.";
case dcp::VerificationNote::XML_VALIDATION_ERROR:
return String::compose("An XML file is badly formed: %1 (%2:%3)", note.note().get(), note.file()->filename(), note.line().get());
+ case dcp::VerificationNote::INTRINSIC_DURATION_TOO_SMALL:
+ return String::compose("The intrinsic duration of an asset is less than 1 second long: %1", note.note().get());
+ case dcp::VerificationNote::DURATION_TOO_SMALL:
+ return String::compose("The duration of an asset is less than 1 second long: %1", note.note().get());
}
return "";
diff --git a/src/verify.h b/src/verify.h
index ab9e9aac..c56cfb9d 100644
--- a/src/verify.h
+++ b/src/verify.h
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2018 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2018-2020 Carl Hetherington <cth@carlh.net>
This file is part of libdcp.
@@ -77,6 +77,10 @@ public:
MISMATCHED_STANDARD,
/** Some XML fails to validate against the XSD/DTD */
XML_VALIDATION_ERROR,
+ /** An asset's IntrinsicDuration is less than 1 second */
+ INTRINSIC_DURATION_TOO_SMALL,
+ /** An asset's Duration is less than 1 second */
+ DURATION_TOO_SMALL
};
VerificationNote (Type type, Code code)
diff --git a/test/verify_test.cc b/test/verify_test.cc
index b5069023..2ff66f69 100644
--- a/test/verify_test.cc
+++ b/test/verify_test.cc
@@ -471,3 +471,25 @@ BOOST_AUTO_TEST_CASE (verify_test13)
next_verify_test_number++;
}
+
+/* DCP with a short asset */
+BOOST_AUTO_TEST_CASE (verify_test14)
+{
+ vector<boost::filesystem::path> directories = setup (8, next_verify_test_number);
+ list<dcp::VerificationNote> notes = dcp::verify (directories, &stage, &progress, "xsd");
+
+ dump_notes (notes);
+
+ BOOST_REQUIRE_EQUAL (notes.size(), 4);
+ list<dcp::VerificationNote>::const_iterator i = notes.begin ();
+ BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::DURATION_TOO_SMALL);
+ ++i;
+ BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::INTRINSIC_DURATION_TOO_SMALL);
+ ++i;
+ BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::DURATION_TOO_SMALL);
+ ++i;
+ BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::INTRINSIC_DURATION_TOO_SMALL);
+ ++i;
+ next_verify_test_number++;
+}
+