From 6abf2fdd53b14608561fcc1900507daea5b79fb7 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 17 Aug 2020 15:44:58 +0200 Subject: [PATCH] Report better errors when the butler dies. Adapted from d23f55d8cd73adda823d0a2fcabc129b8845a81 in master. --- src/lib/butler.cc | 41 +++++++++++++++++++++++++++++++++++---- src/lib/butler.h | 23 +++++++++++++++++----- src/lib/ffmpeg_encoder.cc | 2 +- src/wx/video_view.cc | 6 +++++- 4 files changed, 61 insertions(+), 11 deletions(-) diff --git a/src/lib/butler.cc b/src/lib/butler.cc index df2358086..33938ece4 100644 --- a/src/lib/butler.cc +++ b/src/lib/butler.cc @@ -208,6 +208,12 @@ try boost::mutex::scoped_lock lm (_mutex); _finished = true; _arrived.notify_all (); +} catch (std::exception& e) { + store_current (); + boost::mutex::scoped_lock lm (_mutex); + _died = true; + _died_message = e.what (); + _arrived.notify_all (); } catch (...) { store_current (); boost::mutex::scoped_lock lm (_mutex); @@ -226,7 +232,7 @@ Butler::get_video (bool blocking, Error* e) if (_suspended || (_video.empty() && !blocking)) { if (e) { - *e = AGAIN; + e->code = Error::AGAIN; } return make_pair(shared_ptr(), DCPTime()); } @@ -239,11 +245,12 @@ Butler::get_video (bool blocking, Error* e) if (_video.empty()) { if (e) { if (_died) { - *e = DIED; + e->code = Error::DIED; + e->message = _died_message; } else if (_finished) { - *e = FINISHED; + e->code = Error::FINISHED; } else { - *e = NONE; + e->code = Error::NONE; } } return make_pair(shared_ptr(), DCPTime()); @@ -299,6 +306,13 @@ try LOG_TIMING("finish-prepare in %1", thread_id()); } } +catch (std::exception& e) +{ + store_current (); + boost::mutex::scoped_lock lm (_mutex); + _died = true; + _died_message = e.what (); +} catch (...) { store_current (); @@ -406,3 +420,22 @@ Butler::text (PlayerText pt, TextType type, optional track, DCPTim _closed_caption.put (pt, *track, period); } + +string +Butler::Error::summary () const +{ + switch (code) + { + case Error::NONE: + return "No error registered"; + case Error::AGAIN: + return "Butler not ready"; + case Error::DIED: + return String::compose("Butler died (%1)", message); + case Error::FINISHED: + return "Butler finished"; + } + + return ""; +} + diff --git a/src/lib/butler.h b/src/lib/butler.h index 6263d6143..e13843c90 100644 --- a/src/lib/butler.h +++ b/src/lib/butler.h @@ -49,11 +49,23 @@ public: void seek (dcpomatic::DCPTime position, bool accurate); - enum Error { - NONE, - AGAIN, - DIED, - FINISHED + class Error { + public: + enum Code{ + NONE, + AGAIN, + DIED, + FINISHED + }; + + Error() + : code (NONE) + {} + + Code code; + std::string message; + + std::string summary () const; }; std::pair, dcpomatic::DCPTime> get_video (bool blocking, Error* e = 0); @@ -94,6 +106,7 @@ private: int _suspended; bool _finished; bool _died; + std::string _died_message; bool _stop_thread; AudioMapping _audio_mapping; diff --git a/src/lib/ffmpeg_encoder.cc b/src/lib/ffmpeg_encoder.cc index cf91a9fae..cd03c7b93 100644 --- a/src/lib/ffmpeg_encoder.cc +++ b/src/lib/ffmpeg_encoder.cc @@ -174,7 +174,7 @@ FFmpegEncoder::go () pair, DCPTime> v = _butler->get_video (true, &e); _butler->rethrow (); if (!v.first) { - throw ProgrammingError(__FILE__, __LINE__, String::compose("butler returned no video; error was %1", static_cast(e))); + throw ProgrammingError(__FILE__, __LINE__, String::compose("butler returned no video; error was %1", e.summary())); } shared_ptr fe = encoder->get (v.first->eyes()); if (fe) { diff --git a/src/wx/video_view.cc b/src/wx/video_view.cc index b0e16737c..7eea4b786 100644 --- a/src/wx/video_view.cc +++ b/src/wx/video_view.cc @@ -22,6 +22,7 @@ #include "wx_util.h" #include "film_viewer.h" #include "lib/butler.h" +#include "lib/dcpomatic_log.h" #include using std::pair; @@ -74,7 +75,10 @@ VideoView::get_next_frame (bool non_blocking) do { Butler::Error e; pair, dcpomatic::DCPTime> pv = butler->get_video (!non_blocking, &e); - if (!pv.first && e == Butler::AGAIN) { + if (e.code == Butler::Error::DIED) { + LOG_ERROR ("Butler died with %1", e.summary()); + } + if (!pv.first && e.code == Butler::Error::AGAIN) { return false; } _player_video = pv; -- 2.30.2