#include "raw_convert.h"
#include <libcxml/cxml.h>
#include <dcp/colour_matrix.h>
+#include <libxml++/libxml++.h>
#include <iomanip>
+#include <iostream>
#include "i18n.h"
using std::stringstream;
using std::fixed;
using std::setprecision;
+using std::list;
+using std::pair;
using boost::shared_ptr;
using boost::optional;
using boost::dynamic_pointer_cast;
-VideoContent::VideoContent (shared_ptr<const Film> f)
- : Content (f)
+VideoContent::VideoContent (shared_ptr<const Film> film)
+ : Content (film)
, _video_length (0)
, _video_frame_rate (0)
, _video_frame_type (VIDEO_FRAME_TYPE_2D)
, _scale (VideoContentScale (Ratio::from_id ("178")))
+ , _fade_in (0)
+ , _fade_out (0)
{
set_default_colour_conversion ();
}
-VideoContent::VideoContent (shared_ptr<const Film> f, DCPTime s, Frame len)
- : Content (f, s)
+VideoContent::VideoContent (shared_ptr<const Film> film, DCPTime s, Frame len)
+ : Content (film, s)
, _video_length (len)
, _video_frame_rate (0)
, _video_frame_type (VIDEO_FRAME_TYPE_2D)
, _scale (VideoContentScale (Ratio::from_id ("178")))
+ , _fade_in (0)
+ , _fade_out (0)
{
set_default_colour_conversion ();
}
-VideoContent::VideoContent (shared_ptr<const Film> f, boost::filesystem::path p)
- : Content (f, p)
+VideoContent::VideoContent (shared_ptr<const Film> film, boost::filesystem::path p)
+ : Content (film, p)
, _video_length (0)
, _video_frame_rate (0)
, _video_frame_type (VIDEO_FRAME_TYPE_2D)
, _scale (VideoContentScale (Ratio::from_id ("178")))
+ , _fade_in (0)
+ , _fade_out (0)
{
set_default_colour_conversion ();
}
-VideoContent::VideoContent (shared_ptr<const Film> f, cxml::ConstNodePtr node, int version)
- : Content (f, node)
+VideoContent::VideoContent (shared_ptr<const Film> film, cxml::ConstNodePtr node, int version)
+ : Content (film, node)
{
_video_size.width = node->number_child<int> ("VideoWidth");
_video_size.height = node->number_child<int> ("VideoHeight");
- _video_frame_rate = node->number_child<float> ("VideoFrameRate");
+ _video_frame_rate = node->number_child<double> ("VideoFrameRate");
_video_length = node->number_child<Frame> ("VideoLength");
_video_frame_type = static_cast<VideoFrameType> (node->number_child<int> ("VideoFrameType"));
- _sample_aspect_ratio = node->optional_number_child<float> ("SampleAspectRatio");
+ _sample_aspect_ratio = node->optional_number_child<double> ("SampleAspectRatio");
_crop.left = node->number_child<int> ("LeftCrop");
_crop.right = node->number_child<int> ("RightCrop");
_crop.top = node->number_child<int> ("TopCrop");
_scale = VideoContentScale (node->node_child ("Scale"));
}
-
+
if (node->optional_node_child ("ColourConversion")) {
_colour_conversion = ColourConversion (node->node_child ("ColourConversion"), version);
}
if (version >= 32) {
_fade_in = node->number_child<Frame> ("FadeIn");
_fade_out = node->number_child<Frame> ("FadeOut");
+ } else {
+ _fade_in = _fade_out = 0;
}
}
-VideoContent::VideoContent (shared_ptr<const Film> f, vector<shared_ptr<Content> > c)
- : Content (f, c)
+VideoContent::VideoContent (shared_ptr<const Film> film, vector<shared_ptr<Content> > c)
+ : Content (film, c)
, _video_length (0)
{
shared_ptr<VideoContent> ref = dynamic_pointer_cast<VideoContent> (c[0]);
if (vc->fade_in() != ref->fade_in() || vc->fade_out() != ref->fade_out()) {
throw JoinError (_("Content to be joined must have the same fades."));
}
-
+
_video_length += vc->video_length ();
}
{
/* These examiner calls could call other content methods which take a lock on the mutex */
dcp::Size const vs = d->video_size ();
- optional<float> const vfr = d->video_frame_rate ();
+ optional<double> const vfr = d->video_frame_rate ();
Frame vl = d->video_length ();
- optional<float> const ar = d->sample_aspect_ratio ();
+ optional<double> const ar = d->sample_aspect_ratio ();
{
boost::mutex::scoped_lock lm (_mutex);
/* Guess correct scale from size and sample aspect ratio */
_scale = VideoContentScale (
- Ratio::nearest_from_ratio (float (_video_size.width) * ar.get_value_or (1) / _video_size.height)
+ Ratio::nearest_from_ratio (double (_video_size.width) * ar.get_value_or (1) / _video_size.height)
);
}
LOG_GENERAL ("Video length obtained from header as %1 frames", _video_length);
set_default_colour_conversion ();
-
+
signal_changed (VideoContentProperty::VIDEO_SIZE);
signal_changed (VideoContentProperty::VIDEO_FRAME_RATE);
signal_changed (VideoContentProperty::VIDEO_SCALE);
{
{
boost::mutex::scoped_lock lm (_mutex);
-
+
if (_crop.left == c) {
return;
}
-
+
_crop.left = c;
}
-
+
signal_changed (VideoContentProperty::VIDEO_CROP);
}
if (_crop.right == c) {
return;
}
-
+
_crop.right = c;
}
-
+
signal_changed (VideoContentProperty::VIDEO_CROP);
}
if (_crop.top == c) {
return;
}
-
+
_crop.top = c;
}
-
+
signal_changed (VideoContentProperty::VIDEO_CROP);
}
if (_crop.bottom == c) {
return;
}
-
+
_crop.bottom = c;
}
<< "_" << crop().right
<< "_" << crop().top
<< "_" << crop().bottom
- << "_" << scale().id();
+ << "_" << scale().id()
+ << "_" << _fade_in
+ << "_" << _fade_out;
if (colour_conversion()) {
s << "_" << colour_conversion().get().identifier ();
}
void
-VideoContent::unset_colour_conversion (bool signal)
+VideoContent::unset_colour_conversion ()
{
{
boost::mutex::scoped_lock lm (_mutex);
_colour_conversion = boost::optional<ColourConversion> ();
}
- if (signal) {
- signal_changed (VideoContentProperty::COLOUR_CONVERSION);
- }
+ signal_changed (VideoContentProperty::COLOUR_CONVERSION);
}
void
}
void
-VideoContent::set_video_frame_rate (float r)
+VideoContent::set_video_frame_rate (double r)
{
{
boost::mutex::scoped_lock lm (_mutex);
if (_video_frame_rate == r) {
return;
}
-
+
_video_frame_rate = r;
}
-
+
signal_changed (VideoContentProperty::VIDEO_FRAME_RATE);
}
-optional<float>
+optional<double>
VideoContent::fade (Frame f) const
{
DCPOMATIC_ASSERT (f >= 0);
-
+
if (f < fade_in()) {
- return float (f) / fade_in();
+ return double (f) / fade_in();
}
Frame fade_out_start = video_length() - fade_out();
if (f >= fade_out_start) {
- return 1 - float (f - fade_out_start) / fade_out();
+ return 1 - double (f - fade_out_start) / fade_out();
}
- return optional<float> ();
+ return optional<double> ();
}
string
);
- float ratio = video_size_after_3d_split().ratio ();
+ double ratio = video_size_after_3d_split().ratio ();
if (sample_aspect_ratio ()) {
d << ", " << _("pixel aspect ratio") << " " << fixed << setprecision(2) << sample_aspect_ratio().get () << ":1";
d << " (" << fixed << setprecision(2) << scaled.ratio() << ":1)\n";
}
-
+
if (scaled != container_size) {
d << String::compose (
_("Padded with black to fit container %1 (%2x%3)"),
d << _("Content frame rate");
d << " " << fixed << setprecision(4) << video_frame_rate() << "\n";
-
+
FrameRateChange frc (video_frame_rate(), film->video_frame_rate ());
d << frc.description () << "\n";
return d.str ();
}
+
+void
+VideoContent::add_properties (list<pair<string, string> >& p) const
+{
+ p.push_back (make_pair (_("Video length"), raw_convert<string> (video_length ()) + " " + _("video frames")));
+ p.push_back (make_pair (_("Video size"), raw_convert<string> (video_size().width) + "x" + raw_convert<string> (video_size().height)));
+ p.push_back (make_pair (_("Video frame rate"), raw_convert<string> (video_frame_rate()) + " " + _("frames per second")));
+}