X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Fwx%2Fgl_video_view.cc;h=786cee84a3a1afd9a8c19fc19640c7fc5ca433c6;hp=2300cc6984e305df1348e963aad2c3600fe09263;hb=92a2ca96e61ed040737a395b232cf22e5f3234c1;hpb=91152d27421ae3674c782a644e23df1a9dbc8f42 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 ();