#include "film.h"
#include "safe_stringstream.h"
#include "job.h"
+#include "compose.hpp"
#include "raw_convert.h"
#include <libcxml/cxml.h>
#include <libxml++/libxml++.h>
#include <boost/thread/mutex.hpp>
+#include <iostream>
#include "i18n.h"
_paths.push_back ((*i)->content ());
}
_digest = node->optional_string_child ("Digest").get_value_or ("X");
- _position = DCPTime (node->number_child<double> ("Position"));
- _trim_start = DCPTime (node->number_child<double> ("TrimStart"));
- _trim_end = DCPTime (node->number_child<double> ("TrimEnd"));
+ _position = DCPTime (node->number_child<DCPTime::Type> ("Position"));
+ _trim_start = ContentTime (node->number_child<ContentTime::Type> ("TrimStart"));
+ _trim_end = ContentTime (node->number_child<ContentTime::Type> ("TrimEnd"));
}
Content::Content (shared_ptr<const Film> film, vector<shared_ptr<Content> > c)
, _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."));
}
}
void
-Content::set_trim_start (DCPTime t)
+Content::set_trim_start (ContentTime t)
{
{
boost::mutex::scoped_lock lm (_mutex);
}
void
-Content::set_trim_end (DCPTime t)
+Content::set_trim_end (ContentTime t)
{
{
boost::mutex::scoped_lock lm (_mutex);
DCPTime
Content::length_after_trim () const
{
- return max (DCPTime (), full_length() - trim_start() - trim_end());
+ 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
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<pair<string, string> >
-Content::properties () const
+/** @return a list of properties that might be interesting to the user */
+list<Content::UserProperty>
+Content::user_properties () const
{
- list<pair<string, string> > p;
+ list<UserProperty> p;
add_properties (p);
return p;
}
+
+shared_ptr<const Film>
+Content::film () const
+{
+ shared_ptr<const Film> film = _film.lock ();
+ DCPOMATIC_ASSERT (film);
+ return film;
+}
+
+/** @return DCP times of points within this content where a reel split could occur */
+list<DCPTime>
+Content::reel_split_points () const
+{
+ list<DCPTime> t;
+ /* XXX: this is questionable; perhaps the position itself should be forced to be on a frame boundary */
+ t.push_back (position().round_up (film()->video_frame_rate()));
+ return t;
+}