X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Ffilm.cc;h=267138ce63b74d51054d695b52777bd405a6ebc9;hb=854f2e5bbb7ffb9758b823af87034033033f3cb8;hp=11fb9e4b0a671f6eef1ab9db22da95f565083f66;hpb=1b1bc528ee5ca1fee1bd33f9fb6f79cd551e3b33;p=dcpomatic.git diff --git a/src/lib/film.cc b/src/lib/film.cc index 11fb9e4b0..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. @@ -918,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 { @@ -932,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 (); @@ -950,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));