X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fvideo_view.cc;h=5f44c37d61779db3cced384221af5fdba9289506;hb=bb949ec65adf95f4a2c7dd5ee7e97b9daaaf3d3f;hp=08b7d2912f39f1593eeac0d76b8558ce91ed2a15;hpb=d1a57244622f5f4160d0f58af7fe71a829175345;p=dcpomatic.git diff --git a/src/wx/video_view.cc b/src/wx/video_view.cc index 08b7d2912..5f44c37d6 100644 --- a/src/wx/video_view.cc +++ b/src/wx/video_view.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2019 Carl Hetherington + Copyright (C) 2019-2021 Carl Hetherington This file is part of DCP-o-matic. @@ -18,6 +18,7 @@ */ + #include "video_view.h" #include "wx_util.h" #include "film_viewer.h" @@ -26,22 +27,18 @@ #include using std::pair; -using boost::shared_ptr; +using std::shared_ptr; using boost::optional; + VideoView::VideoView (FilmViewer* viewer) : _viewer (viewer) , _state_timer ("viewer") - , _video_frame_rate (0) - , _eyes (EYES_LEFT) - , _three_d (false) - , _dropped (0) - , _errored (0) - , _gets (0) { } + void VideoView::clear () { @@ -50,20 +47,22 @@ VideoView::clear () _player_video.second = dcpomatic::DCPTime (); } + /** 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 (); + auto butler = _viewer->butler (); if (!butler) { - return false; + return FAIL; } add_get (); @@ -71,34 +70,36 @@ VideoView::get_next_frame (bool non_blocking) do { Butler::Error e; - pair, dcpomatic::DCPTime> pv = butler->get_video (!non_blocking, &e); + auto pv = butler->get_video (!non_blocking, &e); if (e.code == Butler::Error::DIED) { LOG_ERROR ("Butler died with %1", e.summary()); } - if (!pv.first && e.code == Butler::Error::AGAIN) { - return false; + 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 ); if (_player_video.first && _player_video.first->error()) { ++_errored; } - return true; + return SUCCESS; } + dcpomatic::DCPTime VideoView::one_video_frame () const { return dcpomatic::DCPTime::from_frames (1, video_frame_rate()); } + /** @return Time in ms until the next frame is due, or empty if nothing is due */ optional VideoView::time_until_next_frame () const @@ -108,14 +109,15 @@ 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; } return (next.seconds() - time.seconds()) * 1000; } + void VideoView::start () { @@ -124,10 +126,11 @@ VideoView::start () _errored = 0; } + bool -VideoView::refresh_metadata (shared_ptr film, dcp::Size player_video_container_size) +VideoView::reset_metadata (shared_ptr film, dcp::Size player_video_container_size) { - pair, dcpomatic::DCPTime> pv = player_video (); + auto pv = player_video (); if (!pv.first) { return false; }