summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2020-11-18 01:06:49 +0100
committerCarl Hetherington <cth@carlh.net>2020-11-20 22:57:59 +0100
commite519feaca11005d330e7b8403b948d4ad9cc3ae8 (patch)
tree5c43aba1dd590d1abad189ac7f39b5d4ecbb1f5e /src/lib
parent556dd9cc254bf3ef18c41fcfe5948484c91cc440 (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.cc83
-rw-r--r--src/lib/film.h13
-rw-r--r--src/lib/isdcf_metadata.cc5
-rw-r--r--src/lib/isdcf_metadata.h2
-rw-r--r--src/lib/reel_writer.cc6
-rw-r--r--src/lib/subtitle_encoder.cc6
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);
}