From 2915c4f48129a4cac2c8ca364b09dd8047364aad Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 18 Jan 2021 00:27:34 +0100 Subject: [PATCH] Bv2.1 8.5: FFOC and LFOC should be present and have particular values. --- src/verify.cc | 39 +++- src/verify.h | 8 + test/combine_test.cc | 8 +- test/dcp_test.cc | 1 + test/markers_test.cc | 7 +- test/ref/DCP/dcp_test1/ASSETMAP.xml | 8 +- ...l_81fb54df-e1bf-4647-8788-ea7ba154375b.xml | 18 ++ ..._63c3aece-c581-4603-b612-75e43f0c0430.xml} | 6 +- test/ref/DCP/dcp_test7/ASSETMAP | 8 +- ...l_81fb54df-e1bf-4647-8788-ea7ba154375b.xml | 18 ++ ..._63c3aece-c581-4603-b612-75e43f0c0430.xml} | 6 +- test/test.cc | 33 ++- test/test.h | 1 + test/verify_test.cc | 191 +++++++++++++----- 14 files changed, 260 insertions(+), 92 deletions(-) rename test/ref/DCP/dcp_test1/{pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml => pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml} (89%) rename test/ref/DCP/dcp_test7/{pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml => pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml} (89%) diff --git a/src/verify.cc b/src/verify.cc index aa296fec..1cea1a0c 100644 --- a/src/verify.cc +++ b/src/verify.cc @@ -79,6 +79,7 @@ using std::string; using std::cout; using std::map; using std::max; +using std::set; using std::shared_ptr; using std::make_shared; using boost::optional; @@ -1084,10 +1085,7 @@ dcp::verify ( size_t fewest_closed_captions = SIZE_MAX; /* most number of closed caption assets seen in a reel */ size_t most_closed_captions = 0; - /* true if we've seen a FFEC marker */ - auto have_ffec = false; - /* true if we've seen a FFMC marker */ - auto have_ffmc = false; + map markers_seen; for (auto reel: cpl->reels()) { stage ("Checking reel", optional()); @@ -1158,11 +1156,8 @@ dcp::verify ( } if (reel->main_markers()) { - if (reel->main_markers()->get(Marker::FFEC)) { - have_ffec = true; - } - if (reel->main_markers()->get(Marker::FFMC)) { - have_ffmc = true; + for (auto const& i: reel->main_markers()->get()) { + markers_seen.insert (i); } } @@ -1181,14 +1176,28 @@ dcp::verify ( } if (cpl->content_kind() == FEATURE) { - if (!have_ffec) { + if (markers_seen.find(dcp::Marker::FFEC) == markers_seen.end()) { notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_FFEC_IN_FEATURE}); } - if (!have_ffmc) { + if (markers_seen.find(dcp::Marker::FFMC) == markers_seen.end()) { notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_FFMC_IN_FEATURE}); } } + auto ffoc = markers_seen.find(dcp::Marker::FFOC); + if (ffoc == markers_seen.end()) { + notes.push_back ({VerificationNote::VERIFY_WARNING, VerificationNote::MISSING_FFOC}); + } else if (ffoc->second.e != 1) { + notes.push_back ({VerificationNote::VERIFY_WARNING, VerificationNote::INCORRECT_FFOC}); + } + + auto lfoc = markers_seen.find(dcp::Marker::LFOC); + if (lfoc == markers_seen.end()) { + notes.push_back ({VerificationNote::VERIFY_WARNING, VerificationNote::MISSING_LFOC}); + } else if (lfoc->second.as_editable_units(lfoc->second.tcr) != (cpl->reels().back()->duration() - 1)) { + notes.push_back ({VerificationNote::VERIFY_WARNING, VerificationNote::INCORRECT_LFOC}); + } + check_text_timing (cpl->reels(), notes); LinesCharactersResult result; @@ -1347,6 +1356,14 @@ dcp::note_to_string (dcp::VerificationNote note) return "The DCP is marked as a Feature but there is no FFEC (first frame of end credits) marker"; case dcp::VerificationNote::MISSING_FFMC_IN_FEATURE: return "The DCP is marked as a Feature but there is no FFMC (first frame of moving credits) marker"; + case dcp::VerificationNote::MISSING_FFOC: + return "There should be a FFOC (first frame of content) marker"; + case dcp::VerificationNote::MISSING_LFOC: + return "There should be a LFOC (last frame of content) marker"; + case dcp::VerificationNote::INCORRECT_FFOC: + 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"; } return ""; diff --git a/src/verify.h b/src/verify.h index 5fb46a1b..05a49417 100644 --- a/src/verify.h +++ b/src/verify.h @@ -157,6 +157,14 @@ public: MISSING_FFEC_IN_FEATURE, /** If ContentKind is Feature there must be a FFMC marker */ MISSING_FFMC_IN_FEATURE, + /** There should be a FFOC */ + MISSING_FFOC, + /** There should be a LFOC */ + MISSING_LFOC, + /** The FFOC should be 1 */ + INCORRECT_FFOC, + /** The LFOC should be the last frame in the reel */ + INCORRECT_LFOC, }; VerificationNote (Type type, Code code) diff --git a/test/combine_test.cc b/test/combine_test.cc index 54e908d4..92949cf2 100644 --- a/test/combine_test.cc +++ b/test/combine_test.cc @@ -42,6 +42,7 @@ #include "test.h" #include "types.h" #include "verify.h" +#include "reel_markers_asset.h" #include #include #include @@ -51,9 +52,10 @@ using std::list; using std::string; +using std::make_shared; using std::vector; -using boost::optional; using std::shared_ptr; +using boost::optional; static void @@ -319,7 +321,9 @@ BOOST_AUTO_TEST_CASE (combine_two_dcps_with_shared_asset) 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)); - cpl->add (shared_ptr(new dcp::Reel(pic, sound))); + auto reel = make_shared(pic, sound); + reel->add (simple_markers()); + cpl->add (reel); second->add (cpl); second->write_xml (dcp::SMPTE); diff --git a/test/dcp_test.cc b/test/dcp_test.cc index b22202ea..dc24483e 100644 --- a/test/dcp_test.cc +++ b/test/dcp_test.cc @@ -227,6 +227,7 @@ test_rewriting_sound(string name, bool modify) writer->finalize(); reel->add(make_shared(sound, 0)); + reel->add(simple_markers()); auto cpl = make_shared("A Test DCP", dcp::TRAILER); cpl->add (reel); diff --git a/test/markers_test.cc b/test/markers_test.cc index e7cb3a5d..07ba5a80 100644 --- a/test/markers_test.cc +++ b/test/markers_test.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2019 Carl Hetherington + Copyright (C) 2019-2021 Carl Hetherington This file is part of libdcp. @@ -41,12 +41,13 @@ using std::string; using std::shared_ptr; +using std::make_shared; BOOST_AUTO_TEST_CASE (markers_write_test) { dcp::CPL cpl("Markers test", dcp::TEST); - shared_ptr asset (new dcp::ReelMarkersAsset(dcp::Fraction(24, 1), 0)); + auto asset = make_shared(dcp::Fraction(24, 1), 432000, 0); asset->set (dcp::Marker::FFOC, dcp::Time(1, 1, 9, 16, 24)); asset->set (dcp::Marker::LFOC, dcp::Time(2, 5, 3, 0, 24)); asset->set (dcp::Marker::FFTC, dcp::Time(0, 6, 4, 2, 24)); @@ -103,6 +104,6 @@ BOOST_AUTO_TEST_CASE (markers_read_test, * boost::unit_test::depends_on("markers BOOST_CHECK (markers->equals(markers, dcp::EqualityOptions(), boost::bind(¬e_handler, _1, _2))); - shared_ptr markers2 (new dcp::ReelMarkersAsset(dcp::Fraction(24, 1), 0)); + auto markers2 = make_shared(dcp::Fraction(24, 1), 432000, 0); BOOST_CHECK (!markers->equals(markers2, dcp::EqualityOptions(), boost::bind(¬e_handler, _1, _2))); } diff --git a/test/ref/DCP/dcp_test1/ASSETMAP.xml b/test/ref/DCP/dcp_test1/ASSETMAP.xml index 5879f033..fcb38592 100644 --- a/test/ref/DCP/dcp_test1/ASSETMAP.xml +++ b/test/ref/DCP/dcp_test1/ASSETMAP.xml @@ -1,6 +1,6 @@ - urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430 + urn:uuid:2b9b857f-ab4a-440e-a313-1ace0f1cfc95 Created by libdcp OpenDCP 0.0.25 1 @@ -8,11 +8,11 @@ OpenDCP 0.0.25 - urn:uuid:cd49971e-bf4c-4594-8474-54ebef09a40c + urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430 true - pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml + pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml 1 0 1186 @@ -26,7 +26,7 @@ cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml 1 0 - 1589 + 2170 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 256c3a39..9f626dd6 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 @@ -16,6 +16,24 @@ urn:uuid:48db27c3-4964-46a2-8b02-3e5570efb42d + + urn:uuid:cd49971e-bf4c-4594-8474-54ebef09a40c + + 24 1 + 24 + 0 + 24 + + + + 1 + + + + 23 + + + urn:uuid:1fab8bb0-cfaf-4225-ad6d-01768bc10470 diff --git a/test/ref/DCP/dcp_test1/pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml b/test/ref/DCP/dcp_test1/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml similarity index 89% rename from test/ref/DCP/dcp_test1/pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml rename to test/ref/DCP/dcp_test1/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml index 93386451..1280ed97 100644 --- a/test/ref/DCP/dcp_test1/pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml +++ b/test/ref/DCP/dcp_test1/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml @@ -1,6 +1,6 @@ - urn:uuid:cd49971e-bf4c-4594-8474-54ebef09a40c + urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430 Created by libdcp 2012-07-17T04:45:18+00:00 OpenDCP 0.0.25 @@ -9,8 +9,8 @@ urn:uuid:81fb54df-e1bf-4647-8788-ea7ba154375b 81fb54df-e1bf-4647-8788-ea7ba154375b - QqphASVaO8SqRvmlJ0acJP6c0GE= - 1589 + jWh8hMgamta5Q9sW88wHfI7TS/I= + 2170 text/xml diff --git a/test/ref/DCP/dcp_test7/ASSETMAP b/test/ref/DCP/dcp_test7/ASSETMAP index 2558a5a4..85222f75 100644 --- a/test/ref/DCP/dcp_test7/ASSETMAP +++ b/test/ref/DCP/dcp_test7/ASSETMAP @@ -1,6 +1,6 @@ - urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430 + urn:uuid:2b9b857f-ab4a-440e-a313-1ace0f1cfc95 Created by libdcp 1 2012-07-17T04:45:18+00:00 @@ -8,11 +8,11 @@ OpenDCP 0.0.25 - urn:uuid:cd49971e-bf4c-4594-8474-54ebef09a40c + urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430 true - pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml + pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml 1 0 1253 @@ -26,7 +26,7 @@ cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml 1 0 - 1587 + 2168 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 9e307a2f..f78c3711 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 @@ -16,6 +16,24 @@ urn:uuid:48db27c3-4964-46a2-8b02-3e5570efb42d + + urn:uuid:cd49971e-bf4c-4594-8474-54ebef09a40c + + 24 1 + 24 + 0 + 24 + + + + 1 + + + + 23 + + + urn:uuid:1fab8bb0-cfaf-4225-ad6d-01768bc10470 diff --git a/test/ref/DCP/dcp_test7/pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml b/test/ref/DCP/dcp_test7/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml similarity index 89% rename from test/ref/DCP/dcp_test7/pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml rename to test/ref/DCP/dcp_test7/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml index fdb0c16c..ca2c865d 100644 --- a/test/ref/DCP/dcp_test7/pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml +++ b/test/ref/DCP/dcp_test7/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml @@ -1,6 +1,6 @@ - urn:uuid:cd49971e-bf4c-4594-8474-54ebef09a40c + urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430 Created by libdcp 2012-07-17T04:45:18+00:00 OpenDCP 0.0.25 @@ -9,8 +9,8 @@ urn:uuid:81fb54df-e1bf-4647-8788-ea7ba154375b 81fb54df-e1bf-4647-8788-ea7ba154375b - WSXYtHMlxzMuhrEmXrRctm9Ij04= - 1587 + tc+MzIDj0cjUXzAGaE5mmse4DVM= + 2168 text/xml;asdcpKind=CPL diff --git a/test/test.cc b/test/test.cc index e43e5a70..38ff565e 100644 --- a/test/test.cc +++ b/test/test.cc @@ -55,6 +55,7 @@ #include "reel_asset.h" #include "test.h" #include "util.h" +#include "reel_markers_asset.h" #include #include #include @@ -67,6 +68,7 @@ using std::string; using std::min; using std::vector; using std::shared_ptr; +using std::make_shared; using boost::optional; @@ -337,12 +339,21 @@ make_simple (boost::filesystem::path path, int reels, int frames) shared_ptr mp = simple_picture (path, suffix, frames); shared_ptr ms = simple_sound (path, suffix, mxf_meta, "en-US", frames); - cpl->add (shared_ptr ( - new dcp::Reel ( - shared_ptr(new dcp::ReelMonoPictureAsset(mp, 0)), - shared_ptr(new dcp::ReelSoundAsset(ms, 0)) - ) - )); + auto reel = make_shared( + shared_ptr(new dcp::ReelMonoPictureAsset(mp, 0)), + shared_ptr(new dcp::ReelSoundAsset(ms, 0)) + ); + + auto markers = make_shared(dcp::Fraction(24, 1), frames, 0); + if (i == 0) { + markers->set (dcp::Marker::FFOC, dcp::Time(0, 0, 0, 1, 24)); + } + if (i == reels - 1) { + markers->set (dcp::Marker::LFOC, dcp::Time(0, 0, 0, frames - 1, 24)); + } + reel->add (markers); + + cpl->add (reel); } d->add (cpl); @@ -379,6 +390,16 @@ simple_subtitle () } +shared_ptr +simple_markers (int frames) +{ + auto markers = make_shared(dcp::Fraction(24, 1), frames, 0); + markers->set (dcp::Marker::FFOC, dcp::Time(1, 24, 24)); + markers->set (dcp::Marker::LFOC, dcp::Time(frames - 1, 24, 24)); + return markers; +} + + shared_ptr make_simple_with_interop_subs (boost::filesystem::path path) { diff --git a/test/test.h b/test/test.h index 5ed424bc..155c7898 100644 --- a/test/test.h +++ b/test/test.h @@ -46,6 +46,7 @@ extern void check_file (boost::filesystem::path ref, boost::filesystem::path che extern std::shared_ptr simple_picture (boost::filesystem::path path, std::string suffix, int frames = 24); extern std::shared_ptr simple_sound (boost::filesystem::path path, std::string suffix, dcp::MXFMetadata mxf_meta, std::string language, int frames = 24, int sample_rate = 48000); extern std::shared_ptr simple_subtitle (); +extern std::shared_ptr simple_markers (int frames = 24); extern std::shared_ptr make_simple (boost::filesystem::path path, int reels = 1, int frames = 24); extern std::shared_ptr make_simple_with_interop_subs (boost::filesystem::path path); extern std::shared_ptr make_simple_with_smpte_subs (boost::filesystem::path path); diff --git a/test/verify_test.cc b/test/verify_test.cc index edb37cfb..77733972 100644 --- a/test/verify_test.cc +++ b/test/verify_test.cc @@ -109,6 +109,8 @@ write_dcp_with_single_asset (boost::filesystem::path dir, shared_ptr(); reel->add (reel_asset); + reel->add (simple_markers()); + auto cpl = make_shared("hello", dcp::TRAILER); cpl->add (reel); auto dcp = make_shared(dir); @@ -210,7 +212,7 @@ BOOST_AUTO_TEST_CASE (verify_test1) 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_cd49971e-bf4c-4594-8474-54ebef09a40c.xml"; + boost::filesystem::path const pkl_file = "build/test/verify_test1/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml"; boost::filesystem::path const assetmap_file = "build/test/verify_test1/ASSETMAP.xml"; auto st = stages.begin(); @@ -287,7 +289,7 @@ BOOST_AUTO_TEST_CASE (verify_test3) auto directories = setup (1, 3); { - Editor e ("build/test/verify_test3/pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml"); + Editor e ("build/test/verify_test3/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml"); e.replace ("", "x"); } @@ -331,7 +333,7 @@ static boost::filesystem::path pkl (int n) { - return dcp::String::compose("build/test/verify_test%1/pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml", n); + return dcp::String::compose("build/test/verify_test%1/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml", n); } static @@ -418,7 +420,7 @@ BOOST_AUTO_TEST_CASE (verify_test11) { check_verify_result_after_replace ( 11, &pkl, - "urn:uuid:cd4", "urn:uuid:xd4", + "urn:uuid:63c", "urn:uuid:x3c", { dcp::VerificationNote::XML_VALIDATION_ERROR } ); } @@ -639,8 +641,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); - auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test); - BOOST_REQUIRE_EQUAL (notes.size(), 0); + check_verify_result ({dir}, {}); } @@ -701,6 +702,9 @@ BOOST_AUTO_TEST_CASE (verify_test23) auto reel = make_shared(); reel->add (reel_asset); + + reel->add (simple_markers(16 * 24 - 1)); + auto cpl = make_shared("hello", dcp::TRAILER); cpl->add (reel); cpl->set_main_sound_configuration ("L,C,R,Lfe,-,-"); @@ -712,8 +716,7 @@ BOOST_AUTO_TEST_CASE (verify_test23) dcp.add (cpl); dcp.write_xml (dcp::SMPTE); - auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test); - BOOST_CHECK (notes.empty()); + check_verify_result ({dir}, {}); } @@ -745,6 +748,8 @@ BOOST_AUTO_TEST_CASE (verify_test24) cpl->set_main_picture_stored_area (dcp::Size(1998, 1080)); cpl->set_main_picture_active_area (dcp::Size(1440, 1080)); + reel->add (simple_markers()); + dcp::DCP dcp (dir); dcp.add (cpl); dcp.write_xml (dcp::SMPTE); @@ -863,6 +868,8 @@ BOOST_AUTO_TEST_CASE (verify_various_invalid_languages) auto sound = simple_sound (dir, "foo", dcp::MXFMetadata(), "frobozz"); auto reel_sound = make_shared(sound, 0); reel->add (reel_sound); + reel->add (simple_markers()); + auto cpl = make_shared("hello", dcp::TRAILER); cpl->add (reel); cpl->_additional_subtitle_languages.push_back("this-is-wrong"); @@ -937,6 +944,8 @@ check_picture_size (int width, int height, int frame_rate, bool three_d) reel->add (make_shared(std::dynamic_pointer_cast(mp), 0)); } + reel->add (simple_markers(frame_rate)); + cpl->add (reel); d->add (cpl); @@ -1386,6 +1395,9 @@ BOOST_AUTO_TEST_CASE (verify_text_early_on_second_reel) auto reel_asset1 = make_shared(asset1, dcp::Fraction(24, 1), 16 * 24, 0); auto reel1 = make_shared(); reel1->add (reel_asset1); + auto markers1 = make_shared(dcp::Fraction(24, 1), 16 * 24, 0); + markers1->set (dcp::Marker::FFOC, dcp::Time(1, 24, 24)); + reel1->add (markers1); auto asset2 = make_shared(); asset2->set_start_time (dcp::Time()); @@ -1396,6 +1408,9 @@ BOOST_AUTO_TEST_CASE (verify_text_early_on_second_reel) auto reel_asset2 = make_shared(asset2, dcp::Fraction(24, 1), 16 * 24, 0); auto reel2 = make_shared(); reel2->add (reel_asset2); + auto markers2 = make_shared(dcp::Fraction(24, 1), 16 * 24, 0); + markers2->set (dcp::Marker::LFOC, dcp::Time(16 * 24 - 1, 24, 24)); + reel2->add (markers2); auto cpl = make_shared("hello", dcp::TRAILER); cpl->add (reel1); @@ -1623,6 +1638,7 @@ BOOST_AUTO_TEST_CASE (verify_sound_sampling_rate_must_be_48k) auto sound = simple_sound (dir, "foo", dcp::MXFMetadata(), "de-DE", 24, 96000); auto reel_sound = make_shared(sound, 0); reel->add (reel_sound); + reel->add (simple_markers()); auto cpl = make_shared("hello", dcp::TRAILER); cpl->add (reel); auto dcp = make_shared(dir); @@ -1688,12 +1704,13 @@ BOOST_AUTO_TEST_CASE (verify_reel_assets_durations_must_match) shared_ptr mp = simple_picture (dir, "", 24); shared_ptr ms = simple_sound (dir, "", dcp::MXFMetadata(), "en-US", 25); - cpl->add ( - make_shared( - make_shared(mp, 0), - make_shared(ms, 0) - ) - ); + auto reel = make_shared( + make_shared(mp, 0), + make_shared(ms, 0) + ); + + reel->add (simple_markers()); + cpl->add (reel); dcp->add (cpl); dcp->write_xml (dcp::SMPTE); @@ -1728,8 +1745,11 @@ verify_subtitles_must_be_in_all_reels_check (boost::filesystem::path dir, bool a reel1->add (make_shared(subs, dcp::Fraction(24, 1), 240, 0)); } - cpl->add (reel1); + auto markers1 = make_shared(dcp::Fraction(24, 1), 240, 0); + markers1->set (dcp::Marker::FFOC, dcp::Time(1, 24, 24)); + reel1->add (markers1); + cpl->add (reel1); auto reel2 = make_shared( make_shared(simple_picture(dir, "", 240), 0), @@ -1740,6 +1760,10 @@ verify_subtitles_must_be_in_all_reels_check (boost::filesystem::path dir, bool a reel2->add (make_shared(subs, dcp::Fraction(24, 1), 240, 0)); } + auto markers2 = make_shared(dcp::Fraction(24, 1), 240, 0); + markers2->set (dcp::Marker::LFOC, dcp::Time(239, 24, 24)); + reel2->add (markers2); + cpl->add (reel2); dcp->add (cpl); @@ -1795,6 +1819,10 @@ verify_closed_captions_must_be_in_all_reels_check (boost::filesystem::path dir, reel1->add (make_shared(subs, dcp::Fraction(24, 1), 240, 0)); } + auto markers1 = make_shared(dcp::Fraction(24, 1), 240, 0); + markers1->set (dcp::Marker::FFOC, dcp::Time(1, 24, 24)); + reel1->add (markers1); + cpl->add (reel1); auto reel2 = make_shared( @@ -1806,6 +1834,10 @@ verify_closed_captions_must_be_in_all_reels_check (boost::filesystem::path dir, reel2->add (make_shared(subs, dcp::Fraction(24, 1), 240, 0)); } + auto markers2 = make_shared(dcp::Fraction(24, 1), 240, 0); + markers2->set (dcp::Marker::LFOC, dcp::Time(239, 24, 24)); + reel2->add (markers2); + cpl->add (reel2); dcp->add (cpl); @@ -1862,6 +1894,8 @@ verify_text_entry_point_check (boost::filesystem::path dir, dcp::VerificationNot reel->add (reel_text); + reel->add (simple_markers(240)); + cpl->add (reel); dcp->add (cpl); @@ -1931,60 +1965,105 @@ BOOST_AUTO_TEST_CASE (verify_assets_must_have_hashes) } - -BOOST_AUTO_TEST_CASE (verify_features_must_have_ffec_ffmc1) +static +void +verify_markers_test ( + boost::filesystem::path dir, + vector> markers, + vector> types_and_codes + ) { - boost::filesystem::path const dir("build/test/verify_features_must_have_ffec_ffmc1"); auto dcp = make_simple (dir); dcp->cpls()[0]->set_content_kind (dcp::FEATURE); - auto markers = make_shared(dcp::Fraction(24, 1), 0); - markers->set (dcp::Marker::FFEC, dcp::Time(0, 0, 4, 0, 24)); - markers->set (dcp::Marker::FFMC, dcp::Time(0, 0, 5, 0, 24)); - dcp->cpls()[0]->reels()[0]->add(markers); + auto markers_asset = make_shared(dcp::Fraction(24, 1), 24, 0); + for (auto const& i: markers) { + markers_asset->set (i.first, i.second); + } + dcp->cpls()[0]->reels()[0]->add(markers_asset); dcp->write_xml (dcp::SMPTE); - check_verify_result ({dir}, {}); + check_verify_result ({dir}, types_and_codes); } -BOOST_AUTO_TEST_CASE (verify_features_must_have_ffec_ffmc2) +BOOST_AUTO_TEST_CASE (verify_markers) { - boost::filesystem::path const dir("build/test/verify_features_must_have_ffec_ffmc2"); - auto dcp = make_simple (dir); - dcp->cpls()[0]->set_content_kind (dcp::FEATURE); - auto markers = make_shared(dcp::Fraction(24, 1), 0); - markers->set (dcp::Marker::FFEC, dcp::Time(0, 0, 4, 0, 24)); - dcp->cpls()[0]->reels()[0]->add(markers); - dcp->write_xml (dcp::SMPTE); - check_verify_result ({dir}, {{dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_FFMC_IN_FEATURE}}); -} + verify_markers_test ( + "build/test/verify_markers_all_correct", + { + { dcp::Marker::FFEC, dcp::Time(12, 24, 24) }, + { dcp::Marker::FFMC, dcp::Time(13, 24, 24) }, + { dcp::Marker::FFOC, dcp::Time(1, 24, 24) }, + { dcp::Marker::LFOC, dcp::Time(23, 24, 24) } + }, + {} + ); + verify_markers_test ( + "build/test/verify_markers_missing_ffec", + { + { dcp::Marker::FFMC, dcp::Time(13, 24, 24) }, + { dcp::Marker::FFOC, dcp::Time(1, 24, 24) }, + { dcp::Marker::LFOC, dcp::Time(23, 24, 24) } + }, + { + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_FFEC_IN_FEATURE } + }); -BOOST_AUTO_TEST_CASE (verify_features_must_have_ffec_ffmc3) -{ - boost::filesystem::path const dir("build/test/verify_features_must_have_ffec_ffmc3"); - auto dcp = make_simple (dir); - dcp->cpls()[0]->set_content_kind (dcp::FEATURE); - auto markers = make_shared(dcp::Fraction(24, 1), 0); - markers->set (dcp::Marker::FFMC, dcp::Time(0, 0, 4, 0, 24)); - dcp->cpls()[0]->reels()[0]->add(markers); - dcp->write_xml (dcp::SMPTE); - check_verify_result ({dir}, {{dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_FFEC_IN_FEATURE}}); -} + verify_markers_test ( + "build/test/verify_markers_missing_ffmc", + { + { dcp::Marker::FFEC, dcp::Time(12, 24, 24) }, + { dcp::Marker::FFOC, dcp::Time(1, 24, 24) }, + { dcp::Marker::LFOC, dcp::Time(23, 24, 24) } + }, + { + { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_FFMC_IN_FEATURE } + }); + + verify_markers_test ( + "build/test/verify_markers_missing_ffoc", + { + { dcp::Marker::FFEC, dcp::Time(12, 24, 24) }, + { dcp::Marker::FFMC, dcp::Time(13, 24, 24) }, + { dcp::Marker::LFOC, dcp::Time(23, 24, 24) } + }, + { + { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::MISSING_FFOC} + }); + verify_markers_test ( + "build/test/verify_markers_missing_lfoc", + { + { dcp::Marker::FFEC, dcp::Time(12, 24, 24) }, + { dcp::Marker::FFMC, dcp::Time(13, 24, 24) }, + { dcp::Marker::FFOC, dcp::Time(1, 24, 24) } + }, + { + { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::MISSING_LFOC } + }); -BOOST_AUTO_TEST_CASE (verify_features_must_have_ffec_ffmc4) -{ - boost::filesystem::path const dir("build/test/verify_features_must_have_ffec_ffmc4"); - auto dcp = make_simple (dir); - dcp->cpls()[0]->set_content_kind (dcp::FEATURE); - auto markers = make_shared(dcp::Fraction(24, 1), 0); - dcp->cpls()[0]->reels()[0]->add(markers); - dcp->write_xml (dcp::SMPTE); - check_verify_result ( - {dir}, + verify_markers_test ( + "build/test/verify_markers_incorrect_ffoc", { - { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_FFEC_IN_FEATURE }, - { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_FFMC_IN_FEATURE } + { dcp::Marker::FFEC, dcp::Time(12, 24, 24) }, + { dcp::Marker::FFMC, dcp::Time(13, 24, 24) }, + { dcp::Marker::FFOC, dcp::Time(3, 24, 24) }, + { dcp::Marker::LFOC, dcp::Time(23, 24, 24) } + }, + { + { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::INCORRECT_FFOC } + }); + + verify_markers_test ( + "build/test/verify_markers_incorrect_lfoc", + { + { dcp::Marker::FFEC, dcp::Time(12, 24, 24) }, + { dcp::Marker::FFMC, dcp::Time(13, 24, 24) }, + { dcp::Marker::FFOC, dcp::Time(1, 24, 24) }, + { dcp::Marker::LFOC, dcp::Time(18, 24, 24) } + }, + { + { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::INCORRECT_LFOC } }); } -- 2.30.2