X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Ffilm.cc;h=ab636bdfcc3a651fe79cd1b87dd94d15693e93ed;hb=d0d93259d096faa0d410a27450445a3a1a16c430;hp=ff4d3b8f5a7fac14c8b24de5917dd5de78f62928;hpb=2e536ef0971edefea23810b99f7706881072783b;p=dcpomatic.git diff --git a/src/lib/film.cc b/src/lib/film.cc index ff4d3b8f5..ab636bdfc 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -51,6 +51,7 @@ #include "video_decoder.h" #include "audio_decoder.h" #include "external_audio_decoder.h" +#include "analyse_audio_job.h" using std::string; using std::stringstream; @@ -63,7 +64,6 @@ using std::ofstream; using std::setfill; using std::min; using std::make_pair; -using std::cout; using boost::shared_ptr; using boost::lexical_cast; using boost::to_upper_copy; @@ -104,6 +104,8 @@ Film::Film (string d, bool must_exist) , _frames_per_second (0) , _dirty (false) { + set_dci_date_today (); + /* Make state.directory a complete path without ..s (where possible) (Code swiped from Adam Bowen on stackoverflow) */ @@ -139,7 +141,6 @@ Film::Film (string d, bool must_exist) } _log = new FileLog (file ("log")); - set_dci_date_today (); } Film::Film (Film const & o) @@ -171,6 +172,7 @@ Film::Film (Film const & o) , _colour_lut (o._colour_lut) , _j2k_bandwidth (o._j2k_bandwidth) , _dci_metadata (o._dci_metadata) + , _dci_date (o._dci_date) , _size (o._size) , _length (o._length) , _dcp_intrinsic_duration (o._dcp_intrinsic_duration) @@ -236,11 +238,18 @@ Film::video_mxf_filename () const return video_state_identifier() + ".mxf"; } -/** Add suitable Jobs to the JobManager to create a DCP for this Film. - * @param true to transcode, false to use the WAV and J2K files that are already there. - */ +string +Film::audio_analysis_path () const +{ + boost::filesystem::path p; + p /= "analysis"; + p /= content_digest(); + return file (p.string ()); +} + +/** Add suitable Jobs to the JobManager to create a DCP for this Film */ void -Film::make_dcp (bool transcode) +Film::make_dcp () { set_dci_date_today (); @@ -297,13 +306,24 @@ Film::make_dcp (bool transcode) shared_ptr r; - if (transcode) { - if (dcp_ab()) { - r = JobManager::instance()->add (shared_ptr (new ABTranscodeJob (shared_from_this(), od, shared_ptr ()))); - } else { - r = JobManager::instance()->add (shared_ptr (new TranscodeJob (shared_from_this(), od, shared_ptr ()))); - } + if (dcp_ab()) { + r = JobManager::instance()->add (shared_ptr (new ABTranscodeJob (shared_from_this(), od))); + } else { + r = JobManager::instance()->add (shared_ptr (new TranscodeJob (shared_from_this(), od))); + } +} + +/** Start a job to analyse the audio of our content file */ +void +Film::analyse_audio () +{ + if (_analyse_audio_job) { + return; } + + _analyse_audio_job.reset (new AnalyseAudioJob (shared_from_this())); + _analyse_audio_job->Finished.connect (bind (&Film::analyse_audio_finished, this)); + JobManager::instance()->add (_analyse_audio_job); } /** Start a job to examine our content file */ @@ -314,11 +334,20 @@ Film::examine_content () return; } - _examine_content_job.reset (new ExamineContentJob (shared_from_this(), shared_ptr ())); + _examine_content_job.reset (new ExamineContentJob (shared_from_this())); _examine_content_job->Finished.connect (bind (&Film::examine_content_finished, this)); JobManager::instance()->add (_examine_content_job); } +void +Film::analyse_audio_finished () +{ + ensure_ui_thread (); + _analyse_audio_job.reset (); + + AudioAnalysisFinished (); +} + void Film::examine_content_finished () { @@ -329,7 +358,7 @@ Film::examine_content_finished () void Film::send_dcp_to_tms () { - shared_ptr j (new SCPDCPJob (shared_from_this(), shared_ptr ())); + shared_ptr j (new SCPDCPJob (shared_from_this())); JobManager::instance()->add (j); } @@ -409,6 +438,7 @@ Film::write_metadata () const f << "colour_lut " << _colour_lut << "\n"; f << "j2k_bandwidth " << _j2k_bandwidth << "\n"; _dci_metadata.write (f); + f << "dci_date " << boost::gregorian::to_iso_string (_dci_date) << "\n"; f << "width " << _size.width << "\n"; f << "height " << _size.height << "\n"; f << "length " << _length.get_value_or(0) << "\n"; @@ -535,6 +565,8 @@ Film::read_metadata () _colour_lut = atoi (v.c_str ()); } else if (k == "j2k_bandwidth") { _j2k_bandwidth = atoi (v.c_str ()); + } else if (k == "dci_date") { + _dci_date = boost::gregorian::from_undelimited_string (v); } _dci_metadata.read (k, v); @@ -696,7 +728,7 @@ Film::still_duration_in_frames () const /** @return a DCI-compliant name for a DCP of this film */ string -Film::dci_name () const +Film::dci_name (bool if_created_now) const { stringstream d; @@ -764,7 +796,11 @@ Film::dci_name () const d << dm.studio << "_"; } - d << boost::gregorian::to_iso_string (_dci_date) << "_"; + if (if_created_now) { + d << boost::gregorian::to_iso_string (boost::gregorian::day_clock::local_day ()) << "_"; + } else { + d << boost::gregorian::to_iso_string (_dci_date) << "_"; + } if (!dm.facility.empty ()) { d << dm.facility << "_"; @@ -779,10 +815,10 @@ Film::dci_name () const /** @return name to give the DCP */ string -Film::dcp_name () const +Film::dcp_name (bool if_created_now) const { if (use_dci_name()) { - return dci_name (); + return dci_name (if_created_now); } return name(); @@ -866,6 +902,13 @@ Film::set_content (string c) set_content_audio_streams (d.audio->audio_streams ()); } + { + boost::mutex::scoped_lock lm (_state_mutex); + _content = c; + } + + signal_changed (CONTENT); + /* Start off with the first audio and subtitle streams */ if (d.audio && !d.audio->audio_streams().empty()) { set_content_audio_stream (d.audio->audio_streams().front()); @@ -875,13 +918,6 @@ Film::set_content (string c) set_subtitle_stream (d.video->subtitle_streams().front()); } - { - boost::mutex::scoped_lock lm (_state_mutex); - _content = c; - } - - signal_changed (CONTENT); - examine_content (); } catch (...) { @@ -1355,4 +1391,20 @@ Film::j2c_path (int f, bool t) const return file (p.string ()); } +/** Make an educated guess as to whether we have a complete DCP + * or not. + * @return true if we do. + */ +bool +Film::have_dcp () const +{ + try { + libdcp::DCP dcp (dir (dcp_name())); + dcp.read (); + } catch (...) { + return false; + } + + return true; +}