+ VideoView::start ();
+
+ boost::mutex::scoped_lock lm (_playing_mutex);
+ _playing = true;
+ _thread_work_condition.notify_all ();
+}
+
+void
+GLVideoView::stop ()
+{
+ boost::mutex::scoped_lock lm (_playing_mutex);
+ _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<int> n = time_until_next_frame();
+ if (!n || *n > 5) {
+ break;
+ }
+ get_next_frame (true);
+ add_dropped ();
+ }
+}
+
+
+void
+GLVideoView::set_image_and_draw ()
+{
+ shared_ptr<PlayerVideo> pv = player_video().first;
+ if (pv) {
+ set_image (pv->image(bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VIDEO_RANGE_FULL, false, true));
+ draw (pv->inter_position(), pv->inter_size());
+ _viewer->image_changed (pv);
+ }