X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fvideo_view.cc;h=4edc2cd23a28cf0f3b943fe3a9d6cb409fecd973;hb=1d796edf59da644e91bd443505fb76e0397a1439;hp=f2886a48ce54c9c31ba8b4ba01f91b580a6f040d;hpb=5ee3fcbd31065275faad4c06a7805dcbcb338812;p=dcpomatic.git diff --git a/src/wx/video_view.cc b/src/wx/video_view.cc index f2886a48c..4edc2cd23 100644 --- a/src/wx/video_view.cc +++ b/src/wx/video_view.cc @@ -22,6 +22,25 @@ #include "wx_util.h" #include "film_viewer.h" #include "lib/butler.h" +#include + +using boost::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) + , _three_d (false) + , _dropped (0) + , _gets (0) +{ + +} void VideoView::clear () @@ -31,37 +50,38 @@ 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) { - DCPOMATIC_ASSERT (_viewer->butler()); - _viewer->_gets++; + if (length() == dcpomatic::DCPTime()) { + return true; + } + + 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() && - _viewer->_eyes != _player_video.first->eyes() && + _three_d && + _eyes != _player_video.first->eyes() && _player_video.first->eyes() != EYES_BOTH ); - /* XXX_b: this is called from the GL thread so it shouldn't be opening error dialogs */ - try { - _viewer->butler()->rethrow (); - } catch (DecodeError& e) { - error_dialog (get(), e.what()); - } - return true; } @@ -71,16 +91,43 @@ VideoView::one_video_frame () const return dcpomatic::DCPTime::from_frames (1, video_frame_rate()); } -/* XXX_b: comment */ -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 optional(); + } + 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; } return (next.seconds() - time.seconds()) * 1000; } +void +VideoView::start () +{ + boost::mutex::scoped_lock lm (_mutex); + _dropped = 0; +} + +bool +VideoView::refresh_metadata (shared_ptr film, dcp::Size video_container_size, dcp::Size film_frame_size) +{ + boost::mutex::scoped_lock lm (_mutex); + if (!_player_video.first) { + return false; + } + + if (!_player_video.first->reset_metadata (film, video_container_size, film_frame_size)) { + return false; + } + + update (); + return true; +} +