X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fvideo_view.cc;h=3e21e709dd2b5fc1749540ed9c4087d5aeddb20c;hb=8fedaaa75c4586a4cc7ffb393bd71d1fdb091dc8;hp=4edc2cd23a28cf0f3b943fe3a9d6cb409fecd973;hpb=89e92b3e7effafd2ca3aa1e9300777f2d2fb6183;p=dcpomatic.git diff --git a/src/wx/video_view.cc b/src/wx/video_view.cc index 4edc2cd23..3e21e709d 100644 --- a/src/wx/video_view.cc +++ b/src/wx/video_view.cc @@ -22,21 +22,21 @@ #include "wx_util.h" #include "film_viewer.h" #include "lib/butler.h" +#include "lib/dcpomatic_log.h" #include -using boost::shared_ptr; +using std::pair; +using std::shared_ptr; using boost::optional; VideoView::VideoView (FilmViewer* viewer) : _viewer (viewer) -#ifdef DCPOMATIC_VARIANT_SWAROOP - , _in_watermark (false) -#endif , _state_timer ("viewer") , _video_frame_rate (0) - , _eyes (EYES_LEFT) + , _eyes (Eyes::LEFT) , _three_d (false) , _dropped (0) + , _errored (0) , _gets (0) { @@ -52,18 +52,19 @@ VideoView::clear () /** Could be called from any thread. * @param non_blocking true to return false quickly if no video is available quickly. - * @return false if we gave up because it would take too long, otherwise true. + * @return FAIL if there's no frame, AGAIN if the method should be called again, or SUCCESS + * if there is a frame. */ -bool +VideoView::NextFrameResult VideoView::get_next_frame (bool non_blocking) { if (length() == dcpomatic::DCPTime()) { - return true; + return FAIL; } shared_ptr butler = _viewer->butler (); if (!butler) { - return false; + return FAIL; } add_get (); @@ -71,18 +72,26 @@ VideoView::get_next_frame (bool non_blocking) do { Butler::Error e; - _player_video = butler->get_video (!non_blocking, &e); - if (!_player_video.first && e == Butler::AGAIN) { - return false; + pair, dcpomatic::DCPTime> pv = butler->get_video (!non_blocking, &e); + if (e.code == Butler::Error::DIED) { + LOG_ERROR ("Butler died with %1", e.summary()); } + if (!pv.first) { + return e.code == Butler::Error::AGAIN ? AGAIN : FAIL; + } + _player_video = pv; } while ( _player_video.first && _three_d && _eyes != _player_video.first->eyes() && - _player_video.first->eyes() != EYES_BOTH + _player_video.first->eyes() != Eyes::BOTH ); - return true; + if (_player_video.first && _player_video.first->error()) { + ++_errored; + } + + return SUCCESS; } dcpomatic::DCPTime @@ -100,8 +109,8 @@ VideoView::time_until_next_frame () const return optional(); } - dcpomatic::DCPTime const next = position() + one_video_frame(); - dcpomatic::DCPTime const time = _viewer->audio_time().get_value_or(position()); + auto const next = position() + one_video_frame(); + auto const time = _viewer->audio_time().get_value_or(position()); if (next < time) { return 0; } @@ -113,17 +122,18 @@ VideoView::start () { boost::mutex::scoped_lock lm (_mutex); _dropped = 0; + _errored = 0; } bool -VideoView::refresh_metadata (shared_ptr film, dcp::Size video_container_size, dcp::Size film_frame_size) +VideoView::reset_metadata (shared_ptr film, dcp::Size player_video_container_size) { - boost::mutex::scoped_lock lm (_mutex); - if (!_player_video.first) { + auto pv = player_video (); + if (!pv.first) { return false; } - if (!_player_video.first->reset_metadata (film, video_container_size, film_frame_size)) { + if (!pv.first->reset_metadata(film, player_video_container_size)) { return false; }