X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fdcp_content.cc;h=a5b5f37e13f967a9c4845d707000f19049c140cb;hb=7979aeb87a83de31c4cf25f88eef4fbca4b56553;hp=3d4a48b89756b4a21ce5b85d4957e7ea4be5b931;hpb=0dc52cd6e69890cd8a2c539e80389ea8bac5cc3c;p=dcpomatic.git diff --git a/src/lib/dcp_content.cc b/src/lib/dcp_content.cc index 3d4a48b89..a5b5f37e1 100644 --- a/src/lib/dcp_content.cc +++ b/src/lib/dcp_content.cc @@ -18,27 +18,52 @@ */ #include +#include #include "dcp_content.h" #include "dcp_examiner.h" #include "job.h" #include "film.h" +#include "config.h" #include "compose.hpp" #include "i18n.h" using std::string; +using std::cout; using boost::shared_ptr; +using boost::optional; + +int const DCPContentProperty::CAN_BE_PLAYED = 600; DCPContent::DCPContent (shared_ptr f, boost::filesystem::path p) : Content (f) , VideoContent (f) , SingleStreamAudioContent (f) , SubtitleContent (f) + , _has_subtitles (false) + , _encrypted (false) , _directory (p) + , _kdm_valid (false) { read_directory (p); } +DCPContent::DCPContent (shared_ptr f, cxml::ConstNodePtr node, int version) + : Content (f, node) + , VideoContent (f, node, version) + , SingleStreamAudioContent (f, node, version) + , SubtitleContent (f, node, version) +{ + _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")); + } + _kdm_valid = node->bool_child ("KDMValid"); +} + void DCPContent::read_directory (boost::filesystem::path p) { @@ -54,13 +79,24 @@ DCPContent::read_directory (boost::filesystem::path p) void DCPContent::examine (shared_ptr job) { + bool const could_be_played = can_be_played (); + job->set_progress_unknown (); 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 (); + + if (could_be_played != can_be_played ()) { + signal_changed (DCPContentProperty::CAN_BE_PLAYED); + } } string @@ -82,9 +118,21 @@ void DCPContent::as_xml (xmlpp::Node* node) const { node->add_child("Type")->add_child_text ("DCP"); + Content::as_xml (node); VideoContent::as_xml (node); SingleStreamAudioContent::as_xml (node); + SubtitleContent::as_xml (node); + + boost::mutex::scoped_lock lm (_mutex); + 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 ()); + } + node->add_child("KDMValid")->add_child_text (_kdm_valid ? "1" : "0"); } DCPTime @@ -94,3 +142,21 @@ DCPContent::full_length () const assert (film); return DCPTime (video_length (), FrameRateChange (video_frame_rate (), film->video_frame_rate ())); } + +string +DCPContent::identifier () const +{ + return SubtitleContent::identifier (); +} + +void +DCPContent::add_kdm (dcp::EncryptedKDM k) +{ + _kdm = k; +} + +bool +DCPContent::can_be_played () const +{ + return !_encrypted || _kdm_valid; +}