X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Flib%2Fcontent.cc;h=aa596f75a3f931ed0fc83b52914b737e6db600d4;hb=2e62b2c0de47fc8e5bcb5466b2876f9b23d2ae84;hp=b00ea3e5774ec02d89e2f77778892861af818bb9;hpb=05c37bfdb86be26497d5baa448a0cbda20e33bed;p=dcpomatic.git diff --git a/src/lib/content.cc b/src/lib/content.cc index b00ea3e57..aa596f75a 100644 --- a/src/lib/content.cc +++ b/src/lib/content.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2013-2014 Carl Hetherington + Copyright (C) 2013-2015 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,15 +24,16 @@ #include "content.h" #include "util.h" #include "content_factory.h" -#include "ui_signaller.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 #include "i18n.h" @@ -41,6 +42,7 @@ using std::list; using std::cout; using std::vector; using std::max; +using std::pair; using boost::shared_ptr; int const ContentProperty::PATH = 400; @@ -49,8 +51,8 @@ int const ContentProperty::LENGTH = 402; int const ContentProperty::TRIM_START = 403; int const ContentProperty::TRIM_END = 404; -Content::Content (shared_ptr f) - : _film (f) +Content::Content (shared_ptr film) + : _film (film) , _position (0) , _trim_start (0) , _trim_end (0) @@ -59,8 +61,8 @@ Content::Content (shared_ptr f) } -Content::Content (shared_ptr f, DCPTime p) - : _film (f) +Content::Content (shared_ptr film, DCPTime p) + : _film (film) , _position (p) , _trim_start (0) , _trim_end (0) @@ -69,8 +71,8 @@ Content::Content (shared_ptr f, DCPTime p) } -Content::Content (shared_ptr f, boost::filesystem::path p) - : _film (f) +Content::Content (shared_ptr film, boost::filesystem::path p) + : _film (film) , _position (0) , _trim_start (0) , _trim_end (0) @@ -79,8 +81,8 @@ Content::Content (shared_ptr f, boost::filesystem::path p) _paths.push_back (p); } -Content::Content (shared_ptr f, cxml::ConstNodePtr node) - : _film (f) +Content::Content (shared_ptr film, cxml::ConstNodePtr node) + : _film (film) , _change_signals_frequent (false) { list path_children = node->node_children ("Path"); @@ -88,24 +90,24 @@ Content::Content (shared_ptr f, cxml::ConstNodePtr node) _paths.push_back ((*i)->content ()); } _digest = node->optional_string_child ("Digest").get_value_or ("X"); - _position = DCPTime (node->number_child ("Position")); - _trim_start = DCPTime (node->number_child ("TrimStart")); - _trim_end = DCPTime (node->number_child ("TrimEnd")); + _position = DCPTime (node->number_child ("Position")); + _trim_start = ContentTime (node->number_child ("TrimStart")); + _trim_end = ContentTime (node->number_child ("TrimEnd")); } -Content::Content (shared_ptr f, vector > c) - : _film (f) +Content::Content (shared_ptr film, vector > c) + : _film (film) , _position (c.front()->position ()) , _trim_start (c.front()->trim_start ()) , _trim_end (c.back()->trim_end ()) , _change_signals_frequent (false) { for (size_t i = 0; i < c.size(); ++i) { - if (i > 0 && c[i]->trim_start() > DCPTime()) { + if (i > 0 && c[i]->trim_start() > ContentTime ()) { throw JoinError (_("Only the first piece of content to be joined can have a start trim.")); } - if (i < (c.size() - 1) && c[i]->trim_end () > DCPTime()) { + if (i < (c.size() - 1) && c[i]->trim_end () > ContentTime ()) { throw JoinError (_("Only the last piece of content to be joined can have an end trim.")); } @@ -135,12 +137,12 @@ Content::examine (shared_ptr job) if (job) { job->sub (_("Computing digest")); } - + boost::mutex::scoped_lock lm (_mutex); vector p = _paths; lm.unlock (); - /* Some content files are very big, so we use a poor's + /* 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 size of the first file tacked on the end as a string. */ @@ -164,7 +166,7 @@ Content::set_position (DCPTime p) if (p == _position) { return; } - + _position = p; } @@ -172,7 +174,7 @@ Content::set_position (DCPTime p) } void -Content::set_trim_start (DCPTime t) +Content::set_trim_start (ContentTime t) { { boost::mutex::scoped_lock lm (_mutex); @@ -183,7 +185,7 @@ Content::set_trim_start (DCPTime t) } void -Content::set_trim_end (DCPTime t) +Content::set_trim_end (ContentTime t) { { boost::mutex::scoped_lock lm (_mutex); @@ -201,7 +203,7 @@ Content::clone () const if (!film) { return shared_ptr (); } - + /* This is a bit naughty, but I can't think of a compelling reason not to do it ... */ xmlpp::Document doc; xmlpp::Node* node = doc.create_root_node ("Content"); @@ -221,17 +223,19 @@ Content::technical_summary () const DCPTime Content::length_after_trim () const { - return max (DCPTime (), full_length() - trim_start() - trim_end()); + shared_ptr film = _film.lock (); + DCPOMATIC_ASSERT (film); + return max (DCPTime (), full_length() - DCPTime (trim_start() + trim_end(), film->active_frame_rate_change (position ()))); } -/** @return string which includes everything about how this content affects - * its playlist. +/** @return string which changes when something about this content changes which affects + * the appearance of its video. */ string Content::identifier () const { SafeStringStream s; - + s << Content::digest() << "_" << position().get() << "_" << trim_start().get() @@ -274,3 +278,14 @@ Content::path_summary () const return s; } + +/** @return a list of properties that might be interesting to the user; first string is the property name, + * second is the value. + */ +list > +Content::properties () const +{ + list > p; + add_properties (p); + return p; +}