Remove a couple of uses of ofstream.
[dcpomatic.git] / src / lib / video_content.cc
index 3f6e171a549d2f6feefaca6deb3e3c5556805b66..d0eab4dbf93f870344b7c34228ed14d7813ad26d 100644 (file)
 
 #include <iomanip>
 #include <libcxml/cxml.h>
+#include <libdcp/colour_matrix.h>
 #include "video_content.h"
 #include "video_examiner.h"
 #include "ratio.h"
 #include "compose.hpp"
 #include "config.h"
 #include "colour_conversion.h"
+#include "util.h"
+#include "film.h"
 
 #include "i18n.h"
 
@@ -49,9 +52,8 @@ VideoContent::VideoContent (shared_ptr<const Film> f, Time s, VideoContent::Fram
        , _video_frame_rate (0)
        , _video_frame_type (VIDEO_FRAME_TYPE_2D)
        , _ratio (Ratio::from_id ("185"))
-       , _colour_conversion (Config::instance()->colour_conversions().front().conversion)
 {
-
+       setup_default_colour_conversion ();
 }
 
 VideoContent::VideoContent (shared_ptr<const Film> f, boost::filesystem::path p)
@@ -60,13 +62,13 @@ VideoContent::VideoContent (shared_ptr<const Film> f, boost::filesystem::path p)
        , _video_frame_rate (0)
        , _video_frame_type (VIDEO_FRAME_TYPE_2D)
        , _ratio (Ratio::from_id ("185"))
-       , _colour_conversion (Config::instance()->colour_conversions().front().conversion)
 {
-
+       setup_default_colour_conversion ();
 }
 
 VideoContent::VideoContent (shared_ptr<const Film> f, shared_ptr<const cxml::Node> node)
        : Content (f, node)
+       , _ratio (0)
 {
        _video_length = node->number_child<VideoContent::Frame> ("VideoLength");
        _video_size.width = node->number_child<int> ("VideoWidth");
@@ -103,6 +105,12 @@ VideoContent::as_xml (xmlpp::Node* node) const
        _colour_conversion.as_xml (node->add_child("ColourConversion"));
 }
 
+void
+VideoContent::setup_default_colour_conversion ()
+{
+       _colour_conversion = PresetColourConversion (_("sRGB"), 2.4, true, libdcp::colour_matrix::srgb_to_xyz, 2.6).conversion;
+}
+
 void
 VideoContent::take_from_video_examiner (shared_ptr<VideoExaminer> d)
 {
@@ -134,7 +142,7 @@ VideoContent::information () const
                _("%1x%2 pixels (%3:1)"),
                video_size().width,
                video_size().height,
-               setprecision (3), float (video_size().width) / video_size().height
+               setprecision (3), video_size().ratio ()
                );
        
        return s.str ();
@@ -221,7 +229,7 @@ string
 VideoContent::identifier () const
 {
        stringstream s;
-       s << Content::digest()
+       s << Content::identifier()
          << "_" << crop().left
          << "_" << crop().right
          << "_" << crop().top
@@ -276,3 +284,28 @@ VideoContent::set_colour_conversion (ColourConversion c)
 
        signal_changed (VideoContentProperty::COLOUR_CONVERSION);
 }
+
+/** @return Video size after 3D split and crop */
+libdcp::Size
+VideoContent::video_size_after_crop () const
+{
+       return crop().apply (video_size_after_3d_split ());
+}
+
+/** @param t A time offset from the start of this piece of content.
+ *  @return Corresponding frame index.
+ */
+VideoContent::Frame
+VideoContent::time_to_content_video_frames (Time t) const
+{
+       shared_ptr<const Film> film = _film.lock ();
+       assert (film);
+       
+       FrameRateConversion frc (video_frame_rate(), film->video_frame_rate());
+
+       /* Here we are converting from time (in the DCP) to a frame number in the content.
+          Hence we need to use the DCP's frame rate and the double/skip correction, not
+          the source's rate.
+       */
+       return t * film->video_frame_rate() / (frc.factor() * TIME_HZ);
+}