X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fvideo_view.h;h=3b596197e42c82bca0bbeab977752a51f2f9ba37;hb=dd9be86db6cde0afa5da0d1d1ac43b42e05dca26;hp=fd2684e4175a3d6a47e98f8dcc3d0affa2eca8d4;hpb=b3b371294ed5e6cc18ef64ba1b06ca76726b903a;p=dcpomatic.git diff --git a/src/wx/video_view.h b/src/wx/video_view.h index fd2684e41..3b596197e 100644 --- a/src/wx/video_view.h +++ b/src/wx/video_view.h @@ -24,46 +24,60 @@ #include "lib/dcpomatic_time.h" #include "lib/timer.h" #include "lib/types.h" -#include +#include "lib/exception_store.h" #include #include +#include class Image; class wxWindow; class FilmViewer; +class Player; class PlayerVideo; -class VideoView +class VideoView : public ExceptionStore, public boost::noncopyable { public: 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; - /** Redraw the view after something has changed like content outlining, - * the film being removed, etc. - */ + /** Re-make and display the image from the current _player_video */ virtual void update () = 0; - + /** Called when playback starts */ virtual void start (); - /* XXX_b: make pure */ + /** Called when playback stops */ virtual void stop () {} + enum NextFrameResult { + FAIL, + AGAIN, + SUCCESS + }; + + /** Get the next frame and display it; used after seek */ + virtual NextFrameResult display_next_frame (bool) = 0; + void clear (); + bool reset_metadata (std::shared_ptr film, dcp::Size player_video_container_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; @@ -78,6 +92,11 @@ public: 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; @@ -93,12 +112,14 @@ public: _eyes = eyes; } -protected: - /* XXX_b: to remove */ - friend class FilmViewer; + void set_three_d (bool t) { + boost::mutex::scoped_lock lm (_mutex); + _three_d = t; + } - bool get_next_frame (bool non_blocking); - int time_until_next_frame () const; +protected: + NextFrameResult get_next_frame (bool non_blocking); + boost::optional time_until_next_frame () const; dcpomatic::DCPTime one_video_frame () const; int video_frame_rate () const { @@ -111,7 +132,7 @@ protected: return _length; } - std::pair, dcpomatic::DCPTime> player_video () const { + std::pair, dcpomatic::DCPTime> player_video () const { boost::mutex::scoped_lock lm (_mutex); return _player_video; } @@ -128,25 +149,21 @@ protected: FilmViewer* _viewer; -#ifdef DCPOMATIC_VARIANT_SWAROOP - bool _in_watermark; - int _watermark_x; - 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; + 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; };