diff options
| author | Carl Hetherington <cth@carlh.net> | 2019-10-20 22:49:07 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2020-01-08 21:56:47 +0100 |
| commit | 7c33cdd95a23ff784c0e0731a9d1444ce9bb8f09 (patch) | |
| tree | 8d68307a5480a152627952dfef4d73ce4bb0af1f /src/wx/simple_video_view.cc | |
| parent | ff64d7f42884bb21e61c5f5b242c41415a5934b1 (diff) | |
Move FilmViewer::get() into SimpleVideoView.
Diffstat (limited to 'src/wx/simple_video_view.cc')
| -rw-r--r-- | src/wx/simple_video_view.cc | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/src/wx/simple_video_view.cc b/src/wx/simple_video_view.cc index 37daecda2..7d2080003 100644 --- a/src/wx/simple_video_view.cc +++ b/src/wx/simple_video_view.cc @@ -147,7 +147,7 @@ SimpleVideoView::timer () return; } - _viewer->get (false); + get (false); DCPTime const next = _viewer->position() + _viewer->one_video_frame(); if (next >= _viewer->film()->length()) { @@ -169,3 +169,46 @@ SimpleVideoView::start () { timer (); } + +/** Try to get a frame from the butler and display it. + * @param lazy true to return false quickly if no video is available quickly (i.e. we are waiting for the butler). + * false to ask the butler to block until it has video (unless it is suspended). + * @return true on success, false if we did nothing because it would have taken too long. + */ +bool +SimpleVideoView::get (bool lazy) +{ + DCPOMATIC_ASSERT (_viewer->_butler); + _viewer->_gets++; + + do { + Butler::Error e; + _viewer->_player_video = _viewer->_butler->get_video (!lazy, &e); + if (!_viewer->_player_video.first && e == Butler::AGAIN) { + if (lazy) { + /* No video available; return saying we failed */ + return false; + } else { + /* Player was suspended; come back later */ + signal_manager->when_idle (boost::bind(&SimpleVideoView::get, this, false)); + return false; + } + } + } while ( + _viewer->_player_video.first && + _viewer->film()->three_d() && + _viewer->_eyes != _viewer->_player_video.first->eyes() && + _viewer->_player_video.first->eyes() != EYES_BOTH + ); + + try { + _viewer->_butler->rethrow (); + } catch (DecodeError& e) { + error_dialog (get(), e.what()); + } + + _viewer->display_player_video (); + _viewer->PositionChanged (); + + return true; +} |
