Clean up access to stuff from Film.
[dcpomatic.git] / src / wx / gl_video_view.cc
index c69ab210ab5e962c3ea099043c72a4f20640a4f9..3cf58757d08bc441c662fb283db28516d9806ae2 100644 (file)
@@ -105,7 +105,7 @@ GLVideoView::~GLVideoView ()
 }
 
 static void
-       check_gl_error (char const * last)
+check_gl_error (char const * last)
 {
        GLenum const e = glGetError ();
        if (e != GL_NO_ERROR) {
@@ -266,6 +266,17 @@ GLVideoView::start ()
        _thread = new boost::thread (boost::bind(&GLVideoView::thread, this));
 }
 
+void
+GLVideoView::stop ()
+{
+       if (_thread) {
+               _thread->interrupt ();
+               _thread->join ();
+       }
+       delete _thread;
+       _thread = 0;
+}
+
 void
 GLVideoView::thread ()
 try
@@ -277,27 +288,30 @@ try
                _canvas->SetCurrent (*_context);
        }
 
-       while (true) {
-               if (!_viewer->film() || !_viewer->playing()) {
-                       dcpomatic_sleep_milliseconds (40);
-                       continue;
-               }
+       std::cout << "Here we go " << video_frame_rate() << " " << to_string(length()) << "\n";
 
-               dcpomatic::DCPTime const next = _viewer->position() + _viewer->one_video_frame();
+       while (true) {
+               dcpomatic::DCPTime const next = position() + one_video_frame();
 
-               if (next >= _viewer->film()->length()) {
+               if (next >= length()) {
                        _viewer->stop ();
-                       _viewer->Finished ();
-                       return;
+                       _viewer->emit_finished ();
+                       continue;
                }
 
                get_next_frame (false);
-               set_image (_player_video.first->image(bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), false, true));
+               {
+                       boost::mutex::scoped_lock lm (_mutex);
+                       set_image (_player_video.first->image(bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), false, true));
+               }
                draw ();
-               _viewer->_video_position = _player_video.second;
 
-               std::cout << "sleep " << _viewer->time_until_next_frame() << "\n";
-               dcpomatic_sleep_milliseconds (_viewer->time_until_next_frame());
+               while (time_until_next_frame() < 5) {
+                       get_next_frame (true);
+               }
+
+               boost::this_thread::interruption_point ();
+               dcpomatic_sleep_milliseconds (time_until_next_frame());
        }
 
        {
@@ -318,3 +332,10 @@ GLVideoView::context () const
        boost::mutex::scoped_lock lm (_context_mutex);
        return _context;
 }
+
+bool
+GLVideoView::display_next_frame (bool non_blocking)
+{
+       return get_next_frame (non_blocking);
+}
+