Give a warning on make DCP if it seems unlikely that the disk will have enough space...
[dcpomatic.git] / src / lib / film.cc
index b1b86898403fdbb62c39b6fe1bc9e42eed0bd9c7..edd47c6d056df916df4793e63d7fe965774a8865 100644 (file)
@@ -81,7 +81,7 @@ using boost::optional;
 using libdcp::Size;
 using libdcp::Signer;
 
-int const Film::state_version = 4;
+int const Film::state_version = 5;
 
 /** Construct a Film object in a given directory.
  *
@@ -96,6 +96,7 @@ Film::Film (boost::filesystem::path dir)
        , _resolution (RESOLUTION_2K)
        , _scaler (Scaler::from_id ("bicubic"))
        , _with_subtitles (false)
+       , _signed (true)
        , _encrypted (false)
        , _j2k_bandwidth (Config::instance()->default_j2k_bandwidth ())
        , _dci_metadata (Config::instance()->default_dci_metadata ())
@@ -351,6 +352,7 @@ Film::write_metadata () const
        root->add_child("ThreeD")->add_child_text (_three_d ? "1" : "0");
        root->add_child("SequenceVideo")->add_child_text (_sequence_video ? "1" : "0");
        root->add_child("Interop")->add_child_text (_interop ? "1" : "0");
+       root->add_child("Signed")->add_child_text (_signed ? "1" : "0");
        root->add_child("Encrypted")->add_child_text (_encrypted ? "1" : "0");
        root->add_child("Key")->add_child_text (_key.hex ());
        _playlist->as_xml (root->add_child ("Playlist"));
@@ -372,6 +374,8 @@ Film::read_metadata ()
 
        cxml::Document f ("Metadata");
        f.read_file (file ("metadata.xml"));
+
+       int const version = f.number_child<int> ("Version");
        
        _name = f.string_child ("Name");
        _use_dci_name = f.bool_child ("UseDCIName");
@@ -397,13 +401,14 @@ Film::read_metadata ()
        _dci_metadata = DCIMetadata (f.node_child ("DCIMetadata"));
        _video_frame_rate = f.number_child<int> ("VideoFrameRate");
        _dci_date = boost::gregorian::from_undelimited_string (f.string_child ("DCIDate"));
+       _signed = f.optional_bool_child("Signed").get_value_or (true);
        _encrypted = f.bool_child ("Encrypted");
        _audio_channels = f.number_child<int> ("AudioChannels");
        _sequence_video = f.bool_child ("SequenceVideo");
        _three_d = f.bool_child ("ThreeD");
        _interop = f.bool_child ("Interop");
        _key = libdcp::Key (f.string_child ("Key"));
-       _playlist->set_from_xml (shared_from_this(), f.node_child ("Playlist"));
+       _playlist->set_from_xml (shared_from_this(), f.node_child ("Playlist"), version);
 
        _dirty = false;
 }
@@ -760,6 +765,13 @@ Film::make_player () const
        return shared_ptr<Player> (new Player (shared_from_this (), _playlist));
 }
 
+void
+Film::set_signed (bool s)
+{
+       _signed = s;
+       signal_changed (SIGNED);
+}
+
 void
 Film::set_encrypted (bool e)
 {
@@ -848,12 +860,6 @@ Film::best_video_frame_rate () const
        return _playlist->best_dcp_frame_rate ();
 }
 
-bool
-Film::content_paths_valid () const
-{
-       return _playlist->content_paths_valid ();
-}
-
 void
 Film::playlist_content_changed (boost::weak_ptr<Content> c, int p)
 {
@@ -968,3 +974,28 @@ Film::make_kdms (
 
        return kdms;
 }
+
+/** @return The approximate disk space required to encode a DCP of this film with the
+ *  current settings, in bytes.
+ */
+uint64_t
+Film::required_disk_space () const
+{
+       return uint64_t (j2k_bandwidth() / 8) * length() / TIME_HZ;
+}
+
+/** This method checks the disk that the Film is on and tries to decide whether or not
+ *  there will be enough space to make a DCP for it.  If so, true is returned; if not,
+ *  false is returned and required and availabe are filled in with the amount of disk space
+ *  required and available respectively (in Gb).
+ *
+ *  Note: the decision made by this method isn't, of course, 100% reliable.
+ */
+bool
+Film::should_be_enough_disk_space (double& required, double& available) const
+{
+       boost::filesystem::space_info s = boost::filesystem::space (internal_video_mxf_dir ());
+       required = double (required_disk_space ()) / 1073741824.0f;
+       available = double (s.available) / 1073741824.0f;
+       return (available - required) > 1;
+}