summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2018-02-18 01:26:03 +0000
committerCarl Hetherington <cth@carlh.net>2018-02-18 01:26:03 +0000
commite941ab2b02cf01ab15427e47124b7dd32425095c (patch)
tree805c5e08a7dda066a60ec0764ae0d3d0ae4d75f1
parent59500421bda6e44bc6e92e27c6c21ea071eb81c1 (diff)
Hold lock for the whole of Butler::video(). Fixes jumpy nudge-seek
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.
-rw-r--r--src/lib/butler.cc10
1 files changed, 4 insertions, 6 deletions
diff --git a/src/lib/butler.cc b/src/lib/butler.cc
index 623a17c2f..5a40af128 100644
--- a/src/lib/butler.cc
+++ b/src/lib/butler.cc
@@ -211,12 +211,10 @@ Butler::prepare (weak_ptr<PlayerVideo> weak_video) const
void
Butler::video (shared_ptr<PlayerVideo> video, DCPTime time)
{
- {
- boost::mutex::scoped_lock lm (_mutex);
- if (_pending_seek_position) {
- /* Don't store any video while a seek is pending */
- return;
- }
+ boost::mutex::scoped_lock lm (_mutex);
+ if (_pending_seek_position) {
+ /* Don't store any video while a seek is pending */
+ return;
}
_prepare_service.post (bind (&Butler::prepare, this, weak_ptr<PlayerVideo>(video)));