diff options
| author | Carl Hetherington <cth@carlh.net> | 2021-01-15 22:04:42 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2021-01-17 20:13:23 +0100 |
| commit | 9a6cf0df676175022f7d0cade7919153207b7910 (patch) | |
| tree | 072586b526913ee73ca2b9515309deb6be5071e9 | |
| parent | 87a4a9470f0c81f27322f044cf0837fff21ad89e (diff) | |
Bv2.1 8.3.2: text tracks must have <EntryPoint> and it must be zero.
| -rw-r--r-- | src/verify.cc | 20 | ||||
| -rw-r--r-- | src/verify.h | 8 | ||||
| -rw-r--r-- | test/verify_test.cc | 68 |
3 files changed, 96 insertions, 0 deletions
diff --git a/src/verify.cc b/src/verify.cc index f8ab3d44..01d2e786 100644 --- a/src/verify.cc +++ b/src/verify.cc @@ -633,6 +633,12 @@ verify_main_subtitle_reel (shared_ptr<const ReelSubtitleAsset> reel_asset, vecto if (reel_asset->language()) { verify_language_tag (*reel_asset->language(), notes); } + + if (!reel_asset->entry_point()) { + notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_SUBTITLE_ENTRY_POINT }); + } else if (reel_asset->entry_point().get()) { + notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::SUBTITLE_ENTRY_POINT_NON_ZERO }); + } } @@ -643,6 +649,12 @@ verify_closed_caption_reel (shared_ptr<const ReelClosedCaptionAsset> reel_asset, if (reel_asset->language()) { verify_language_tag (*reel_asset->language(), notes); } + + if (!reel_asset->entry_point()) { + notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_CLOSED_CAPTION_ENTRY_POINT }); + } else if (reel_asset->entry_point().get()) { + notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::CLOSED_CAPTION_ENTRY_POINT_NON_ZERO }); + } } @@ -1284,6 +1296,14 @@ dcp::note_to_string (dcp::VerificationNote note) return "At least one reel contains a subtitle asset, but some reel(s) do not"; case dcp::VerificationNote::CLOSED_CAPTION_ASSET_COUNTS_DIFFER: return "At least one reel has closed captions, but reels have different numbers of closed caption assets."; + case dcp::VerificationNote::MISSING_SUBTITLE_ENTRY_POINT: + return "Subtitle assets must have an <EntryPoint> tag."; + case dcp::VerificationNote::SUBTITLE_ENTRY_POINT_NON_ZERO: + return "Subtitle assets must have an <EntryPoint> of 0."; + case dcp::VerificationNote::MISSING_CLOSED_CAPTION_ENTRY_POINT: + return "Closed caption assets must have an <EntryPoint> tag."; + case dcp::VerificationNote::CLOSED_CAPTION_ENTRY_POINT_NON_ZERO: + return "Closed caption assets must have an <EntryPoint> of 0."; } return ""; diff --git a/src/verify.h b/src/verify.h index 64232a43..917d5e53 100644 --- a/src/verify.h +++ b/src/verify.h @@ -143,6 +143,14 @@ public: MAIN_SUBTITLE_NOT_IN_ALL_REELS, /** If one reel has at least one ClosedCaption, all reels must have the same number of ClosedCaptions */ CLOSED_CAPTION_ASSET_COUNTS_DIFFER, + /** MainSubtitle in reels must have <EntryPoint> Bv2.1_8.3.2 */ + MISSING_SUBTITLE_ENTRY_POINT, + /** MainSubtitle <EntryPoint> must be zero Bv2.1_8.3.2 */ + SUBTITLE_ENTRY_POINT_NON_ZERO, + /** Closed caption in reels must have <EntryPoint> Bv2.1_8.3.2 */ + MISSING_CLOSED_CAPTION_ENTRY_POINT, + /** Closed caption MainSubtitle <EntryPoint> must be zero Bv2.1_8.3.2 */ + CLOSED_CAPTION_ENTRY_POINT_NON_ZERO, }; VerificationNote (Type type, Code code) diff --git a/test/verify_test.cc b/test/verify_test.cc index 246b4462..31647933 100644 --- a/test/verify_test.cc +++ b/test/verify_test.cc @@ -1834,3 +1834,71 @@ BOOST_AUTO_TEST_CASE (verify_closed_captions_must_be_in_all_reels) } } + +template <class T> +void +verify_text_entry_point_check (boost::filesystem::path dir, dcp::VerificationNote::Code code, boost::function<void (shared_ptr<T>)> adjust) +{ + boost::filesystem::remove_all (dir); + boost::filesystem::create_directories (dir); + auto dcp = make_shared<dcp::DCP>(dir); + auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::FEATURE); + + auto subs = make_shared<dcp::SMPTESubtitleAsset>(); + subs->set_language (dcp::LanguageTag("de-DE")); + subs->set_start_time (dcp::Time()); + subs->add (simple_subtitle()); + subs->write (dir / "subs.mxf"); + auto reel_text = make_shared<T>(subs, dcp::Fraction(24, 1), 240, 0); + adjust (reel_text); + + auto reel = make_shared<dcp::Reel>( + make_shared<dcp::ReelMonoPictureAsset>(simple_picture(dir, "", 240), 0), + make_shared<dcp::ReelSoundAsset>(simple_sound(dir, "", dcp::MXFMetadata(), "en-US", 240), 0) + ); + + reel->add (reel_text); + + cpl->add (reel); + + dcp->add (cpl); + dcp->write_xml (dcp::SMPTE); + + check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, code }}); +} + + +BOOST_AUTO_TEST_CASE (verify_text_entry_point) +{ + verify_text_entry_point_check<dcp::ReelSubtitleAsset> ( + "build/test/verify_subtitle_entry_point_must_be_present", + dcp::VerificationNote::MISSING_SUBTITLE_ENTRY_POINT, + [](shared_ptr<dcp::ReelSubtitleAsset> asset) { + asset->unset_entry_point (); + } + ); + + verify_text_entry_point_check<dcp::ReelSubtitleAsset> ( + "build/test/verify_subtitle_entry_point_must_be_zero", + dcp::VerificationNote::SUBTITLE_ENTRY_POINT_NON_ZERO, + [](shared_ptr<dcp::ReelSubtitleAsset> asset) { + asset->set_entry_point (4); + } + ); + + verify_text_entry_point_check<dcp::ReelClosedCaptionAsset> ( + "build/test/verify_closed_caption_entry_point_must_be_present", + dcp::VerificationNote::MISSING_CLOSED_CAPTION_ENTRY_POINT, + [](shared_ptr<dcp::ReelClosedCaptionAsset> asset) { + asset->unset_entry_point (); + } + ); + + verify_text_entry_point_check<dcp::ReelClosedCaptionAsset> ( + "build/test/verify_closed_caption_entry_point_must_be_zero", + dcp::VerificationNote::CLOSED_CAPTION_ENTRY_POINT_NON_ZERO, + [](shared_ptr<dcp::ReelClosedCaptionAsset> asset) { + asset->set_entry_point (9); + } + ); +} |
