Fix build.
[dcpomatic.git] / src / lib / film.cc
index 774c1b392c715c7da834d6b0dd0dce1886477cd1..21e7383bf94fcfbfd0635c7d1c0efe3c90ee2741 100644 (file)
 #include <boost/date_time.hpp>
 #include <libxml++/libxml++.h>
 #include <libcxml/cxml.h>
-#include <libdcp/signer_chain.h>
-#include <libdcp/cpl.h>
-#include <libdcp/signer.h>
-#include <libdcp/util.h>
-#include <libdcp/kdm.h>
+#include <dcp/signer_chain.h>
+#include <dcp/cpl.h>
+#include <dcp/signer.h>
+#include <dcp/util.h>
+#include <dcp/kdm.h>
 #include "film.h"
 #include "job.h"
 #include "util.h"
@@ -85,15 +85,17 @@ using dcp::Signer;
  * AudioMapping XML changed.
  * 6 -> 7
  * Subtitle offset changed to subtitle y offset, and subtitle x offset added.
+ * 7 -> 8
+ * Use <Scale> tag in <VideoContent> rather than <Ratio>.
  */
-int const Film::state_version = 7;
+int const Film::current_state_version = 8;
 
 /** Construct a Film object in a given directory.
  *
  *  @param dir Film directory.
  */
 
-Film::Film (boost::filesystem::path dir)
+Film::Film (boost::filesystem::path dir, bool log)
        : _playlist (new Playlist)
        , _use_dci_name (true)
        , _dcp_content_type (Config::instance()->default_dcp_content_type ())
@@ -106,10 +108,11 @@ Film::Film (boost::filesystem::path dir)
        , _j2k_bandwidth (Config::instance()->default_j2k_bandwidth ())
        , _dci_metadata (Config::instance()->default_dci_metadata ())
        , _video_frame_rate (24)
-       , _audio_channels (MAX_AUDIO_CHANNELS)
+       , _audio_channels (6)
        , _three_d (false)
        , _sequence_video (true)
        , _interop (false)
+       , _state_version (current_state_version)
        , _dirty (false)
 {
        set_dci_date_today ();
@@ -136,7 +139,11 @@ Film::Film (boost::filesystem::path dir)
        }
 
        set_directory (result);
-       _log.reset (new FileLog (file ("log")));
+       if (log) {
+               _log.reset (new FileLog (file ("log")));
+       } else {
+               _log.reset (new NullLog);
+       }
 
        _playlist->set_sequence_video (_sequence_video);
 }
@@ -327,22 +334,15 @@ Film::encoded_frames () const
        return N;
 }
 
-/** Write state to our `metadata' file */
-void
-Film::write_metadata () const
+shared_ptr<xmlpp::Document>
+Film::metadata () const
 {
-       if (!boost::filesystem::exists (directory ())) {
-               boost::filesystem::create_directory (directory ());
-       }
-       
        LocaleGuard lg;
 
-       boost::filesystem::create_directories (directory ());
-
-       xmlpp::Document doc;
-       xmlpp::Element* root = doc.create_root_node ("Metadata");
+       shared_ptr<xmlpp::Document> doc (new xmlpp::Document);
+       xmlpp::Element* root = doc->create_root_node ("Metadata");
 
-       root->add_child("Version")->add_child_text (lexical_cast<string> (state_version));
+       root->add_child("Version")->add_child_text (lexical_cast<string> (current_state_version));
        root->add_child("Name")->add_child_text (_name);
        root->add_child("UseDCIName")->add_child_text (_use_dci_name ? "1" : "0");
 
@@ -370,8 +370,16 @@ Film::write_metadata () const
        root->add_child("Key")->add_child_text (_key.hex ());
        _playlist->as_xml (root->add_child ("Playlist"));
 
-       doc.write_to_file_formatted (file("metadata.xml").string ());
-       
+       return doc;
+}
+
+/** Write state to our `metadata' file */
+void
+Film::write_metadata () const
+{
+       boost::filesystem::create_directories (directory ());
+       shared_ptr<xmlpp::Document> doc = metadata ();
+       doc->write_to_file_formatted (file("metadata.xml").string ());
        _dirty = false;
 }
 
@@ -388,7 +396,10 @@ Film::read_metadata ()
        cxml::Document f ("Metadata");
        f.read_file (file ("metadata.xml"));
 
-       int const version = f.number_child<int> ("Version");
+       _state_version = f.number_child<int> ("Version");
+       if (_state_version > current_state_version) {
+               throw StringError (_("This film was created with a newer version of DCP-o-matic, and it cannot be loaded into this version.  Sorry!"));
+       }
        
        _name = f.string_child ("Name");
        _use_dci_name = f.bool_child ("UseDCIName");
@@ -421,7 +432,7 @@ Film::read_metadata ()
        _three_d = f.bool_child ("ThreeD");
        _interop = f.bool_child ("Interop");
        _key = dcp::Key (f.string_child ("Key"));
-       _playlist->set_from_xml (shared_from_this(), f.node_child ("Playlist"), version);
+       _playlist->set_from_xml (shared_from_this(), f.node_child ("Playlist"), _state_version);
 
        _dirty = false;
 }
@@ -867,7 +878,7 @@ Film::has_subtitles () const
        return _playlist->has_subtitles ();
 }
 
-VideoFrame
+int
 Film::best_video_frame_rate () const
 {
        return _playlist->best_dcp_frame_rate ();
@@ -897,31 +908,7 @@ Film::playlist_changed ()
        signal_changed (CONTENT);
 }      
 
-AudioFrame
-Film::time_to_audio_frames (DCPTime t) const
-{
-       return t * audio_frame_rate () / TIME_HZ;
-}
-
-VideoFrame
-Film::time_to_video_frames (DCPTime t) const
-{
-       return t * video_frame_rate () / TIME_HZ;
-}
-
-DCPTime
-Film::audio_frames_to_time (AudioFrame f) const
-{
-       return f * TIME_HZ / audio_frame_rate ();
-}
-
-DCPTime
-Film::video_frames_to_time (VideoFrame f) const
-{
-       return f * TIME_HZ / video_frame_rate ();
-}
-
-AudioFrame
+int
 Film::audio_frame_rate () const
 {
        /* XXX */
@@ -1000,7 +987,7 @@ Film::make_kdms (
 uint64_t
 Film::required_disk_space () const
 {
-       return uint64_t (j2k_bandwidth() / 8) * length() / TIME_HZ;
+       return uint64_t (j2k_bandwidth() / 8) * length().seconds();
 }
 
 /** This method checks the disk that the Film is on and tries to decide whether or not