X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Ffilm.cc;h=bdd650437568cd62ce2702ac931383384cc20666;hb=308488324dbc4d8b709d3fb1dc9fee0479346c21;hp=21e7383bf94fcfbfd0635c7d1c0efe3c90ee2741;hpb=a4c19a34244aeaf183c25878933b570fc5c0ee34;p=dcpomatic.git diff --git a/src/lib/film.cc b/src/lib/film.cc index 21e7383bf..bdd650437 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,14 @@ #include #include #include -#include #include #include #include #include #include #include -#include +#include +#include #include "film.h" #include "job.h" #include "util.h" @@ -72,7 +72,6 @@ using std::cout; using std::list; using boost::shared_ptr; using boost::weak_ptr; -using boost::lexical_cast; using boost::dynamic_pointer_cast; using boost::to_upper_copy; using boost::ends_with; @@ -80,6 +79,7 @@ using boost::starts_with; using boost::optional; using dcp::Size; using dcp::Signer; +using dcp::raw_convert; /* 5 -> 6 * AudioMapping XML changed. @@ -152,9 +152,10 @@ string Film::video_identifier () const { assert (container ()); - LocaleGuard lg; stringstream s; + s.imbue (std::locale::classic ()); + s << container()->id() << "_" << resolution_to_string (_resolution) << "_" << _playlist->video_identifier() @@ -232,11 +233,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 */ @@ -248,7 +247,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())); { @@ -337,12 +341,10 @@ Film::encoded_frames () const shared_ptr Film::metadata () const { - LocaleGuard lg; - shared_ptr doc (new xmlpp::Document); xmlpp::Element* root = doc->create_root_node ("Metadata"); - root->add_child("Version")->add_child_text (lexical_cast (current_state_version)); + root->add_child("Version")->add_child_text (raw_convert (current_state_version)); root->add_child("Name")->add_child_text (_name); root->add_child("UseDCIName")->add_child_text (_use_dci_name ? "1" : "0"); @@ -357,11 +359,11 @@ Film::metadata () const root->add_child("Resolution")->add_child_text (resolution_to_string (_resolution)); root->add_child("Scaler")->add_child_text (_scaler->id ()); root->add_child("WithSubtitles")->add_child_text (_with_subtitles ? "1" : "0"); - root->add_child("J2KBandwidth")->add_child_text (lexical_cast (_j2k_bandwidth)); + root->add_child("J2KBandwidth")->add_child_text (raw_convert (_j2k_bandwidth)); _dci_metadata.as_xml (root->add_child ("DCIMetadata")); - root->add_child("VideoFrameRate")->add_child_text (lexical_cast (_video_frame_rate)); + root->add_child("VideoFrameRate")->add_child_text (raw_convert (_video_frame_rate)); root->add_child("DCIDate")->add_child_text (boost::gregorian::to_iso_string (_dci_date)); - root->add_child("AudioChannels")->add_child_text (lexical_cast (_audio_channels)); + root->add_child("AudioChannels")->add_child_text (raw_convert (_audio_channels)); 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"); @@ -383,12 +385,12 @@ 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; - if (boost::filesystem::exists (file ("metadata")) && !boost::filesystem::exists (file ("metadata.xml"))) { throw StringError (_("This film was created with an older version of DCP-o-matic, and unfortunately it cannot be loaded into this version. You will need to create a new Film, re-add your content and set it up again. Sorry!")); } @@ -432,9 +434,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. @@ -818,6 +824,10 @@ Film::content () const void Film::examine_and_add_content (shared_ptr c) { + if (dynamic_pointer_cast (c)) { + run_ffprobe (c->path(0), file ("ffprobe.log"), _log); + } + shared_ptr j (new ExamineContentJob (shared_from_this(), c)); j->Finished.connect (bind (&Film::maybe_add_content, this, boost::weak_ptr (j), boost::weak_ptr (c))); JobManager::instance()->add (j); @@ -923,6 +933,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 { @@ -937,12 +948,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 (); @@ -955,24 +973,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));