summaryrefslogtreecommitdiff
path: root/src/lib/butler.cc
AgeCommit message (Collapse)Author
2020-08-17Report better errors when the butler dies.Carl Hetherington
Adapted from d23f55d8cd73adda823d0a2fcabc129b8845a81 in master.
2020-07-29Fix bugs in thread termination causing occasional pthreadCarl Hetherington
assertion failures. Before this, it was possible for J2KEncoder::terminate_threads() to finish without terminating all threads if the thread _running_ terminate_threads() was itself interrupt()ed. This is because the thread_group::join_all() in terminate_threads() is an interruption point, so it was possible it not to complete but instead to throw interrupted_exception. Then the owning J2KEncoder would be torn down but the threads would still be running, causing use-after-frees. This commit adds some boost::this_thread::disable_interruption objects to ensure that the owning thread is not interrupted while it is being destroyed. Also tidy up code that does this stuff, assuming that it's safe to not call thread::joinable but instead do thread.interrupt(); try { thread.join(); } catch (...) {}
2020-07-05Improve butler error reporting during export.v2.15.88Carl Hetherington
2020-01-30Various thread cleanups.Carl Hetherington
2019-11-05Remove dubious _buffers_mutex and maintain a lock on _mutex forCarl Hetherington
the whole of ::audio. Otherwise changes to pending seeks can be mixed up with audio being put into the ringbuffer.
2019-07-24Optimise the feel of some GUI functions by doing the seek afterCarl Hetherington
many content changes in an idle handler, rather than blocking the UI update until the seek and image redisplay have finished.
2019-05-15Player::playlist_content_change will call setup_pieces() regardlessv2.15.5Carl Hetherington
of the state of frequent, so Butler::player_change must always seek regardless of the state of frequent. Otherwise setup_pieces() results in the next pass() output being at position 0, which causes problems when the audio from that output is pushed into the audio ring buffers.
2019-05-10Put Time types in dcpomatic namespace.Carl Hetherington
2019-04-20Comment tweaks.Carl Hetherington
2019-04-19Hopefully better errors on large video/audio disagreements.Carl Hetherington
2019-03-26Unset _awaiting on a regular seek. This fixes bad behaviour in the sequence:Carl Hetherington
- some player_change; _awaiting is set - regular seek occurs (perhaps to a time much earlier than _awaiting) - another player_change occurs; player_change handler wrongly seeks back to _awaiting May help with #1505.
2019-03-07Better reporting of errors in Butler::prepare.v2.13.125Carl Hetherington
2019-01-06Fix comment typo.Carl Hetherington
2018-12-22Fix assumption of 48kHz DCP audio in AudioRingBuffers consistency check (#1436).Carl Hetherington
2018-11-21Tidy and fix logging.Carl Hetherington
2018-11-06Do image crop/scale/window in the butler prepare threads.Carl Hetherington
2018-11-06Double up on DCP-decode prepare threads and readahead as I think it provides ↵v2.13.66Carl Hetherington
a slight performance improvement for playback.
2018-11-06Add some code to help with profiling the player.Carl Hetherington
2018-09-11Store audio/video even when suspended.Carl Hetherington
This is important for audio. _audio.put() must be called with sequential data, so if you're going to discard audio (as was happening when _suspended) you need to clear _audio before put()ting any more. This happens with seek; when _pending_seek_position is set _audio is cleared and then nothing more is added until the seek is done. _suspended may be set and then reset with no change having happened (type _CANCELLED) so I think you have to keep storing data in this case. It will be discarded when the seek comes around after a _DONE change.
2018-09-04Allow the butler to say "try again later" when get_video() is calledCarl Hetherington
while it's suspended. Then make the GUI follow that suggestion. Should
2018-08-29Basics of splitting CCAP streams into different assets.Carl Hetherington
2018-08-22Await video in get_video() if we are suspended.Carl Hetherington
Fix player_change to summon the butler if _suspended is changed, and ensure that the butler's Player::Change handler is the first to be called so that suspension is sorted out before any other Player::Change handlers might call get_video(). This is to prevent the sequence 1. player change-pending emitted 2. hence butler suspended -> 1 3. player change-done emitted 4. first handler is something which calls get_video() 5. get_video() awaits video which will never arrive because the butler is suspended. Here there is a pending change-done signal to butler. Ensuring this arrives before the handler which calls get_video() sorts it out.
2018-08-20Allow nested butler suspensions.Carl Hetherington
2018-08-19Replace May/Done/NotDone signal sets with one signal and extendCarl Hetherington
this treatment to anything that caused Player::setup_pieces. This should fix out-of-sequence Player emissions caused by setup_pieces being called by one thread while the butler is calling pass().
2018-08-19Suspend butler on player may-change as otherwise there's a windowCarl Hetherington
between Player::_suspended being set to false and the the butler requesting a seek, during which the butler may call pass().
2018-08-14More fixes for errors / crashes / misbehaviour with content changesCarl Hetherington
and the butler. Here we signal both before and after a change in content. Before, the player disables itself so that any pass()/seek() will be no-ops. After, the player rebuilds its pieces and the butler re-seeks to get back to where it was before the change.
2018-08-12Don't seek during timeline drags.Carl Hetherington
2018-08-09Remove duplicated stuff from seek_unlocked(); tweak some ordering.Carl Hetherington
2018-08-05Get closed caption view data from the butler, rather than the player.Carl Hetherington
You can't introduce the butler (so that the player is ahead of time) and then ask the player what should be in the frame that is being displayed "now"; the player will already have moved on.
2018-08-04Remove unused parameter.Carl Hetherington
2018-08-04Timestamp audio emissions from butler and hence discard very lateCarl Hetherington
audio in FilmViewer. This should help with the case where lots of video frames are rapidly discarded when they are late but the corresponding audio is not, hence audio buffers get overfilled.
2018-08-02A variety of changes to improve (but not entirely fix) behaviourCarl Hetherington
when moving content (or otherwise changing the playlist) while playing. This commit refills the butler when things change in certain ways, and improves locking to cope with Player methods being called from the GUI and butler threads at the same time.
2018-07-27Remove debug code.Carl Hetherington
2018-07-26Protect the public API of Player with a mutex, sinceCarl Hetherington
seek() and pass() may be called from the Butler thread ad the same time as other Player methods are called from the GUI thread (by FilmViewer and ClosedCaptionViewDialog).
2018-06-22Add some timing logs for playback.Carl Hetherington
2018-06-11Throw exceptions when things in the butler get really out of hand.v2.13.31Carl Hetherington
2018-02-18Hold lock for the whole of Butler::video(). Fixes jumpy nudge-seekCarl Hetherington
when playing DCPs. Before, the lock was only held to check _pending_seek_position. With that arrangement, this sequence was possible: 1. video arrives, check _pending_seek_position, decide it's ok, release lock 2. Butler::seek called, sets _pending_seek_position, clears _video 3. video that arrived in #1 is put into _video by ::video() 4. that video is given to an awaiting get_video() call. This clearly subverts the attempts not to accept new video data while a seek is pending.
2018-02-16Name threads on Linux.Carl Hetherington
2018-02-12Tone some debug messages down slightly.Carl Hetherington
2018-02-07Slightly better log message.Carl Hetherington
2017-12-29Add basic memory-used stuff for butler and reduce minimum audioCarl Hetherington
readahead quite a bit. This in turn reduces the maximum butler memory usage as it will keep getting audio (and hence video) until the minimum audio readahead is hit.
2017-12-29Reduce the maximum video readahead.Carl Hetherington
2017-12-13Attempt to prevent a deadlock if audio is full and video empty (or vice versa).Carl Hetherington
2017-08-14Remove believed-unnecessary player-changed handler in butler.Carl Hetherington
2017-08-14Missing conditional wakeup.Carl Hetherington
2017-08-14I think Butler should just clear itself out when the player changes.Carl Hetherington
Other layers will seek as appropriate, we shouldn't fight them I don't think.
2017-08-14Remove Film dependency from Butler.Carl Hetherington
2017-07-26Fix warning.Carl Hetherington
2017-07-26Multi-threaded decode of DCP when previewing.Carl Hetherington
2017-07-12Report underruns from Butler::get_audio.Carl Hetherington