diff options
| author | Carl Hetherington <cth@carlh.net> | 2023-02-16 21:56:22 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2023-02-16 21:56:22 +0100 |
| commit | 89fbc8d186378cd72ab3e9a259073d45b7b993ad (patch) | |
| tree | 57d7cf19ca2f21f1acb9da4e7d7e9888cdab2163 | |
| parent | 8b86c990e526e55e273cc408377f13e64a27fb26 (diff) | |
Change how whitespace in subtitles is handled.
Previously we would discard any whitespace subtitle content we found.
This had the side-effect of making a verification test fail (checking
that at least one subtitle is in each reel; blank subtitles are often
used to avoid this warning).
Here we take any subtitle content, whitespace or not, inside a
<Text> or <Image> node which I think is a little more correct.
| -rw-r--r-- | src/subtitle_asset.cc | 6 | ||||
| -rw-r--r-- | src/util.cc | 13 | ||||
| -rw-r--r-- | src/util.h | 5 | ||||
| -rw-r--r-- | test/data/subs5.xml | 13 | ||||
| -rw-r--r-- | test/verify_test.cc | 18 |
5 files changed, 36 insertions, 19 deletions
diff --git a/src/subtitle_asset.cc b/src/subtitle_asset.cc index f707c665..4baa7b06 100644 --- a/src/subtitle_asset.cc +++ b/src/subtitle_asset.cc @@ -324,7 +324,11 @@ SubtitleAsset::parse_subtitles (xmlpp::Element const * node, vector<ParseState>& void SubtitleAsset::maybe_add_subtitle (string text, vector<ParseState> const & parse_state, float space_before, Standard standard) { - if (empty_or_white_space (text)) { + auto wanted = [](ParseState const& ps) { + return ps.type && (ps.type.get() == ParseState::Type::TEXT || ps.type.get() == ParseState::Type::IMAGE); + }; + + if (find_if(parse_state.begin(), parse_state.end(), wanted) == parse_state.end()) { return; } diff --git a/src/util.cc b/src/util.cc index b58035ea..9cc35ad6 100644 --- a/src/util.cc +++ b/src/util.cc @@ -158,19 +158,6 @@ dcp::make_digest (boost::filesystem::path filename, function<void (float)> progr } -bool -dcp::empty_or_white_space (string s) -{ - for (size_t i = 0; i < s.length(); ++i) { - if (s[i] != ' ' && s[i] != '\n' && s[i] != '\t') { - return false; - } - } - - return true; -} - - void dcp::init (optional<boost::filesystem::path> given_resources_directory) { @@ -84,11 +84,6 @@ extern std::string make_digest (boost::filesystem::path filename, boost::functio extern std::string make_digest (ArrayData data); -/** @param s A string - * @return true if the string contains only space, newline or tab characters, or is empty - */ -extern bool empty_or_white_space (std::string s); - extern bool ids_equal (std::string a, std::string b); extern std::string remove_urn_uuid (std::string raw); diff --git a/test/data/subs5.xml b/test/data/subs5.xml new file mode 100644 index 00000000..d75583b9 --- /dev/null +++ b/test/data/subs5.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<DCSubtitle Version="1.0"> +<SubtitleID>12345678-9abc-def0-1234-56789abcdef0</SubtitleID> +<MovieTitle>Frobozz</MovieTitle> +<ReelNumber>1</ReelNumber> +<Language>English</Language> +<LoadFont Id="Arial" URI="Arial.ttf"/> +<Font Id="Arial"> +<Subtitle SpotNumber="1" TimeIn="00:00:04:100" TimeOut="00:00:05:199" FadeUpTime="0" FadeDownTime="0"> + <Text HAlign="center" HPosition="0.00" VAlign="top" VPosition="40.00" Direction="horizontal"> </Text> +</Subtitle> +</Font> +</DCSubtitle> diff --git a/test/verify_test.cc b/test/verify_test.cc index cde49830..396a1ef5 100644 --- a/test/verify_test.cc +++ b/test/verify_test.cc @@ -825,6 +825,24 @@ BOOST_AUTO_TEST_CASE(verify_interop_subtitle_asset_with_no_subtitles) } +BOOST_AUTO_TEST_CASE(verify_interop_subtitle_asset_with_single_space_subtitle) +{ + path const dir("build/test/verify_interop_subtitle_asset_with_single_space_subtitle"); + prepare_directory(dir); + copy_file("test/data/subs5.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 }, + }); + +} + + BOOST_AUTO_TEST_CASE (verify_valid_smpte_subtitles) { path const dir("build/test/verify_valid_smpte_subtitles"); |
