diff options
| author | Carl Hetherington <cth@carlh.net> | 2021-01-14 23:38:30 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2021-01-17 20:13:23 +0100 |
| commit | ecb9344aedd1beac90668cba46e0f22bd7c7bd9f (patch) | |
| tree | 28464363a659a61e266eacbca3daa0467c251623 | |
| parent | 6e1558f51d4f90c0adf6b18dc8143274167e4d89 (diff) | |
Bv2.1 8.2: all parts of a reel must have the same duration.
| -rw-r--r-- | src/verify.cc | 14 | ||||
| -rw-r--r-- | src/verify.h | 2 | ||||
| -rw-r--r-- | test/test.cc | 4 | ||||
| -rw-r--r-- | test/verify_test.cc | 37 |
4 files changed, 49 insertions, 8 deletions
diff --git a/src/verify.cc b/src/verify.cc index dc435706..a7f3f1da 100644 --- a/src/verify.cc +++ b/src/verify.cc @@ -1065,6 +1065,18 @@ dcp::verify ( } } + if (dcp->standard() == dcp::SMPTE) { + boost::optional<int64_t> duration; + for (auto i: reel->assets()) { + if (!duration) { + duration = i->actual_duration(); + } else if (*duration != i->actual_duration()) { + notes.push_back (VerificationNote(VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISMATCHED_ASSET_DURATION, i->id())); + break; + } + } + } + if (reel->main_picture()) { /* Check reel stuff */ auto const frame_rate = reel->main_picture()->frame_rate(); @@ -1242,6 +1254,8 @@ dcp::note_to_string (dcp::VerificationNote note) return "The CPL has no <AnnotationText> tag, which is required by Bv2.1"; case dcp::VerificationNote::CPL_ANNOTATION_TEXT_DIFFERS_FROM_CONTENT_TITLE_TEXT: return "The CPL's <AnnotationText> differs from its <ContentTitleText>, which Bv2.1 advises against."; + case dcp::VerificationNote::MISMATCHED_ASSET_DURATION: + return "All assets in a reel do not have the same duration, which is required by Bv2.1"; } return ""; diff --git a/src/verify.h b/src/verify.h index cab8ba4f..3b2629f9 100644 --- a/src/verify.h +++ b/src/verify.h @@ -137,6 +137,8 @@ public: MISSING_ANNOTATION_TEXT_IN_CPL, /** The <AnnotationText> is not the same as the <ContentTitleText> [Bv2.1_8.1] */ CPL_ANNOTATION_TEXT_DIFFERS_FROM_CONTENT_TITLE_TEXT, + /** At least one asset in a reel does not have the same duration as the others */ + MISMATCHED_ASSET_DURATION, }; VerificationNote (Type type, Code code) diff --git a/test/test.cc b/test/test.cc index f110c9cb..ba309f0e 100644 --- a/test/test.cc +++ b/test/test.cc @@ -402,7 +402,7 @@ make_simple_with_interop_subs (boost::filesystem::path path) shared_ptr<dcp::DCP> make_simple_with_smpte_subs (boost::filesystem::path path) { - shared_ptr<dcp::DCP> dcp = make_simple (path); + shared_ptr<dcp::DCP> dcp = make_simple (path, 1, 240); shared_ptr<dcp::SMPTESubtitleAsset> subs(new dcp::SMPTESubtitleAsset()); subs->set_language (dcp::LanguageTag("de-DE")); @@ -437,7 +437,7 @@ make_simple_with_interop_ccaps (boost::filesystem::path path) shared_ptr<dcp::DCP> make_simple_with_smpte_ccaps (boost::filesystem::path path) { - shared_ptr<dcp::DCP> dcp = make_simple (path); + shared_ptr<dcp::DCP> dcp = make_simple (path, 1, 240); shared_ptr<dcp::SMPTESubtitleAsset> subs(new dcp::SMPTESubtitleAsset()); subs->set_language (dcp::LanguageTag("de-DE")); diff --git a/test/verify_test.cc b/test/verify_test.cc index 6ed6b092..86b98d2b 100644 --- a/test/verify_test.cc +++ b/test/verify_test.cc @@ -1139,7 +1139,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_language_tag_in_subtitle_xml) { boost::filesystem::path dir = "build/test/verify_missing_language_tag_in_subtitle_xml"; prepare_directory (dir); - auto dcp = make_simple (dir, 1); + auto dcp = make_simple (dir, 1, 240); string const xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" @@ -1169,7 +1169,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_language_tag_in_subtitle_xml) auto subs = make_shared<dcp::SMPTESubtitleAsset>(dir / "subs.xml"); subs->write (dir / "subs.mxf"); - auto reel_subs = make_shared<dcp::ReelSubtitleAsset>(subs, dcp::Fraction(24, 1), 100, 0); + auto reel_subs = make_shared<dcp::ReelSubtitleAsset>(subs, dcp::Fraction(24, 1), 240, 0); dcp->cpls().front()->reels().front()->add(reel_subs); dcp->write_xml (dcp::SMPTE); @@ -1222,7 +1222,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_start_time_tag_in_subtitle_xml) { boost::filesystem::path dir = "build/test/verify_missing_start_time_tag_in_subtitle_xml"; prepare_directory (dir); - auto dcp = make_simple (dir, 1); + auto dcp = make_simple (dir, 1, 240); string const xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" @@ -1252,7 +1252,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_start_time_tag_in_subtitle_xml) auto subs = make_shared<dcp::SMPTESubtitleAsset>(dir / "subs.xml"); subs->write (dir / "subs.mxf"); - auto reel_subs = make_shared<dcp::ReelSubtitleAsset>(subs, dcp::Fraction(24, 1), 100, 0); + auto reel_subs = make_shared<dcp::ReelSubtitleAsset>(subs, dcp::Fraction(24, 1), 240, 0); dcp->cpls().front()->reels().front()->add(reel_subs); dcp->write_xml (dcp::SMPTE); @@ -1269,7 +1269,7 @@ BOOST_AUTO_TEST_CASE (verify_non_zero_start_time_tag_in_subtitle_xml) { boost::filesystem::path dir = "build/test/verify_non_zero_start_time_tag_in_subtitle_xml"; prepare_directory (dir); - auto dcp = make_simple (dir, 1); + auto dcp = make_simple (dir, 1, 240); string const xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" @@ -1300,7 +1300,7 @@ BOOST_AUTO_TEST_CASE (verify_non_zero_start_time_tag_in_subtitle_xml) auto subs = make_shared<dcp::SMPTESubtitleAsset>(dir / "subs.xml"); subs->write (dir / "subs.mxf"); - auto reel_subs = make_shared<dcp::ReelSubtitleAsset>(subs, dcp::Fraction(24, 1), 100, 0); + auto reel_subs = make_shared<dcp::ReelSubtitleAsset>(subs, dcp::Fraction(24, 1), 240, 0); dcp->cpls().front()->reels().front()->add(reel_subs); dcp->write_xml (dcp::SMPTE); @@ -1673,3 +1673,28 @@ BOOST_AUTO_TEST_CASE (verify_cpl_annotation_text_should_be_same_as_content_title }); } + +BOOST_AUTO_TEST_CASE (verify_reel_assets_durations_must_match) +{ + boost::filesystem::path const dir("build/test/verify_reel_assets_durations_must_match"); + boost::filesystem::remove_all (dir); + boost::filesystem::create_directories (dir); + shared_ptr<dcp::DCP> dcp (new dcp::DCP(dir)); + shared_ptr<dcp::CPL> cpl (new dcp::CPL("A Test DCP", dcp::FEATURE)); + + shared_ptr<dcp::MonoPictureAsset> mp = simple_picture (dir, "", 24); + shared_ptr<dcp::SoundAsset> ms = simple_sound (dir, "", dcp::MXFMetadata(), "en-US", 25); + + cpl->add ( + make_shared<dcp::Reel>( + make_shared<dcp::ReelMonoPictureAsset>(mp, 0), + make_shared<dcp::ReelSoundAsset>(ms, 0) + ) + ); + + dcp->add (cpl); + dcp->write_xml (dcp::SMPTE); + + check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISMATCHED_ASSET_DURATION }}); +} + |
