Add verification checks too see if reel assets' Duration or IntrinsicDuration are...
authorCarl Hetherington <cth@carlh.net>
Sun, 8 Mar 2020 21:47:33 +0000 (22:47 +0100)
committerCarl Hetherington <cth@carlh.net>
Sun, 8 Mar 2020 21:47:33 +0000 (22:47 +0100)
src/verify.cc
src/verify.h
test/verify_test.cc

index 10e91320a739e7e4c5461d1eb71b5f9b1838b618..a8c5001c1fe73bffde37b9b6e7dd5c79707b0338 100644 (file)
@@ -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 "";
index ab9e9aac1a7710e1b43493165ace49bac3e72807..c56cfb9d26fd2cfbda7ce6ed4c9171b802dfec9e 100644 (file)
@@ -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)
index b506902302005f5fba4d22b4e88fce58fb6d736d..2ff66f6945f13ec89169ed3f9ecac4b3c6a00fe1 100644 (file)
@@ -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++;
+}
+