summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2020-05-12 12:35:07 +0200
committerCarl Hetherington <cth@carlh.net>2020-05-12 13:12:48 +0200
commitc871f79f49087582c6ea7a42e79fd5fd3968bf00 (patch)
tree53a194dc5753493e2c5b90e4b9bf2000dcc962fb
parent25b9ff016477a8fda6f0368235275b92dda90c93 (diff)
Add a note when verifying if the DCP refers to assets
that are not mentioned in its ASSETMAP (i.e. a VF).
-rw-r--r--src/dcp.cc13
-rw-r--r--src/verify.cc2
-rw-r--r--src/verify.h2
-rw-r--r--test/verify_test.cc37
4 files changed, 52 insertions, 2 deletions
diff --git a/src/dcp.cc b/src/dcp.cc
index 09db9523..2929b5d8 100644
--- a/src/dcp.cc
+++ b/src/dcp.cc
@@ -256,8 +256,17 @@ DCP::read (list<dcp::VerificationNote>* notes, bool ignore_incorrect_picture_mxf
}
}
- BOOST_FOREACH (shared_ptr<CPL> i, cpls ()) {
- i->resolve_refs (other_assets);
+ resolve_refs (other_assets);
+
+ /* While we've got the ASSETMAP lets look and see if this DCP refers to things that are not in its ASSETMAP */
+ if (notes) {
+ BOOST_FOREACH (shared_ptr<CPL> i, cpls()) {
+ BOOST_FOREACH (shared_ptr<const ReelMXF> j, i->reel_mxfs()) {
+ if (!j->asset_ref().resolved() && paths.find(j->asset_ref().id()) == paths.end()) {
+ notes->push_back (VerificationNote(VerificationNote::VERIFY_WARNING, VerificationNote::EXTERNAL_ASSET));
+ }
+ }
+ }
}
}
diff --git a/src/verify.cc b/src/verify.cc
index 11eb75d2..0820c7b0 100644
--- a/src/verify.cc
+++ b/src/verify.cc
@@ -659,6 +659,8 @@ dcp::note_to_string (dcp::VerificationNote note)
return String::compose("The instantaneous bit rate of the picture asset %1 is larger than the limit of 250Mbit/s in at least one place", note.file()->filename());
case dcp::VerificationNote::PICTURE_FRAME_NEARLY_TOO_LARGE:
return String::compose("The instantaneous bit rate of the picture asset %1 is close to the limit of 250Mbit/s in at least one place", note.file()->filename());
+ case dcp::VerificationNote::EXTERNAL_ASSET:
+ return "An asset that this DCP refers to is not included in the DCP. It may be a VF.";
}
return "";
diff --git a/src/verify.h b/src/verify.h
index 405c6b09..87d52d44 100644
--- a/src/verify.h
+++ b/src/verify.h
@@ -87,6 +87,8 @@ public:
PICTURE_FRAME_TOO_LARGE,
/** The JPEG2000 data in at least one picture frame is larger than the equivalent of 230Mbit/s */
PICTURE_FRAME_NEARLY_TOO_LARGE,
+ /** An asset that the CPL requires is not in this DCP; the DCP may be a VF */
+ EXTERNAL_ASSET,
};
VerificationNote (Type type, Code code)
diff --git a/test/verify_test.cc b/test/verify_test.cc
index d744eff6..4d577a5a 100644
--- a/test/verify_test.cc
+++ b/test/verify_test.cc
@@ -735,3 +735,40 @@ BOOST_AUTO_TEST_CASE (verify_test21)
BOOST_CHECK_EQUAL (notes.back().code(), dcp::VerificationNote::XML_VALIDATION_ERROR);
}
+
+/* VF */
+BOOST_AUTO_TEST_CASE (verify_test22)
+{
+ boost::filesystem::path const ov_dir("build/test/verify_test22_ov");
+ boost::filesystem::remove_all (ov_dir);
+ boost::filesystem::create_directories (ov_dir);
+
+ shared_ptr<dcp::OpenJPEGImage> image = black_image ();
+ dcp::Data frame = dcp::compress_j2k (image, 100000000, 24, false, false);
+ BOOST_REQUIRE (frame.size() < 230000000 / (24 * 8));
+ dcp_from_frame (frame, ov_dir);
+
+ dcp::DCP ov (ov_dir);
+ ov.read ();
+
+ boost::filesystem::path const vf_dir("build/test/verify_test22_vf");
+ boost::filesystem::remove_all (vf_dir);
+ boost::filesystem::create_directories (vf_dir);
+
+ shared_ptr<dcp::Reel> reel(new dcp::Reel());
+ reel->add (ov.cpls().front()->reels().front()->main_picture());
+ shared_ptr<dcp::CPL> cpl(new dcp::CPL("hello", dcp::FEATURE));
+ cpl->add (reel);
+ dcp::DCP vf (vf_dir);
+ vf.add (cpl);
+ vf.write_xml (dcp::SMPTE);
+
+ vector<boost::filesystem::path> dirs;
+ dirs.push_back (vf_dir);
+ list<dcp::VerificationNote> notes = dcp::verify (dirs, &stage, &progress, "xsd");
+ dump_notes (notes);
+ BOOST_REQUIRE_EQUAL (notes.size(), 1);
+ BOOST_CHECK_EQUAL (notes.front().code(), dcp::VerificationNote::EXTERNAL_ASSET);
+}
+
+