2 Copyright (C) 2019-2021 Carl Hetherington <cth@carlh.net>
4 This file is part of DCP-o-matic.
6 DCP-o-matic is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 DCP-o-matic is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
22 #ifndef DCPOMATIC_VIDEO_VIEW_H
23 #define DCPOMATIC_VIDEO_VIEW_H
26 #include "lib/dcpomatic_time.h"
27 #include "lib/exception_store.h"
28 #include "lib/signaller.h"
29 #include "lib/timer.h"
30 #include "lib/types.h"
31 #include <dcp/warnings.h>
32 LIBDCP_DISABLE_WARNINGS
34 LIBDCP_ENABLE_WARNINGS
35 #include <boost/signals2.hpp>
36 #include <boost/thread.hpp>
46 class VideoView : public ExceptionStore, public Signaller
49 VideoView (FilmViewer* viewer);
50 virtual ~VideoView () {}
52 VideoView (VideoView const&) = delete;
53 VideoView& operator= (VideoView const&) = delete;
55 /** @return the thing displaying the image */
56 virtual wxWindow* get () const = 0;
57 /** Re-make and display the image from the current _player_video */
58 virtual void update () = 0;
59 /** Called when playback starts */
60 virtual void start ();
61 /** Called when playback stops */
62 virtual void stop () {}
64 enum NextFrameResult {
70 /** Get the next frame and display it; used after seek */
71 virtual NextFrameResult display_next_frame (bool) = 0;
74 bool reset_metadata (std::shared_ptr<const Film> film, dcp::Size player_video_container_size);
76 /** Emitted from the GUI thread when our display changes in size */
77 boost::signals2::signal<void()> Sized;
78 /** Emitted from the GUI thread when a lot of frames are being dropped */
79 boost::signals2::signal<void()> TooManyDropped;
82 /* Accessors for FilmViewer */
84 int dropped () const {
85 boost::mutex::scoped_lock lm (_mutex);
89 int errored () const {
90 boost::mutex::scoped_lock lm (_mutex);
95 boost::mutex::scoped_lock lm (_mutex);
99 StateTimer const & state_timer () const {
103 dcpomatic::DCPTime position () const {
104 boost::mutex::scoped_lock lm (_mutex);
105 return _player_video.second;
109 /* Setters for FilmViewer so it can tell us our state and
110 * we can then use (thread) safely.
113 void set_video_frame_rate (int r) {
114 boost::mutex::scoped_lock lm (_mutex);
115 _video_frame_rate = r;
118 void set_length (dcpomatic::DCPTime len) {
119 boost::mutex::scoped_lock lm (_mutex);
123 void set_eyes (Eyes eyes) {
124 boost::mutex::scoped_lock lm (_mutex);
128 void set_three_d (bool t) {
129 boost::mutex::scoped_lock lm (_mutex);
133 void set_optimise_for_j2k (bool o) {
134 _optimise_for_j2k = o;
138 NextFrameResult get_next_frame (bool non_blocking);
139 boost::optional<int> time_until_next_frame () const;
140 dcpomatic::DCPTime one_video_frame () const;
142 wxColour pad_colour () const;
144 wxColour outline_content_colour () const {
145 return wxColour(255, 0, 0);
148 wxColour outline_subtitles_colour () const {
149 return wxColour(0, 255, 0);
152 wxColour crop_guess_colour () const {
153 return wxColour(0, 0, 255);
156 int video_frame_rate () const {
157 boost::mutex::scoped_lock lm (_mutex);
158 return _video_frame_rate;
161 dcpomatic::DCPTime length () const {
162 boost::mutex::scoped_lock lm (_mutex);
166 std::pair<std::shared_ptr<PlayerVideo>, dcpomatic::DCPTime> player_video () const {
167 boost::mutex::scoped_lock lm (_mutex);
168 return _player_video;
174 boost::mutex::scoped_lock lm (_mutex);
180 StateTimer _state_timer;
182 bool _optimise_for_j2k = false;
185 /** Mutex protecting all the state in this class */
186 mutable boost::mutex _mutex;
188 std::pair<std::shared_ptr<PlayerVideo>, dcpomatic::DCPTime> _player_video;
189 int _video_frame_rate = 0;
190 /** length of the film we are playing, or 0 if there is none */
191 dcpomatic::DCPTime _length;
192 Eyes _eyes = Eyes::LEFT;
193 bool _three_d = false;
196 struct timeval _dropped_check_period_start;