X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fbutler.cc;h=0218c1fb30d198b494d05b466f778de8509324bf;hb=c4403784febdbdd42e9c32e67fadb147f11fe566;hp=f3e9f73f13775ba31123800bafe80ad091841aa9;hpb=b73576594b252e033539bec964d72403d3775585;p=dcpomatic.git diff --git a/src/lib/butler.cc b/src/lib/butler.cc index f3e9f73f1..0218c1fb3 100644 --- a/src/lib/butler.cc +++ b/src/lib/butler.cc @@ -38,18 +38,19 @@ using boost::shared_ptr; using boost::bind; using boost::optional; using boost::function; +using namespace dcpomatic; /** Minimum video readahead in frames */ #define MINIMUM_VIDEO_READAHEAD 10 -/** Maximum video readahead in frames; should never be reached unless there are bugs in Player */ +/** Maximum video readahead in frames; should never be exceeded (by much) unless there are bugs in Player */ #define MAXIMUM_VIDEO_READAHEAD 48 /** Minimum audio readahead in frames */ #define MINIMUM_AUDIO_READAHEAD (48000 * MINIMUM_VIDEO_READAHEAD / 24) -/** Minimum audio readahead in frames; should never be reached unless there are bugs in Player */ +/** Maximum audio readahead in frames; should never be exceeded (by much) unless there are bugs in Player */ #define MAXIMUM_AUDIO_READAHEAD (48000 * MAXIMUM_VIDEO_READAHEAD / 24) /** @param pixel_format Pixel format functor that will be used when calling ::image on PlayerVideos coming out of this - * butler. This will be used (where possible) to prepare the PlayerVideos so that calling image() on them is quick(). + * butler. This will be used (where possible) to prepare the PlayerVideos so that calling image() on them is quick. * @param aligned Same as above for the `aligned' flag. * @param fast Same as above for the `fast' flag. */ @@ -124,14 +125,26 @@ Butler::should_run () const { if (_video.size() >= MAXIMUM_VIDEO_READAHEAD * 10) { /* This is way too big */ - throw ProgrammingError - (__FILE__, __LINE__, String::compose ("Butler video buffers reached %1 frames (audio is %2)", _video.size(), _audio.size())); + optional pos = _audio.peek(); + if (pos) { + throw ProgrammingError + (__FILE__, __LINE__, String::compose ("Butler video buffers reached %1 frames (audio is %2 at %3)", _video.size(), _audio.size(), pos->get())); + } else { + throw ProgrammingError + (__FILE__, __LINE__, String::compose ("Butler video buffers reached %1 frames (audio is %2)", _video.size(), _audio.size())); + } } if (_audio.size() >= MAXIMUM_AUDIO_READAHEAD * 10) { /* This is way too big */ - throw ProgrammingError - (__FILE__, __LINE__, String::compose ("Butler audio buffers reached %1 frames (video is %2)", _audio.size(), _video.size())); + optional pos = _audio.peek(); + if (pos) { + throw ProgrammingError + (__FILE__, __LINE__, String::compose ("Butler audio buffers reached %1 frames at %2 (video is %3)", _audio.size(), pos->get(), _video.size())); + } else { + throw ProgrammingError + (__FILE__, __LINE__, String::compose ("Butler audio buffers reached %1 frames (video is %3)", _audio.size(), _video.size())); + } } if (_video.size() >= MAXIMUM_VIDEO_READAHEAD * 2) { @@ -243,6 +256,7 @@ void Butler::seek (DCPTime position, bool accurate) { boost::mutex::scoped_lock lm (_mutex); + _awaiting = optional(); seek_unlocked (position, accurate); } @@ -268,7 +282,8 @@ Butler::seek_unlocked (DCPTime position, bool accurate) } void -Butler::prepare (weak_ptr weak_video) const +Butler::prepare (weak_ptr weak_video) +try { shared_ptr video = weak_video.lock (); /* If the weak_ptr cannot be locked the video obviously no longer requires any work */ @@ -278,6 +293,12 @@ Butler::prepare (weak_ptr weak_video) const LOG_TIMING("finish-prepare in %1", thread_id()); } } +catch (...) +{ + store_current (); + boost::mutex::scoped_lock lm (_mutex); + _died = true; +} void Butler::video (shared_ptr video, DCPTime time)