summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2021-04-02 10:47:35 +0200
committerCarl Hetherington <cth@carlh.net>2021-04-02 10:47:35 +0200
commita6696b9a58c14d81f0ae30482051c2cd47a004db (patch)
tree0fb2983324b891f7dd3ecde04eb92dae00cb0a85 /src/lib
parenta4b7d0af831b8cd9aafca5f2b264be416a7b1148 (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.cc20
-rw-r--r--src/lib/audio_content.h9
-rw-r--r--src/lib/film.cc27
-rw-r--r--src/lib/film.h2
-rw-r--r--src/lib/isdcf_metadata.cc3
-rw-r--r--src/lib/isdcf_metadata.h1
-rw-r--r--src/lib/writer.cc10
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;