X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Ffilm.cc;h=f57b6299dfd551cb99756ee4251fccf96747654c;hb=848d897596f00828cf1aa6c064d06e69bd40922c;hp=04ff0025088300b6712659791e9c18fc7ee44934;hpb=89ae13638097f259f3e50b4b61068dd23451107d;p=dcpomatic.git diff --git a/src/lib/film.cc b/src/lib/film.cc index 04ff00250..f57b6299d 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -19,7 +19,7 @@ */ /** @file src/film.cc - * @brief A representation of some audio and video content, and details of + * @brief A representation of some audio, video and subtitle content, and details of * how they should be presented in a DCP. */ @@ -27,6 +27,7 @@ #include "job.h" #include "util.h" #include "job_manager.h" +#include "dcp_encoder.h" #include "transcode_job.h" #include "upload_job.h" #include "null_log.h" @@ -98,6 +99,8 @@ using dcp::raw_convert; #define LOG_GENERAL(...) log()->log (String::compose (__VA_ARGS__), LogEntry::TYPE_GENERAL); #define LOG_GENERAL_NC(...) log()->log (__VA_ARGS__, LogEntry::TYPE_GENERAL); +string const Film::metadata_file = "metadata.xml"; + /* 5 -> 6 * AudioMapping XML changed. * 6 -> 7 @@ -306,7 +309,7 @@ Film::make_dcp () } if (name().empty()) { - throw MissingSettingError (_("name")); + set_name ("DCP"); } BOOST_FOREACH (shared_ptr i, content ()) { @@ -339,7 +342,9 @@ Film::make_dcp () } LOG_GENERAL ("J2K bandwidth %1", j2k_bandwidth()); - JobManager::instance()->add (shared_ptr (new TranscodeJob (shared_from_this()))); + shared_ptr tj (new TranscodeJob (shared_from_this())); + tj->set_encoder (shared_ptr (new DCPEncoder (shared_from_this(), tj))); + JobManager::instance()->add (tj); } /** Start a job to send our DCP to the configured TMS */ @@ -399,7 +404,7 @@ Film::write_metadata () const DCPOMATIC_ASSERT (directory()); boost::filesystem::create_directories (directory().get()); shared_ptr doc = metadata (); - doc->write_to_file_formatted (file("metadata.xml").string ()); + doc->write_to_file_formatted (file(metadata_file).string ()); _dirty = false; } @@ -419,11 +424,11 @@ list Film::read_metadata (optional path) { if (!path) { - if (boost::filesystem::exists (file ("metadata")) && !boost::filesystem::exists (file ("metadata.xml"))) { + if (boost::filesystem::exists (file ("metadata")) && !boost::filesystem::exists (file (metadata_file))) { throw runtime_error (_("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!")); } - path = file ("metadata.xml"); + path = file (metadata_file); } cxml::Document f ("Metadata"); @@ -509,7 +514,7 @@ Film::read_metadata (optional path) } /** Given a directory name, return its full path within the Film's directory. - * @param d directory name within the Filn's directory. + * @param d directory name within the Film's directory. * @param create true to create the directory (and its parents) if they do not exist. */ boost::filesystem::path @@ -664,7 +669,7 @@ Film::isdcf_name (bool if_created_now) const /* XXX: this uses the first bit of content only */ - /* The standard says we don't do this for trailers, for some strange reason */ + /* Interior aspect ratio. The standard says we don't do this for trailers, for some strange reason */ if (dcp_content_type() && dcp_content_type()->libdcp_kind() != dcp::TRAILER) { Ratio const * content_ratio = 0; BOOST_FOREACH (shared_ptr i, content ()) { @@ -680,7 +685,8 @@ Film::isdcf_name (bool if_created_now) const } if (content_ratio && content_ratio != container()) { - d += "-" + content_ratio->isdcf_name(); + /* This needs to be the numeric version of the ratio, and ::id() is close enough */ + d += "-" + content_ratio->id(); } } @@ -1022,24 +1028,27 @@ Film::content () const return _playlist->content (); } +/** @param content Content to add. + * @param disable_audio_analysis true to never do automatic audio analysis, even if it is enabled in configuration. + */ void -Film::examine_and_add_content (shared_ptr c) +Film::examine_and_add_content (shared_ptr content, bool disable_audio_analysis) { - if (dynamic_pointer_cast (c) && _directory) { - run_ffprobe (c->path(0), file ("ffprobe.log"), _log); + if (dynamic_pointer_cast (content) && _directory) { + run_ffprobe (content->path(0), file ("ffprobe.log"), _log); } - shared_ptr j (new ExamineContentJob (shared_from_this(), c)); + shared_ptr j (new ExamineContentJob (shared_from_this(), content)); _job_connections.push_back ( - j->Finished.connect (bind (&Film::maybe_add_content, this, weak_ptr (j), weak_ptr (c))) + j->Finished.connect (bind (&Film::maybe_add_content, this, weak_ptr(j), weak_ptr(content), disable_audio_analysis)) ); JobManager::instance()->add (j); } void -Film::maybe_add_content (weak_ptr j, weak_ptr c) +Film::maybe_add_content (weak_ptr j, weak_ptr c, bool disable_audio_analysis) { shared_ptr job = j.lock (); if (!job || !job->finished_ok ()) { @@ -1053,7 +1062,7 @@ Film::maybe_add_content (weak_ptr j, weak_ptr c) add_content (content); - if (Config::instance()->automatic_audio_analysis() && content->audio) { + if (Config::instance()->automatic_audio_analysis() && content->audio && !disable_audio_analysis) { shared_ptr playlist (new Playlist); playlist->add (content); boost::signals2::connection c; @@ -1078,7 +1087,7 @@ Film::add_content (shared_ptr c) /* Take settings from the first piece of content of c's type in _template */ BOOST_FOREACH (shared_ptr i, _template_film->content()) { if (typeid(i.get()) == typeid(c.get())) { - c->use_template (i); + c->take_settings_from (i); } } } @@ -1108,7 +1117,7 @@ Film::move_content_later (shared_ptr c) DCPTime Film::length () const { - return _playlist->length (); + return _playlist->length().ceil(video_frame_rate()); } int @@ -1451,7 +1460,7 @@ list Film::reels () const { list p; - DCPTime const len = length().ceil (video_frame_rate ()); + DCPTime const len = length(); switch (reel_type ()) { case REELTYPE_SINGLE: @@ -1575,3 +1584,9 @@ Film::speed_up_range (int dcp_frame_rate) const { return _playlist->speed_up_range (dcp_frame_rate); } + +void +Film::copy_from (shared_ptr film) +{ + read_metadata (film->file (metadata_file)); +}