X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Ffilm.cc;h=57d23ec4eed51e3596e89f0abad5376c53f0b75f;hb=e8204f55c981493b99814f71a50b3c3d62601032;hp=650163efebe174b1e810f960869bfdb27ad46d6c;hpb=080da912e04d156d9260a3a5eead9034d2a72af3;p=dcpomatic.git diff --git a/src/lib/film.cc b/src/lib/film.cc index 650163efe..57d23ec4e 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -64,8 +64,6 @@ using std::multimap; using std::pair; using std::map; using std::vector; -using std::ifstream; -using std::ofstream; using std::setfill; using std::min; using std::make_pair; @@ -83,7 +81,10 @@ using boost::optional; using libdcp::Size; using libdcp::Signer; -int const Film::state_version = 4; +/* 5 -> 6 + * AudioMapping XML changed. + */ +int const Film::state_version = 6; /** Construct a Film object in a given directory. * @@ -98,6 +99,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 ()) @@ -151,6 +153,12 @@ Film::video_identifier () const << "_" << scaler()->id() << "_" << j2k_bandwidth(); + if (encrypted ()) { + s << "_E"; + } else { + s << "_P"; + } + if (_interop) { s << "_I"; } else { @@ -347,6 +355,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")); @@ -368,6 +377,8 @@ Film::read_metadata () cxml::Document f ("Metadata"); f.read_file (file ("metadata.xml")); + + int const version = f.number_child ("Version"); _name = f.string_child ("Name"); _use_dci_name = f.bool_child ("UseDCIName"); @@ -393,13 +404,14 @@ Film::read_metadata () _dci_metadata = DCIMetadata (f.node_child ("DCIMetadata")); _video_frame_rate = f.number_child ("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 ("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; } @@ -756,6 +768,13 @@ Film::make_player () const return shared_ptr (new Player (shared_from_this (), _playlist)); } +void +Film::set_signed (bool s) +{ + _signed = s; + signal_changed (SIGNED); +} + void Film::set_encrypted (bool e) { @@ -826,7 +845,7 @@ Film::move_content_later (shared_ptr c) _playlist->move_later (c); } -Time +DCPTime Film::length () const { return _playlist->length (); @@ -838,16 +857,16 @@ Film::has_subtitles () const return _playlist->has_subtitles (); } -OutputVideoFrame +VideoFrame Film::best_video_frame_rate () const { return _playlist->best_dcp_frame_rate (); } -bool -Film::content_paths_valid () const +FrameRateChange +Film::active_frame_rate_change (DCPTime t) const { - return _playlist->content_paths_valid (); + return _playlist->active_frame_rate_change (t, video_frame_rate ()); } void @@ -868,31 +887,31 @@ Film::playlist_changed () signal_changed (CONTENT); } -OutputAudioFrame -Film::time_to_audio_frames (Time t) const +AudioFrame +Film::time_to_audio_frames (DCPTime t) const { return t * audio_frame_rate () / TIME_HZ; } -OutputVideoFrame -Film::time_to_video_frames (Time t) const +VideoFrame +Film::time_to_video_frames (DCPTime t) const { return t * video_frame_rate () / TIME_HZ; } -Time -Film::audio_frames_to_time (OutputAudioFrame f) const +DCPTime +Film::audio_frames_to_time (AudioFrame f) const { return f * TIME_HZ / audio_frame_rate (); } -Time -Film::video_frames_to_time (OutputVideoFrame f) const +DCPTime +Film::video_frames_to_time (VideoFrame f) const { return f * TIME_HZ / video_frame_rate (); } -OutputAudioFrame +AudioFrame Film::audio_frame_rate () const { /* XXX */ @@ -964,3 +983,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; +}