diff options
| author | Carl Hetherington <cth@carlh.net> | 2020-12-14 23:23:41 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2021-01-17 20:13:22 +0100 |
| commit | d4519ea7898ccb878a297126bbb45c7b65cccd08 (patch) | |
| tree | 13c623d68e03655dc9d5cfbe5c1706a01024651c | |
| parent | 3924dd859ad3de1d4a207d04e841f699bd27490a (diff) | |
Bv2.1 7.2.2: Check that subtitle Language tags are present.
| -rw-r--r-- | BRANCH | 6 | ||||
| -rw-r--r-- | src/verify.cc | 8 | ||||
| -rw-r--r-- | src/verify.h | 2 | ||||
| -rw-r--r-- | test/test.cc | 2 | ||||
| -rw-r--r-- | test/verify_test.cc | 47 |
5 files changed, 63 insertions, 2 deletions
@@ -22,6 +22,8 @@ Mark things with [Bv2.1_paragraph] 7.2 [/] 7.2.1 - Timed text XML files for closed captions must be <= 256kB [/] - - Timed text total track asset must be <= 115MB - - Font resource <= 10MB + - Timed text total track asset must be <= 115MB [/] + - Font resource <= 10MB [/] +7.2.2 Language Element shall be present [/] and contiguous across all MainSubtitles. + diff --git a/src/verify.cc b/src/verify.cc index 428c737f..9dc87eec 100644 --- a/src/verify.cc +++ b/src/verify.cc @@ -658,6 +658,12 @@ verify_subtitle_asset ( if (smpte) { if (smpte->language()) { verify_language_tag (*smpte->language(), notes); + } else { + notes.push_back ( + VerificationNote( + VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_SUBTITLE_LANGUAGE, *asset->file() + ) + ); } if (boost::filesystem::file_size(*asset->file()) > 115 * 1024 * 1024) { notes.push_back ( @@ -883,6 +889,8 @@ dcp::note_to_string (dcp::VerificationNote note) return String::compose("The total size of the timed text asset %1 is larger than the 115MB maximum required by Bv2.1", note.file()->filename()); case dcp::VerificationNote::TIMED_TEXT_FONTS_TOO_LARGE_IN_BYTES: return String::compose("The total size of the fonts in timed text asset %1 is larger than the 10MB maximum required by Bv2.1", note.file()->filename()); + case dcp::VerificationNote::MISSING_SUBTITLE_LANGUAGE: + return String::compose("The XML for a SMPTE subtitle asset has no <Language> tag, which is required by Bv2.1", note.file()->filename()); } return ""; diff --git a/src/verify.h b/src/verify.h index c30718eb..5a120e10 100644 --- a/src/verify.h +++ b/src/verify.h @@ -108,6 +108,8 @@ public: TIMED_TEXT_ASSET_TOO_LARGE_IN_BYTES, /** The total size of all a timed text asset's fonts is larger than 10MB [Bv2.1_7.2.1] */ TIMED_TEXT_FONTS_TOO_LARGE_IN_BYTES, + /** Some SMPTE subtitle XML has no <Language> tag [Bv2.1_7.2.2] */ + MISSING_SUBTITLE_LANGUAGE, }; VerificationNote (Type type, Code code) diff --git a/test/test.cc b/test/test.cc index 8092df4f..502a847b 100644 --- a/test/test.cc +++ b/test/test.cc @@ -403,6 +403,7 @@ make_simple_with_smpte_subs (boost::filesystem::path path) shared_ptr<dcp::DCP> dcp = make_simple (path); shared_ptr<dcp::SMPTESubtitleAsset> subs(new dcp::SMPTESubtitleAsset()); + subs->set_language (dcp::LanguageTag("de-DE")); subs->add (simple_subtitle()); dcp::ArrayData data(4096); @@ -437,6 +438,7 @@ make_simple_with_smpte_ccaps (boost::filesystem::path path) shared_ptr<dcp::DCP> dcp = make_simple (path); shared_ptr<dcp::SMPTESubtitleAsset> subs(new dcp::SMPTESubtitleAsset()); + subs->set_language (dcp::LanguageTag("de-DE")); subs->add (simple_subtitle()); subs->write (path / "ccap.mxf"); diff --git a/test/verify_test.cc b/test/verify_test.cc index e468f286..1fc66dcd 100644 --- a/test/verify_test.cc +++ b/test/verify_test.cc @@ -1192,6 +1192,7 @@ BOOST_AUTO_TEST_CASE (verify_closed_caption_xml_too_large) ) ); } + asset->set_language (dcp::LanguageTag("de-DE")); asset->write (dir / "subs.mxf"); shared_ptr<dcp::ReelClosedCaptionAsset> reel_asset(new dcp::ReelClosedCaptionAsset(asset, dcp::Fraction(24, 1), 16 * 24, 0)); shared_ptr<dcp::Reel> reel(new dcp::Reel()); @@ -1257,6 +1258,7 @@ verify_timed_text_asset_too_large (string name) ) ) ); + asset->set_language (dcp::LanguageTag("de-DE")); asset->write (dir / "subs.mxf"); shared_ptr<T> reel_asset(new T(asset, dcp::Fraction(24, 1), 16 * 24, 0)); @@ -1288,3 +1290,48 @@ BOOST_AUTO_TEST_CASE (verify_subtitle_asset_too_large) } +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); + shared_ptr<dcp::DCP> dcp = make_simple (dir, 1); + + string const xml = + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<SubtitleReel xmlns=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/schema\">" + "<Id>urn:uuid:e6a8ae03-ebbf-41ed-9def-913a87d1493a</Id>" + "<ContentTitleText>Content</ContentTitleText>" + "<AnnotationText>Annotation</AnnotationText>" + "<IssueDate>2018-10-02T12:25:14+02:00</IssueDate>" + "<ReelNumber>1</ReelNumber>" + "<EditRate>25 1</EditRate>" + "<TimeCodeRate>25</TimeCodeRate>" + "<StartTime>00:00:00:00</StartTime>" + "<LoadFont ID=\"arial\">urn:uuid:e4f0ff0a-9eba-49e0-92ee-d89a88a575f6</LoadFont>" + "<SubtitleList>" + "<Font ID=\"arial\" Color=\"FFFEFEFE\" Weight=\"normal\" Size=\"42\" Effect=\"border\" EffectColor=\"FF181818\" AspectAdjust=\"1.00\">" + "<Subtitle SpotNumber=\"1\" TimeIn=\"00:00:03:00\" TimeOut=\"00:00:04:10\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">" + "<Text Hposition=\"0.0\" Halign=\"center\" Valign=\"bottom\" Vposition=\"13.5\" Direction=\"ltr\">Hello world</Text>" + "</Subtitle>" + "</Font>" + "</SubtitleList>" + "</SubtitleReel>"; + + FILE* xml_file = dcp::fopen_boost (dir / "subs.xml", "w"); + BOOST_REQUIRE (xml_file); + fwrite (xml.c_str(), xml.size(), 1, xml_file); + fclose (xml_file); + shared_ptr<dcp::SMPTESubtitleAsset> subs (new dcp::SMPTESubtitleAsset(dir / "subs.xml")); + subs->write (dir / "subs.mxf"); + + shared_ptr<dcp::ReelSubtitleAsset> reel_subs (new dcp::ReelSubtitleAsset(subs, dcp::Fraction(24, 1), 100, 0)); + dcp->cpls().front()->reels().front()->add (reel_subs); + dcp->write_xml (dcp::SMPTE); + + vector<boost::filesystem::path> dirs; + dirs.push_back (dir); + list<dcp::VerificationNote> notes = dcp::verify (dirs, &stage, &progress, xsd_test); + BOOST_REQUIRE_EQUAL (notes.size(), 1U); + BOOST_CHECK_EQUAL (notes.front().type(), dcp::VerificationNote::VERIFY_BV21_ERROR); + BOOST_CHECK_EQUAL (notes.front().code(), dcp::VerificationNote::MISSING_SUBTITLE_LANGUAGE); +} |
