/*
- Copyright (C) 2013-2014 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2013-2015 Carl Hetherington <cth@carlh.net>
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
#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"
using std::cout;
using std::vector;
using std::max;
+using std::pair;
using boost::shared_ptr;
int const ContentProperty::PATH = 400;
_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."));
}
if (job) {
job->sub (_("Computing digest"));
}
-
+
boost::mutex::scoped_lock lm (_mutex);
vector<boost::filesystem::path> p = _paths;
lm.unlock ();
if (p == _position) {
return;
}
-
+
_position = p;
}
}
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);
if (!film) {
return shared_ptr<Content> ();
}
-
+
/* 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");
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
{
SafeStringStream s;
-
+
s << Content::digest()
<< "_" << position().get()
<< "_" << trim_start().get()
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
+{
+ list<pair<string, string> > 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;
+}