From 36310b78f8fd84554f2c87dc513bd04efe0fd69a Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 18 Jan 2021 13:05:11 +0100 Subject: Bv2.1 8.6.{1.2}: CompositionMetadataAsset must exist and it must have some . --- src/verify.cc | 13 ++ src/verify.h | 4 + test/combine_test.cc | 5 + test/ref/DCP/dcp_test1/ASSETMAP.xml | 10 +- test/ref/DCP/dcp_test1/audio.mxf | Bin 161326 -> 881326 bytes .../cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml | 50 ++++- .../pkl_2b9b857f-ab4a-440e-a313-1ace0f1cfc95.xml | 31 +++ .../pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml | 31 --- test/ref/DCP/dcp_test7/ASSETMAP | 2 +- test/ref/DCP/dcp_test7/audio.mxf | Bin 161326 -> 881326 bytes .../cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml | 2 +- .../pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml | 6 +- test/test.cc | 7 +- test/verify_test.cc | 232 +++++++++++++++------ 14 files changed, 283 insertions(+), 110 deletions(-) create mode 100644 test/ref/DCP/dcp_test1/pkl_2b9b857f-ab4a-440e-a313-1ace0f1cfc95.xml delete mode 100644 test/ref/DCP/dcp_test1/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml diff --git a/src/verify.cc b/src/verify.cc index 1cea1a0c..d5b80b9f 100644 --- a/src/verify.cc +++ b/src/verify.cc @@ -1231,6 +1231,15 @@ dcp::verify ( if (result.error_length_exceeded) { notes.push_back (VerificationNote(VerificationNote::VERIFY_BV21_ERROR, VerificationNote::CLOSED_CAPTION_LINE_TOO_LONG)); } + + if (!cpl->full_content_title_text()) { + /* Since FullContentTitleText is assumed always to exist if there's a CompositionMetadataAsset we + * can use it as a proxy for CompositionMetadataAsset's existence. + */ + notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_CPL_METADATA}); + } else if (!cpl->version_number()) { + notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_CPL_METADATA_VERSION_NUMBER}); + } } } @@ -1364,6 +1373,10 @@ dcp::note_to_string (dcp::VerificationNote note) return "The FFOC marker should bet set to 1"; case dcp::VerificationNote::INCORRECT_LFOC: return "The LFOC marker should be set to 1 less than the duration of the last reel"; + case dcp::VerificationNote::MISSING_CPL_METADATA: + return "There should be a tag"; + case dcp::VerificationNote::MISSING_CPL_METADATA_VERSION_NUMBER: + return "The CPL metadata must contain a "; } return ""; diff --git a/src/verify.h b/src/verify.h index 05a49417..65095a8f 100644 --- a/src/verify.h +++ b/src/verify.h @@ -165,6 +165,10 @@ public: INCORRECT_FFOC, /** The LFOC should be the last frame in the reel */ INCORRECT_LFOC, + /** There must be a */ + MISSING_CPL_METADATA, + /** CPL metadata should contain of 1, at least */ + MISSING_CPL_METADATA_VERSION_NUMBER, }; VerificationNote (Type type, Code code) diff --git a/test/combine_test.cc b/test/combine_test.cc index 92949cf2..050978c7 100644 --- a/test/combine_test.cc +++ b/test/combine_test.cc @@ -318,6 +318,11 @@ BOOST_AUTO_TEST_CASE (combine_two_dcps_with_shared_asset) cpl->set_content_version ( dcp::ContentVersion("urn:uuid:75ac29aa-42ac-1234-ecae-49251abefd11","content-version-label-text") ); + cpl->set_main_sound_configuration ("L,C,R,Lfe,-,-"); + cpl->set_main_sound_sample_rate (48000); + cpl->set_main_picture_stored_area (dcp::Size(1998, 1080)); + cpl->set_main_picture_active_area (dcp::Size(1440, 1080)); + cpl->set_version_number(1); shared_ptr pic(new dcp::ReelMonoPictureAsset(simple_picture("build/test/combine_input2", ""), 0)); shared_ptr sound(new dcp::ReelSoundAsset(first->cpls().front()->reels().front()->main_sound()->asset(), 0)); diff --git a/test/ref/DCP/dcp_test1/ASSETMAP.xml b/test/ref/DCP/dcp_test1/ASSETMAP.xml index fcb38592..72096d95 100644 --- a/test/ref/DCP/dcp_test1/ASSETMAP.xml +++ b/test/ref/DCP/dcp_test1/ASSETMAP.xml @@ -1,6 +1,6 @@ - urn:uuid:2b9b857f-ab4a-440e-a313-1ace0f1cfc95 + urn:uuid:07e9f5a0-83ab-4791-8c6b-7df5d11f76f9 Created by libdcp OpenDCP 0.0.25 1 @@ -8,11 +8,11 @@ OpenDCP 0.0.25 - urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430 + urn:uuid:2b9b857f-ab4a-440e-a313-1ace0f1cfc95 true - pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml + pkl_2b9b857f-ab4a-440e-a313-1ace0f1cfc95.xml 1 0 1186 @@ -26,7 +26,7 @@ cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml 1 0 - 2170 + 5082 @@ -48,7 +48,7 @@ audio.mxf 1 0 - 161326 + 881326 diff --git a/test/ref/DCP/dcp_test1/audio.mxf b/test/ref/DCP/dcp_test1/audio.mxf index b58ff436..0b5a4459 100644 Binary files a/test/ref/DCP/dcp_test1/audio.mxf and b/test/ref/DCP/dcp_test1/audio.mxf differ diff --git a/test/ref/DCP/dcp_test1/cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml b/test/ref/DCP/dcp_test1/cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml index 9f626dd6..2ee11df5 100644 --- a/test/ref/DCP/dcp_test1/cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml +++ b/test/ref/DCP/dcp_test1/cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml @@ -52,8 +52,56 @@ 24 0 24 - cb1OLhgHG9svy7G8hoTSPpltzhw= + qtXbkcwhUj/yqquVLmV+wbzbxQ8= + + urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430 + 24 1 + 24 + + 1 + 51/L,R,C,LFE,Ls,Rs + 48000 1 + + 1998 + 1080 + + + 1998 + 1080 + + + + Application + + + DCP Constraints Profile + SMPTE-RDD-52:2020-Bv2.1 + + + + + + + urn:uuid:18be072e-5a0f-44e1-b2eb-c8a52ae12789 + urn:smpte:ul:060e2b34.0401010d.03020201.00000000 + urn:uuid:8e293965-f8ad-48c6-971d-261b01f65cdb + sg51 + 5.1 + en-US + + + urn:uuid:74e205d0-d145-42d2-8c49-7b55d058ca55 + urn:smpte:ul:060e2b34.0401010d.03020101.00000000 + urn:uuid:ae8a9818-872a-4f86-8493-11dfdea03e09 + chL + Left + 1 + en-US + urn:uuid:8e293965-f8ad-48c6-971d-261b01f65cdb + + + diff --git a/test/ref/DCP/dcp_test1/pkl_2b9b857f-ab4a-440e-a313-1ace0f1cfc95.xml b/test/ref/DCP/dcp_test1/pkl_2b9b857f-ab4a-440e-a313-1ace0f1cfc95.xml new file mode 100644 index 00000000..ea99d114 --- /dev/null +++ b/test/ref/DCP/dcp_test1/pkl_2b9b857f-ab4a-440e-a313-1ace0f1cfc95.xml @@ -0,0 +1,31 @@ + + + urn:uuid:2b9b857f-ab4a-440e-a313-1ace0f1cfc95 + Created by libdcp + 2012-07-17T04:45:18+00:00 + OpenDCP 0.0.25 + OpenDCP 0.0.25 + + + urn:uuid:81fb54df-e1bf-4647-8788-ea7ba154375b + 81fb54df-e1bf-4647-8788-ea7ba154375b + xz+gUPoPMdbFlAewvWIq8BRhBmA= + 5082 + text/xml + + + urn:uuid:1fab8bb0-cfaf-4225-ad6d-01768bc10470 + 1fab8bb0-cfaf-4225-ad6d-01768bc10470 + XGhFVrqZqapOJx5Fh2SLjj48Yjg= + 40144 + application/mxf + + + urn:uuid:9482e87d-292d-4e0e-a98d-c61822b60fe9 + 9482e87d-292d-4e0e-a98d-c61822b60fe9 + qtXbkcwhUj/yqquVLmV+wbzbxQ8= + 881326 + application/mxf + + + diff --git a/test/ref/DCP/dcp_test1/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml b/test/ref/DCP/dcp_test1/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml deleted file mode 100644 index 1280ed97..00000000 --- a/test/ref/DCP/dcp_test1/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430 - Created by libdcp - 2012-07-17T04:45:18+00:00 - OpenDCP 0.0.25 - OpenDCP 0.0.25 - - - urn:uuid:81fb54df-e1bf-4647-8788-ea7ba154375b - 81fb54df-e1bf-4647-8788-ea7ba154375b - jWh8hMgamta5Q9sW88wHfI7TS/I= - 2170 - text/xml - - - urn:uuid:1fab8bb0-cfaf-4225-ad6d-01768bc10470 - 1fab8bb0-cfaf-4225-ad6d-01768bc10470 - XGhFVrqZqapOJx5Fh2SLjj48Yjg= - 40144 - application/mxf - - - urn:uuid:9482e87d-292d-4e0e-a98d-c61822b60fe9 - 9482e87d-292d-4e0e-a98d-c61822b60fe9 - cb1OLhgHG9svy7G8hoTSPpltzhw= - 161326 - application/mxf - - - diff --git a/test/ref/DCP/dcp_test7/ASSETMAP b/test/ref/DCP/dcp_test7/ASSETMAP index 85222f75..a0a42801 100644 --- a/test/ref/DCP/dcp_test7/ASSETMAP +++ b/test/ref/DCP/dcp_test7/ASSETMAP @@ -48,7 +48,7 @@ audio.mxf 1 0 - 161326 + 881326 diff --git a/test/ref/DCP/dcp_test7/audio.mxf b/test/ref/DCP/dcp_test7/audio.mxf index b58ff436..0b5a4459 100644 Binary files a/test/ref/DCP/dcp_test7/audio.mxf and b/test/ref/DCP/dcp_test7/audio.mxf differ diff --git a/test/ref/DCP/dcp_test7/cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml b/test/ref/DCP/dcp_test7/cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml index f78c3711..a9ff202b 100644 --- a/test/ref/DCP/dcp_test7/cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml +++ b/test/ref/DCP/dcp_test7/cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml @@ -52,7 +52,7 @@ 24 0 24 - cb1OLhgHG9svy7G8hoTSPpltzhw= + qtXbkcwhUj/yqquVLmV+wbzbxQ8= diff --git a/test/ref/DCP/dcp_test7/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml b/test/ref/DCP/dcp_test7/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml index ca2c865d..919fe206 100644 --- a/test/ref/DCP/dcp_test7/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml +++ b/test/ref/DCP/dcp_test7/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml @@ -9,7 +9,7 @@ urn:uuid:81fb54df-e1bf-4647-8788-ea7ba154375b 81fb54df-e1bf-4647-8788-ea7ba154375b - tc+MzIDj0cjUXzAGaE5mmse4DVM= + JxqfjtwuLuimdPydOWGY/Vgrzek= 2168 text/xml;asdcpKind=CPL @@ -23,8 +23,8 @@ urn:uuid:9482e87d-292d-4e0e-a98d-c61822b60fe9 9482e87d-292d-4e0e-a98d-c61822b60fe9 - cb1OLhgHG9svy7G8hoTSPpltzhw= - 161326 + qtXbkcwhUj/yqquVLmV+wbzbxQ8= + 881326 application/x-smpte-mxf;asdcpKind=Sound diff --git a/test/test.cc b/test/test.cc index 38ff565e..91ecfcf7 100644 --- a/test/test.cc +++ b/test/test.cc @@ -280,7 +280,7 @@ simple_picture (boost::filesystem::path path, string suffix, int frames) shared_ptr simple_sound (boost::filesystem::path path, string suffix, dcp::MXFMetadata mxf_meta, string language, int frames, int sample_rate) { - int const channels = 1; + int const channels = 6; /* Set a valid language, then overwrite it, so that the language parameter can be badly formed */ shared_ptr ms (new dcp::SoundAsset(dcp::Fraction(24, 1), sample_rate, channels, dcp::LanguageTag("en-US"), dcp::SMPTE)); @@ -332,6 +332,11 @@ make_simple (boost::filesystem::path path, int reels, int frames) cpl->set_content_version ( dcp::ContentVersion("urn:uuid:75ac29aa-42ac-1234-ecae-49251abefd11", "content-version-label-text") ); + cpl->set_main_sound_configuration("51/L,R,C,LFE,Ls,Rs"); + cpl->set_main_sound_sample_rate(48000); + cpl->set_main_picture_stored_area(dcp::Size(1998, 1080)); + cpl->set_main_picture_active_area(dcp::Size(1998, 1080)); + cpl->set_version_number(1); for (int i = 0; i < reels; ++i) { string suffix = reels == 1 ? "" : dcp::String::compose("%1", i); diff --git a/test/verify_test.cc b/test/verify_test.cc index 77733972..fd76209b 100644 --- a/test/verify_test.cc +++ b/test/verify_test.cc @@ -67,7 +67,9 @@ using boost::optional; using std::shared_ptr; -static list > > stages; +static list>> stages; +static string const dcp_test1_pkl = "pkl_2b9b857f-ab4a-440e-a313-1ace0f1cfc95.xml"; +static string const dcp_test1_cpl = "cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml"; static void stage (string s, optional p) @@ -167,7 +169,6 @@ void check_verify_result (vector dir, vector> types_and_codes) { auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test); - dump_notes (notes); BOOST_REQUIRE_EQUAL (notes.size(), types_and_codes.size()); auto i = notes.begin(); auto j = types_and_codes.begin(); @@ -211,8 +212,8 @@ BOOST_AUTO_TEST_CASE (verify_test1) auto directories = setup (1, 1); auto notes = dcp::verify (directories, &stage, &progress, xsd_test); - 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_63c3aece-c581-4603-b612-75e43f0c0430.xml"; + boost::filesystem::path const cpl_file = boost::filesystem::path("build") / "test" / "verify_test1" / dcp_test1_cpl; + boost::filesystem::path const pkl_file = boost::filesystem::path("build") / "test" / "verify_test1" / dcp_test1_pkl; boost::filesystem::path const assetmap_file = "build/test/verify_test1/ASSETMAP.xml"; auto st = stages.begin(); @@ -289,7 +290,7 @@ BOOST_AUTO_TEST_CASE (verify_test3) auto directories = setup (1, 3); { - Editor e ("build/test/verify_test3/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml"); + Editor e (boost::filesystem::path("build") / "test" / "verify_test3" / dcp_test1_pkl); e.replace ("", "x"); } @@ -311,7 +312,7 @@ BOOST_AUTO_TEST_CASE (verify_test4) auto directories = setup (1, 4); { - Editor e ("build/test/verify_test4/cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml"); + Editor e (boost::filesystem::path("build") / "test" / "verify_test4" / dcp_test1_cpl); e.replace ("", "x"); } @@ -326,14 +327,14 @@ static boost::filesystem::path cpl (int n) { - return dcp::String::compose("build/test/verify_test%1/cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml", n); + return dcp::String::compose("build/test/verify_test%1/%2", n, dcp_test1_cpl); } static boost::filesystem::path pkl (int n) { - return dcp::String::compose("build/test/verify_test%1/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml", n); + return dcp::String::compose("build/test/verify_test%1/%2", n, dcp_test1_pkl); } static @@ -388,6 +389,10 @@ BOOST_AUTO_TEST_CASE (verify_test8) 8, &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, + dcp::VerificationNote::XML_VALIDATION_ERROR, + dcp::VerificationNote::XML_VALIDATION_ERROR, + dcp::VerificationNote::XML_VALIDATION_ERROR, dcp::VerificationNote::XML_VALIDATION_ERROR, dcp::VerificationNote::CPL_HASH_INCORRECT } ); @@ -420,7 +425,7 @@ BOOST_AUTO_TEST_CASE (verify_test11) { check_verify_result_after_replace ( 11, &pkl, - "urn:uuid:63c", "urn:uuid:x3c", + "urn:uuid:2b9", "urn:uuid:xb9", { dcp::VerificationNote::XML_VALIDATION_ERROR } ); } @@ -430,7 +435,7 @@ BOOST_AUTO_TEST_CASE (verify_test12) { check_verify_result_after_replace ( 12, &asset_map, - "urn:uuid:63c", "urn:uuid:x3c", + "urn:uuid:07e", "urn:uuid:x7e", { dcp::VerificationNote::XML_VALIDATION_ERROR } ); } @@ -442,8 +447,8 @@ BOOST_AUTO_TEST_CASE (verify_test13) auto directories = setup (3, 13); auto notes = dcp::verify (directories, &stage, &progress, xsd_test); - boost::filesystem::path const cpl_file = "build/test/verify_test13/cpl_cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296.xml"; - boost::filesystem::path const pkl_file = "build/test/verify_test13/pkl_d87a950c-bd6f-41f6-90cc-56ccd673e131.xml"; + boost::filesystem::path const cpl_file = boost::filesystem::path("build") / "test" / "verify_test13" / "cpl_cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296.xml"; + boost::filesystem::path const pkl_file = boost::filesystem::path("build") / "test" / "verify_test13" / "pkl_d87a950c-bd6f-41f6-90cc-56ccd673e131.xml"; boost::filesystem::path const assetmap_file = "build/test/verify_test13/ASSETMAP"; auto st = stages.begin(); @@ -544,8 +549,10 @@ BOOST_AUTO_TEST_CASE (verify_test15) check_verify_result ( { dir }, - {{ dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::PICTURE_FRAME_TOO_LARGE_IN_BYTES }} - ); + { + { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::PICTURE_FRAME_TOO_LARGE_IN_BYTES }, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA } + }); } @@ -570,8 +577,10 @@ BOOST_AUTO_TEST_CASE (verify_test16) check_verify_result ( { dir }, - {{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::PICTURE_FRAME_NEARLY_TOO_LARGE_IN_BYTES }} - ); + { + { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::PICTURE_FRAME_NEARLY_TOO_LARGE_IN_BYTES }, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA } + }); } @@ -587,8 +596,7 @@ BOOST_AUTO_TEST_CASE (verify_test17) boost::filesystem::remove_all (dir); dcp_from_frame (frame, dir); - auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test); - BOOST_REQUIRE_EQUAL (notes.size(), 0); + check_verify_result ({ dir }, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }}); } @@ -641,7 +649,7 @@ BOOST_AUTO_TEST_CASE (verify_test20) auto reel_asset = make_shared(asset, dcp::Fraction(24, 1), 16 * 24, 0); write_dcp_with_single_asset (dir, reel_asset); - check_verify_result ({dir}, {}); + check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }}); } @@ -660,7 +668,8 @@ BOOST_AUTO_TEST_CASE (verify_test21) { { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::XML_VALIDATION_ERROR }, { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::XML_VALIDATION_ERROR }, - { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_SUBTITLE_START_TIME } + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_SUBTITLE_START_TIME }, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA } }); } @@ -686,7 +695,10 @@ BOOST_AUTO_TEST_CASE (verify_test22) check_verify_result ( { vf_dir }, - {{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::EXTERNAL_ASSET }}); + { + { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::EXTERNAL_ASSET }, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA } + }); } @@ -716,7 +728,7 @@ BOOST_AUTO_TEST_CASE (verify_test23) dcp.add (cpl); dcp.write_xml (dcp::SMPTE); - check_verify_result ({dir}, {}); + check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }}); } @@ -747,6 +759,7 @@ BOOST_AUTO_TEST_CASE (verify_test24) cpl->set_main_sound_sample_rate (48000); cpl->set_main_picture_stored_area (dcp::Size(1998, 1080)); cpl->set_main_picture_active_area (dcp::Size(1440, 1080)); + cpl->set_version_number (1); reel->add (simple_markers()); @@ -815,7 +828,7 @@ BOOST_AUTO_TEST_CASE (verify_test26) write_dcp_with_single_asset (dir, reel_asset); auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test); - BOOST_REQUIRE_EQUAL (notes.size(), 2U); + BOOST_REQUIRE_EQUAL (notes.size(), 3U); auto i = notes.begin(); BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::BAD_LANGUAGE); BOOST_REQUIRE (i->note()); @@ -824,6 +837,8 @@ BOOST_AUTO_TEST_CASE (verify_test26) BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::BAD_LANGUAGE); BOOST_REQUIRE (i->note()); BOOST_CHECK_EQUAL (*i->note(), "wrong-andbad"); + i++; + BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::MISSING_CPL_METADATA); } @@ -841,7 +856,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_closed_caption_languages) write_dcp_with_single_asset (dir, reel_asset); auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test); - BOOST_REQUIRE_EQUAL (notes.size(), 2U); + BOOST_REQUIRE_EQUAL (notes.size(), 3U); auto i = notes.begin (); BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::BAD_LANGUAGE); BOOST_REQUIRE (i->note()); @@ -850,6 +865,8 @@ BOOST_AUTO_TEST_CASE (verify_invalid_closed_caption_languages) BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::BAD_LANGUAGE); BOOST_REQUIRE (i->note()); BOOST_CHECK_EQUAL (*i->note(), "wrong-andbad"); + i++; + BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::MISSING_CPL_METADATA); } @@ -878,6 +895,7 @@ BOOST_AUTO_TEST_CASE (verify_various_invalid_languages) cpl->set_main_sound_sample_rate (48000); cpl->set_main_picture_stored_area (dcp::Size(1998, 1080)); cpl->set_main_picture_active_area (dcp::Size(1440, 1080)); + cpl->set_version_number (1); cpl->_release_territory = "fred-jim"; auto dcp = make_shared(dir); dcp->add (cpl); @@ -901,7 +919,6 @@ BOOST_AUTO_TEST_CASE (verify_various_invalid_languages) BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::BAD_LANGUAGE); BOOST_REQUIRE (i->note()); BOOST_CHECK_EQUAL (*i->note(), "frobozz"); - ++i; } @@ -935,6 +952,11 @@ check_picture_size (int width, int height, int frame_rate, bool three_d) auto cpl = make_shared("A Test DCP", dcp::TRAILER); cpl->set_annotation_text ("A Test DCP"); cpl->set_issue_date ("2012-07-17T04:45:18+00:00"); + cpl->set_main_sound_configuration ("L,C,R,Lfe,-,-"); + cpl->set_main_sound_sample_rate (48000); + cpl->set_main_picture_stored_area (dcp::Size(1998, 1080)); + cpl->set_main_picture_active_area (dcp::Size(1998, 1080)); + cpl->set_version_number (1); auto reel = make_shared(); @@ -1096,7 +1118,8 @@ BOOST_AUTO_TEST_CASE (verify_closed_caption_xml_too_large) { { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_SUBTITLE_START_TIME }, { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::CLOSED_CAPTION_XML_TOO_LARGE_IN_BYTES }, - { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::FIRST_TEXT_TOO_EARLY } + { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::FIRST_TEXT_TOO_EARLY }, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }, }); } @@ -1135,7 +1158,8 @@ verify_timed_text_asset_too_large (string name) { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::TIMED_TEXT_ASSET_TOO_LARGE_IN_BYTES }, { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::TIMED_TEXT_FONTS_TOO_LARGE_IN_BYTES }, { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_SUBTITLE_START_TIME }, - { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::FIRST_TEXT_TOO_EARLY } + { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::FIRST_TEXT_TOO_EARLY }, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }, }); } @@ -1367,7 +1391,11 @@ BOOST_AUTO_TEST_CASE (verify_text_too_early) dcp_with_text (dir, {{ 4 * 24 - 1, 5 * 24 }}); check_verify_result ( { dir }, - {{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::FIRST_TEXT_TOO_EARLY }}); + { + { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::FIRST_TEXT_TOO_EARLY }, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA } + }); + } @@ -1376,8 +1404,7 @@ BOOST_AUTO_TEST_CASE (verify_text_not_too_early) auto const dir = boost::filesystem::path("build/test/verify_text_not_too_early"); /* Just late enough */ dcp_with_text (dir, {{ 4 * 24, 5 * 24 }}); - auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test); - BOOST_REQUIRE (notes.empty()); + check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }}); } @@ -1419,8 +1446,7 @@ BOOST_AUTO_TEST_CASE (verify_text_early_on_second_reel) dcp->add (cpl); dcp->write_xml (dcp::SMPTE); - auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test); - BOOST_REQUIRE (notes.empty()); + check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }}); } @@ -1433,7 +1459,12 @@ BOOST_AUTO_TEST_CASE (verify_text_too_close) { 4 * 24, 5 * 24 }, { 5 * 24 + 1, 6 * 24 }, }); - check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::SUBTITLE_TOO_CLOSE }}); + check_verify_result ( + {dir}, + { + { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::SUBTITLE_TOO_CLOSE }, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA } + }); } @@ -1446,8 +1477,7 @@ BOOST_AUTO_TEST_CASE (verify_text_not_too_close) { 4 * 24, 5 * 24 }, { 5 * 24 + 16, 8 * 24 }, }); - auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test); - BOOST_REQUIRE (notes.empty()); + check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }}); } @@ -1455,7 +1485,12 @@ BOOST_AUTO_TEST_CASE (verify_text_too_short) { auto const dir = boost::filesystem::path("build/test/verify_text_too_short"); dcp_with_text (dir, {{ 4 * 24, 4 * 24 + 1 }}); - check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::SUBTITLE_TOO_SHORT }}); + check_verify_result ( + {dir}, + { + { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::SUBTITLE_TOO_SHORT }, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA } + }); } @@ -1463,8 +1498,7 @@ BOOST_AUTO_TEST_CASE (verify_text_not_too_short) { auto const dir = boost::filesystem::path("build/test/verify_text_not_too_short"); dcp_with_text (dir, {{ 4 * 24, 4 * 24 + 17 }}); - auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test); - BOOST_REQUIRE (notes.empty()); + check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }}); } @@ -1479,7 +1513,12 @@ BOOST_AUTO_TEST_CASE (verify_too_many_subtitle_lines1) { 96, 200, 0.2, "four" }, { 96, 200, 0.3, "lines" } }); - check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::TOO_MANY_SUBTITLE_LINES}}); + check_verify_result ( + {dir}, + { + { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::TOO_MANY_SUBTITLE_LINES }, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA } + }); } @@ -1493,8 +1532,7 @@ BOOST_AUTO_TEST_CASE (verify_not_too_many_subtitle_lines1) { 96, 200, 0.1, "have" }, { 96, 200, 0.2, "four" }, }); - auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test); - BOOST_REQUIRE (notes.empty()); + check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }}); } @@ -1509,7 +1547,12 @@ BOOST_AUTO_TEST_CASE (verify_too_many_subtitle_lines2) { 150, 180, 0.2, "four" }, { 150, 180, 0.3, "lines" } }); - check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::TOO_MANY_SUBTITLE_LINES}}); + check_verify_result ( + {dir}, + { + { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::TOO_MANY_SUBTITLE_LINES }, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA } + }); } @@ -1524,8 +1567,7 @@ BOOST_AUTO_TEST_CASE (verify_not_too_many_subtitle_lines2) { 150, 180, 0.2, "four" }, { 190, 250, 0.3, "lines" } }); - auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test); - BOOST_REQUIRE (notes.empty()); + check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }}); } @@ -1537,7 +1579,12 @@ BOOST_AUTO_TEST_CASE (verify_subtitle_lines_too_long1) { { 96, 300, 0.0, "012345678901234567890123456789012345678901234567890123" } }); - check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::SUBTITLE_LINE_LONGER_THAN_RECOMMENDED }}); + check_verify_result ( + {dir}, + { + { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::SUBTITLE_LINE_LONGER_THAN_RECOMMENDED }, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA } + }); } @@ -1549,7 +1596,12 @@ BOOST_AUTO_TEST_CASE (verify_subtitle_lines_too_long2) { { 96, 300, 0.0, "012345678901234567890123456789012345678901234567890123456789012345678901234567890" } }); - check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::SUBTITLE_LINE_TOO_LONG }}); + check_verify_result ( + {dir}, + { + { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::SUBTITLE_LINE_TOO_LONG }, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA } + }); } @@ -1564,7 +1616,12 @@ BOOST_AUTO_TEST_CASE (verify_too_many_closed_caption_lines1) { 96, 200, 0.2, "four" }, { 96, 200, 0.3, "lines" } }); - check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::TOO_MANY_CLOSED_CAPTION_LINES}}); + check_verify_result ( + {dir}, + { + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::TOO_MANY_CLOSED_CAPTION_LINES}, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA } + }); } @@ -1578,8 +1635,7 @@ BOOST_AUTO_TEST_CASE (verify_not_too_many_closed_caption_lines1) { 96, 200, 0.1, "have" }, { 96, 200, 0.2, "four" }, }); - auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test); - BOOST_REQUIRE (notes.empty()); + check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }}); } @@ -1594,7 +1650,12 @@ BOOST_AUTO_TEST_CASE (verify_too_many_closed_caption_lines2) { 150, 180, 0.2, "four" }, { 150, 180, 0.3, "lines" } }); - check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::TOO_MANY_CLOSED_CAPTION_LINES}}); + check_verify_result ( + {dir}, + { + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::TOO_MANY_CLOSED_CAPTION_LINES}, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA } + }); } @@ -1609,8 +1670,7 @@ BOOST_AUTO_TEST_CASE (verify_not_too_many_closed_caption_lines2) { 150, 180, 0.2, "four" }, { 190, 250, 0.3, "lines" } }); - auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test); - BOOST_REQUIRE (notes.empty()); + check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }}); } @@ -1622,7 +1682,12 @@ BOOST_AUTO_TEST_CASE (verify_closed_caption_lines_too_long1) { { 96, 300, 0.0, "0123456789012345678901234567890123" } }); - check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::CLOSED_CAPTION_LINE_TOO_LONG }}); + check_verify_result ( + {dir}, + { + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::CLOSED_CAPTION_LINE_TOO_LONG }, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA } + }); } @@ -1645,7 +1710,12 @@ BOOST_AUTO_TEST_CASE (verify_sound_sampling_rate_must_be_48k) dcp->add (cpl); dcp->write_xml (dcp::SMPTE); - check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_SOUND_FRAME_RATE }}); + check_verify_result ( + {dir}, + { + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_SOUND_FRAME_RATE }, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA } + }); } @@ -1715,7 +1785,12 @@ BOOST_AUTO_TEST_CASE (verify_reel_assets_durations_must_match) dcp->add (cpl); dcp->write_xml (dcp::SMPTE); - check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISMATCHED_ASSET_DURATION }}); + check_verify_result ( + {dir}, + { + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISMATCHED_ASSET_DURATION }, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA } + }); } @@ -1776,21 +1851,25 @@ BOOST_AUTO_TEST_CASE (verify_subtitles_must_be_in_all_reels) { boost::filesystem::path dir ("build/test/verify_subtitles_must_be_in_all_reels1"); verify_subtitles_must_be_in_all_reels_check (dir, true, false); - check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MAIN_SUBTITLE_NOT_IN_ALL_REELS}}); + check_verify_result ( + { dir }, + { + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MAIN_SUBTITLE_NOT_IN_ALL_REELS }, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA } + }); + } { boost::filesystem::path dir ("build/test/verify_subtitles_must_be_in_all_reels2"); verify_subtitles_must_be_in_all_reels_check (dir, true, true); - auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test); - BOOST_REQUIRE (notes.empty()); + check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }}); } { boost::filesystem::path dir ("build/test/verify_subtitles_must_be_in_all_reels1"); verify_subtitles_must_be_in_all_reels_check (dir, false, false); - auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test); - BOOST_REQUIRE (notes.empty()); + check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }}); } } @@ -1851,21 +1930,24 @@ BOOST_AUTO_TEST_CASE (verify_closed_captions_must_be_in_all_reels) { boost::filesystem::path dir ("build/test/verify_closed_captions_must_be_in_all_reels1"); verify_closed_captions_must_be_in_all_reels_check (dir, 3, 4); - check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::CLOSED_CAPTION_ASSET_COUNTS_DIFFER }}); + check_verify_result ( + {dir}, + { + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::CLOSED_CAPTION_ASSET_COUNTS_DIFFER }, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA } + }); } { boost::filesystem::path dir ("build/test/verify_closed_captions_must_be_in_all_reels2"); verify_closed_captions_must_be_in_all_reels_check (dir, 4, 4); - auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test); - BOOST_REQUIRE (notes.empty()); + check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }}); } { boost::filesystem::path dir ("build/test/verify_closed_captions_must_be_in_all_reels3"); verify_closed_captions_must_be_in_all_reels_check (dir, 0, 0); - auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test); - BOOST_REQUIRE (notes.empty()); + check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }}); } } @@ -1901,7 +1983,12 @@ verify_text_entry_point_check (boost::filesystem::path dir, dcp::VerificationNot dcp->add (cpl); dcp->write_xml (dcp::SMPTE); - check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, code }}); + check_verify_result ( + {dir}, + { + { dcp::VerificationNote::VERIFY_BV21_ERROR, code }, + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA } + }); } @@ -1953,7 +2040,7 @@ BOOST_AUTO_TEST_CASE (verify_assets_must_have_hashes) { BOOST_REQUIRE (dcp->cpls()[0]->file()); Editor e(dcp->cpls()[0]->file().get()); - e.replace("cb1OLhgHG9svy7G8hoTSPpltzhw=", ""); + e.replace("XGhFVrqZqapOJx5Fh2SLjj48Yjg=", ""); } check_verify_result ( @@ -2067,3 +2154,14 @@ BOOST_AUTO_TEST_CASE (verify_markers) }); } + +BOOST_AUTO_TEST_CASE (verify_cpl_metadata_version) +{ + boost::filesystem::path dir = "build/test/verify_cpl_metadata_version"; + prepare_directory (dir); + auto dcp = make_simple (dir); + dcp->cpls()[0]->unset_version_number(); + dcp->write_xml (dcp::SMPTE); + check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA_VERSION_NUMBER }}); +} + -- cgit v1.2.3