summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/film.cc31
-rw-r--r--src/lib/film.h4
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<boost::filesystem::path> 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<boost::filesystem::path> 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<shared_ptr<Content>> 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<DCPContent> dcp;
+ for (auto content: _playlist->content()) {
+ if (auto test = dynamic_pointer_cast<DCPContent>(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<Content> 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<dcp::Marker, dcpomatic::DCPTime> _markers;
std::vector<dcp::Rating> _ratings;
std::vector<std::string> _content_versions;