X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Ffilm.cc;h=267138ce63b74d51054d695b52777bd405a6ebc9;hb=854f2e5bbb7ffb9758b823af87034033033f3cb8;hp=e463a0e356c950c2886fab844bdadb30a54f3015;hpb=e8c1880a2b9a40eb11ee259feee3edd799139a43;p=dcpomatic.git diff --git a/src/lib/film.cc b/src/lib/film.cc index e463a0e35..267138ce6 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2013 Carl Hetherington + Copyright (C) 2012-2014 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,14 +28,13 @@ #include #include #include -#include #include #include #include #include #include #include -#include +#include #include "film.h" #include "job.h" #include "util.h" @@ -85,8 +84,10 @@ using dcp::Signer; * AudioMapping XML changed. * 6 -> 7 * Subtitle offset changed to subtitle y offset, and subtitle x offset added. + * 7 -> 8 + * Use tag in rather than . */ -int const Film::current_state_version = 7; +int const Film::current_state_version = 8; /** Construct a Film object in a given directory. * @@ -230,11 +231,9 @@ Film::filename_safe_name () const } boost::filesystem::path -Film::audio_analysis_path (shared_ptr c) const +Film::audio_analysis_dir () const { - boost::filesystem::path p = dir ("analysis"); - p /= c->digest(); - return p; + return dir ("analysis"); } /** Add suitable Jobs to the JobManager to create a DCP for this Film */ @@ -246,7 +245,12 @@ Film::make_dcp () if (dcp_name().find ("/") != string::npos) { throw BadSettingError (_("name"), _("cannot contain slashes")); } - + + /* It seems to make sense to auto-save metadata here, since the make DCP may last + a long time, and crashes/power failures are moderately likely. + */ + write_metadata (); + log()->log (String::compose ("DCP-o-matic %1 git %2 using %3", dcpomatic_version, dcpomatic_git_commit, dependency_version_summary())); { @@ -381,8 +385,10 @@ Film::write_metadata () const _dirty = false; } -/** Read state from our metadata file */ -void +/** Read state from our metadata file. + * @return Notes about things that the user should know about, or empty. + */ +list Film::read_metadata () { LocaleGuard lg; @@ -395,6 +401,9 @@ Film::read_metadata () f.read_file (file ("metadata.xml")); _state_version = f.number_child ("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"); @@ -427,9 +436,13 @@ 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"), _state_version); + + list notes; + /* This method is the only one that can return notes (so far) */ + _playlist->set_from_xml (shared_from_this(), f.node_child ("Playlist"), _state_version, notes); _dirty = false; + return notes; } /** Given a directory name, return its full path within the Film's directory. @@ -873,7 +886,7 @@ Film::has_subtitles () const return _playlist->has_subtitles (); } -VideoFrame +int Film::best_video_frame_rate () const { return _playlist->best_dcp_frame_rate (); @@ -903,31 +916,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 */ @@ -942,6 +931,7 @@ Film::set_sequence_video (bool s) signal_changed (SEQUENCE_VIDEO); } +/** @return Size of the largest possible image in whatever resolution we are using */ dcp::Size Film::full_frame () const { @@ -956,12 +946,19 @@ Film::full_frame () const return dcp::Size (); } -dcp::KDM +/** @return Size of the frame */ +dcp::Size +Film::frame_size () const +{ + return fit_ratio_within (container()->ratio(), full_frame ()); +} + +dcp::EncryptedKDM Film::make_kdm ( shared_ptr target, boost::filesystem::path dcp_dir, - boost::posix_time::ptime from, - boost::posix_time::ptime until + dcp::LocalTime from, + dcp::LocalTime until ) const { shared_ptr signer = make_signer (); @@ -974,24 +971,22 @@ Film::make_kdm ( throw KDMError (_("Could not read DCP to make KDM for")); } - time_t now = time (0); - struct tm* tm = localtime (&now); - string const issue_date = dcp::tm_to_string (tm); - dcp.cpls().front()->set_mxf_keys (key ()); - return dcp::KDM (dcp.cpls().front(), signer, target, from, until, "DCP-o-matic", issue_date); + return dcp::DecryptedKDM ( + dcp.cpls().front(), from, until, "DCP-o-matic", dcp.cpls().front()->content_title_text(), dcp::LocalTime().as_string() + ).encrypt (signer, target); } -list +list Film::make_kdms ( list > screens, boost::filesystem::path dcp, - boost::posix_time::ptime from, - boost::posix_time::ptime until + dcp::LocalTime from, + dcp::LocalTime until ) const { - list kdms; + list kdms; for (list >::iterator i = screens.begin(); i != screens.end(); ++i) { kdms.push_back (make_kdm ((*i)->certificate, dcp, from, until)); @@ -1006,7 +1001,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