X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Fwx%2Fvideo_view.h;h=50ea40fc76e081ae7ba16711d3a1c2adfdf9b66f;hp=8d763204ce6ae24a31e5370f28fb74d82b718a55;hb=8f12e84009d7c2685bb2eeb32665876463d4e6e5;hpb=798819f74c6d194b95d3458f88b7ad60ef5f282c diff --git a/src/wx/video_view.h b/src/wx/video_view.h index 8d763204c..50ea40fc7 100644 --- a/src/wx/video_view.h +++ b/src/wx/video_view.h @@ -22,51 +22,74 @@ #define DCPOMATIC_VIDEO_VIEW_H #include "lib/dcpomatic_time.h" +#include "lib/timer.h" +#include "lib/types.h" +#include "lib/exception_store.h" #include #include #include +#include class Image; class wxWindow; class FilmViewer; class PlayerVideo; -class VideoView +class VideoView : public ExceptionStore, public boost::noncopyable { public: - VideoView (FilmViewer* viewer) - : _viewer (viewer) -#ifdef DCPOMATIC_VARIANT_SWAROOP - , _in_watermark (false) -#endif - , _video_frame_rate (0) - {} - + VideoView (FilmViewer* viewer); virtual ~VideoView () {} - virtual void set_image (boost::shared_ptr image) = 0; + /** @return the thing displaying the image */ virtual wxWindow* get () const = 0; + /** Re-make and display the image from the current _player_video */ virtual void update () = 0; - - /* XXX_b: make pure */ - virtual void start () {} - /* XXX_b: make pure */ + /** Called when playback starts */ + virtual void start (); + /** Called when playback stops */ virtual void stop () {} + /** Get the next frame and display it; used after seek */ + virtual bool display_next_frame (bool) = 0; void clear (); + bool refresh_metadata (boost::shared_ptr film, dcp::Size video_container_size, dcp::Size film_frame_size); + /** Emitted from the GUI thread when our display changes in size */ boost::signals2::signal Sized; - virtual bool display_next_frame (bool) = 0; - /* XXX_b: to remove */ - virtual void display_player_video () {} + /* Accessors for FilmViewer */ + + int dropped () const { + boost::mutex::scoped_lock lm (_mutex); + return _dropped; + } + + int errored () const { + boost::mutex::scoped_lock lm (_mutex); + return _errored; + } + + int gets () const { + boost::mutex::scoped_lock lm (_mutex); + return _gets; + } + + StateTimer const & state_timer () const { + return _state_timer; + } dcpomatic::DCPTime position () const { boost::mutex::scoped_lock lm (_mutex); return _player_video.second; } + + /* Setters for FilmViewer so it can tell us our state and + * we can then use (thread) safely. + */ + void set_video_frame_rate (int r) { boost::mutex::scoped_lock lm (_mutex); _video_frame_rate = r; @@ -77,12 +100,19 @@ public: _length = len; } -protected: - /* XXX_b: to remove */ - friend class FilmViewer; + void set_eyes (Eyes eyes) { + boost::mutex::scoped_lock lm (_mutex); + _eyes = eyes; + } + void set_three_d (bool t) { + boost::mutex::scoped_lock lm (_mutex); + _three_d = t; + } + +protected: bool get_next_frame (bool non_blocking); - int time_until_next_frame () const; + boost::optional time_until_next_frame () const; dcpomatic::DCPTime one_video_frame () const; int video_frame_rate () const { @@ -100,6 +130,16 @@ protected: return _player_video; } + void add_dropped () { + boost::mutex::scoped_lock lm (_mutex); + ++_dropped; + } + + void add_get () { + boost::mutex::scoped_lock lm (_mutex); + ++_gets; + } + FilmViewer* _viewer; #ifdef DCPOMATIC_VARIANT_SWAROOP @@ -108,13 +148,22 @@ protected: int _watermark_y; #endif + StateTimer _state_timer; + private: - /** Mutex protecting all the state in VideoView */ + /** Mutex protecting all the state in this class */ mutable boost::mutex _mutex; std::pair, dcpomatic::DCPTime> _player_video; int _video_frame_rate; + /** length of the film we are playing, or 0 if there is none */ dcpomatic::DCPTime _length; + Eyes _eyes; + bool _three_d; + + int _dropped; + int _errored; + int _gets; }; #endif