From 68f662ac50a00ad986e3bd258c3f7daac374ab26 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 23 Jan 2015 23:17:36 +0000 Subject: [PATCH] Hand-apply 111f02f4fc8ace359a16aea1c88c2821bf3dde31 from master; improve progress reporting when scanning a file for length. --- TO_PORT | 1 - src/lib/ffmpeg_content.cc | 2 +- src/lib/ffmpeg_examiner.cc | 7 ++++++- src/lib/ffmpeg_examiner.h | 4 ++-- src/lib/job.cc | 41 ++++++++++++++++++++++++-------------- src/lib/job.h | 5 +---- src/tools/dcpomatic_cli.cc | 4 +--- src/wx/job_manager_view.cc | 17 +++++++--------- 8 files changed, 44 insertions(+), 37 deletions(-) diff --git a/TO_PORT b/TO_PORT index fb68cba31..c74375424 100644 --- a/TO_PORT +++ b/TO_PORT @@ -1,4 +1,3 @@ -0e86c9ee06ab902e4a59ca7e866d7df5bfa29cc5 aa3c14f5093f8c228bc9763d601dc6f4aafd1a0a 3cee9121d9cda951e3fb15a53a792b682a27a01b e48f13a1fc46fb469417d602acfe4b3fa57d5aa2 diff --git a/src/lib/ffmpeg_content.cc b/src/lib/ffmpeg_content.cc index 66f78d541..d5fd592d6 100644 --- a/src/lib/ffmpeg_content.cc +++ b/src/lib/ffmpeg_content.cc @@ -169,7 +169,7 @@ FFmpegContent::examine (shared_ptr job, bool calculate_digest) Content::examine (job, calculate_digest); - shared_ptr examiner (new FFmpegExaminer (shared_from_this ())); + shared_ptr examiner (new FFmpegExaminer (shared_from_this (), job)); take_from_video_examiner (examiner); shared_ptr film = _film.lock (); diff --git a/src/lib/ffmpeg_examiner.cc b/src/lib/ffmpeg_examiner.cc index f28060a56..4409526dc 100644 --- a/src/lib/ffmpeg_examiner.cc +++ b/src/lib/ffmpeg_examiner.cc @@ -23,6 +23,7 @@ extern "C" { } #include "ffmpeg_examiner.h" #include "ffmpeg_content.h" +#include "job.h" #include "ffmpeg_audio_stream.h" #include "ffmpeg_subtitle_stream.h" #include "util.h" @@ -36,7 +37,8 @@ using std::max; using boost::shared_ptr; using boost::optional; -FFmpegExaminer::FFmpegExaminer (shared_ptr c) +/** @param job job that the examiner is operating in, or 0 */ +FFmpegExaminer::FFmpegExaminer (shared_ptr c, shared_ptr job) : FFmpeg (c) , _need_video_length (false) { @@ -69,6 +71,9 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr c) _need_video_length = _format_context->duration == AV_NOPTS_VALUE; if (!_need_video_length) { _video_length = ContentTime::from_seconds (double (_format_context->duration) / AV_TIME_BASE); + } else if (job) { + job->sub (_("Finding length")); + job->set_progress_unknown (); } /* Run through until we find: diff --git a/src/lib/ffmpeg_examiner.h b/src/lib/ffmpeg_examiner.h index c24d2ebcf..b873222c1 100644 --- a/src/lib/ffmpeg_examiner.h +++ b/src/lib/ffmpeg_examiner.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2013 Carl Hetherington + Copyright (C) 2013-2015 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 @@ -27,7 +27,7 @@ class FFmpegSubtitleStream; class FFmpegExaminer : public FFmpeg, public VideoExaminer { public: - FFmpegExaminer (boost::shared_ptr); + FFmpegExaminer (boost::shared_ptr, boost::shared_ptr job = boost::shared_ptr ()); boost::optional video_frame_rate () const; dcp::Size video_size () const; diff --git a/src/lib/job.cc b/src/lib/job.cc index e11efa407..68aa6230a 100644 --- a/src/lib/job.cc +++ b/src/lib/job.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2014 Carl Hetherington + Copyright (C) 2012-2015 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 @@ -38,6 +38,7 @@ using std::string; using std::list; using std::cout; using boost::shared_ptr; +using boost::optional; #define LOG_ERROR_NC(...) _film->log()->log (__VA_ARGS__, Log::TYPE_ERROR); @@ -224,7 +225,7 @@ Job::elapsed_time () const void Job::set_progress (float p, bool force) { - if (!force && fabs (p - progress()) < 0.01) { + if (!force && fabs (p - progress().get_value_or(0)) < 0.01) { /* Calm excessive progress reporting */ return; } @@ -243,12 +244,12 @@ Job::set_progress (float p, bool force) } } -/** @return fractional progress of the current sub-job, or -1 if not known */ -float +/** @return fractional progress of the current sub-job, if known */ +optional Job::progress () const { boost::mutex::scoped_lock lm (_progress_mutex); - return _progress.get_value_or (-1); + return _progress; } void @@ -298,26 +299,32 @@ Job::set_progress_unknown () { boost::mutex::scoped_lock lm (_progress_mutex); _progress.reset (); + lm.unlock (); + + if (ui_signaller) { + ui_signaller->emit (boost::bind (boost::ref (Progress))); + } } /** @return Human-readable status of this job */ string Job::status () const { - float const p = progress (); + optional p = progress (); int const t = elapsed_time (); int const r = remaining_time (); - int pc = rint (p * 100); - if (pc == 100) { - /* 100% makes it sound like we've finished when we haven't */ - pc = 99; - } - SafeStringStream s; - if (!finished ()) { + if (!finished () && p) { + int pc = rint (p.get() * 100); + if (pc == 100) { + /* 100% makes it sound like we've finished when we haven't */ + pc = 99; + } + s << pc << N_("%"); - if (p >= 0 && t > 10 && r > 0) { + + if (t > 10 && r > 0) { /// TRANSLATORS: remaining here follows an amount of time that is remaining /// on an operation. s << "; " << seconds_to_approximate_hms (r) << " " << _("remaining"); @@ -341,7 +348,11 @@ Job::status () const int Job::remaining_time () const { - return elapsed_time() / progress() - elapsed_time(); + if (progress().get_value_or(0) == 0) { + return elapsed_time (); + } + + return elapsed_time() / progress().get() - elapsed_time(); } void diff --git a/src/lib/job.h b/src/lib/job.h index 28c12a3dc..f6120f128 100644 --- a/src/lib/job.h +++ b/src/lib/job.h @@ -71,10 +71,7 @@ public: void set_progress_unknown (); void set_progress (float, bool force = false); void sub (std::string); - float progress () const; - bool progress_unknown () const { - return !_progress; - } + boost::optional progress () const; boost::shared_ptr film () const { return _film; diff --git a/src/tools/dcpomatic_cli.cc b/src/tools/dcpomatic_cli.cc index f55a425ce..0b946181a 100644 --- a/src/tools/dcpomatic_cli.cc +++ b/src/tools/dcpomatic_cli.cc @@ -177,9 +177,7 @@ main (int argc, char* argv[]) if (progress) { cout << (*i)->name() << ": "; - float const p = (*i)->progress (); - - if (p >= 0) { + if ((*i)->progress ()) { cout << (*i)->status() << " \n"; } else { cout << ": Running \n"; diff --git a/src/wx/job_manager_view.cc b/src/wx/job_manager_view.cc index b62d44d07..fd3ea6bf7 100644 --- a/src/wx/job_manager_view.cc +++ b/src/wx/job_manager_view.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012 Carl Hetherington + Copyright (C) 2012-2015 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 @@ -88,7 +88,7 @@ public: void maybe_pulse () { - if (_job->running() && _job->progress_unknown ()) { + if (_job->running() && !_job->progress ()) { _gauge->Pulse (); } } @@ -110,14 +110,11 @@ private: void progress () { - float const p = _job->progress (); - if (p >= 0) { - checked_set (_message, _job->status ()); - update_job_name (); - int const pp = min (100.0f, p * 100); - _gauge->SetValue (pp); - } - + checked_set (_message, _job->status ()); + update_job_name (); + if (_job->progress ()) { + _gauge->SetValue (min (100.0f, _job->progress().get() * 100)); + } _table->Layout (); _window->FitInside (); } -- 2.30.2