diff options
| author | Carl Hetherington <cth@carlh.net> | 2021-04-02 10:47:35 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2021-04-02 10:47:35 +0200 |
| commit | a6696b9a58c14d81f0ae30482051c2cd47a004db (patch) | |
| tree | 0fb2983324b891f7dd3ecde04eb92dae00cb0a85 /src/lib | |
| parent | a4b7d0af831b8cd9aafca5f2b264be416a7b1148 (diff) | |
Add language to audio content and use it instead of the general metadata.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/audio_content.cc | 20 | ||||
| -rw-r--r-- | src/lib/audio_content.h | 9 | ||||
| -rw-r--r-- | src/lib/film.cc | 27 | ||||
| -rw-r--r-- | src/lib/film.h | 2 | ||||
| -rw-r--r-- | src/lib/isdcf_metadata.cc | 3 | ||||
| -rw-r--r-- | src/lib/isdcf_metadata.h | 1 | ||||
| -rw-r--r-- | src/lib/writer.cc | 10 |
7 files changed, 61 insertions, 11 deletions
diff --git a/src/lib/audio_content.cc b/src/lib/audio_content.cc index 748cbb7d0..3d9f6ac05 100644 --- a/src/lib/audio_content.cc +++ b/src/lib/audio_content.cc @@ -52,6 +52,7 @@ using namespace dcpomatic; int const AudioContentProperty::STREAMS = 200; int const AudioContentProperty::GAIN = 201; int const AudioContentProperty::DELAY = 202; +int const AudioContentProperty::LANGUAGE = 203; AudioContent::AudioContent (Content* parent) @@ -89,6 +90,10 @@ AudioContent::AudioContent (Content* parent, cxml::ConstNodePtr node) { _gain = node->number_child<double> ("AudioGain"); _delay = node->number_child<int> ("AudioDelay"); + auto lang = node->optional_node_child ("Language"); + if (lang) { + _language = dcp::LanguageTag (lang->content()); + } /* Backwards compatibility */ auto r = node->optional_number_child<double>("AudioVideoFrameRate"); @@ -112,11 +117,16 @@ AudioContent::AudioContent (Content* parent, vector<shared_ptr<Content> > c) if (c[i]->audio->delay() != ref->delay()) { throw JoinError (_("Content to be joined must have the same audio delay.")); } + + if (c[i]->audio->language() != ref->language()) { + throw JoinError (_("Content to be joined must have the same audio language.")); + } } _gain = ref->gain (); _delay = ref->delay (); _streams = ref->streams (); + _language = ref->language (); } @@ -126,6 +136,9 @@ AudioContent::as_xml (xmlpp::Node* node) const boost::mutex::scoped_lock lm (_mutex); node->add_child("AudioGain")->add_child_text(raw_convert<string>(_gain)); node->add_child("AudioDelay")->add_child_text(raw_convert<string>(_delay)); + if (_language) { + node->add_child("Language")->add_child_text(_language->to_string()); + } } @@ -143,6 +156,13 @@ AudioContent::set_delay (int d) } +void +AudioContent::set_language (optional<dcp::LanguageTag> language) +{ + maybe_set (_language, language, AudioContentProperty::LANGUAGE); +} + + string AudioContent::technical_summary () const { diff --git a/src/lib/audio_content.h b/src/lib/audio_content.h index 67183d0a4..adb5c9556 100644 --- a/src/lib/audio_content.h +++ b/src/lib/audio_content.h @@ -31,6 +31,7 @@ #include "content_part.h" #include "audio_stream.h" #include "audio_mapping.h" +#include <dcp/language_tag.h> /** @class AudioContentProperty @@ -42,6 +43,7 @@ public: static int const STREAMS; static int const GAIN; static int const DELAY; + static int const LANGUAGE; }; @@ -63,6 +65,7 @@ public: void set_gain (double); void set_delay (int); + void set_language (boost::optional<dcp::LanguageTag> langauge); double gain () const { boost::mutex::scoped_lock lm (_mutex); @@ -74,6 +77,11 @@ public: return _delay; } + boost::optional<dcp::LanguageTag> language () const { + boost::mutex::scoped_lock lm (_mutex); + return _language; + } + std::string processing_description (std::shared_ptr<const Film> film) const; std::vector<AudioStreamPtr> streams () const { @@ -100,6 +108,7 @@ private: /** Delay to apply to audio (positive moves audio later) in milliseconds */ int _delay = 0; std::vector<AudioStreamPtr> _streams; + boost::optional<dcp::LanguageTag> _language; }; #endif diff --git a/src/lib/film.cc b/src/lib/film.cc index 945559a49..7dd0ff6f1 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -752,6 +752,23 @@ Film::mapped_audio_channels () const } +vector<dcp::LanguageTag> +Film::audio_languages () const +{ + vector<dcp::LanguageTag> result; + for (auto i: content()) { + if (i->audio && !i->audio->mapping().mapped_output_channels().empty() && i->audio->language()) { + result.push_back (i->audio->language().get()); + } + } + + std::sort (result.begin(), result.end()); + auto last = std::unique (result.begin(), result.end()); + result.erase (last, result.end()); + return result; +} + + pair<optional<dcp::LanguageTag>, vector<dcp::LanguageTag>> Film::subtitle_languages () const { @@ -889,7 +906,9 @@ Film::isdcf_name (bool if_created_now) const } } - auto const audio_language = dm.audio_language.empty() ? "XX" : dm.audio_language; + auto audio_langs = audio_languages(); + auto audio_language = (audio_langs.empty() || !audio_langs.front().language()) ? "XX" : audio_langs.front().language()->subtag(); + transform (audio_language.begin(), audio_language.end(), audio_language.begin(), ::toupper); d += "_" + audio_language; @@ -909,9 +928,9 @@ Film::isdcf_name (bool if_created_now) const } } - auto sublangs = subtitle_languages(); - if (sublangs.first && sublangs.first->language()) { - auto lang = sublangs.first->language()->subtag(); + auto sub_langs = subtitle_languages(); + if (sub_langs.first && sub_langs.first->language()) { + auto lang = sub_langs.first->language()->subtag(); if (burnt_in) { transform (lang.begin(), lang.end(), lang.begin(), ::tolower); } else { diff --git a/src/lib/film.h b/src/lib/film.h index 9feb5d0d3..6b50bba5e 100644 --- a/src/lib/film.h +++ b/src/lib/film.h @@ -184,6 +184,7 @@ public: std::list<dcpomatic::DCPTimePeriod> reels () const; std::list<int> mapped_audio_channels () const; + std::vector<dcp::LanguageTag> audio_languages () const; std::pair<boost::optional<dcp::LanguageTag>, std::vector<dcp::LanguageTag>> subtitle_languages () const; std::string content_summary (dcpomatic::DCPTimePeriod period) const; @@ -239,7 +240,6 @@ public: DISTRIBUTOR, FACILITY, LUMINANCE, - SUBTITLE_LANGUAGES }; diff --git a/src/lib/isdcf_metadata.cc b/src/lib/isdcf_metadata.cc index 368b6e3a5..6adbd0f3c 100644 --- a/src/lib/isdcf_metadata.cc +++ b/src/lib/isdcf_metadata.cc @@ -35,7 +35,6 @@ using dcp::raw_convert; ISDCFMetadata::ISDCFMetadata (cxml::ConstNodePtr node) : content_version (node->number_child<int> ("ContentVersion")) - , audio_language (node->string_child ("AudioLanguage")) , territory (node->string_child ("Territory")) , rating (node->string_child ("Rating")) , studio (node->string_child ("Studio")) @@ -55,7 +54,6 @@ void ISDCFMetadata::as_xml (xmlpp::Node* root) const { root->add_child("ContentVersion")->add_child_text (raw_convert<string> (content_version)); - 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); root->add_child("Studio")->add_child_text (studio); @@ -72,7 +70,6 @@ bool operator== (ISDCFMetadata const & a, ISDCFMetadata const & b) { return a.content_version == b.content_version && - a.audio_language == b.audio_language && a.territory == b.territory && a.rating == b.rating && a.studio == b.studio && diff --git a/src/lib/isdcf_metadata.h b/src/lib/isdcf_metadata.h index 0c70fb6bc..fd021b8dc 100644 --- a/src/lib/isdcf_metadata.h +++ b/src/lib/isdcf_metadata.h @@ -45,7 +45,6 @@ public: void read_old_metadata (std::string, std::string); int content_version; - std::string audio_language; std::string territory; std::string rating; std::string studio; diff --git a/src/lib/writer.cc b/src/lib/writer.cc index 3448c5bca..0285255e0 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -706,13 +706,19 @@ Writer::write_cover_sheet (boost::filesystem::path output_dcp) boost::algorithm::replace_all (text, "$CPL_NAME", film()->name()); boost::algorithm::replace_all (text, "$TYPE", film()->dcp_content_type()->pretty_name()); boost::algorithm::replace_all (text, "$CONTAINER", film()->container()->container_nickname()); - boost::algorithm::replace_all (text, "$AUDIO_LANGUAGE", film()->isdcf_metadata().audio_language); + + auto audio_languages = film()->audio_languages(); + if (!audio_languages.empty()) { + boost::algorithm::replace_all (text, "$AUDIO_LANGUAGE", audio_languages.front().description()); + } else { + boost::algorithm::replace_all (text, "$AUDIO_LANGUAGE", _("None")); + } auto subtitle_languages = film()->subtitle_languages(); if (subtitle_languages.first) { boost::algorithm::replace_all (text, "$SUBTITLE_LANGUAGE", subtitle_languages.first->description()); } else { - boost::algorithm::replace_all (text, "$SUBTITLE_LANGUAGE", "None"); + boost::algorithm::replace_all (text, "$SUBTITLE_LANGUAGE", _("None")); } boost::uintmax_t size = 0; |
