X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fvideo_view.h;h=5353f213f8803e3e2a9865c6a0567610edf51fc9;hb=48ed90fc9c44b52de5b0dfb4ece44739a6a9b9d2;hp=d9ef2a65f4859afd8a8bea01dd8ef9abd0c8642b;hpb=046d84f45621f7e128cb30160a315f98881c6f4b;p=dcpomatic.git diff --git a/src/wx/video_view.h b/src/wx/video_view.h index d9ef2a65f..5353f213f 100644 --- a/src/wx/video_view.h +++ b/src/wx/video_view.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2019 Carl Hetherington + Copyright (C) 2019-2021 Carl Hetherington This file is part of DCP-o-matic. @@ -18,86 +18,178 @@ */ + #ifndef DCPOMATIC_VIDEO_VIEW_H #define DCPOMATIC_VIDEO_VIEW_H + #include "lib/dcpomatic_time.h" -#include +#include "lib/exception_store.h" +#include "lib/signaller.h" +#include "lib/timer.h" +#include "lib/types.h" +#include #include #include + class Image; class wxWindow; class FilmViewer; +class Player; class PlayerVideo; -class VideoView + +class VideoView : public ExceptionStore, public Signaller { public: - VideoView (FilmViewer* viewer) - : _viewer (viewer) -#ifdef DCPOMATIC_VARIANT_SWAROOP - , _in_watermark (false) -#endif - {} - + VideoView (FilmViewer* viewer); virtual ~VideoView () {} - virtual void set_image (boost::shared_ptr image) = 0; + VideoView (VideoView const&) = delete; + VideoView& operator= (VideoView const&) = delete; + + /** @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 () {} + 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; + /** Emitted from the GUI thread when a lot of frames are being dropped */ + boost::signals2::signal TooManyDropped; + + + /* Accessors for FilmViewer */ + + int dropped () const { + boost::mutex::scoped_lock lm (_mutex); + return _dropped; + } - virtual bool display_next_frame (bool) = 0; + int errored () const { + boost::mutex::scoped_lock lm (_mutex); + return _errored; + } - /* XXX_b: to remove */ - virtual void display_player_video () {} + 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; } - void set_film (boost::shared_ptr film) { + + /* 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); - _film = film; + _video_frame_rate = r; } -protected: - /* XXX_b: to remove */ - friend class FilmViewer; + void set_length (dcpomatic::DCPTime len) { + boost::mutex::scoped_lock lm (_mutex); + _length = len; + } - bool get_next_frame (bool non_blocking); - int time_until_next_frame () const; + 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; + } + + void set_optimise_for_j2k (bool o) { + _optimise_for_j2k = o; + } + +protected: + NextFrameResult get_next_frame (bool non_blocking); + boost::optional time_until_next_frame () const; dcpomatic::DCPTime one_video_frame () const; - boost::shared_ptr film () const { + wxColour pad_colour () const; + + wxColour outline_content_colour () const { + return wxColour(255, 0, 0); + } + + wxColour outline_subtitles_colour () const { + return wxColour(0, 255, 0); + } + + int video_frame_rate () const { boost::mutex::scoped_lock lm (_mutex); - return _film; + return _video_frame_rate; + } + + dcpomatic::DCPTime length () const { + boost::mutex::scoped_lock lm (_mutex); + return _length; + } + + std::pair, dcpomatic::DCPTime> player_video () const { + boost::mutex::scoped_lock lm (_mutex); + return _player_video; + } + + void add_dropped (); + + void add_get () { + boost::mutex::scoped_lock lm (_mutex); + ++_gets; } FilmViewer* _viewer; - std::pair, dcpomatic::DCPTime> _player_video; - /** Mutex protecting all the state in VideoView */ - mutable boost::mutex _mutex; + StateTimer _state_timer; -#ifdef DCPOMATIC_VARIANT_SWAROOP - bool _in_watermark; - int _watermark_x; - int _watermark_y; -#endif + bool _optimise_for_j2k = false; private: - boost::shared_ptr _film; + /** Mutex protecting all the state in this class */ + mutable boost::mutex _mutex; + + std::pair, dcpomatic::DCPTime> _player_video; + int _video_frame_rate = 0; + /** length of the film we are playing, or 0 if there is none */ + dcpomatic::DCPTime _length; + Eyes _eyes = Eyes::LEFT; + bool _three_d = false; + + int _dropped = 0; + struct timeval _dropped_check_period_start; + int _errored = 0; + int _gets = 0; }; + #endif