From: Carl Hetherington Date: Sat, 27 Jun 2020 23:46:20 +0000 (+0200) Subject: Fix confusion between one-shot and playing causing surprising X-Git-Tag: v2.15.85~2 X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=92a2ca96e61ed040737a395b232cf22e5f3234c1 Fix confusion between one-shot and playing causing surprising seeks when things are updated. --- diff --git a/src/wx/gl_video_view.cc b/src/wx/gl_video_view.cc index 2300cc698..786cee84a 100644 --- a/src/wx/gl_video_view.cc +++ b/src/wx/gl_video_view.cc @@ -313,6 +313,44 @@ GLVideoView::stop () _playing = false; } + +void +GLVideoView::thread_playing () +{ + if (length() != dcpomatic::DCPTime()) { + dcpomatic::DCPTime const next = position() + one_video_frame(); + + if (next >= length()) { + _viewer->finished (); + return; + } + + get_next_frame (false); + set_image_and_draw (); + } + + while (true) { + optional n = time_until_next_frame(); + if (!n || *n > 5) { + break; + } + get_next_frame (true); + add_dropped (); + } +} + + +void +GLVideoView::set_image_and_draw () +{ + shared_ptr pv = player_video().first; + if (pv) { + set_image (pv->image(bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), false, true)); + draw (pv->inter_position(), pv->inter_size()); + } +} + + void GLVideoView::thread () try @@ -328,36 +366,13 @@ try while (!_playing && !_one_shot) { _thread_work_condition.wait (lm); } - _one_shot = false; lm.unlock (); - Position inter_position; - dcp::Size inter_size; - if (length() != dcpomatic::DCPTime()) { - dcpomatic::DCPTime const next = position() + one_video_frame(); - - if (next >= length()) { - _viewer->finished (); - continue; - } - - get_next_frame (false); - shared_ptr pv = player_video().first; - if (pv) { - set_image (pv->image(bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), false, true)); - inter_position = pv->inter_position(); - inter_size = pv->inter_size(); - } - } - draw (inter_position, inter_size); - - while (true) { - optional n = time_until_next_frame(); - if (!n || *n > 5) { - break; - } - get_next_frame (true); - add_dropped (); + if (_playing) { + thread_playing (); + } else if (_one_shot) { + _one_shot = false; + set_image_and_draw (); } boost::this_thread::interruption_point (); diff --git a/src/wx/gl_video_view.h b/src/wx/gl_video_view.h index d9e03823b..b91078da0 100644 --- a/src/wx/gl_video_view.h +++ b/src/wx/gl_video_view.h @@ -51,8 +51,10 @@ public: } private: + void set_image_and_draw (); void draw (Position inter_position, dcp::Size inter_size); void thread (); + void thread_playing (); void request_one_shot (); void create (); void check_for_butler_errors ();