From 56ab90d4e9fde3be3a34947e4a48937326566fb3 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 3 Feb 2020 16:22:38 +0100 Subject: Provide more details on failure to load xmlsec-crypto. --- src/util.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/util.cc b/src/util.cc index 9374b6e7..c79b8160 100644 --- a/src/util.cc +++ b/src/util.cc @@ -176,7 +176,7 @@ dcp::init () #ifdef XMLSEC_CRYPTO_DYNAMIC_LOADING if (xmlSecCryptoDLLoadLibrary(BAD_CAST XMLSEC_CRYPTO) < 0) { - throw MiscError ("unable to load default xmlsec-crypto library"); + throw MiscError (String::compose("unable to load default xmlsec-crypto library '%1'", XMLSEC_CRYPTO)); } #endif -- cgit v1.2.3 From ada2065df461ae9e56165e93e02b901c67a8bea3 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 3 Feb 2020 16:43:01 +0100 Subject: Try to fix build of previous. --- src/util.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/util.cc b/src/util.cc index c79b8160..66a03194 100644 --- a/src/util.cc +++ b/src/util.cc @@ -176,7 +176,7 @@ dcp::init () #ifdef XMLSEC_CRYPTO_DYNAMIC_LOADING if (xmlSecCryptoDLLoadLibrary(BAD_CAST XMLSEC_CRYPTO) < 0) { - throw MiscError (String::compose("unable to load default xmlsec-crypto library '%1'", XMLSEC_CRYPTO)); + throw MiscError (String::compose("unable to load default xmlsec-crypto library '%1'", string(XMLSEC_CRYPTO))); } #endif -- cgit v1.2.3 From 718d47c3900ab152272d68a29588bd689141071e Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 3 Feb 2020 16:51:49 +0100 Subject: Try again to fix Windows build of previous. --- src/util.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/util.cc b/src/util.cc index 66a03194..fba54cd3 100644 --- a/src/util.cc +++ b/src/util.cc @@ -176,7 +176,7 @@ dcp::init () #ifdef XMLSEC_CRYPTO_DYNAMIC_LOADING if (xmlSecCryptoDLLoadLibrary(BAD_CAST XMLSEC_CRYPTO) < 0) { - throw MiscError (String::compose("unable to load default xmlsec-crypto library '%1'", string(XMLSEC_CRYPTO))); + throw MiscError (String::compose("unable to load default xmlsec-crypto library '%1'", reinterpret_cast((XMLSEC_CRYPTO)))); } #endif -- cgit v1.2.3 From 8331c050aab2e53ff7848c354e6790c681600dee Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 3 Feb 2020 17:08:17 +0100 Subject: Try always loading the openssl crypto module, not the default one. --- src/util.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/util.cc b/src/util.cc index fba54cd3..ba9e6fa2 100644 --- a/src/util.cc +++ b/src/util.cc @@ -175,8 +175,8 @@ dcp::init () } #ifdef XMLSEC_CRYPTO_DYNAMIC_LOADING - if (xmlSecCryptoDLLoadLibrary(BAD_CAST XMLSEC_CRYPTO) < 0) { - throw MiscError (String::compose("unable to load default xmlsec-crypto library '%1'", reinterpret_cast((XMLSEC_CRYPTO)))); + if (xmlSecCryptoDLLoadLibrary(BAD_CAST "openssl") < 0) { + throw MiscError (String::compose("unable to load openssl xmlsec-crypto library")); } #endif -- cgit v1.2.3 From 43c859fa095987d3c367c2426f698d7477e81305 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 3 Feb 2020 17:15:49 +0100 Subject: Another build fix. --- src/util.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/util.cc b/src/util.cc index ba9e6fa2..f755c21e 100644 --- a/src/util.cc +++ b/src/util.cc @@ -176,7 +176,7 @@ dcp::init () #ifdef XMLSEC_CRYPTO_DYNAMIC_LOADING if (xmlSecCryptoDLLoadLibrary(BAD_CAST "openssl") < 0) { - throw MiscError (String::compose("unable to load openssl xmlsec-crypto library")); + throw MiscError ("unable to load openssl xmlsec-crypto library"); } #endif -- cgit v1.2.3 From fea967ca635b04ca70f3f44d2e02f551fc9d6684 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 3 Mar 2020 22:02:03 +0100 Subject: Fix interop verification and add some tests for it. --- src/verify.cc | 9 +- test/verify_test.cc | 108 ++++++++++++----- wscript | 2 +- xsd/Main-Stereo-Picture-CPL.xsd | 11 ++ xsd/PROTO-ASDCP-AM-20040311.xsd | 67 +++++++++++ xsd/PROTO-ASDCP-CPL-20040511.xsd | 251 +++++++++++++++++++++++++++++++++++++++ xsd/PROTO-ASDCP-PKL-20040311.xsd | 60 ++++++++++ 7 files changed, 478 insertions(+), 30 deletions(-) create mode 100644 xsd/Main-Stereo-Picture-CPL.xsd create mode 100644 xsd/PROTO-ASDCP-AM-20040311.xsd create mode 100644 xsd/PROTO-ASDCP-CPL-20040511.xsd create mode 100644 xsd/PROTO-ASDCP-PKL-20040311.xsd (limited to 'src') diff --git a/src/verify.cc b/src/verify.cc index ca53a4c1..10e91320 100644 --- a/src/verify.cc +++ b/src/verify.cc @@ -196,6 +196,10 @@ public: add("http://www.w3.org/2001/XMLSchema.dtd", "XMLSchema.dtd"); add("http://www.w3.org/2001/03/xml.xsd", "xml.xsd"); add("http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd", "xmldsig-core-schema.xsd"); + add("http://www.digicine.com/schemas/437-Y/2007/Main-Stereo-Picture-CPL.xsd", "Main-Stereo-Picture-CPL.xsd"); + add("http://www.digicine.com/PROTO-ASDCP-CPL-20040511.xsd", "PROTO-ASDCP-CPL-20040511.xsd"); + add("http://www.digicine.com/PROTO-ASDCP-PKL-20040311.xsd", "PROTO-ASDCP-PKL-20040311.xsd"); + add("http://www.digicine.com/PROTO-ASDCP-AM-20040311.xsd", "PROTO-ASDCP-AM-20040311.xsd"); } InputSource* resolveEntity(XMLCh const *, XMLCh const * system_id) @@ -245,7 +249,10 @@ validate_xml (boost::filesystem::path xml_file, boost::filesystem::path xsd_dtd_ schema["http://www.smpte-ra.org/schemas/429-7/2006/CPL"] = "SMPTE-429-7-2006-CPL.xsd"; schema["http://www.smpte-ra.org/schemas/429-8/2006/PKL"] = "SMPTE-429-8-2006-PKL.xsd"; schema["http://www.smpte-ra.org/schemas/429-9/2007/AM"] = "SMPTE-429-9-2007-AM.xsd"; - schema["http://www.w3.org/2001/03/xml.xsd"] = "xml.xsd"; + schema["http://www.digicine.com/schemas/437-Y/2007/Main-Stereo-Picture-CPL.xsd"] = "Main-Stereo-Picture-CPL.xsd"; + schema["http://www.digicine.com/PROTO-ASDCP-CPL-20040511#"] = "PROTO-ASDCP-CPL-20040511.xsd"; + schema["http://www.digicine.com/PROTO-ASDCP-PKL-20040311#"] = "PROTO-ASDCP-PKL-20040311.xsd"; + schema["http://www.digicine.com/PROTO-ASDCP-AM-20040311#"] = "PROTO-ASDCP-AM-20040311.xsd"; string locations; for (map::const_iterator i = schema.begin(); i != schema.end(); ++i) { diff --git a/test/verify_test.cc b/test/verify_test.cc index 38316f54..b5069023 100644 --- a/test/verify_test.cc +++ b/test/verify_test.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2018-2019 Carl Hetherington + Copyright (C) 2018-2020 Carl Hetherington This file is part of libdcp. @@ -48,6 +48,7 @@ using std::make_pair; using boost::optional; static list > > stages; +static int next_verify_test_number = 1; static void stage (string s, optional p) @@ -62,16 +63,16 @@ progress (float) } static vector -setup (int n) +setup (int reference_number, int verify_test_number) { - boost::filesystem::remove_all (dcp::String::compose("build/test/verify_test%1", n)); - boost::filesystem::create_directory (dcp::String::compose("build/test/verify_test%1", n)); - for (boost::filesystem::directory_iterator i("test/ref/DCP/dcp_test1"); i != boost::filesystem::directory_iterator(); ++i) { - boost::filesystem::copy_file (i->path(), dcp::String::compose("build/test/verify_test%1", n) / i->path().filename()); + boost::filesystem::remove_all (dcp::String::compose("build/test/verify_test%1", verify_test_number)); + boost::filesystem::create_directory (dcp::String::compose("build/test/verify_test%1", verify_test_number)); + for (boost::filesystem::directory_iterator i(dcp::String::compose("test/ref/DCP/dcp_test%1", reference_number)); i != boost::filesystem::directory_iterator(); ++i) { + boost::filesystem::copy_file (i->path(), dcp::String::compose("build/test/verify_test%1", verify_test_number) / i->path().filename()); } vector directories; - directories.push_back (dcp::String::compose("build/test/verify_test%1", n)); + directories.push_back (dcp::String::compose("build/test/verify_test%1", verify_test_number)); return directories; } @@ -115,17 +116,18 @@ dump_notes (list const & notes) /* Check DCP as-is (should be OK) */ BOOST_AUTO_TEST_CASE (verify_test1) { - vector directories = setup (1); + stages.clear (); + vector directories = setup (1, next_verify_test_number); list notes = dcp::verify (directories, &stage, &progress, "xsd"); - boost::filesystem::path const cpl_file = "build/test/verify_test1/cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml"; - boost::filesystem::path const pkl_file = "build/test/verify_test1/pkl_ae8a9818-872a-4f86-8493-11dfdea03e09.xml"; - boost::filesystem::path const assetmap_file = "build/test/verify_test1/ASSETMAP.xml"; + boost::filesystem::path const cpl_file = dcp::String::compose("build/test/verify_test%1/cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml", next_verify_test_number); + boost::filesystem::path const pkl_file = dcp::String::compose("build/test/verify_test1/pkl_ae8a9818-872a-4f86-8493-11dfdea03e09.xml", next_verify_test_number); + boost::filesystem::path const assetmap_file = dcp::String::compose("build/test/verify_test1/ASSETMAP.xml", next_verify_test_number); list > >::const_iterator st = stages.begin(); BOOST_CHECK_EQUAL (st->first, "Checking DCP"); BOOST_REQUIRE (st->second); - BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical("build/test/verify_test1")); + BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical(dcp::String::compose("build/test/verify_test%1", next_verify_test_number))); ++st; BOOST_CHECK_EQUAL (st->first, "Checking CPL"); BOOST_REQUIRE (st->second); @@ -136,11 +138,11 @@ BOOST_AUTO_TEST_CASE (verify_test1) ++st; BOOST_CHECK_EQUAL (st->first, "Checking picture asset hash"); BOOST_REQUIRE (st->second); - BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical("build/test/verify_test1/video.mxf")); + BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical(dcp::String::compose("build/test/verify_test%1/video.mxf", next_verify_test_number))); ++st; BOOST_CHECK_EQUAL (st->first, "Checking sound asset hash"); BOOST_REQUIRE (st->second); - BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical("build/test/verify_test1/audio.mxf")); + BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical(dcp::String::compose("build/test/verify_test%1/audio.mxf", next_verify_test_number))); ++st; BOOST_CHECK_EQUAL (st->first, "Checking PKL"); BOOST_REQUIRE (st->second); @@ -155,12 +157,14 @@ BOOST_AUTO_TEST_CASE (verify_test1) dump_notes (notes); BOOST_CHECK_EQUAL (notes.size(), 0); + + next_verify_test_number++; } /* Corrupt the MXFs and check that this is spotted */ BOOST_AUTO_TEST_CASE (verify_test2) { - vector directories = setup (2); + vector directories = setup (1, next_verify_test_number++); FILE* mod = fopen("build/test/verify_test2/video.mxf", "r+b"); BOOST_REQUIRE (mod); @@ -187,7 +191,7 @@ BOOST_AUTO_TEST_CASE (verify_test2) /* Corrupt the hashes in the PKL and check that the disagreement between CPL and PKL is spotted */ BOOST_AUTO_TEST_CASE (verify_test3) { - vector directories = setup (3); + vector directories = setup (1, next_verify_test_number++); { Editor e ("build/test/verify_test3/pkl_ae8a9818-872a-4f86-8493-11dfdea03e09.xml"); @@ -223,7 +227,7 @@ BOOST_AUTO_TEST_CASE (verify_test3) /* Corrupt the ContentKind in the CPL */ BOOST_AUTO_TEST_CASE (verify_test4) { - vector directories = setup (4); + vector directories = setup (1, next_verify_test_number++); { Editor e ("build/test/verify_test4/cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml"); @@ -261,7 +265,7 @@ asset_map (int n) static void check_after_replace (int n, boost::function file, string from, string to, dcp::VerificationNote::Code code1) { - vector directories = setup (n); + vector directories = setup (1, n); { Editor e (file(n)); @@ -279,7 +283,7 @@ void check_after_replace (int n, boost::function static void check_after_replace (int n, boost::function file, string from, string to, dcp::VerificationNote::Code code1, dcp::VerificationNote::Code code2) { - vector directories = setup (n); + vector directories = setup (1, n); { Editor e (file(n)); @@ -305,7 +309,7 @@ void check_after_replace ( dcp::VerificationNote::Code code3 ) { - vector directories = setup (n); + vector directories = setup (1, n); { Editor e (file(n)); @@ -329,7 +333,7 @@ void check_after_replace ( BOOST_AUTO_TEST_CASE (verify_test5) { check_after_replace ( - 5, &cpl, + next_verify_test_number++, &cpl, "24 1", "99 1", dcp::VerificationNote::CPL_HASH_INCORRECT, dcp::VerificationNote::INVALID_PICTURE_FRAME_RATE @@ -339,7 +343,7 @@ BOOST_AUTO_TEST_CASE (verify_test5) /* Missing asset */ BOOST_AUTO_TEST_CASE (verify_test6) { - vector directories = setup (6); + vector directories = setup (1, next_verify_test_number++); boost::filesystem::remove ("build/test/verify_test6/video.mxf"); list notes = dcp::verify (directories, &stage, &progress, "xsd"); @@ -360,7 +364,7 @@ assetmap (int n) BOOST_AUTO_TEST_CASE (verify_test7) { check_after_replace ( - 7, &assetmap, + next_verify_test_number++, &assetmap, "video.mxf", "", dcp::VerificationNote::EMPTY_ASSET_PATH ); @@ -370,7 +374,7 @@ BOOST_AUTO_TEST_CASE (verify_test7) BOOST_AUTO_TEST_CASE (verify_test8) { check_after_replace ( - 8, &cpl, + next_verify_test_number++, &cpl, "http://www.smpte-ra.org/schemas/429-7/2006/CPL", "http://www.digicine.com/PROTO-ASDCP-CPL-20040511#", dcp::VerificationNote::MISMATCHED_STANDARD, dcp::VerificationNote::XML_VALIDATION_ERROR, @@ -383,7 +387,7 @@ BOOST_AUTO_TEST_CASE (verify_test9) { /* There's no CPL_HASH_INCORRECT error here because it can't find the correct hash by ID (since the ID is wrong) */ check_after_replace ( - 9, &cpl, + next_verify_test_number++, &cpl, "urn:uuid:81fb54df-e1bf-4647-8788-ea7ba154375b", "urn:uuid:81fb54df-e1bf-4647-8788-ea7ba154375", dcp::VerificationNote::XML_VALIDATION_ERROR ); @@ -393,7 +397,7 @@ BOOST_AUTO_TEST_CASE (verify_test9) BOOST_AUTO_TEST_CASE (verify_test10) { check_after_replace ( - 10, &cpl, + next_verify_test_number++, &cpl, "", "x", dcp::VerificationNote::XML_VALIDATION_ERROR, dcp::VerificationNote::CPL_HASH_INCORRECT @@ -404,7 +408,7 @@ BOOST_AUTO_TEST_CASE (verify_test10) BOOST_AUTO_TEST_CASE (verify_test11) { check_after_replace ( - 11, &pkl, + next_verify_test_number++, &pkl, "urn:uuid:ae8", "urn:uuid:xe8", dcp::VerificationNote::XML_VALIDATION_ERROR ); @@ -414,8 +418,56 @@ BOOST_AUTO_TEST_CASE (verify_test11) BOOST_AUTO_TEST_CASE (verify_test12) { check_after_replace ( - 12, &asset_map, + next_verify_test_number++, &asset_map, "urn:uuid:74e", "urn:uuid:x4e", dcp::VerificationNote::XML_VALIDATION_ERROR ); } + +/* Basic test of an Interop DCP */ +BOOST_AUTO_TEST_CASE (verify_test13) +{ + stages.clear (); + vector directories = setup (3, next_verify_test_number); + list notes = dcp::verify (directories, &stage, &progress, "xsd"); + + boost::filesystem::path const cpl_file = dcp::String::compose("build/test/verify_test%1/cpl_cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296.xml", next_verify_test_number); + boost::filesystem::path const pkl_file = dcp::String::compose("build/test/verify_test%1/pkl_d87a950c-bd6f-41f6-90cc-56ccd673e131.xml", next_verify_test_number); + boost::filesystem::path const assetmap_file = dcp::String::compose("build/test/verify_test%1/ASSETMAP", next_verify_test_number); + + list > >::const_iterator st = stages.begin(); + BOOST_CHECK_EQUAL (st->first, "Checking DCP"); + BOOST_REQUIRE (st->second); + BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical(dcp::String::compose("build/test/verify_test%1", next_verify_test_number))); + ++st; + BOOST_CHECK_EQUAL (st->first, "Checking CPL"); + BOOST_REQUIRE (st->second); + BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical(cpl_file)); + ++st; + BOOST_CHECK_EQUAL (st->first, "Checking reel"); + BOOST_REQUIRE (!st->second); + ++st; + BOOST_CHECK_EQUAL (st->first, "Checking picture asset hash"); + BOOST_REQUIRE (st->second); + BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical(dcp::String::compose("build/test/verify_test%1/j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf", next_verify_test_number))); + ++st; + BOOST_CHECK_EQUAL (st->first, "Checking sound asset hash"); + BOOST_REQUIRE (st->second); + BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical(dcp::String::compose("build/test/verify_test%1/pcm_69cf9eaf-9a99-4776-b022-6902208626c3.mxf", next_verify_test_number))); + ++st; + BOOST_CHECK_EQUAL (st->first, "Checking PKL"); + BOOST_REQUIRE (st->second); + BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical(pkl_file)); + ++st; + BOOST_CHECK_EQUAL (st->first, "Checking ASSETMAP"); + BOOST_REQUIRE (st->second); + BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical(assetmap_file)); + ++st; + BOOST_REQUIRE (st == stages.end()); + + dump_notes (notes); + + BOOST_CHECK_EQUAL (notes.size(), 0); + + next_verify_test_number++; +} diff --git a/wscript b/wscript index 8b5593e9..689a84fb 100644 --- a/wscript +++ b/wscript @@ -231,7 +231,7 @@ def build(bld): if not bld.env.DISABLE_EXAMPLES: bld.recurse('examples') - for i in ['SMPTE-429-7-2006-CPL.xsd', 'SMPTE-429-8-2006-PKL.xsd', 'SMPTE-429-9-2007-AM.xsd', 'xmldsig-core-schema.xsd', 'XMLSchema.dtd', 'XMLSchema.xsd', 'xml.xsd' ]: + for i in ['SMPTE-429-7-2006-CPL.xsd', 'SMPTE-429-8-2006-PKL.xsd', 'SMPTE-429-9-2007-AM.xsd', 'xmldsig-core-schema.xsd', 'XMLSchema.dtd', 'XMLSchema.xsd', 'xml.xsd', 'PROTO-ASDCP-CPL-20040511.xsd', 'PROTO-ASDCP-PKL-20040311.xsd', 'PROTO-ASDCP-AM-20040311.xsd', 'Main-Stereo-Picture-CPL.xsd' ]: bld.install_files('${PREFIX}/share/libdcp/xsd', os.path.join('xsd', i)) bld.add_post_fun(post) diff --git a/xsd/Main-Stereo-Picture-CPL.xsd b/xsd/Main-Stereo-Picture-CPL.xsd new file mode 100644 index 00000000..bec275e8 --- /dev/null +++ b/xsd/Main-Stereo-Picture-CPL.xsd @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/xsd/PROTO-ASDCP-AM-20040311.xsd b/xsd/PROTO-ASDCP-AM-20040311.xsd new file mode 100644 index 00000000..f63540d0 --- /dev/null +++ b/xsd/PROTO-ASDCP-AM-20040311.xsd @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/xsd/PROTO-ASDCP-CPL-20040511.xsd b/xsd/PROTO-ASDCP-CPL-20040511.xsd new file mode 100644 index 00000000..c870811a --- /dev/null +++ b/xsd/PROTO-ASDCP-CPL-20040511.xsd @@ -0,0 +1,251 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/xsd/PROTO-ASDCP-PKL-20040311.xsd b/xsd/PROTO-ASDCP-PKL-20040311.xsd new file mode 100644 index 00000000..0be3cd3d --- /dev/null +++ b/xsd/PROTO-ASDCP-PKL-20040311.xsd @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3 From 900ad47ca6e2addab8ac376daed834dd7b28c01d Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 8 Mar 2020 22:47:09 +0100 Subject: Add Reel::assets(). --- src/reel.cc | 20 ++++++++++++++++++++ src/reel.h | 2 ++ 2 files changed, 22 insertions(+) (limited to 'src') diff --git a/src/reel.cc b/src/reel.cc index 14c0b1e2..3bf249c9 100644 --- a/src/reel.cc +++ b/src/reel.cc @@ -282,6 +282,26 @@ Reel::add (shared_ptr asset) } } +list > +Reel::assets () const +{ + list > a; + if (_main_picture) { + a.push_back (_main_picture); + } + if (_main_sound) { + a.push_back (_main_sound); + } + if (_main_subtitle) { + a.push_back (_main_subtitle); + } + std::copy (_closed_captions.begin(), _closed_captions.end(), back_inserter(a)); + if (_atmos) { + a.push_back (_atmos); + } + return a; +} + void Reel::resolve_refs (list > assets) { diff --git a/src/reel.h b/src/reel.h index 0a3cf19a..3792682e 100644 --- a/src/reel.h +++ b/src/reel.h @@ -111,6 +111,8 @@ public: void add (boost::shared_ptr asset); + std::list > assets () const; + void write_to_cpl (xmlpp::Element* node, Standard standard) const; bool encrypted () const; -- cgit v1.2.3 From 82d3db851257dbd460cff1c7eed2640a39b8ebfe Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 8 Mar 2020 22:47:33 +0100 Subject: Add verification checks too see if reel assets' Duration or IntrinsicDuration are too small. --- src/verify.cc | 16 +++++++++++++++- src/verify.h | 6 +++++- test/verify_test.cc | 22 ++++++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) (limited to 'src') 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 + Copyright (C) 2018-2020 Carl Hetherington This file is part of libdcp. @@ -371,6 +371,16 @@ dcp::verify ( BOOST_FOREACH (shared_ptr reel, cpl->reels()) { stage ("Checking reel", optional()); + + BOOST_FOREACH (shared_ptr 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 + Copyright (C) 2018-2020 Carl Hetherington 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 directories = setup (8, next_verify_test_number); + list notes = dcp::verify (directories, &stage, &progress, "xsd"); + + dump_notes (notes); + + BOOST_REQUIRE_EQUAL (notes.size(), 4); + list::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++; +} + -- cgit v1.2.3