X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Ffilm.cc;h=f7fd96a01a35e4f405bb0f575ec9cb161092de03;hp=988b7e2fe639f6ef40b6f91d09e23a283a753fce;hb=b69813dd682c8a0c3b7c46287b1a75c7c10f6a10;hpb=114fad7b8c36a0aa1c6f924870e186ab60e32009 diff --git a/src/lib/film.cc b/src/lib/film.cc index 988b7e2fe..f7fd96a01 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -180,7 +180,8 @@ Film::Film (optional dir) boost::filesystem::path result; for (boost::filesystem::path::iterator i = p.begin(); i != p.end(); ++i) { if (*i == "..") { - if (boost::filesystem::is_symlink (result) || result.filename() == "..") { + boost::system::error_code ec; + if (boost::filesystem::is_symlink(result, ec) || result.filename() == "..") { result /= *i; } else { result = result.parent_path (); @@ -319,6 +320,10 @@ Film::make_dcp (bool gui, bool check) throw runtime_error (_("You must add some content to the DCP before creating it")); } + if (length() == DCPTime()) { + throw runtime_error (_("The DCP is empty, perhaps because all the content has zero length.")); + } + if (dcp_content_type() == 0) { throw MissingSettingError (_("content type")); } @@ -1276,6 +1281,9 @@ Film::playlist_content_change (ChangeType type, weak_ptr c, int p, bool if (type == CHANGE_TYPE_DONE) { emit (boost::bind (boost::ref (ContentChange), type, c, p, frequent)); + if (!frequent) { + check_settings_consistency (); + } } else { ContentChange (type, c, p, frequent); } @@ -1288,29 +1296,37 @@ Film::playlist_change (ChangeType type) signal_change (type, NAME); if (type == CHANGE_TYPE_DONE) { - /* Check that this change hasn't made our settings inconsistent */ - bool change_made = false; - BOOST_FOREACH (shared_ptr i, content()) { - shared_ptr d = dynamic_pointer_cast(i); - if (!d) { - continue; - } + check_settings_consistency (); + } +} - string why_not; - if (d->reference_video() && !d->can_reference_video(shared_from_this(), why_not)) { - d->set_reference_video(false); - change_made = true; - } - if (d->reference_audio() && !d->can_reference_audio(shared_from_this(), why_not)) { - d->set_reference_audio(false); - change_made = true; - } +/** Check for (and if necessary fix) impossible settings combinations, like + * video set to being referenced when it can't be. + */ +void +Film::check_settings_consistency () +{ + bool change_made = false; + BOOST_FOREACH (shared_ptr i, content()) { + shared_ptr d = dynamic_pointer_cast(i); + if (!d) { + continue; } - if (change_made) { - Message (_("DCP-o-matic had to change your settings for referring to DCPs as OV. Please review those settings to make sure they are what you want.")); + string why_not; + if (d->reference_video() && !d->can_reference_video(shared_from_this(), why_not)) { + d->set_reference_video(false); + change_made = true; + } + if (d->reference_audio() && !d->can_reference_audio(shared_from_this(), why_not)) { + d->set_reference_audio(false); + change_made = true; } } + + if (change_made) { + Message (_("DCP-o-matic had to change your settings for referring to DCPs as OV. Please review those settings to make sure they are what you want.")); + } } void @@ -1595,29 +1611,29 @@ Film::reels () const break; case REELTYPE_BY_VIDEO_CONTENT: { - optional last_split; - shared_ptr last_video; - BOOST_FOREACH (shared_ptr c, content ()) { + /* Collect all reel boundaries */ + list split_points; + split_points.push_back (DCPTime()); + split_points.push_back (len); + BOOST_FOREACH (shared_ptr c, content()) { if (c->video) { BOOST_FOREACH (DCPTime t, c->reel_split_points(shared_from_this())) { - if (last_split) { - p.push_back (DCPTimePeriod (last_split.get(), t)); - } - last_split = t; + split_points.push_back (t); } - last_video = c; + split_points.push_back (c->end(shared_from_this())); } } - DCPTime video_end = last_video ? last_video->end(shared_from_this()) : DCPTime(0); - if (last_split) { - /* Definitely go from the last split to the end of the video content */ - p.push_back (DCPTimePeriod (last_split.get(), video_end)); - } + split_points.sort (); + split_points.unique (); - if (video_end < len) { - /* And maybe go after that as well if there is any non-video hanging over the end */ - p.push_back (DCPTimePeriod (video_end, len)); + /* Make them into periods */ + optional last; + BOOST_FOREACH (DCPTime t, split_points) { + if (last) { + p.push_back (DCPTimePeriod(*last, t)); + } + last = t; } break; }