X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fhints.cc;h=4d3b2d95ee91161fddbde42a84fe3ab17c5e5322;hb=39fb8198febde1937019db1c300ec363aab5aa56;hp=cfd8a29ddfff2e42709f9c5490c09a5d27b77a2f;hpb=1bcf14c383fad1dd87dda8d6b506887b63fa8b34;p=dcpomatic.git diff --git a/src/lib/hints.cc b/src/lib/hints.cc index cfd8a29dd..4d3b2d95e 100644 --- a/src/lib/hints.cc +++ b/src/lib/hints.cc @@ -18,6 +18,7 @@ */ + #include "dcp_content_type.h" #include "hints.h" #include "types.h" @@ -45,6 +46,7 @@ #include "i18n.h" + using std::cout; using std::make_shared; using std::max; @@ -73,20 +75,23 @@ using namespace boost::placeholders; */ -Hints::Hints (weak_ptr film) - : WeakConstFilm (film) - , _writer (new Writer(film, weak_ptr(), true)) +Hints::Hints (weak_ptr weak_film) + : WeakConstFilm (weak_film) + , _writer (new Writer(weak_film, weak_ptr(), true)) + , _analyser (film(), film()->playlist(), true, [](float) {}) , _stop (false) { } + void Hints::start () { _thread = boost::thread (bind(&Hints::thread, this)); } + Hints::~Hints () { boost::this_thread::disable_interruption dis; @@ -255,7 +260,7 @@ Hints::check_big_font_files () for (auto i: film()->content()) { for (auto j: i->text) { for (auto k: j->fonts()) { - optional const p = k->file (); + auto const p = k->file (); if (p && boost::filesystem::file_size(p.get()) >= (MAX_FONT_FILE_SIZE - SIZE_SLACK)) { big_font_files = true; } @@ -275,7 +280,7 @@ Hints::check_vob () { int vob = 0; for (auto i: film()->content()) { - if (boost::algorithm::starts_with (i->path(0).filename().string(), "VTS_")) { + if (boost::algorithm::starts_with(i->path(0).filename().string(), "VTS_")) { ++vob; } } @@ -302,42 +307,46 @@ Hints::check_3d_in_2d () } -void +/** @return true if the loudness could be checked, false if it could not because no analysis was available */ +bool Hints::check_loudness () { auto path = film()->audio_analysis_path(film()->playlist()); - if (boost::filesystem::exists (path)) { - try { - auto an = make_shared(path); + if (!boost::filesystem::exists(path)) { + return false; + } - string ch; + try { + auto an = make_shared(path); - auto sample_peak = an->sample_peak (); - auto true_peak = an->true_peak (); + string ch; - for (size_t i = 0; i < sample_peak.size(); ++i) { - float const peak = max (sample_peak[i].peak, true_peak.empty() ? 0 : true_peak[i]); - float const peak_dB = linear_to_db(peak) + an->gain_correction(film()->playlist()); - if (peak_dB > -3) { - ch += dcp::raw_convert (short_audio_channel_name (i)) + ", "; - } + auto sample_peak = an->sample_peak (); + auto true_peak = an->true_peak (); + + for (size_t i = 0; i < sample_peak.size(); ++i) { + float const peak = max (sample_peak[i].peak, true_peak.empty() ? 0 : true_peak[i]); + float const peak_dB = linear_to_db(peak) + an->gain_correction(film()->playlist()); + if (peak_dB > -3) { + ch += dcp::raw_convert(short_audio_channel_name(i)) + ", "; } + } - ch = ch.substr (0, ch.length() - 2); + ch = ch.substr (0, ch.length() - 2); - if (!ch.empty ()) { - hint (String::compose ( - _("Your audio level is very high (on %1). You should reduce the gain of your audio content."), - ch - ) - ); - } - } catch (OldFormatError& e) { - /* The audio analysis is too old to load in; just skip this hint as if - it had never been run. - */ + if (!ch.empty()) { + hint(String::compose( + _("Your audio level is very high (on %1). You should reduce the gain of your audio content."), + ch + ) + ); } + } catch (OldFormatError& e) { + /* The audio analysis is too old to load in */ + return false; } + + return true; } @@ -363,7 +372,10 @@ Hints::check_out_of_range_markers () void Hints::thread () +try { + start_of_thread ("Hints"); + auto film = _film.lock (); if (!film) { return; @@ -383,36 +395,46 @@ Hints::thread () check_speed_up (); check_vob (); check_3d_in_2d (); - check_loudness (); + auto const check_loudness_done = check_loudness (); check_ffec_and_ffmc_in_smpte_feature (); check_out_of_range_markers (); check_text_languages (); - emit (bind(boost::ref(Progress), _("Examining subtitles and closed captions"))); + if (check_loudness_done) { + emit (bind(boost::ref(Progress), _("Examining subtitles and closed captions"))); + } else { + emit (bind(boost::ref(Progress), _("Examining audio, subtitles and closed captions"))); + } auto player = make_shared(film); player->set_ignore_video (); - player->set_ignore_audio (); + if (check_loudness_done) { + /* We don't need to analyse audio because we already loaded a suitable analysis */ + player->set_ignore_audio (); + } + player->Audio.connect (bind(&Hints::audio, this, _1, _2)); player->Text.connect (bind(&Hints::text, this, _1, _2, _3, _4)); struct timeval last_pulse; gettimeofday (&last_pulse, 0); - try { - while (!player->pass()) { + while (!player->pass()) { - struct timeval now; - gettimeofday (&now, 0); - if ((seconds(now) - seconds(last_pulse)) > 1) { - if (_stop) { - break; - } - emit (bind (boost::ref(Pulse))); - last_pulse = now; + struct timeval now; + gettimeofday (&now, 0); + if ((seconds(now) - seconds(last_pulse)) > 1) { + if (_stop) { + return; } + emit (bind (boost::ref(Pulse))); + last_pulse = now; } - } catch (...) { - store_current (); + } + + if (!check_loudness_done) { + _analyser.finish (); + _analyser.get().write(film->audio_analysis_path(film->playlist())); + check_loudness (); } _writer->write (player->get_subtitle_fonts()); @@ -427,16 +449,10 @@ Hints::thread () bool ccap_mxf_too_big = false; bool subs_mxf_too_big = false; - boost::filesystem::path dcp_dir = film->dir("hints") / dcpomatic::get_process_id(); + auto dcp_dir = film->dir("hints") / dcpomatic::get_process_id(); boost::filesystem::remove_all (dcp_dir); - try { - _writer->finish (film->dir("hints") / dcpomatic::get_process_id()); - } catch (...) { - store_current (); - emit (bind(boost::ref(Finished))); - return; - } + _writer->finish (film->dir("hints") / dcpomatic::get_process_id()); dcp::DCP dcp (dcp_dir); dcp.read (); @@ -470,6 +486,15 @@ Hints::thread () emit (bind(boost::ref(Finished))); } +catch (boost::thread_interrupted) +{ + /* The Hints object is being destroyed before it has finished, so just give up */ +} +catch (...) +{ + store_current (); +} + void Hints::hint (string h) @@ -477,6 +502,14 @@ Hints::hint (string h) emit(bind(boost::ref(Hint), h)); } + +void +Hints::audio (shared_ptr audio, DCPTime time) +{ + _analyser.analyse (audio, time); +} + + void Hints::text (PlayerText text, TextType type, optional track, DCPTimePeriod period) {