Merge master.
[dcpomatic.git] / src / lib / film.cc
index 9103024ab14d1fbc560743106bf2bc47abcff7e2..75ec700e0092e5bb35487f43556e4c93b1600b4e 100644 (file)
@@ -1,5 +1,3 @@
-/* -*- c-basic-offset: 8; default-tab-width: 8; -*- */
-
 /*
     Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
 
@@ -34,7 +32,6 @@
 #include <libxml++/libxml++.h>
 #include <libcxml/cxml.h>
 #include "film.h"
-#include "container.h"
 #include "job.h"
 #include "filter.h"
 #include "util.h"
@@ -56,6 +53,8 @@
 #include "imagemagick_content.h"
 #include "sndfile_content.h"
 #include "dcp_content_type.h"
+#include "ratio.h"
+#include "cross.h"
 
 #include "i18n.h"
 
@@ -75,6 +74,7 @@ using std::cout;
 using std::list;
 using boost::shared_ptr;
 using boost::lexical_cast;
+using boost::dynamic_pointer_cast;
 using boost::to_upper_copy;
 using boost::ends_with;
 using boost::starts_with;
@@ -102,6 +102,7 @@ Film::Film (string d)
        , _j2k_bandwidth (200000000)
        , _dci_metadata (Config::instance()->default_dci_metadata ())
        , _dcp_video_frame_rate (0)
+       , _dcp_audio_channels (MAX_AUDIO_CHANNELS)
        , _dirty (false)
 {
        set_dci_date_today ();
@@ -141,7 +142,6 @@ Film::Film (Film const & o)
        , _use_dci_name      (o._use_dci_name)
        , _dcp_content_type  (o._dcp_content_type)
        , _container         (o._container)
-       , _filters           (o._filters)
        , _scaler            (o._scaler)
        , _ab                (o._ab)
        , _with_subtitles    (o._with_subtitles)
@@ -163,16 +163,13 @@ Film::video_state_identifier () const
        assert (container ());
        LocaleGuard lg;
 
-       pair<string, string> f = Filter::ffmpeg_strings (filters());
-
        stringstream s;
        s << container()->id()
          << "_" << _playlist->video_digest()
          << "_" << _dcp_video_frame_rate
-         << "_" << f.first << "_" << f.second
          << "_" << scaler()->id()
          << "_" << j2k_bandwidth()
-         << "_" << boost::lexical_cast<int> (colour_lut());
+         << "_" << lexical_cast<int> (colour_lut());
 
        if (ab()) {
                pair<string, string> fa = Filter::ffmpeg_strings (Config::instance()->reference_filters());
@@ -319,14 +316,6 @@ Film::analyse_audio ()
        JobManager::instance()->add (_analyse_audio_job);
 }
 
-/** Start a job to examine a piece of content */
-void
-Film::examine_content (shared_ptr<Content> c)
-{
-       shared_ptr<Job> j (new ExamineContentJob (shared_from_this(), c));
-       JobManager::instance()->add (j);
-}
-
 void
 Film::analyse_audio_finished ()
 {
@@ -382,7 +371,7 @@ Film::write_metadata () const
        xmlpp::Document doc;
        xmlpp::Element* root = doc.create_root_node ("Metadata");
 
-       root->add_child("Version")->add_child_text (boost::lexical_cast<string> (state_version));
+       root->add_child("Version")->add_child_text (lexical_cast<string> (state_version));
        root->add_child("Name")->add_child_text (_name);
        root->add_child("UseDCIName")->add_child_text (_use_dci_name ? "1" : "0");
 
@@ -394,20 +383,17 @@ Film::write_metadata () const
                root->add_child("Container")->add_child_text (_container->id ());
        }
 
-       for (vector<Filter const *>::const_iterator i = _filters.begin(); i != _filters.end(); ++i) {
-               root->add_child("Filter")->add_child_text ((*i)->id ());
-       }
-       
        root->add_child("Scaler")->add_child_text (_scaler->id ());
        root->add_child("AB")->add_child_text (_ab ? "1" : "0");
        root->add_child("WithSubtitles")->add_child_text (_with_subtitles ? "1" : "0");
-       root->add_child("SubtitleOffset")->add_child_text (boost::lexical_cast<string> (_subtitle_offset));
-       root->add_child("SubtitleScale")->add_child_text (boost::lexical_cast<string> (_subtitle_scale));
-       root->add_child("ColourLUT")->add_child_text (boost::lexical_cast<string> (_colour_lut));
-       root->add_child("J2KBandwidth")->add_child_text (boost::lexical_cast<string> (_j2k_bandwidth));
+       root->add_child("SubtitleOffset")->add_child_text (lexical_cast<string> (_subtitle_offset));
+       root->add_child("SubtitleScale")->add_child_text (lexical_cast<string> (_subtitle_scale));
+       root->add_child("ColourLUT")->add_child_text (lexical_cast<string> (_colour_lut));
+       root->add_child("J2KBandwidth")->add_child_text (lexical_cast<string> (_j2k_bandwidth));
        _dci_metadata.as_xml (root->add_child ("DCIMetadata"));
-       root->add_child("DCPVideoFrameRate")->add_child_text (boost::lexical_cast<string> (_dcp_video_frame_rate));
+       root->add_child("DCPVideoFrameRate")->add_child_text (lexical_cast<string> (_dcp_video_frame_rate));
        root->add_child("DCIDate")->add_child_text (boost::gregorian::to_iso_string (_dci_date));
+       root->add_child("DCPAudioChannels")->add_child_text (lexical_cast<string> (_dcp_audio_channels));
        _playlist->as_xml (root->add_child ("Playlist"));
 
        doc.write_to_file_formatted (file ("metadata.xml"));
@@ -441,14 +427,7 @@ Film::read_metadata ()
        {
                optional<string> c = f.optional_string_child ("Container");
                if (c) {
-                       _container = Container::from_id (c.get ());
-               }
-       }
-
-       {
-               list<shared_ptr<cxml::Node> > c = f.node_children ("Filter");
-               for (list<shared_ptr<cxml::Node> >::iterator i = c.begin(); i != c.end(); ++i) {
-                       _filters.push_back (Filter::from_id ((*i)->content ()));
+                       _container = Ratio::from_id (c.get ());
                }
        }
 
@@ -462,6 +441,7 @@ Film::read_metadata ()
        _dci_metadata = DCIMetadata (f.node_child ("DCIMetadata"));
        _dcp_video_frame_rate = f.number_child<int> ("DCPVideoFrameRate");
        _dci_date = boost::gregorian::from_undelimited_string (f.string_child ("DCIDate"));
+       _dcp_audio_channels = f.number_child<int> ("DCPAudioChannels");
 
        _playlist->set_from_xml (shared_from_this(), f.node_child ("Playlist"));
 
@@ -623,7 +603,7 @@ Film::set_dcp_content_type (DCPContentType const * t)
 }
 
 void
-Film::set_container (Container const * c)
+Film::set_container (Ratio const * c)
 {
        {
                boost::mutex::scoped_lock lm (_state_mutex);
@@ -632,16 +612,6 @@ Film::set_container (Container const * c)
        signal_changed (CONTAINER);
 }
 
-void
-Film::set_filters (vector<Filter const *> f)
-{
-       {
-               boost::mutex::scoped_lock lm (_state_mutex);
-               _filters = f;
-       }
-       signal_changed (FILTERS);
-}
-
 void
 Film::set_scaler (Scaler const * s)
 {
@@ -818,7 +788,6 @@ Film::have_dcp () const
 shared_ptr<Player>
 Film::player () const
 {
-       boost::mutex::scoped_lock lm (_state_mutex);
        return shared_ptr<Player> (new Player (shared_from_this (), _playlist));
 }
 
@@ -835,11 +804,22 @@ Film::content () const
        return _playlist->content ();
 }
 
+void
+Film::examine_and_add_content (shared_ptr<Content> c)
+{
+       shared_ptr<Job> j (new ExamineContentJob (shared_from_this(), c));
+       JobManager::instance()->add (j);
+}
+
 void
 Film::add_content (shared_ptr<Content> c)
 {
+       /* Add video content after any existing content */
+       if (dynamic_pointer_cast<VideoContent> (c)) {
+               c->set_start (_playlist->video_end ());
+       }
+
        _playlist->add (c);
-       examine_content (c);
 }
 
 void
@@ -926,3 +906,15 @@ Film::dcp_audio_frame_rate () const
        /* XXX */
        return 48000;
 }
+
+void
+Film::set_sequence_video (bool s)
+{
+       _playlist->set_sequence_video (s);
+}
+
+libdcp::Size
+Film::full_frame () const
+{
+       return libdcp::Size (2048, 1080);
+}