X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fdcp_content.cc;h=b707754a78957bc2e3291659fc01c3e4d84606fe;hb=0a93237cb5e4642d3b698ff9b7d0cfae5401478c;hp=cd82ee6e9e811b54a6b7538d1a8a712d9ca22947;hpb=8596e31595c9aba128078ba4a3950543ea291f98;p=dcpomatic.git diff --git a/src/lib/dcp_content.cc b/src/lib/dcp_content.cc index cd82ee6e9..b707754a7 100644 --- a/src/lib/dcp_content.cc +++ b/src/lib/dcp_content.cc @@ -25,11 +25,13 @@ #include "compose.hpp" #include #include +#include #include "i18n.h" using std::string; using std::cout; +using std::distance; using boost::shared_ptr; using boost::optional; @@ -42,10 +44,11 @@ DCPContent::DCPContent (shared_ptr f, boost::filesystem::path p) , SubtitleContent (f) , _has_subtitles (false) , _encrypted (false) - , _directory (p) , _kdm_valid (false) { read_directory (p); + /* Default to no colour conversion for DCPs */ + unset_colour_conversion (false); } DCPContent::DCPContent (shared_ptr f, cxml::ConstNodePtr node, int version) @@ -56,7 +59,6 @@ DCPContent::DCPContent (shared_ptr f, cxml::ConstNodePtr node, int v { _name = node->string_child ("Name"); _has_subtitles = node->bool_child ("HasSubtitles"); - _directory = node->string_child ("Directory"); _encrypted = node->bool_child ("Encrypted"); if (node->optional_node_child ("KDM")) { _kdm = dcp::EncryptedKDM (node->string_child ("KDM")); @@ -77,22 +79,24 @@ DCPContent::read_directory (boost::filesystem::path p) } void -DCPContent::examine (shared_ptr job, bool calculate_digest) +DCPContent::examine (shared_ptr job) { bool const could_be_played = can_be_played (); job->set_progress_unknown (); - Content::examine (job, calculate_digest); + Content::examine (job); shared_ptr examiner (new DCPExaminer (shared_from_this ())); take_from_video_examiner (examiner); take_from_audio_examiner (examiner); - boost::mutex::scoped_lock lm (_mutex); - _name = examiner->name (); - _has_subtitles = examiner->has_subtitles (); - _encrypted = examiner->encrypted (); - _kdm_valid = examiner->kdm_valid (); + { + boost::mutex::scoped_lock lm (_mutex); + _name = examiner->name (); + _has_subtitles = examiner->has_subtitles (); + _encrypted = examiner->encrypted (); + _kdm_valid = examiner->kdm_valid (); + } if (could_be_played != can_be_played ()) { signal_changed (DCPContentProperty::CAN_BE_PLAYED); @@ -128,7 +132,6 @@ DCPContent::as_xml (xmlpp::Node* node) const node->add_child("Name")->add_child_text (_name); node->add_child("HasSubtitles")->add_child_text (_has_subtitles ? "1" : "0"); node->add_child("Encrypted")->add_child_text (_encrypted ? "1" : "0"); - node->add_child("Directory")->add_child_text (_directory.string ()); if (_kdm) { node->add_child("KDM")->add_child_text (_kdm->as_xml ()); } @@ -139,8 +142,9 @@ DCPTime DCPContent::full_length () const { shared_ptr film = _film.lock (); - assert (film); - return DCPTime (video_length (), FrameRateChange (video_frame_rate (), film->video_frame_rate ())); + DCPOMATIC_ASSERT (film); + FrameRateChange const frc (video_frame_rate (), film->video_frame_rate ()); + return DCPTime::from_frames (rint (video_length () * frc.factor ()), film->video_frame_rate ()); } string @@ -158,5 +162,22 @@ DCPContent::add_kdm (dcp::EncryptedKDM k) bool DCPContent::can_be_played () const { + boost::mutex::scoped_lock lm (_mutex); return !_encrypted || _kdm_valid; } + +boost::filesystem::path +DCPContent::directory () const +{ + optional smallest; + boost::filesystem::path dir; + for (size_t i = 0; i < number_of_paths(); ++i) { + boost::filesystem::path const p = path (i).parent_path (); + size_t const d = distance (p.begin(), p.end()); + if (!smallest || d < smallest.get ()) { + dir = p; + } + } + + return dir; +}