From 79a262837eb94facf447c6dd77fb0ff9db658d8a Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 22 Dec 2025 01:50:33 +0100 Subject: Set project standard when adding a DCP (#2148). --- src/lib/film.cc | 31 ++++++++++++++++++++++++++++++- src/lib/film.h | 4 +++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/lib/film.cc b/src/lib/film.cc index 831acd9da..8a88fc2c5 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -186,6 +186,7 @@ Film::Film(optional dir) , _user_explicit_video_frame_rate(false) , _user_explicit_container(false) , _user_explicit_resolution(false) + , _user_explicit_interop(false) , _name_language(dcp::LanguageTag("en-US")) , _release_territory(Config::instance()->default_territory()) , _version_number(1) @@ -480,6 +481,7 @@ Film::metadata(bool with_content_paths) const } cxml::add_text_child(root, "UserExplicitContainer", _user_explicit_container ? "1" : "0"); cxml::add_text_child(root, "UserExplicitResolution", _user_explicit_resolution ? "1" : "0"); + cxml::add_text_child(root, "UserExplicitInterop", _user_explicit_interop ? "1" : "0"); if (_audio_language) { cxml::add_text_child(root, "AudioLanguage", _audio_language->as_string()); } @@ -708,6 +710,7 @@ Film::read_metadata(optional path) /* Disable guessing for files made in previous DCP-o-matic versions */ _user_explicit_container = f.optional_bool_child("UserExplicitContainer").get_value_or(true); _user_explicit_resolution = f.optional_bool_child("UserExplicitResolution").get_value_or(true); + _user_explicit_interop = f.optional_bool_child("UserExplicitInterop").get_value_or(true); auto audio_language = f.optional_string_child("AudioLanguage"); if (audio_language) { @@ -1279,10 +1282,14 @@ Film::set_three_d(bool t) } void -Film::set_interop(bool i) +Film::set_interop(bool i, bool user_explicit) { FilmChangeSignaller ch(this, FilmProperty::INTEROP); _interop = i; + + if (user_explicit) { + _user_explicit_interop = true; + } } @@ -1565,6 +1572,7 @@ Film::add_content(vector> const& content) _playlist->add_at_end(shared_from_this(), content); maybe_set_container_and_resolution(); + maybe_set_interop(); if (any_atmos) { if (_audio_channels < 14) { @@ -1614,6 +1622,27 @@ Film::maybe_set_container_and_resolution() } } + +void +Film::maybe_set_interop() +{ + shared_ptr dcp; + for (auto content: _playlist->content()) { + if (auto test = dynamic_pointer_cast(content)) { + if (!dcp) { + dcp = test; + } else { + return; + } + } + } + + if (dcp && !_user_explicit_interop) { + set_interop(dcp->standard() == dcp::Standard::INTEROP, false); + } +} + + void Film::remove_content(shared_ptr c) { diff --git a/src/lib/film.h b/src/lib/film.h index 5e3a6e0fe..799333430 100644 --- a/src/lib/film.h +++ b/src/lib/film.h @@ -410,7 +410,7 @@ public: void set_isdcf_date_today(); void set_isdcf_date(boost::gregorian::date); void set_sequence(bool); - void set_interop(bool); + void set_interop(bool interop, bool user_explicit = true); void set_video_encoding(VideoEncoding encoding); void set_limit_to_smpte_bv20(bool); void set_audio_processor(AudioProcessor const * processor); @@ -491,6 +491,7 @@ private: void audio_analysis_finished(); void check_settings_consistency(); void maybe_set_container_and_resolution(); + void maybe_set_interop(); void set_dirty(bool dirty); void write_ui_state() const; void check_reel_boundaries_for_atmos(); @@ -555,6 +556,7 @@ private: bool _user_explicit_video_frame_rate; bool _user_explicit_container; bool _user_explicit_resolution; + bool _user_explicit_interop; std::map _markers; std::vector _ratings; std::vector _content_versions; -- cgit v1.2.3