X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fdcp_content.cc;h=dc32a243e89245221ec37b9906626bf31a39d6b3;hb=8726c70cc1b14dc996c18670cdcda0b4d670605e;hp=8b823c61966afe23d4bfdf8dfb78ccad2888c6e1;hpb=e2d0781d45fccd67649a8943f1fb45442f5d2cbc;p=dcpomatic.git diff --git a/src/lib/dcp_content.cc b/src/lib/dcp_content.cc index 8b823c619..dc32a243e 100644 --- a/src/lib/dcp_content.cc +++ b/src/lib/dcp_content.cc @@ -54,10 +54,12 @@ using boost::function; using boost::dynamic_pointer_cast; using dcp::raw_convert; -int const DCPContentProperty::CAN_BE_PLAYED = 600; -int const DCPContentProperty::REFERENCE_VIDEO = 601; -int const DCPContentProperty::REFERENCE_AUDIO = 602; -int const DCPContentProperty::REFERENCE_SUBTITLE = 603; +int const DCPContentProperty::NEEDS_ASSETS = 600; +int const DCPContentProperty::NEEDS_KDM = 601; +int const DCPContentProperty::REFERENCE_VIDEO = 602; +int const DCPContentProperty::REFERENCE_AUDIO = 603; +int const DCPContentProperty::REFERENCE_SUBTITLE = 604; +int const DCPContentProperty::NAME = 605; DCPContent::DCPContent (shared_ptr film, boost::filesystem::path p) : Content (film) @@ -135,7 +137,9 @@ DCPContent::read_directory (boost::filesystem::path p) void DCPContent::examine (shared_ptr job) { - bool const could_be_played = can_be_played (); + bool const needed_assets = needs_assets (); + bool const needed_kdm = needs_kdm (); + string const old_name = name (); job->set_progress_unknown (); Content::examine (job); @@ -170,8 +174,16 @@ DCPContent::examine (shared_ptr job) _cpl = examiner->cpl (); } - if (could_be_played != can_be_played ()) { - signal_changed (DCPContentProperty::CAN_BE_PLAYED); + if (needed_assets != needs_assets ()) { + signal_changed (DCPContentProperty::NEEDS_ASSETS); + } + + if (needed_kdm != needs_kdm ()) { + signal_changed (DCPContentProperty::NEEDS_KDM); + } + + if (old_name != name ()) { + signal_changed (DCPContentProperty::NAME); } video->set_frame_type (_three_d ? VIDEO_FRAME_TYPE_3D : VIDEO_FRAME_TYPE_2D); @@ -362,11 +374,23 @@ DCPContent::reels () const return p; } - DCPTime from = position (); - BOOST_FOREACH (shared_ptr i, decoder->reels()) { - DCPTime const to = from + DCPTime::from_frames (i->main_picture()->duration(), film()->video_frame_rate()); - p.push_back (DCPTimePeriod (from, to)); - from = to; + /* This content's frame rate must be the same as the output DCP rate, so we can + convert `directly' from ContentTime to DCPTime. + */ + + /* The starting point of this content on the timeline */ + DCPTime pos = position() - DCPTime (trim_start().get()); + + BOOST_FOREACH (shared_ptr i, decoder->reels ()) { + /* This reel runs from `pos' to `to' */ + DCPTime const to = pos + DCPTime::from_frames (i->main_picture()->duration(), film()->video_frame_rate()); + if (to > position()) { + p.push_back (DCPTimePeriod (max(position(), pos), min(end(), to))); + if (to > end()) { + break; + } + } + pos = to; } return p; @@ -396,7 +420,14 @@ DCPContent::can_reference (function (shared_ptrvideo_frame_rate())) { + why_not.push_back (_("The film has a different frame rate to this DCP.")); + return false; + } + list const fr = film()->reels (); + /* fr must contain reels(). It can also contain other reels, but it must at least contain reels(). */ @@ -419,6 +450,11 @@ DCPContent::can_reference (function (shared_ptr& why_not) const { + if (film()->frame_size() != video->size()) { + why_not.push_back (_("The video frame size in the film differs from that in the DCP.")); + return false; + } + return can_reference (bind (&Content::video, _1), _("There is other video content overlapping this DCP; remove it."), why_not); } @@ -433,7 +469,7 @@ DCPContent::can_reference_audio (list& why_not) const } } - return can_reference (bind (&Content::audio, _1), _("There is other audio content overlapping this DCP; remove it."), why_not); + return can_reference (bind (&Content::audio, _1), _("There is other audio content overlapping this DCP; remove it."), why_not); } bool @@ -460,3 +496,10 @@ DCPContent::use_template (shared_ptr c) _reference_audio = dc->_reference_audio; _reference_subtitle = dc->_reference_subtitle; } + +void +DCPContent::set_cpl (string id) +{ + boost::mutex::scoped_lock lm (_mutex); + _cpl = id; +}