diff options
| author | Carl Hetherington <cth@carlh.net> | 2020-11-18 01:06:49 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2020-11-20 22:57:59 +0100 |
| commit | e519feaca11005d330e7b8403b948d4ad9cc3ae8 (patch) | |
| tree | 5c43aba1dd590d1abad189ac7f39b5d4ecbb1f5e /src/lib | |
| parent | 556dd9cc254bf3ef18c41fcfe5948484c91cc440 (diff) | |
Store subtitle language(s) in Film, and allow setup of those
languages from the Interop/SMPTE metadata dialogues.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/film.cc | 83 | ||||
| -rw-r--r-- | src/lib/film.h | 13 | ||||
| -rw-r--r-- | src/lib/isdcf_metadata.cc | 5 | ||||
| -rw-r--r-- | src/lib/isdcf_metadata.h | 2 | ||||
| -rw-r--r-- | src/lib/reel_writer.cc | 6 | ||||
| -rw-r--r-- | src/lib/subtitle_encoder.cc | 6 |
6 files changed, 56 insertions, 59 deletions
diff --git a/src/lib/film.cc b/src/lib/film.cc index 3d822c5ea..9943711f5 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -488,6 +488,9 @@ Film::metadata (bool with_content_paths) const root->add_child("LuminanceUnit")->add_child_text(dcp::Luminance::unit_to_string(_luminance.unit())); root->add_child("UserExplicitContainer")->add_child_text(_user_explicit_container ? "1" : "0"); root->add_child("UserExplicitResolution")->add_child_text(_user_explicit_resolution ? "1" : "0"); + BOOST_FOREACH (dcp::LanguageTag i, _subtitle_languages) { + root->add_child("SubtitleLanguage")->add_child_text(i.to_string()); + } _playlist->as_xml (root->add_child ("Playlist"), with_content_paths); return doc; @@ -671,6 +674,10 @@ Film::read_metadata (optional<boost::filesystem::path> path) _user_explicit_container = f.optional_bool_child("UserExplicitContainer").get_value_or(true); _user_explicit_resolution = f.optional_bool_child("UserExplicitResolution").get_value_or(true); + BOOST_FOREACH (cxml::ConstNodePtr i, f.node_children("SubtitleLanguage")) { + _subtitle_languages.push_back (dcp::LanguageTag(i->content())); + } + list<string> notes; _playlist->set_from_xml (shared_from_this(), f.node_child ("Playlist"), _state_version, notes); @@ -863,39 +870,27 @@ Film::isdcf_name (bool if_created_now) const for now I'm just appending -CCAP if we have any closed captions. */ - optional<string> subtitle_language; bool burnt_in = true; bool ccap = false; BOOST_FOREACH (shared_ptr<Content> i, content()) { BOOST_FOREACH (shared_ptr<TextContent> j, i->text) { - if (j->type() == TEXT_OPEN_SUBTITLE && j->use()) { - subtitle_language = j->language (); - if (!j->burn()) { - burnt_in = false; - } + if (j->type() == TEXT_OPEN_SUBTITLE && j->use() && !j->burn()) { + burnt_in = false; } else if (j->type() == TEXT_CLOSED_CAPTION && j->use()) { ccap = true; } } } - if (dm.subtitle_language) { - /* Subtitle language is overridden in ISDCF metadata, primarily to handle - content with pre-burnt subtitles. - */ - d += "-" + *dm.subtitle_language; - if (ccap) { - d += "-CCAP"; - } - } else if (subtitle_language) { - /* Language is worked out from the content */ - if (burnt_in && *subtitle_language != "XX") { - transform (subtitle_language->begin(), subtitle_language->end(), subtitle_language->begin(), ::tolower); + if (!_subtitle_languages.empty()) { + string lang = _subtitle_languages.front().language().get_value_or("en").subtag(); + if (burnt_in) { + transform (lang.begin(), lang.end(), lang.begin(), ::tolower); } else { - transform (subtitle_language->begin(), subtitle_language->end(), subtitle_language->begin(), ::toupper); + transform (lang.begin(), lang.end(), lang.begin(), ::toupper); } - d += "-" + *subtitle_language; + d += "-" + lang; if (ccap) { d += "-CCAP"; } @@ -1684,29 +1679,6 @@ Film::should_be_enough_disk_space (double& required, double& available, bool& ca return (available - required) > 1; } -string -Film::subtitle_language () const -{ - set<string> languages; - - BOOST_FOREACH (shared_ptr<Content> i, content()) { - BOOST_FOREACH (shared_ptr<TextContent> j, i->text) { - languages.insert (j->language ()); - } - } - - string all; - BOOST_FOREACH (string s, languages) { - if (!all.empty ()) { - all += "/" + s; - } else { - all += s; - } - } - - return all; -} - /** @return The names of the channels that audio contents' outputs are passed into; * this is either the DCP or a AudioProcessor. */ @@ -2012,6 +1984,31 @@ Film::set_luminance (dcp::Luminance l) void +Film::set_subtitle_language (dcp::LanguageTag language) +{ + vector<dcp::LanguageTag> lang; + lang.push_back (language); + set_subtitle_languages (lang); +} + + +void +Film::unset_subtitle_language () +{ + ChangeSignaller<Film> ch (this, SUBTITLE_LANGUAGES); + _subtitle_languages.clear(); +} + + +void +Film::set_subtitle_languages (vector<dcp::LanguageTag> languages) +{ + ChangeSignaller<Film> ch (this, SUBTITLE_LANGUAGES); + _subtitle_languages = languages; +} + + +void Film::set_facility (string f) { ChangeSignaller<Film> ch (this, FACILITY); diff --git a/src/lib/film.h b/src/lib/film.h index 4854d2ae7..4c71c9e16 100644 --- a/src/lib/film.h +++ b/src/lib/film.h @@ -175,8 +175,6 @@ public: return _state_version; } - std::string subtitle_language () const; - std::vector<NamedChannel> audio_output_names () const; void repeat_content (ContentList, int); @@ -240,7 +238,8 @@ public: CHAIN, DISTRIBUTOR, FACILITY, - LUMINANCE + LUMINANCE, + SUBTITLE_LANGUAGES }; @@ -378,6 +377,10 @@ public: return _luminance; } + std::vector<dcp::LanguageTag> subtitle_languages () const { + return _subtitle_languages; + } + /* SET */ void set_directory (boost::filesystem::path); @@ -419,6 +422,9 @@ public: void set_facility (std::string f); void set_distributor (std::string d); void set_luminance (dcp::Luminance l); + void set_subtitle_language (dcp::LanguageTag language); + void unset_subtitle_language (); + void set_subtitle_languages (std::vector<dcp::LanguageTag> languages); void add_ffoc_lfoc (Markers& markers) const; @@ -524,6 +530,7 @@ private: std::string _distributor; std::string _facility; dcp::Luminance _luminance; + std::vector<dcp::LanguageTag> _subtitle_languages; int _state_version; diff --git a/src/lib/isdcf_metadata.cc b/src/lib/isdcf_metadata.cc index f4b256626..e117dc284 100644 --- a/src/lib/isdcf_metadata.cc +++ b/src/lib/isdcf_metadata.cc @@ -36,7 +36,6 @@ using dcp::raw_convert; ISDCFMetadata::ISDCFMetadata (cxml::ConstNodePtr node) : content_version (node->number_child<int> ("ContentVersion")) , audio_language (node->string_child ("AudioLanguage")) - , subtitle_language (node->optional_string_child("SubtitleLanguage")) , territory (node->string_child ("Territory")) , rating (node->string_child ("Rating")) , studio (node->string_child ("Studio")) @@ -56,9 +55,6 @@ void ISDCFMetadata::as_xml (xmlpp::Node* root) const { root->add_child("ContentVersion")->add_child_text (raw_convert<string> (content_version)); - if (subtitle_language) { - root->add_child("SubtitleLanguage")->add_child_text (*subtitle_language); - } root->add_child("AudioLanguage")->add_child_text (audio_language); root->add_child("Territory")->add_child_text (territory); root->add_child("Rating")->add_child_text (rating); @@ -76,7 +72,6 @@ bool operator== (ISDCFMetadata const & a, ISDCFMetadata const & b) { return a.content_version == b.content_version && - a.subtitle_language == b.subtitle_language && a.audio_language == b.audio_language && a.territory == b.territory && a.rating == b.rating && diff --git a/src/lib/isdcf_metadata.h b/src/lib/isdcf_metadata.h index f54565f5d..0c70fb6bc 100644 --- a/src/lib/isdcf_metadata.h +++ b/src/lib/isdcf_metadata.h @@ -46,8 +46,6 @@ public: int content_version; std::string audio_language; - /** if set, this overrides any languages specified in individual Content objects */ - boost::optional<std::string> subtitle_language; std::string territory; std::string rating; std::string studio; diff --git a/src/lib/reel_writer.cc b/src/lib/reel_writer.cc index 0ea4d1563..a927770a5 100644 --- a/src/lib/reel_writer.cc +++ b/src/lib/reel_writer.cc @@ -685,12 +685,12 @@ ReelWriter::write (PlayerText subs, TextType type, optional<DCPTextTrack> track, } if (!asset) { - string lang = _film->subtitle_language (); + vector<dcp::LanguageTag> lang = _film->subtitle_languages (); if (_film->interop ()) { shared_ptr<dcp::InteropSubtitleAsset> s (new dcp::InteropSubtitleAsset ()); s->set_movie_title (_film->name ()); if (type == TEXT_OPEN_SUBTITLE) { - s->set_language (lang.empty() ? "Unknown" : lang); + s->set_language (lang.empty() ? "Unknown" : lang.front().to_string()); } else { s->set_language (track->language); } @@ -701,7 +701,7 @@ ReelWriter::write (PlayerText subs, TextType type, optional<DCPTextTrack> track, s->set_content_title_text (_film->name ()); s->set_metadata (mxf_metadata()); if (type == TEXT_OPEN_SUBTITLE && !lang.empty()) { - s->set_language (lang); + s->set_language (lang.front().to_string()); } else { s->set_language (track->language); } diff --git a/src/lib/subtitle_encoder.cc b/src/lib/subtitle_encoder.cc index 19241bd6e..5e76f5e73 100644 --- a/src/lib/subtitle_encoder.cc +++ b/src/lib/subtitle_encoder.cc @@ -130,18 +130,18 @@ SubtitleEncoder::text (PlayerText subs, TextType type, optional<DCPTextTrack> tr if (!_assets[_reel_index].first) { shared_ptr<dcp::SubtitleAsset> asset; - string lang = _film->subtitle_language (); + vector<dcp::LanguageTag> lang = _film->subtitle_languages (); if (_film->interop ()) { shared_ptr<dcp::InteropSubtitleAsset> s (new dcp::InteropSubtitleAsset()); s->set_movie_title (_film->name()); - s->set_language (lang.empty() ? "Unknown" : lang); + s->set_language (lang.empty() ? "Unknown" : lang.front().to_string()); s->set_reel_number (raw_convert<string>(_reel_index + 1)); _assets[_reel_index].first = s; } else { shared_ptr<dcp::SMPTESubtitleAsset> s (new dcp::SMPTESubtitleAsset()); s->set_content_title_text (_film->name()); if (!lang.empty()) { - s->set_language (lang); + s->set_language (lang.front().to_string()); } else { s->set_language (track->language); } |
