X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fwx%2Fvideo_view.cc;h=b9c45631edf1f6d583ac429e7473f8063288b773;hb=4ab86ef0295bcd6bb9297996a06006f371d22bae;hp=5dd857fabc4a4089f8aa4ea08a98e09aeb55ba99;hpb=b3b371294ed5e6cc18ef64ba1b06ca76726b903a;p=dcpomatic.git diff --git a/src/wx/video_view.cc b/src/wx/video_view.cc index 5dd857fab..b9c45631e 100644 --- a/src/wx/video_view.cc +++ b/src/wx/video_view.cc @@ -22,6 +22,11 @@ #include "wx_util.h" #include "film_viewer.h" #include "lib/butler.h" +#include + +using std::pair; +using boost::shared_ptr; +using boost::optional; VideoView::VideoView (FilmViewer* viewer) : _viewer (viewer) @@ -31,7 +36,9 @@ VideoView::VideoView (FilmViewer* viewer) , _state_timer ("viewer") , _video_frame_rate (0) , _eyes (EYES_LEFT) + , _three_d (false) , _dropped (0) + , _errored (0) , _gets (0) { @@ -45,34 +52,42 @@ VideoView::clear () _player_video.second = dcpomatic::DCPTime (); } -/** @param non_blocking true to return false quickly if no video is available quickly. +/** 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. */ bool VideoView::get_next_frame (bool non_blocking) { - if (_length == dcpomatic::DCPTime()) { + if (length() == dcpomatic::DCPTime()) { return true; } - DCPOMATIC_ASSERT (_viewer->butler()); + shared_ptr butler = _viewer->butler (); + if (!butler) { + return false; + } add_get (); boost::mutex::scoped_lock lm (_mutex); do { Butler::Error e; - _player_video = _viewer->butler()->get_video (!non_blocking, &e); + _player_video = butler->get_video (!non_blocking, &e); if (!_player_video.first && e == Butler::AGAIN) { return false; } } while ( _player_video.first && - _viewer->film()->three_d() && + _three_d && _eyes != _player_video.first->eyes() && _player_video.first->eyes() != EYES_BOTH ); + if (_player_video.first && _player_video.first->error()) { + ++_errored; + } + return true; } @@ -82,13 +97,13 @@ VideoView::one_video_frame () const return dcpomatic::DCPTime::from_frames (1, video_frame_rate()); } -/** @return Time in ms until the next frame is due */ -int +/** @return Time in ms until the next frame is due, or empty if nothing is due */ +optional VideoView::time_until_next_frame () const { if (length() == dcpomatic::DCPTime()) { /* There's no content, so this doesn't matter */ - return 0; + return optional(); } dcpomatic::DCPTime const next = position() + one_video_frame(); @@ -104,4 +119,22 @@ 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) +{ + pair, dcpomatic::DCPTime> pv = player_video (); + if (!pv.first) { + return false; + } + + if (!pv.first->reset_metadata (film, video_container_size, film_frame_size)) { + return false; + } + + update (); + return true; } +