diff options
| author | Carl Hetherington <cth@carlh.net> | 2023-01-15 23:13:49 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2023-01-15 23:14:00 +0100 |
| commit | 4c0e03e857066a8241bfb286412f76a8c52d2760 (patch) | |
| tree | 3dd738b666d0b7118f225981d76a66f70620cf46 | |
| parent | 7b6965584cd81ee0406901d84b769946483a85b6 (diff) | |
Check that Interop subtitle files have at least one subtitle.
It was reported on the forum that files without any <Font> or
<Subtitle> tags fail validation on EasyDCP 3.0.1 and crash
Qubemaster Pro 3.0.15.
| -rw-r--r-- | src/verify.cc | 17 | ||||
| -rw-r--r-- | src/verify.h | 7 | ||||
| -rw-r--r-- | test/data/subs4.xml | 8 | ||||
| -rw-r--r-- | test/verify_test.cc | 19 |
4 files changed, 50 insertions, 1 deletions
diff --git a/src/verify.cc b/src/verify.cc index bfa697da..8ea9ae97 100644 --- a/src/verify.cc +++ b/src/verify.cc @@ -687,6 +687,16 @@ verify_smpte_timed_text_asset ( } +/** Verify Interop subtitle-only stuff */ +void +verify_interop_subtitle_asset(shared_ptr<const InteropSubtitleAsset> asset, vector<VerificationNote>& notes) +{ + if (asset->subtitles().empty()) { + notes.push_back({VerificationNote::Type::ERROR, VerificationNote::Code::MISSING_SUBTITLE, asset->id(), asset->file().get() }); + } +} + + /** Verify SMPTE subtitle-only stuff */ void verify_smpte_subtitle_asset ( @@ -740,6 +750,11 @@ verify_subtitle_asset ( notes.push_back ({VerificationNote::Type::WARNING, VerificationNote::Code::MISSED_CHECK_OF_ENCRYPTED}); } + auto interop = dynamic_pointer_cast<const InteropSubtitleAsset>(asset); + if (interop) { + verify_interop_subtitle_asset(interop, notes); + } + auto smpte = dynamic_pointer_cast<const SMPTESubtitleAsset>(asset); if (smpte) { verify_smpte_timed_text_asset (smpte, reel_asset_duration, notes); @@ -1938,6 +1953,8 @@ dcp::note_to_string (VerificationNote note) return String::compose("The PKL %1 has more than one asset with the same ID", note.note().get()); case VerificationNote::Code::DUPLICATE_ASSET_ID_IN_ASSETMAP: return String::compose("The ASSETMAP %1 has more than one asset with the same ID", note.note().get()); + case VerificationNote::Code::MISSING_SUBTITLE: + return String::compose("The subtitle asset %1 has no subtitles", note.note().get()); } return ""; diff --git a/src/verify.h b/src/verify.h index e9b5c9d0..2e20bc31 100644 --- a/src/verify.h +++ b/src/verify.h @@ -410,7 +410,12 @@ public: * note contains the ASSETMAP ID * file contains the ASSETMAP filename */ - DUPLICATE_ASSET_ID_IN_ASSETMAP + DUPLICATE_ASSET_ID_IN_ASSETMAP, + /** An Interop subtitle asset has no subtitles. + * note contains the asset ID + * file contains the asset filename + */ + MISSING_SUBTITLE }; VerificationNote (Type type, Code code) diff --git a/test/data/subs4.xml b/test/data/subs4.xml new file mode 100644 index 00000000..5aea4c10 --- /dev/null +++ b/test/data/subs4.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<DCSubtitle Version="1.0"> + <SubtitleID>cab5c268-222b-41d2-88ae-6d6999441b17</SubtitleID> + <MovieTitle>Movie Title</MovieTitle> + <ReelNumber>1</ReelNumber> + <Language>French</Language> + <LoadFont Id="theFontId" URI="arial.ttf"/> +</DCSubtitle> diff --git a/test/verify_test.cc b/test/verify_test.cc index 652bf12d..34dc79bc 100644 --- a/test/verify_test.cc +++ b/test/verify_test.cc @@ -806,6 +806,25 @@ BOOST_AUTO_TEST_CASE (verify_invalid_interop_subtitles) } +BOOST_AUTO_TEST_CASE(verify_interop_subtitle_asset_with_no_subtitles) +{ + path const dir("build/test/verify_interop_subtitle_asset_with_no_subtitles"); + prepare_directory(dir); + copy_file("test/data/subs4.xml", dir / "subs.xml"); + auto asset = make_shared<dcp::InteropSubtitleAsset>(dir / "subs.xml"); + auto reel_asset = make_shared<dcp::ReelInteropSubtitleAsset>(asset, dcp::Fraction(24, 1), 16 * 24, 0); + write_dcp_with_single_asset(dir, reel_asset, dcp::Standard::INTEROP); + + check_verify_result ( + { dir }, + { + { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD }, + { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE, asset->id(), boost::filesystem::canonical(asset->file().get()) }, + }); + +} + + BOOST_AUTO_TEST_CASE (verify_valid_smpte_subtitles) { path const dir("build/test/verify_valid_smpte_subtitles"); |
