X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fcontent.cc;h=0fd503edd5134a8a809a579801e2b23bbab1381f;hb=73654117144c6de0ec4efe39ddc88485df546cc9;hp=7afbf924f63912c5631caf1a8b138583ad3ca616;hpb=291e2fe2e7df95019feba8097b68b31ec64be794;p=dcpomatic.git diff --git a/src/lib/content.cc b/src/lib/content.cc index 7afbf924f..0fd503edd 100644 --- a/src/lib/content.cc +++ b/src/lib/content.cc @@ -27,10 +27,9 @@ #include "content_factory.h" #include "exceptions.h" #include "film.h" -#include "safe_stringstream.h" #include "job.h" #include "compose.hpp" -#include "raw_convert.h" +#include #include #include #include @@ -45,6 +44,7 @@ using std::vector; using std::max; using std::pair; using boost::shared_ptr; +using dcp::raw_convert; int const ContentProperty::PATH = 400; int const ContentProperty::POSITION = 401; @@ -95,6 +95,7 @@ Content::Content (shared_ptr film, cxml::ConstNodePtr node) _position = DCPTime (node->number_child ("Position")); _trim_start = ContentTime (node->number_child ("TrimStart")); _trim_end = ContentTime (node->number_child ("TrimEnd")); + _video_frame_rate = node->optional_number_child ("VideoFrameRate"); } Content::Content (shared_ptr film, vector > c) @@ -102,6 +103,7 @@ Content::Content (shared_ptr film, vector > c) , _position (c.front()->position ()) , _trim_start (c.front()->trim_start ()) , _trim_end (c.back()->trim_end ()) + , _video_frame_rate (c.front()->video_frame_rate()) , _change_signals_frequent (false) { for (size_t i = 0; i < c.size(); ++i) { @@ -113,6 +115,17 @@ Content::Content (shared_ptr film, vector > c) throw JoinError (_("Only the last piece of content to be joined can have an end trim.")); } + if ( + (_video_frame_rate && !c[i]->_video_frame_rate) || + (!_video_frame_rate && c[i]->_video_frame_rate) + ) { + throw JoinError (_("Content to be joined must have the same video frame rate")); + } + + if (_video_frame_rate && fabs (_video_frame_rate.get() - c[i]->_video_frame_rate.get()) > VIDEO_FRAME_RATE_EPSILON) { + throw JoinError (_("Content to be joined must have the same video frame rate")); + } + for (size_t j = 0; j < c[i]->number_of_paths(); ++j) { _paths.push_back (c[i]->path (j)); } @@ -131,6 +144,9 @@ Content::as_xml (xmlpp::Node* node) const node->add_child("Position")->add_child_text (raw_convert (_position.get ())); node->add_child("TrimStart")->add_child_text (raw_convert (_trim_start.get ())); node->add_child("TrimEnd")->add_child_text (raw_convert (_trim_end.get ())); + if (_video_frame_rate) { + node->add_child("VideoFrameRate")->add_child_text (raw_convert (_video_frame_rate.get())); + } } void @@ -145,10 +161,10 @@ Content::examine (shared_ptr job) lm.unlock (); /* Some content files are very big, so we use a poor man's - digest here: a MD5 of the first and last 1e6 bytes with the + digest here: a digest of the first and last 1e6 bytes with the size of the first file tacked on the end as a string. */ - string const d = md5_digest_head_tail (p, 1000000) + raw_convert (boost::filesystem::file_size (p.front ())); + string const d = digest_head_tail (p, 1000000) + raw_convert (boost::filesystem::file_size (p.front ())); lm.lock (); _digest = d; @@ -238,14 +254,12 @@ Content::length_after_trim () const string Content::identifier () const { - SafeStringStream s; - - s << Content::digest() - << "_" << position().get() - << "_" << trim_start().get() - << "_" << trim_end().get(); - - return s.str (); + char buffer[256]; + snprintf ( + buffer, sizeof(buffer), "%s_%" PRId64 "_%" PRId64 "_%" PRId64, + Content::digest().c_str(), position().get(), trim_start().get(), trim_end().get() + ); + return buffer; } bool @@ -343,9 +357,27 @@ Content::active_video_frame_rate () const void Content::add_properties (list& p) const { - p.push_back (UserProperty (_("General"), _("Filename"), path(0).string ())); + p.push_back (UserProperty (UserProperty::GENERAL, _("Filename"), path(0).string ())); if (_video_frame_rate) { - p.push_back (UserProperty (_("General"), _("Video frame rate"), raw_convert (_video_frame_rate.get(), 5), _("frames per second"))); + if (video) { + p.push_back ( + UserProperty ( + UserProperty::VIDEO, + _("Frame rate"), + raw_convert (_video_frame_rate.get(), 5), + _("frames per second") + ) + ); + } else { + p.push_back ( + UserProperty ( + UserProperty::GENERAL, + _("Prepared for video frame rate"), + raw_convert (_video_frame_rate.get(), 5), + _("frames per second") + ) + ); + } } }