X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Ffilm.cc;h=193dedf4cd3bc1980dfababef1def911074c6c3c;hb=8fedaaa75c4586a4cc7ffb393bd71d1fdb091dc8;hp=9943711f55cfdc45b3f8a6536a83ffe32447addb;hpb=e519feaca11005d330e7b8403b948d4ad9cc3ae8;p=dcpomatic.git diff --git a/src/lib/film.cc b/src/lib/film.cc index 9943711f5..193dedf4c 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2020 Carl Hetherington + Copyright (C) 2012-2021 Carl Hetherington This file is part of DCP-o-matic. @@ -64,12 +64,11 @@ #include #include #include -#include +#include #include #include #include #include -#include #include #include #include @@ -97,9 +96,10 @@ using std::back_inserter; using std::map; using std::exception; using std::find; -using boost::shared_ptr; -using boost::weak_ptr; -using boost::dynamic_pointer_cast; +using std::shared_ptr; +using std::weak_ptr; +using std::make_shared; +using std::dynamic_pointer_cast; using boost::optional; using boost::is_any_of; #if BOOST_VERSION >= 106100 @@ -151,7 +151,7 @@ Film::Film (optional dir) , _use_isdcf_name (true) , _dcp_content_type (Config::instance()->default_dcp_content_type ()) , _container (Config::instance()->default_container ()) - , _resolution (RESOLUTION_2K) + , _resolution (Resolution::TWO_K) , _encrypted (false) , _context_id (dcp::make_uuid ()) , _j2k_bandwidth (Config::instance()->default_j2k_bandwidth ()) @@ -162,7 +162,7 @@ Film::Film (optional dir) , _sequence (true) , _interop (Config::instance()->default_interop ()) , _audio_processor (0) - , _reel_type (REELTYPE_SINGLE) + , _reel_type (ReelType::SINGLE) , _reel_length (2000000000) , _reencode_j2k (false) , _user_explicit_video_frame_rate (false) @@ -172,8 +172,8 @@ Film::Film (optional dir) , _audio_language (dcp::LanguageTag("en-US")) , _release_territory (dcp::LanguageTag::RegionSubtag("US")) , _version_number (1) - , _status (dcp::FINAL) - , _luminance (dcp::Luminance(4.5, dcp::Luminance::FOOT_LAMBERT)) + , _status (dcp::Status::FINAL) + , _luminance (dcp::Luminance(4.5, dcp::Luminance::Unit::FOOT_LAMBERT)) , _state_version (current_state_version) , _dirty (false) , _tolerant (false) @@ -193,16 +193,16 @@ Film::Film (optional dir) boost::filesystem::path p (boost::filesystem::system_complete (dir.get())); boost::filesystem::path result; - for (boost::filesystem::path::iterator i = p.begin(); i != p.end(); ++i) { - if (*i == "..") { + for (auto i: p) { + if (i == "..") { boost::system::error_code ec; if (boost::filesystem::is_symlink(result, ec) || result.filename() == "..") { - result /= *i; + result /= i; } else { result = result.parent_path (); } - } else if (*i != ".") { - result /= *i; + } else if (i != ".") { + result /= i; } } @@ -210,9 +210,9 @@ Film::Film (optional dir) } if (_directory) { - _log.reset (new FileLog (file ("log"))); + _log = make_shared(file("log")); } else { - _log.reset (new NullLog); + _log = make_shared(); } _playlist->set_sequence (_sequence); @@ -220,11 +220,11 @@ Film::Film (optional dir) Film::~Film () { - BOOST_FOREACH (boost::signals2::connection& i, _job_connections) { + for (auto& i: _job_connections) { i.disconnect (); } - BOOST_FOREACH (boost::signals2::connection& i, _audio_analysis_connections) { + for (auto& i: _audio_analysis_connections) { i.disconnect (); } } @@ -285,10 +285,10 @@ Film::internal_video_asset_filename (DCPTimePeriod p) const boost::filesystem::path Film::audio_analysis_path (shared_ptr playlist) const { - boost::filesystem::path p = dir ("analysis"); + auto p = dir ("analysis"); Digester digester; - BOOST_FOREACH (shared_ptr i, playlist->content ()) { + for (auto i: playlist->content ()) { if (!i->audio) { continue; } @@ -320,16 +320,16 @@ Film::audio_analysis_path (shared_ptr playlist) const boost::filesystem::path Film::subtitle_analysis_path (shared_ptr content) const { - boost::filesystem::path p = dir ("analysis"); + auto p = dir ("analysis"); Digester digester; digester.add (content->digest()); if (!content->text.empty()) { - shared_ptr tc = content->text.front(); + auto tc = content->text.front(); digester.add (tc->x_scale()); digester.add (tc->y_scale()); - BOOST_FOREACH (shared_ptr i, tc->fonts()) { + for (auto i: tc->fonts()) { digester.add (i->id()); } if (tc->effect()) { @@ -339,7 +339,7 @@ Film::subtitle_analysis_path (shared_ptr content) const digester.add (tc->outline_width()); } - shared_ptr fc = dynamic_pointer_cast(content); + auto fc = dynamic_pointer_cast(content); if (fc) { digester.add (fc->subtitle_stream()->identifier()); } @@ -360,7 +360,7 @@ Film::make_dcp (bool gui, bool check) throw BadSettingError (_("name"), _("Cannot contain slashes")); } - if (container() == 0) { + if (container() == nullptr) { throw MissingSettingError (_("container")); } @@ -372,7 +372,7 @@ Film::make_dcp (bool gui, bool check) throw runtime_error (_("The DCP is empty, perhaps because all the content has zero length.")); } - if (dcp_content_type() == 0) { + if (dcp_content_type() == nullptr) { throw MissingSettingError (_("content type")); } @@ -380,11 +380,11 @@ Film::make_dcp (bool gui, bool check) set_name ("DCP"); } - BOOST_FOREACH (shared_ptr i, content ()) { + for (auto i: content ()) { if (!i->paths_valid()) { throw runtime_error (_("some of your content is missing")); } - shared_ptr dcp = dynamic_pointer_cast (i); + auto dcp = dynamic_pointer_cast(i); if (dcp && dcp->needs_kdm()) { throw runtime_error (_("Some of your content needs a KDM")); } @@ -395,11 +395,11 @@ Film::make_dcp (bool gui, bool check) set_isdcf_date_today (); - BOOST_FOREACH (string i, environment_info ()) { + for (auto i: environment_info ()) { LOG_GENERAL_NC (i); } - BOOST_FOREACH (shared_ptr i, content ()) { + for (auto i: content ()) { LOG_GENERAL ("Content: %1", i->technical_summary()); } LOG_GENERAL ("DCP video rate %1 fps", video_frame_rate()); @@ -410,10 +410,10 @@ Film::make_dcp (bool gui, bool check) } LOG_GENERAL ("J2K bandwidth %1", j2k_bandwidth()); - shared_ptr tj (new TranscodeJob (shared_from_this())); - tj->set_encoder (shared_ptr (new DCPEncoder (shared_from_this(), tj))); + auto tj = make_shared(shared_from_this()); + tj->set_encoder (make_shared(shared_from_this(), tj)); if (check) { - shared_ptr cc (new CheckContentChangeJob(shared_from_this(), tj, gui)); + auto cc = make_shared(shared_from_this(), tj, gui); JobManager::instance()->add (cc); } else { JobManager::instance()->add (tj); @@ -424,15 +424,14 @@ Film::make_dcp (bool gui, bool check) void Film::send_dcp_to_tms () { - shared_ptr j (new UploadJob (shared_from_this())); - JobManager::instance()->add (j); + JobManager::instance()->add(make_shared(shared_from_this())); } shared_ptr Film::metadata (bool with_content_paths) const { - shared_ptr doc (new xmlpp::Document); - xmlpp::Element* root = doc->create_root_node ("Metadata"); + auto doc = make_shared(); + auto root = doc->create_root_node ("Metadata"); root->add_child("Version")->add_child_text (raw_convert (current_state_version)); root->add_child("Name")->add_child_text (_name); @@ -466,14 +465,14 @@ Film::metadata (bool with_content_paths) const root->add_child("ReencodeJ2K")->add_child_text (_reencode_j2k ? "1" : "0"); root->add_child("UserExplicitVideoFrameRate")->add_child_text(_user_explicit_video_frame_rate ? "1" : "0"); for (map::const_iterator i = _markers.begin(); i != _markers.end(); ++i) { - xmlpp::Element* m = root->add_child("Marker"); + auto m = root->add_child("Marker"); m->set_attribute("Type", dcp::marker_to_string(i->first)); m->add_child_text(raw_convert(i->second.get())); } - BOOST_FOREACH (dcp::Rating i, _ratings) { + for (auto i: _ratings) { i.as_xml (root->add_child("Rating")); } - BOOST_FOREACH (string i, _content_versions) { + for (auto i: _content_versions) { root->add_child("ContentVersion")->add_child_text(i); } root->add_child("NameLanguage")->add_child_text(_name_language.to_string()); @@ -488,7 +487,7 @@ Film::metadata (bool with_content_paths) const root->add_child("LuminanceUnit")->add_child_text(dcp::Luminance::unit_to_string(_luminance.unit())); root->add_child("UserExplicitContainer")->add_child_text(_user_explicit_container ? "1" : "0"); root->add_child("UserExplicitResolution")->add_child_text(_user_explicit_resolution ? "1" : "0"); - BOOST_FOREACH (dcp::LanguageTag i, _subtitle_languages) { + for (auto i: _subtitle_languages) { root->add_child("SubtitleLanguage")->add_child_text(i.to_string()); } _playlist->as_xml (root->add_child ("Playlist"), with_content_paths); @@ -499,8 +498,7 @@ Film::metadata (bool with_content_paths) const void Film::write_metadata (boost::filesystem::path path) const { - shared_ptr doc = metadata (); - doc->write_to_file_formatted (path.string()); + metadata()->write_to_file_formatted(path.string()); } /** Write state to our `metadata' file */ @@ -509,8 +507,7 @@ Film::write_metadata () const { DCPOMATIC_ASSERT (directory()); boost::filesystem::create_directories (directory().get()); - shared_ptr doc = metadata (); - doc->write_to_file_formatted (file(metadata_file).string ()); + metadata()->write_to_file_formatted(file(metadata_file).string()); _dirty = false; } @@ -520,7 +517,7 @@ Film::write_template (boost::filesystem::path path) const { boost::filesystem::create_directories (path.parent_path()); shared_ptr doc = metadata (false); - doc->write_to_file_formatted (path.string ()); + metadata(false)->write_to_file_formatted(path.string()); } /** Read state from our metadata file. @@ -549,7 +546,7 @@ Film::read_metadata (optional path) throw runtime_error (_("This film was created with a newer version of DCP-o-matic, and it cannot be loaded into this version. Sorry!")); } else if (_state_version < current_state_version) { /* This is an older version; save a copy (if we haven't already) */ - boost::filesystem::path const older = path->parent_path() / String::compose("metadata.%1.xml", _state_version); + auto const older = path->parent_path() / String::compose("metadata.%1.xml", _state_version); if (!boost::filesystem::is_regular_file(older)) { try { boost::filesystem::copy_file(*path, older); @@ -572,14 +569,14 @@ Film::read_metadata (optional path) { - optional c = f.optional_string_child ("DCPContentType"); + auto c = f.optional_string_child("DCPContentType"); if (c) { _dcp_content_type = DCPContentType::from_isdcf_name (c.get ()); } } { - optional c = f.optional_string_child ("Container"); + auto c = f.optional_string_child("Container"); if (c) { _container = Ratio::from_id (c.get ()); } @@ -617,45 +614,45 @@ Film::read_metadata (optional path) } if (_audio_processor && !Config::instance()->show_experimental_audio_processors()) { - list ap = AudioProcessor::visible(); + auto ap = AudioProcessor::visible(); if (find(ap.begin(), ap.end(), _audio_processor) == ap.end()) { Config::instance()->set_show_experimental_audio_processors(true); } } - _reel_type = static_cast (f.optional_number_child("ReelType").get_value_or (static_cast(REELTYPE_SINGLE))); + _reel_type = static_cast (f.optional_number_child("ReelType").get_value_or (static_cast(ReelType::SINGLE))); _reel_length = f.optional_number_child("ReelLength").get_value_or (2000000000); _reencode_j2k = f.optional_bool_child("ReencodeJ2K").get_value_or(false); _user_explicit_video_frame_rate = f.optional_bool_child("UserExplicitVideoFrameRate").get_value_or(false); - BOOST_FOREACH (cxml::ConstNodePtr i, f.node_children("Marker")) { + for (auto i: f.node_children("Marker")) { _markers[dcp::marker_from_string(i->string_attribute("Type"))] = DCPTime(dcp::raw_convert(i->content())); } - BOOST_FOREACH (cxml::ConstNodePtr i, f.node_children("Rating")) { + for (auto i: f.node_children("Rating")) { _ratings.push_back (dcp::Rating(i)); } - BOOST_FOREACH (cxml::ConstNodePtr i, f.node_children("ContentVersion")) { + for (auto i: f.node_children("ContentVersion")) { _content_versions.push_back (i->content()); } - optional name_language = f.optional_string_child("NameLanguage"); + auto name_language = f.optional_string_child("NameLanguage"); if (name_language) { _name_language = dcp::LanguageTag (*name_language); } - optional audio_language = f.optional_string_child("AudioLanguage"); + auto audio_language = f.optional_string_child("AudioLanguage"); if (audio_language) { _audio_language = dcp::LanguageTag (*audio_language); } - optional release_territory = f.optional_string_child("ReleaseTerritory"); + auto release_territory = f.optional_string_child("ReleaseTerritory"); if (release_territory) { _release_territory = dcp::LanguageTag::RegionSubtag (*release_territory); } _version_number = f.optional_number_child("VersionNumber").get_value_or(0); - optional status = f.optional_string_child("Status"); + auto status = f.optional_string_child("Status"); if (status) { _status = dcp::string_to_status (*status); } @@ -664,8 +661,8 @@ Film::read_metadata (optional path) _distributor = f.optional_string_child("Distributor").get_value_or(""); _facility = f.optional_string_child("Facility").get_value_or(""); - float value = f.optional_number_child("LuminanceValue").get_value_or(4.5); - optional unit = f.optional_string_child("LuminanceUnit"); + auto value = f.optional_number_child("LuminanceValue").get_value_or(4.5); + auto unit = f.optional_string_child("LuminanceUnit"); if (unit) { _luminance = dcp::Luminance (value, dcp::Luminance::string_to_unit(*unit)); } @@ -674,7 +671,7 @@ Film::read_metadata (optional path) _user_explicit_container = f.optional_bool_child("UserExplicitContainer").get_value_or(true); _user_explicit_resolution = f.optional_bool_child("UserExplicitResolution").get_value_or(true); - BOOST_FOREACH (cxml::ConstNodePtr i, f.node_children("SubtitleLanguage")) { + for (auto i: f.node_children("SubtitleLanguage")) { _subtitle_languages.push_back (dcp::LanguageTag(i->content())); } @@ -686,6 +683,41 @@ Film::read_metadata (optional path) set_backtrace_file (file ("backtrace.txt")); } + /* Around 2.15.108 we removed subtitle language state from the text content and the ISDCF + * metadata and put it into the Film instead. If we've loaded an old Film let's try and fish + * out the settings from where they were so that they don't get lost. + */ + + optional found_language; + + for (auto i: f.node_child("Playlist")->node_children("Content")) { + auto text = i->optional_node_child("Text"); + if (text && text->optional_string_child("Language") && !found_language) { + try { + found_language = dcp::LanguageTag(text->string_child("Language")); + } catch (...) {} + } + } + + if (_state_version >= 9) { + auto isdcf_language = f.node_child("ISDCFMetadata")->optional_string_child("SubtitleLanguage"); + if (isdcf_language && !found_language) { + try { + found_language = dcp::LanguageTag(*isdcf_language); + } catch (...) { + try { + found_language = dcp::LanguageTag(boost::algorithm::to_lower_copy(*isdcf_language)); + } catch (...) { + + } + } + } + } + + if (found_language) { + _subtitle_languages.push_back (*found_language); + } + _dirty = false; return notes; } @@ -738,10 +770,10 @@ Film::mapped_audio_channels () const mapped.push_back (i); } } else { - BOOST_FOREACH (shared_ptr i, content ()) { + for (auto i: content()) { if (i->audio) { - list c = i->audio->mapping().mapped_output_channels (); - copy (c.begin(), c.end(), back_inserter (mapped)); + auto c = i->audio->mapping().mapped_output_channels(); + copy (c.begin(), c.end(), back_inserter(mapped)); } } @@ -758,7 +790,7 @@ Film::isdcf_name (bool if_created_now) const { string d; - string raw_name = name (); + auto raw_name = name (); /* Split the raw name up into words */ vector words; @@ -767,16 +799,16 @@ Film::isdcf_name (bool if_created_now) const string fixed_name; /* Add each word to fixed_name */ - for (vector::const_iterator i = words.begin(); i != words.end(); ++i) { - string w = *i; + for (auto i: words) { + string w = i; /* First letter is always capitalised */ w[0] = toupper (w[0]); /* Count caps in w */ size_t caps = 0; - for (size_t i = 0; i < w.size(); ++i) { - if (isupper (w[i])) { + for (size_t j = 0; j < w.size(); ++j) { + if (isupper (w[j])) { ++caps; } } @@ -785,13 +817,13 @@ Film::isdcf_name (bool if_created_now) const leave it alone. */ if (caps == w.size ()) { - for (size_t i = 1; i < w.size(); ++i) { - w[i] = tolower (w[i]); + for (size_t j = 1; j < w.size(); ++j) { + w[j] = tolower (w[j]); } } - for (size_t i = 0; i < w.size(); ++i) { - fixed_name += w[i]; + for (size_t j = 0; j < w.size(); ++j) { + fixed_name += w[j]; } } @@ -806,7 +838,7 @@ Film::isdcf_name (bool if_created_now) const d += "-" + raw_convert(isdcf_metadata().content_version); } - ISDCFMetadata const dm = isdcf_metadata (); + auto const dm = isdcf_metadata (); if (dm.temp_version) { d += "-Temp"; @@ -847,9 +879,9 @@ Film::isdcf_name (bool if_created_now) const /* XXX: this uses the first bit of content only */ /* Interior aspect ratio. The standard says we don't do this for trailers, for some strange reason */ - if (dcp_content_type() && dcp_content_type()->libdcp_kind() != dcp::TRAILER) { - Ratio const * content_ratio = 0; - BOOST_FOREACH (shared_ptr i, content ()) { + if (dcp_content_type() && dcp_content_type()->libdcp_kind() != dcp::ContentKind::TRAILER) { + Ratio const* content_ratio = nullptr; + for (auto i: content ()) { if (i->video) { /* Here's the first piece of video content */ content_ratio = Ratio::nearest_from_ratio(i->video->scaled_size(frame_size()).ratio()); @@ -870,20 +902,20 @@ Film::isdcf_name (bool if_created_now) const for now I'm just appending -CCAP if we have any closed captions. */ - bool burnt_in = true; - bool ccap = false; - BOOST_FOREACH (shared_ptr i, content()) { - BOOST_FOREACH (shared_ptr j, i->text) { - if (j->type() == TEXT_OPEN_SUBTITLE && j->use() && !j->burn()) { + auto burnt_in = true; + auto ccap = false; + for (auto i: content()) { + for (auto j: i->text) { + if (j->type() == TextType::OPEN_SUBTITLE && j->use() && !j->burn()) { burnt_in = false; - } else if (j->type() == TEXT_CLOSED_CAPTION && j->use()) { + } else if (j->type() == TextType::CLOSED_CAPTION && j->use()) { ccap = true; } } } if (!_subtitle_languages.empty()) { - string lang = _subtitle_languages.front().language().get_value_or("en").subtag(); + auto lang = _subtitle_languages.front().language().get_value_or("en").subtag(); if (burnt_in) { transform (lang.begin(), lang.end(), lang.begin(), ::tolower); } else { @@ -911,19 +943,19 @@ Film::isdcf_name (bool if_created_now) const /* Count mapped audio channels */ - list mapped = mapped_audio_channels (); + auto mapped = mapped_audio_channels (); - pair ch = audio_channel_types (mapped, audio_channels()); + auto ch = audio_channel_types (mapped, audio_channels()); if (!ch.first && !ch.second) { d += "_MOS"; } else if (ch.first) { d += String::compose("_%1%2", ch.first, ch.second); } - if (audio_channels() > static_cast(dcp::HI) && find(mapped.begin(), mapped.end(), dcp::HI) != mapped.end()) { + if (audio_channels() > static_cast(dcp::Channel::HI) && find(mapped.begin(), mapped.end(), static_cast(dcp::Channel::HI)) != mapped.end()) { d += "-HI"; } - if (audio_channels() > static_cast(dcp::VI) && find(mapped.begin(), mapped.end(), dcp::VI) != mapped.end()) { + if (audio_channels() > static_cast(dcp::Channel::VI) && find(mapped.begin(), mapped.end(), static_cast(dcp::Channel::VI)) != mapped.end()) { d += "-VI"; } @@ -953,15 +985,15 @@ Film::isdcf_name (bool if_created_now) const d += "-3D"; } - bool vf = false; - BOOST_FOREACH (shared_ptr i, content ()) { - shared_ptr dc = dynamic_pointer_cast (i); + auto vf = false; + for (auto i: content()) { + auto dc = dynamic_pointer_cast(i); if (!dc) { continue; } bool any_text = false; - for (int i = 0; i < TEXT_COUNT; ++i) { + for (int i = 0; i < static_cast(TextType::COUNT); ++i) { if (dc->reference_text(static_cast(i))) { any_text = true; } @@ -1146,7 +1178,7 @@ Film::signal_change (ChangeType type, int p) void Film::signal_change (ChangeType type, Property p) { - if (type == CHANGE_TYPE_DONE) { + if (type == ChangeType::DONE) { _dirty = true; if (p == Film::CONTENT) { @@ -1185,9 +1217,9 @@ Film::j2c_path (int reel, Frame frame, Eyes eyes, bool tmp) const snprintf(buffer, sizeof(buffer), "%08d_%08" PRId64, reel, frame); string s (buffer); - if (eyes == EYES_LEFT) { + if (eyes == Eyes::LEFT) { s += ".L"; - } else if (eyes == EYES_RIGHT) { + } else if (eyes == Eyes::RIGHT) { s += ".R"; } @@ -1220,15 +1252,15 @@ Film::cpls () const vector out; - boost::filesystem::path const dir = directory().get(); - for (boost::filesystem::directory_iterator i = boost::filesystem::directory_iterator(dir); i != boost::filesystem::directory_iterator(); ++i) { + auto const dir = directory().get(); + for (auto i: boost::filesystem::directory_iterator(dir)) { if ( - boost::filesystem::is_directory (*i) && - i->path().leaf() != "j2c" && i->path().leaf() != "video" && i->path().leaf() != "info" && i->path().leaf() != "analysis" + boost::filesystem::is_directory (i) && + i.path().leaf() != "j2c" && i.path().leaf() != "video" && i.path().leaf() != "info" && i.path().leaf() != "analysis" ) { try { - out.push_back (CPLSummary(*i)); + out.push_back (CPLSummary(i)); } catch (...) { } @@ -1263,7 +1295,7 @@ Film::examine_and_add_content (shared_ptr content, bool disable_audio_a run_ffprobe (content->path(0), file("ffprobe.log")); } - shared_ptr j (new ExamineContentJob (shared_from_this(), content)); + auto j = make_shared(shared_from_this(), content); _job_connections.push_back ( j->Finished.connect (bind (&Film::maybe_add_content, this, weak_ptr(j), weak_ptr(content), disable_audio_analysis)) @@ -1275,12 +1307,12 @@ Film::examine_and_add_content (shared_ptr content, bool disable_audio_a void Film::maybe_add_content (weak_ptr j, weak_ptr c, bool disable_audio_analysis) { - shared_ptr job = j.lock (); + auto job = j.lock (); if (!job || !job->finished_ok ()) { return; } - shared_ptr content = c.lock (); + auto content = c.lock (); if (!content) { return; } @@ -1288,7 +1320,7 @@ Film::maybe_add_content (weak_ptr j, weak_ptr c, bool disable_audi add_content (content); if (Config::instance()->automatic_audio_analysis() && content->audio && !disable_audio_analysis) { - shared_ptr playlist (new Playlist); + auto playlist = make_shared(); playlist->add (shared_from_this(), content); boost::signals2::connection c; JobManager::instance()->analyse_audio ( @@ -1310,7 +1342,7 @@ Film::add_content (shared_ptr c) if (_template_film) { /* Take settings from the first piece of content of c's type in _template */ - BOOST_FOREACH (shared_ptr i, _template_film->content()) { + for (auto i: _template_film->content()) { c->take_settings_from (i); } } @@ -1330,7 +1362,7 @@ Film::maybe_set_container_and_resolution () { /* Get the only piece of video content, if there is only one */ shared_ptr video; - BOOST_FOREACH (shared_ptr i, _playlist->content()) { + for (auto i: _playlist->content()) { if (i->video) { if (!video) { video = i->video; @@ -1355,9 +1387,9 @@ Film::maybe_set_container_and_resolution () if (!_user_explicit_resolution) { if (video->size_after_crop().width > 2048 || video->size_after_crop().height > 1080) { - set_resolution (RESOLUTION_4K, false); + set_resolution (Resolution::FOUR_K, false); } else { - set_resolution (RESOLUTION_2K, false); + set_resolution (Resolution::TWO_K, false); } } } @@ -1395,7 +1427,7 @@ int Film::best_video_frame_rate () const { /* Don't default to anything above 30fps (make the user select that explicitly) */ - int best = _playlist->best_video_frame_rate (); + auto best = _playlist->best_video_frame_rate (); if (best > 30) { best /= 2; } @@ -1417,7 +1449,7 @@ Film::playlist_content_change (ChangeType type, weak_ptr c, int p, bool signal_change (type, Film::NAME); } - if (type == CHANGE_TYPE_DONE) { + if (type == ChangeType::DONE) { emit (boost::bind (boost::ref (ContentChange), type, c, p, frequent)); if (!frequent) { check_settings_consistency (); @@ -1441,7 +1473,7 @@ Film::playlist_change (ChangeType type) signal_change (type, CONTENT); signal_change (type, NAME); - if (type == CHANGE_TYPE_DONE) { + if (type == ChangeType::DONE) { check_settings_consistency (); } @@ -1455,7 +1487,7 @@ void Film::check_settings_consistency () { optional atmos_rate; - BOOST_FOREACH (shared_ptr i, content()) { + for (auto i: content()) { if (i->atmos) { int rate = lrintf (i->atmos->edit_rate().as_float()); @@ -1470,8 +1502,8 @@ Film::check_settings_consistency () } bool change_made = false; - BOOST_FOREACH (shared_ptr i, content()) { - shared_ptr d = dynamic_pointer_cast(i); + for (auto i: content()) { + auto d = dynamic_pointer_cast(i); if (!d) { continue; } @@ -1485,6 +1517,14 @@ Film::check_settings_consistency () d->set_reference_audio(false); change_made = true; } + if (d->reference_text(TextType::OPEN_SUBTITLE) && !d->can_reference_text(shared_from_this(), TextType::OPEN_SUBTITLE, why_not)) { + d->set_reference_text(TextType::OPEN_SUBTITLE, false); + change_made = true; + } + if (d->reference_text(TextType::CLOSED_CAPTION) && !d->can_reference_text(shared_from_this(), TextType::CLOSED_CAPTION, why_not)) { + d->set_reference_text(TextType::CLOSED_CAPTION, false); + change_made = true; + } } if (change_made) { @@ -1496,7 +1536,7 @@ void Film::playlist_order_changed () { /* XXX: missing PENDING */ - signal_change (CHANGE_TYPE_DONE, CONTENT_ORDER); + signal_change (ChangeType::DONE, CONTENT_ORDER); } int @@ -1525,9 +1565,9 @@ dcp::Size Film::full_frame () const { switch (_resolution) { - case RESOLUTION_2K: + case Resolution::TWO_K: return dcp::Size (2048, 1080); - case RESOLUTION_4K: + case Resolution::FOUR_K: return dcp::Size (4096, 2160); } @@ -1547,10 +1587,10 @@ Film::frame_size () const dcp::Size Film::active_area () const { - dcp::Size const frame = frame_size (); + auto const frame = frame_size (); dcp::Size active; - BOOST_FOREACH (shared_ptr i, content()) { + for (auto i: content()) { if (i->video) { dcp::Size s = i->video->scaled_size (frame); active.width = max(active.width, s.width); @@ -1588,33 +1628,33 @@ Film::make_kdm ( throw runtime_error (_("Cannot make a KDM as this project is not encrypted.")); } - shared_ptr cpl (new dcp::CPL (cpl_file)); - shared_ptr signer = Config::instance()->signer_chain (); + auto cpl = make_shared(cpl_file); + auto signer = Config::instance()->signer_chain(); if (!signer->valid ()) { throw InvalidSignerError (); } /* Find keys that have been added to imported, encrypted DCP content */ list imported_keys; - BOOST_FOREACH (shared_ptr i, content()) { - shared_ptr d = dynamic_pointer_cast (i); + for (auto i: content()) { + auto d = dynamic_pointer_cast (i); if (d && d->kdm()) { dcp::DecryptedKDM kdm (d->kdm().get(), Config::instance()->decryption_chain()->key().get()); - list keys = kdm.keys (); + auto keys = kdm.keys (); copy (keys.begin(), keys.end(), back_inserter (imported_keys)); } } - map, dcp::Key> keys; + map, dcp::Key> keys; - BOOST_FOREACH(shared_ptr i, cpl->reel_mxfs()) { + for (auto i: cpl->reel_file_assets()) { if (!i->key_id()) { continue; } /* Get any imported key for this ID */ bool done = false; - BOOST_FOREACH (dcp::DecryptedKDMKey j, imported_keys) { + for (auto j: imported_keys) { if (j.id() == i->key_id().get()) { LOG_GENERAL ("Using imported key for %1", i->key_id().get()); keys[i] = j.key(); @@ -1658,7 +1698,7 @@ Film::should_be_enough_disk_space (double& required, double& available, bool& ca boost::filesystem::path test = internal_video_asset_dir() / "test"; boost::filesystem::path test2 = internal_video_asset_dir() / "test2"; can_hard_link = true; - FILE* f = fopen_boost (test, "w"); + auto f = fopen_boost (test, "w"); if (f) { fclose (f); boost::system::error_code ec; @@ -1670,7 +1710,7 @@ Film::should_be_enough_disk_space (double& required, double& available, bool& ca boost::filesystem::remove (test2); } - boost::filesystem::space_info s = boost::filesystem::space (internal_video_asset_dir ()); + auto s = boost::filesystem::space (internal_video_asset_dir ()); required = double (required_disk_space ()) / 1073741824.0f; if (!can_hard_link) { required *= 2; @@ -1724,21 +1764,21 @@ list Film::reels () const { list p; - DCPTime const len = length(); + auto const len = length(); switch (reel_type ()) { - case REELTYPE_SINGLE: + case ReelType::SINGLE: p.push_back (DCPTimePeriod (DCPTime (), len)); break; - case REELTYPE_BY_VIDEO_CONTENT: + case ReelType::BY_VIDEO_CONTENT: { /* Collect all reel boundaries */ list split_points; split_points.push_back (DCPTime()); split_points.push_back (len); - BOOST_FOREACH (shared_ptr c, content()) { + for (auto c: content()) { if (c->video) { - BOOST_FOREACH (DCPTime t, c->reel_split_points(shared_from_this())) { + for (auto t: c->reel_split_points(shared_from_this())) { split_points.push_back (t); } split_points.push_back (c->end(shared_from_this())); @@ -1750,7 +1790,7 @@ Film::reels () const /* Make them into periods, coalescing any that are less than 1 second long */ optional last; - BOOST_FOREACH (DCPTime t, split_points) { + for (auto t: split_points) { if (last && (t - *last) >= DCPTime::from_seconds(1)) { /* Period from *last to t is long enough; use it and start a new one */ p.push_back (DCPTimePeriod(*last, t)); @@ -1762,7 +1802,7 @@ Film::reels () const } break; } - case REELTYPE_BY_LENGTH: + case ReelType::BY_LENGTH: { DCPTime current; /* Integer-divide reel length by the size of one frame to give the number of frames per reel, @@ -1827,8 +1867,8 @@ Film::copy_from (shared_ptr film) bool Film::references_dcp_video () const { - BOOST_FOREACH (shared_ptr i, _playlist->content()) { - shared_ptr d = dynamic_pointer_cast(i); + for (auto i: _playlist->content()) { + auto d = dynamic_pointer_cast(i); if (d && d->reference_video()) { return true; } @@ -1840,8 +1880,8 @@ Film::references_dcp_video () const bool Film::references_dcp_audio () const { - BOOST_FOREACH (shared_ptr i, _playlist->content()) { - shared_ptr d = dynamic_pointer_cast(i); + for (auto i: _playlist->content()) { + auto d = dynamic_pointer_cast(i); if (d && d->reference_audio()) { return true; } @@ -1854,7 +1894,7 @@ Film::references_dcp_audio () const bool Film::contains_atmos_content () const { - BOOST_FOREACH (shared_ptr i, _playlist->content()) { + for (auto i: _playlist->content()) { if (i->atmos) { return true; } @@ -1868,11 +1908,11 @@ list Film::closed_caption_tracks () const { list tt; - BOOST_FOREACH (shared_ptr i, content()) { - BOOST_FOREACH (shared_ptr j, i->text) { + for (auto i: content()) { + for (auto j: i->text) { /* XXX: Empty DCPTextTrack ends up being a magic value here - the "unknown" or "not specified" track */ - DCPTextTrack dtt = j->dcp_track().get_value_or(DCPTextTrack()); - if (j->type() == TEXT_CLOSED_CAPTION && find(tt.begin(), tt.end(), dtt) == tt.end()) { + auto dtt = j->dcp_track().get_value_or(DCPTextTrack()); + if (j->type() == TextType::CLOSED_CAPTION && find(tt.begin(), tt.end(), dtt) == tt.end()) { tt.push_back (dtt); } } @@ -1986,9 +2026,7 @@ Film::set_luminance (dcp::Luminance l) void Film::set_subtitle_language (dcp::LanguageTag language) { - vector lang; - lang.push_back (language); - set_subtitle_languages (lang); + set_subtitle_languages ({language}); } @@ -2019,9 +2057,9 @@ Film::set_facility (string f) optional Film::marker (dcp::Marker type) const { - map::const_iterator i = _markers.find (type); + auto i = _markers.find (type); if (i == _markers.end()) { - return optional(); + return {}; } return i->second; } @@ -2029,7 +2067,7 @@ Film::marker (dcp::Marker type) const shared_ptr Film::info_file_handle (DCPTimePeriod period, bool read) const { - return shared_ptr (new InfoFileHandle(_info_file_mutex, info_file(period), read)); + return std::make_shared(_info_file_mutex, info_file(period), read); } InfoFileHandle::InfoFileHandle (boost::mutex& mutex, boost::filesystem::path file, bool read) @@ -2042,7 +2080,7 @@ InfoFileHandle::InfoFileHandle (boost::mutex& mutex, boost::filesystem::path fil throw OpenFileError (file, errno, OpenFileError::READ); } } else { - bool const exists = boost::filesystem::exists (file); + auto const exists = boost::filesystem::exists (file); if (exists) { _handle = fopen_boost (file, "r+b"); } else { @@ -2066,7 +2104,7 @@ void Film::add_ffoc_lfoc (Markers& markers) const { if (markers.find(dcp::Marker::FFOC) == markers.end()) { - markers[dcp::Marker::FFOC] = dcpomatic::DCPTime(0); + markers[dcp::Marker::FFOC] = dcpomatic::DCPTime::from_frames(1, video_frame_rate()); } if (markers.find(dcp::Marker::LFOC) == markers.end()) {