From 034d7176177043dc4cb4518ae6a946efe401b809 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 28 Mar 2025 01:21:28 +0100 Subject: Copy audio language when setting up a project from a DCP (#3009). --- src/lib/copy_dcp_details_to_film.cc | 1 + src/lib/dcp_content.cc | 8 ++++++ src/lib/dcp_content.h | 9 ++++++ test/copy_dcp_details_to_film_test.cc | 52 +++++++++++++++++++++++++++++++++++ test/wscript | 1 + 5 files changed, 71 insertions(+) create mode 100644 test/copy_dcp_details_to_film_test.cc diff --git a/src/lib/copy_dcp_details_to_film.cc b/src/lib/copy_dcp_details_to_film.cc index 32b08d062..9e0ad79c1 100644 --- a/src/lib/copy_dcp_details_to_film.cc +++ b/src/lib/copy_dcp_details_to_film.cc @@ -61,6 +61,7 @@ copy_dcp_settings_to_film(shared_ptr dcp, shared_ptr fil if (dcp->audio) { film->set_audio_channels(dcp->audio->stream()->channels()); + film->set_audio_language(dcp->audio_language()); } film->set_ratings(dcp->ratings()); diff --git a/src/lib/dcp_content.cc b/src/lib/dcp_content.cc index 32b97b06f..885cbad93 100644 --- a/src/lib/dcp_content.cc +++ b/src/lib/dcp_content.cc @@ -168,6 +168,9 @@ DCPContent::DCPContent(cxml::ConstNodePtr node, boost::optionaloptional_number_child("ActiveAudioChannels"); + if (auto lang = node->optional_string_child("AudioLanguage")) { + _audio_language = dcp::LanguageTag(*lang); + } for (auto non_zero: node->node_children("HasNonZeroEntryPoint")) { try { @@ -273,6 +276,7 @@ DCPContent::examine(shared_ptr film, shared_ptr job, bool toler as->set_mapping (m); _active_audio_channels = examiner->active_audio_channels(); + _audio_language = examiner->audio_language(); } if (examiner->has_atmos()) { @@ -458,6 +462,10 @@ DCPContent::as_xml(xmlpp::Element* element, bool with_paths, PathBehaviour path_ cxml::add_text_child(element, "ActiveAudioChannels", fmt::to_string(*_active_audio_channels)); } + if (_audio_language) { + cxml::add_text_child(element, "AudioLanguage", _audio_language->as_string()); + } + for (auto i = 0; i < static_cast(TextType::COUNT); ++i) { if (_has_non_zero_entry_point[i]) { auto has = cxml::add_child(element, "HasNonZeroEntryPoint"); diff --git a/src/lib/dcp_content.h b/src/lib/dcp_content.h index 8545adf06..a0a18703a 100644 --- a/src/lib/dcp_content.h +++ b/src/lib/dcp_content.h @@ -36,6 +36,7 @@ #include #include #include +#include #include @@ -191,6 +192,13 @@ public: int active_audio_channels() const; + /** @return a guess of the DCP's audio language; if there are multiple reels, + * and they have different langauges, this could be wrong. + */ + boost::optional audio_language () const { + return _audio_language; + } + void check_font_ids(); private: @@ -241,6 +249,7 @@ private: EnumIndexedVector _has_non_zero_entry_point; boost::optional _active_audio_channels; + boost::optional _audio_language; }; diff --git a/test/copy_dcp_details_to_film_test.cc b/test/copy_dcp_details_to_film_test.cc new file mode 100644 index 000000000..6dd913aa0 --- /dev/null +++ b/test/copy_dcp_details_to_film_test.cc @@ -0,0 +1,52 @@ +/* + Copyright (C) 2025 Carl Hetherington + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see . + +*/ + + +#include "lib/content_factory.h" +#include "lib/copy_dcp_details_to_film.h" +#include "lib/dcp_content.h" +#include "lib/film.h" +#include "test.h" +#include +#include + + +using std::make_shared; + + +BOOST_AUTO_TEST_CASE(copy_audio_language_to_film) +{ + auto content = content_factory("test/data/sine_440.wav")[0]; + auto film1 = new_test_film("copy_audio_language_to_film1", { content }); + film1->set_audio_language(dcp::LanguageTag("de-DE")); + make_and_verify_dcp( + film1, + { + dcp::VerificationNote::Code::MISSING_CPL_METADATA + }); + + auto dcp = make_shared(film1->dir(film1->dcp_name())); + auto film2 = new_test_film("copy_audio_language_to_film2", { dcp }); + copy_dcp_settings_to_film(dcp, film2); + + BOOST_REQUIRE(film2->audio_language()); + BOOST_CHECK_EQUAL(film2->audio_language()->as_string(), "de-DE"); +} + diff --git a/test/wscript b/test/wscript index 868d98c58..b568872a3 100644 --- a/test/wscript +++ b/test/wscript @@ -70,6 +70,7 @@ def build(bld): colour_conversion_test.cc config_test.cc content_test.cc + copy_dcp_details_to_film_test.cc cpl_hash_test.cc cpl_metadata_test.cc create_cli_test.cc -- cgit v1.2.3