Fix display when there is no film.
authorCarl Hetherington <cth@carlh.net>
Wed, 20 Nov 2019 20:25:55 +0000 (21:25 +0100)
committerCarl Hetherington <cth@carlh.net>
Wed, 8 Jan 2020 20:56:47 +0000 (21:56 +0100)
src/wx/gl_video_view.cc
src/wx/gl_video_view.h
src/wx/video_view.cc
src/wx/video_view.h

index 236b405181f655c411247c5fa63253eed8282334..a1be8ca301816f77e5b3e52017e0452d4a70d0de 100644 (file)
@@ -61,6 +61,7 @@ GLVideoView::GLVideoView (FilmViewer* viewer, wxWindow *parent)
        _canvas = new wxGLCanvas (parent, wxID_ANY, 0, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE);
        _canvas->Bind (wxEVT_PAINT, boost::bind(&GLVideoView::paint, this));
        _canvas->Bind (wxEVT_SIZE, boost::bind(boost::ref(Sized)));
+       _canvas->Bind (wxEVT_CREATE, boost::bind(&GLVideoView::create, this));
 
 #if defined(DCPOMATIC_LINUX) && defined(DCPOMATIC_HAVE_GLX_SWAP_INTERVAL_EXT)
        if (_canvas->IsExtensionSupported("GLX_EXT_swap_control")) {
@@ -116,14 +117,7 @@ check_gl_error (char const * last)
 void
 GLVideoView::paint ()
 {
-       /* XXX_b: can't do this yet */
-#if 0
-        _viewer->state_timer().set("paint-panel");
-       _canvas->SetCurrent (*_context);
-       wxPaintDC dc (_canvas);
-       draw ();
-       _viewer->state_timer().unset();
-#endif
+       request_one_shot ();
 }
 
 void
@@ -169,9 +163,11 @@ GLVideoView::draw ()
 
        glTranslatef (0, 0, 0);
 
+       dcp::Size const out_size = _viewer->out_size ();
+
        if (_size) {
+               /* Render our image (texture) */
                glBegin (GL_QUADS);
-
                glTexCoord2f (0, 1);
                glVertex2f (0, _size->height);
                glTexCoord2f (1, 1);
@@ -180,11 +176,19 @@ GLVideoView::draw ()
                glVertex2f (_size->width, 0);
                glTexCoord2f (0, 0);
                glVertex2f (0, 0);
-
+               glEnd ();
+       } else {
+               /* No image, so just fill with black */
+               glBegin (GL_QUADS);
+               glColor3ub (0, 0, 0);
+               glVertex2f (0, 0);
+               glVertex2f (out_size.width, 0);
+               glVertex2f (out_size.width, out_size.height);
+               glVertex2f (0, out_size.height);
+               glVertex2f (0, 0);
                glEnd ();
        }
 
-       dcp::Size const out_size = _viewer->out_size ();
        wxSize const canvas_size = _canvas->GetSize ();
 
        if (!_viewer->pad_black() && out_size.width < canvas_size.GetWidth()) {
@@ -263,10 +267,6 @@ GLVideoView::set_image (shared_ptr<const Image> image)
 void
 GLVideoView::start ()
 {
-       if (!_thread) {
-               _thread = new boost::thread (boost::bind(&GLVideoView::thread, this));
-       }
-
        boost::mutex::scoped_lock lm (_playing_mutex);
        _playing = true;
        _playing_condition.notify_all ();
@@ -287,8 +287,6 @@ try
        _context = new wxGLContext (_canvas);
        _canvas->SetCurrent (*_context);
 
-       std::cout << "Here we go " << video_frame_rate() << " " << to_string(length()) << "\n";
-
        while (true) {
                boost::mutex::scoped_lock lm (_playing_mutex);
                while (!_playing && !_one_shot) {
@@ -297,16 +295,18 @@ try
                _one_shot = false;
                lm.unlock ();
 
-               dcpomatic::DCPTime const next = position() + one_video_frame();
+               if (length() != dcpomatic::DCPTime()) {
+                       dcpomatic::DCPTime const next = position() + one_video_frame();
 
-               if (next >= length()) {
-                       _viewer->stop ();
-                       _viewer->emit_finished ();
-                       continue;
-               }
+                       if (next >= length()) {
+                               _viewer->stop ();
+                               _viewer->emit_finished ();
+                               continue;
+                       }
 
-               get_next_frame (false);
-               set_image (player_video().first->image(bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), false, true));
+                       get_next_frame (false);
+                       set_image (player_video().first->image(bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), false, true));
+               }
                draw ();
 
                while (time_until_next_frame() < 5) {
@@ -330,9 +330,22 @@ bool
 GLVideoView::display_next_frame (bool non_blocking)
 {
        bool const r = get_next_frame (non_blocking);
+       request_one_shot ();
+       return r;
+}
+
+void
+GLVideoView::request_one_shot ()
+{
        boost::mutex::scoped_lock lm (_playing_mutex);
        _one_shot = true;
        _playing_condition.notify_all ();
-       return r;
 }
 
+void
+GLVideoView::create ()
+{
+       if (!_thread) {
+               _thread = new boost::thread (boost::bind(&GLVideoView::thread, this));
+       }
+}
index 22b6d8513d18e4434be85e57887acf2c30a54ac8..a9264f05dd6d0cdaa8b3e049a84b24b371e894e0 100644 (file)
@@ -53,6 +53,8 @@ private:
        void paint ();
        void draw ();
        void thread ();
+       void request_one_shot ();
+       void create ();
 
        wxGLCanvas* _canvas;
        wxGLContext* _context;
index f2886a48ce54c9c31ba8b4ba01f91b580a6f040d..f8d44dc70137f321aec43a5610577032417ca1dc 100644 (file)
@@ -37,6 +37,10 @@ VideoView::clear ()
 bool
 VideoView::get_next_frame (bool non_blocking)
 {
+       if (_length == dcpomatic::DCPTime()) {
+               return true;
+       }
+
        DCPOMATIC_ASSERT (_viewer->butler());
        _viewer->_gets++;
 
@@ -71,13 +75,17 @@ VideoView::one_video_frame () const
        return dcpomatic::DCPTime::from_frames (1, video_frame_rate());
 }
 
-/* XXX_b: comment */
+/** @return Time in ms until the next frame is due */
 int
 VideoView::time_until_next_frame () const
 {
+       if (length() == dcpomatic::DCPTime()) {
+               /* There's no content, so this doesn't matter */
+               return 0;
+       }
+
        dcpomatic::DCPTime const next = position() + one_video_frame();
        dcpomatic::DCPTime const time = _viewer->audio_time().get_value_or(position());
-       std::cout << to_string(next) << " " << to_string(time) << " " << ((next.seconds() - time.seconds()) * 1000) << "\n";
        if (next < time) {
                return 0;
        }
index 8d763204ce6ae24a31e5370f28fb74d82b718a55..142cfd022d580135bdd530a938a905031add6a61 100644 (file)
@@ -114,6 +114,7 @@ private:
 
        std::pair<boost::shared_ptr<PlayerVideo>, dcpomatic::DCPTime> _player_video;
        int _video_frame_rate;
+       /** length of the film we are playing, or 0 if there is none */
        dcpomatic::DCPTime _length;
 };