Put two video views inside FilmViewer, one for main and one for sign language.
authorCarl Hetherington <cth@carlh.net>
Sun, 6 Nov 2022 19:33:27 +0000 (20:33 +0100)
committerCarl Hetherington <cth@carlh.net>
Thu, 22 Dec 2022 23:12:00 +0000 (00:12 +0100)
12 files changed:
src/tools/dcpomatic.cc
src/tools/dcpomatic_player.cc
src/wx/film_viewer.cc
src/wx/film_viewer.h
src/wx/gl_video_view.cc
src/wx/gl_video_view.h
src/wx/sign_language_dialog.cc
src/wx/simple_video_view.cc
src/wx/simple_video_view.h
src/wx/system_information_dialog.cc
src/wx/video_view.cc
src/wx/video_view.h

index eb245cef9d8efa3eb8e29f911678533bbd8b6f6c..940ff4345104b277727e891ea7d5e8f4977ff922 100644 (file)
@@ -410,7 +410,7 @@ public:
                auto job_manager_view = new JobManagerView(_right_panel, false);
 
                auto right_sizer = new wxBoxSizer (wxVERTICAL);
-               right_sizer->Add(_film_viewer.panel(), 2, wxEXPAND | wxALL, 6);
+               right_sizer->Add(_film_viewer.panel(VideoType::MAIN), 2, wxEXPAND | wxALL, 6);
                right_sizer->Add (_controls, 0, wxEXPAND | wxALL, 6);
                right_sizer->Add (job_manager_view, 1, wxEXPAND | wxALL, 6);
 
index 1b2b98729ddd789187a144d8bf51aab0dd0af40f..4fabdfc544ced3df22f2ad1dd4695c2a3a128897 100644 (file)
@@ -314,11 +314,11 @@ public:
 
        void setup_main_sizer (Config::PlayerMode mode)
        {
-               _main_sizer->Detach(_viewer.panel());
+               _main_sizer->Detach(_viewer.panel(VideoType::MAIN));
                _main_sizer->Detach (_controls);
                _main_sizer->Detach (_info);
                if (mode != Config::PLAYER_MODE_DUAL) {
-                       _main_sizer->Add(_viewer.panel(), 1, wxEXPAND);
+                       _main_sizer->Add(_viewer.panel(VideoType::MAIN), 1, wxEXPAND);
                }
                _main_sizer->Add (_controls, mode == Config::PLAYER_MODE_DUAL ? 1 : 0, wxEXPAND | wxALL, 6);
                _main_sizer->Add (_info, 0, wxEXPAND | wxALL, 6);
@@ -850,8 +850,8 @@ private:
                        _dual_screen = new wxFrame (this, wxID_ANY, wxT(""));
                        _dual_screen->SetBackgroundColour (wxColour(0, 0, 0));
                        _dual_screen->ShowFullScreen (true);
-                       _viewer.panel()->Reparent(_dual_screen);
-                       _viewer.panel()->SetFocus();
+                       _viewer.panel(VideoType::MAIN)->Reparent(_dual_screen);
+                       _viewer.panel(VideoType::MAIN)->SetFocus();
                        _dual_screen->Show ();
                        if (wxDisplay::GetCount() > 1) {
                                switch (Config::instance()->image_display()) {
@@ -869,7 +869,7 @@ private:
                        _dual_screen->Bind(wxEVT_CHAR_HOOK, boost::bind(&DOMFrame::dual_screen_key_press, this, _1));
                } else {
                        if (_dual_screen) {
-                               _viewer.panel()->Reparent(_overall_panel);
+                               _viewer.panel(VideoType::MAIN)->Reparent(_overall_panel);
                                _dual_screen->Destroy ();
                                _dual_screen = 0;
                        }
index 9f79bbe012a42353c6de8ba8026ed49b41fc6179..50a7390939e89511e7c8eb2688a4bb976260a6dd 100644 (file)
@@ -94,18 +94,21 @@ FilmViewer::FilmViewer (wxWindow* p)
 #if wxCHECK_VERSION(3, 1, 0)
        switch (Config::instance()->video_view_type()) {
        case Config::VIDEO_VIEW_OPENGL:
-               _video_view = std::make_shared<GLVideoView>(this, p);
+               _video_view[VideoType::MAIN] = std::make_shared<GLVideoView>(this, VideoType::MAIN, p);
+               _video_view[VideoType::SIGN_LANGUAGE] = std::make_shared<GLVideoView>(this, VideoType::SIGN_LANGUAGE, _sign_language_dialog);
                break;
        case Config::VIDEO_VIEW_SIMPLE:
-               _video_view = std::make_shared<SimpleVideoView>(this, p);
+               _video_view[VideoType::MAIN] = std::make_shared<SimpleVideoView>(this, VideoType::MAIN, p);
+               _video_view[VideoType::SIGN_LANGUAGE] = std::make_shared<SimpleVideoView>(this, VideoType::SIGN_LANGUAGE, _sign_language_dialog);
                break;
        }
 #else
        _video_view = std::make_shared<SimpleVideoView>(this, p);
 #endif
 
-       _video_view->Sized.connect (boost::bind(&FilmViewer::video_view_sized, this));
-       _video_view->TooManyDropped.connect (boost::bind(boost::ref(TooManyDropped)));
+       _video_view[VideoType::MAIN]->Sized.connect(boost::bind(&FilmViewer::video_view_sized, this, VideoType::MAIN));
+       _video_view[VideoType::SIGN_LANGUAGE]->Sized.connect(boost::bind(&FilmViewer::video_view_sized, this, VideoType::SIGN_LANGUAGE));
+       _video_view[VideoType::MAIN]->TooManyDropped.connect(boost::bind(boost::ref(TooManyDropped)));
 
        set_film (shared_ptr<Film>());
 
@@ -141,7 +144,7 @@ FilmViewer::idle_handler ()
                return;
        }
 
-       if (_video_view->display_next_frame(true) == VideoView::AGAIN) {
+       if (_video_view[VideoType::MAIN]->display_next_frame(true) == VideoView::AGAIN) {
                /* get() could not complete quickly so we'll try again later */
                signal_manager->when_idle (boost::bind(&FilmViewer::idle_handler, this));
        } else {
@@ -159,7 +162,8 @@ FilmViewer::set_film (shared_ptr<Film> film)
 
        _film = film;
 
-       _video_view->clear ();
+       _video_view[VideoType::MAIN]->clear();
+       _video_view[VideoType::SIGN_LANGUAGE]->clear();
        _closed_captions_dialog->clear ();
 
        destroy_butler();
@@ -167,7 +171,8 @@ FilmViewer::set_film (shared_ptr<Film> film)
        if (!_film) {
                _player = boost::none;
                resume();
-               _video_view->update ();
+               _video_view[VideoType::MAIN]->update();
+               _video_view[VideoType::SIGN_LANGUAGE]->update();
                return;
        }
 
@@ -178,7 +183,7 @@ FilmViewer::set_film (shared_ptr<Film> film)
                        _player->set_dcp_decode_reduction (_dcp_decode_reduction);
                }
        } catch (bad_alloc &) {
-               error_dialog (_video_view->get(), _("There is not enough free memory to do that."));
+               error_dialog(_video_view[VideoType::MAIN]->get(), _("There is not enough free memory to do that."));
                _film.reset ();
                resume();
                return;
@@ -233,7 +238,7 @@ void
 FilmViewer::create_butler()
 {
 #if wxCHECK_VERSION(3, 1, 0)
-       auto const j2k_gl_optimised = dynamic_pointer_cast<GLVideoView>(_video_view) && _optimise_for_j2k;
+       auto const j2k_gl_optimised = dynamic_pointer_cast<GLVideoView>(_video_view[VideoType::MAIN]) && _optimise_for_j2k;
 #else
        auto const j2k_gl_optimised = false;
 #endif
@@ -263,7 +268,7 @@ void
 FilmViewer::set_outline_content (bool o)
 {
        _outline_content = o;
-       _video_view->update ();
+       _video_view[VideoType::MAIN]->update();
 }
 
 
@@ -271,20 +276,20 @@ void
 FilmViewer::set_outline_subtitles (optional<dcpomatic::Rect<double>> rect)
 {
        _outline_subtitles = rect;
-       _video_view->update ();
+       _video_view[VideoType::MAIN]->update();
 }
 
 
 void
 FilmViewer::set_eyes (Eyes e)
 {
-       _video_view->set_eyes (e);
+       _video_view[VideoType::MAIN]->set_eyes(e);
        slow_refresh ();
 }
 
 
 void
-FilmViewer::video_view_sized ()
+FilmViewer::video_view_sized(VideoType)
 {
        calculate_sizes ();
        if (!quick_refresh()) {
@@ -300,41 +305,43 @@ FilmViewer::calculate_sizes ()
                return;
        }
 
-       auto const container = _film->container ();
+       auto set_sizes = [this](VideoType type, float ratio) {
+               auto const scale = dpi_scale_factor(_video_view[type]->get());
+               int const video_view_width = std::round(_video_view[type]->get()->GetSize().x * scale);
+               int const video_view_height = std::round(_video_view[type]->get()->GetSize().y * scale);
 
-       auto const scale = dpi_scale_factor (_video_view->get());
-       int const video_view_width = std::round(_video_view->get()->GetSize().x * scale);
-       int const video_view_height = std::round(_video_view->get()->GetSize().y * scale);
+               auto const view_ratio = float(video_view_width) / video_view_height;
 
-       auto const view_ratio = float(video_view_width) / video_view_height;
-       auto const film_ratio = container ? container->ratio () : 1.78;
+               dcp::Size out_size;
+               if (view_ratio < ratio) {
+                       /* panel is less widescreen than the film; clamp width */
+                       out_size.width = video_view_width;
+                       out_size.height = lrintf(out_size.width / ratio);
+               } else {
+                       /* panel is more widescreen than the film; clamp height */
+                       out_size.height = video_view_height;
+                       out_size.width = lrintf(out_size.height * ratio);
+               }
 
-       dcp::Size out_size;
-       if (view_ratio < film_ratio) {
-               /* panel is less widscreen than the film; clamp width */
-               out_size.width = video_view_width;
-               out_size.height = lrintf (out_size.width / film_ratio);
-       } else {
-               /* panel is more widescreen than the film; clamp height */
-               out_size.height = video_view_height;
-               out_size.width = lrintf (out_size.height * film_ratio);
-       }
+               /* Catch silly values */
+               out_size.width = max (64, out_size.width);
+               out_size.height = max (64, out_size.height);
 
-       /* Catch silly values */
-       out_size.width = max (64, out_size.width);
-       out_size.height = max (64, out_size.height);
+               /* Make sure the video container sizes are always a multiple of 2 so that
+                * we don't get gaps with subsampled sources (e.g. YUV420)
+                */
+               if (out_size.width % 2) {
+                       out_size.width++;
+               }
+               if (out_size.height % 2) {
+                       out_size.height++;
+               }
 
-       /* Make sure the video container sizes are always a multiple of 2 so that
-        * we don't get gaps with subsampled sources (e.g. YUV420)
-        */
-       if (out_size.width % 2) {
-               out_size.width++;
-       }
-       if (out_size.height % 2) {
-               out_size.height++;
-       }
+               _player->set_video_container_size(type, out_size);
+       };
 
-       _player->set_video_container_size (out_size);
+       set_sizes(VideoType::MAIN, _film->container() ? _film->container()->ratio() : 1.78);
+       set_sizes(VideoType::SIGN_LANGUAGE, 480.0 / 640.0);
 }
 
 
@@ -352,13 +359,13 @@ void
 FilmViewer::start_audio_stream_if_open ()
 {
        if (_audio.isStreamOpen()) {
-               _audio.setStreamTime (_video_view->position().seconds());
+               _audio.setStreamTime(_video_view[VideoType::MAIN]->position().seconds());
                try {
                        _audio.startStream ();
                } catch (RtAudioError& e) {
                        _audio_channels = 0;
                        error_dialog (
-                               _video_view->get(),
+                               _video_view[VideoType::MAIN]->get(),
                                _("There was a problem starting audio playback.  Please try another audio output device in Preferences."), std_to_wx(e.what())
                                );
                }
@@ -373,7 +380,8 @@ FilmViewer::resume ()
        --_suspended;
        if (_playing && !_suspended) {
                start_audio_stream_if_open ();
-               _video_view->start ();
+               _video_view[VideoType::MAIN]->start();
+               _video_view[VideoType::SIGN_LANGUAGE]->start();
        }
 }
 
@@ -409,7 +417,8 @@ FilmViewer::start ()
         * happens we want it to come after the Started signal, so do that first.
         */
        Started ();
-       _video_view->start ();
+       _video_view[VideoType::MAIN]->start();
+       _video_view[VideoType::SIGN_LANGUAGE]->start();
 }
 
 
@@ -426,10 +435,12 @@ FilmViewer::stop ()
        }
 
        _playing = false;
-       _video_view->stop ();
+       _video_view[VideoType::MAIN]->stop();
+       _video_view[VideoType::SIGN_LANGUAGE]->stop();
        Stopped ();
 
-       _video_view->rethrow ();
+       _video_view[VideoType::MAIN]->rethrow();
+       _video_view[VideoType::SIGN_LANGUAGE]->rethrow();
        return true;
 }
 
@@ -497,9 +508,10 @@ FilmViewer::film_change (ChangeType type, Film::Property p)
        if (p == Film::Property::AUDIO_CHANNELS) {
                destroy_and_maybe_create_butler();
        } else if (p == Film::Property::VIDEO_FRAME_RATE) {
-               _video_view->set_video_frame_rate (_film->video_frame_rate());
+               _video_view[VideoType::MAIN]->set_video_frame_rate(_film->video_frame_rate());
+               _video_view[VideoType::SIGN_LANGUAGE]->set_video_frame_rate(_film->video_frame_rate());
        } else if (p == Film::Property::THREE_D) {
-               _video_view->set_three_d (_film->three_d());
+               _video_view[VideoType::MAIN]->set_three_d(_film->three_d());
        } else if (p == Film::Property::CONTENT) {
                _closed_captions_dialog->update_tracks (_film);
        }
@@ -509,7 +521,8 @@ FilmViewer::film_change (ChangeType type, Film::Property p)
 void
 FilmViewer::film_length_change ()
 {
-       _video_view->set_length (_film->length());
+       _video_view[VideoType::MAIN]->set_length(_film->length());
+       _video_view[VideoType::SIGN_LANGUAGE]->set_length(_film->length());
 }
 
 
@@ -517,7 +530,7 @@ FilmViewer::film_length_change ()
 void
 FilmViewer::slow_refresh ()
 {
-       seek (_video_view->position(), true);
+       seek(_video_view[VideoType::MAIN]->position(), true);
 }
 
 
@@ -528,10 +541,10 @@ FilmViewer::slow_refresh ()
 bool
 FilmViewer::quick_refresh ()
 {
-       if (!_video_view || !_film || !_player) {
+       if (!_video_view[VideoType::MAIN] || !_film || !_player) {
                return true;
        }
-       return _video_view->reset_metadata (_film, _player->video_container_size());
+       return _video_view[VideoType::MAIN]->reset_metadata(_film, _player->video_container_size(VideoType::MAIN));
 }
 
 
@@ -587,7 +600,7 @@ FilmViewer::seek (DCPTime t, bool accurate)
                /* We're going to start playing again straight away
                   so wait for the seek to finish.
                */
-               while (_video_view->display_next_frame(false) == VideoView::AGAIN) {}
+               while (_video_view[VideoType::MAIN]->display_next_frame(false) == VideoView::AGAIN) {}
        }
 
        resume ();
@@ -640,7 +653,7 @@ FilmViewer::config_changed (Config::Property p)
                } catch (RtAudioError& e) {
                        _audio_channels = 0;
                        error_dialog (
-                               _video_view->get(),
+                               _video_view[VideoType::MAIN]->get(),
                                _("Could not set up audio output.  There will be no audio during the preview."), std_to_wx(e.what())
                                );
                }
@@ -660,7 +673,7 @@ FilmViewer::uncorrected_time () const
                return DCPTime::from_seconds (const_cast<RtAudio*>(&_audio)->getStreamTime());
        }
 
-       return _video_view->position();
+       return _video_view[VideoType::MAIN]->position();
 }
 
 
@@ -679,7 +692,7 @@ FilmViewer::audio_time () const
 DCPTime
 FilmViewer::time () const
 {
-       return audio_time().get_value_or(_video_view->position());
+       return audio_time().get_value_or(_video_view[VideoType::MAIN]->position());
 }
 
 
@@ -774,7 +787,7 @@ FilmViewer::show_sign_language()
 void
 FilmViewer::seek_by (DCPTime by, bool accurate)
 {
-       seek (_video_view->position() + by, accurate);
+       seek(_video_view[VideoType::MAIN]->position() + by, accurate);
 }
 
 
@@ -807,21 +820,21 @@ FilmViewer::ui_finished ()
 int
 FilmViewer::dropped () const
 {
-       return _video_view->dropped ();
+       return _video_view[VideoType::MAIN]->dropped();
 }
 
 
 int
 FilmViewer::errored () const
 {
-       return _video_view->errored ();
+       return _video_view[VideoType::MAIN]->errored();
 }
 
 
 int
 FilmViewer::gets () const
 {
-       return _video_view->gets ();
+       return _video_view[VideoType::MAIN]->gets();
 }
 
 
@@ -836,7 +849,7 @@ void
 FilmViewer::set_optimise_for_j2k (bool o)
 {
        _optimise_for_j2k = o;
-       _video_view->set_optimise_for_j2k (o);
+       _video_view[VideoType::MAIN]->set_optimise_for_j2k(o);
 }
 
 
@@ -845,7 +858,7 @@ FilmViewer::set_crop_guess (dcpomatic::Rect<float> crop)
 {
        if (crop != _crop_guess) {
                _crop_guess = crop;
-               _video_view->update ();
+               _video_view[VideoType::MAIN]->update();
        }
 }
 
@@ -854,6 +867,28 @@ void
 FilmViewer::unset_crop_guess ()
 {
        _crop_guess = boost::none;
-       _video_view->update ();
+       _video_view[VideoType::MAIN]->update();
+}
+
+
+optional<dcpomatic::Rect<float>>
+FilmViewer::crop_guess(VideoType type) const
+{
+       if (type != VideoType::MAIN) {
+               return {};
+       }
+
+       return _crop_guess;
+}
+
+
+optional<dcpomatic::Rect<double>>
+FilmViewer::outline_subtitles(VideoType type) const
+{
+       if (type != VideoType::MAIN) {
+               return {};
+       }
+
+       return _outline_subtitles;
 }
 
index c95ab5b0a8572ccdb01eb665f9f0042abbf47af9..73a981680c9d2ba784467538d86992268d3c96ab 100644 (file)
@@ -59,12 +59,12 @@ public:
        ~FilmViewer ();
 
        /** @return the window showing the film's video */
-       wxWindow* panel () const {
-               return _video_view->get();
+       wxWindow* panel(VideoType type) const {
+               return _video_view[type]->get();
        }
 
-       std::shared_ptr<const VideoView> video_view () const {
-               return _video_view;
+       std::shared_ptr<const VideoView> video_view(VideoType type) const {
+               return _video_view[type];
        }
 
        void show_closed_captions ();
@@ -80,7 +80,7 @@ public:
        void seek_by (dcpomatic::DCPTime by, bool accurate);
        /** @return our `playhead' position; this may not lie exactly on a frame boundary */
        dcpomatic::DCPTime position () const {
-               return _video_view->position();
+               return _video_view[VideoType::MAIN]->position();
        }
        boost::optional<dcpomatic::ContentTime> position_in_content (std::shared_ptr<const Content> content) const;
        dcpomatic::DCPTime one_video_frame () const;
@@ -117,16 +117,14 @@ public:
        int audio_callback (void* out, unsigned int frames);
 
        StateTimer const & state_timer () const {
-               return _video_view->state_timer ();
+               return _video_view[VideoType::MAIN]->state_timer();
        }
 
        /* Some accessors and utility methods that VideoView classes need */
-       bool outline_content () const {
-               return _outline_content;
-       }
-       boost::optional<dcpomatic::Rect<double>> outline_subtitles () const {
-               return _outline_subtitles;
+       bool outline_content(VideoType type) const {
+               return type == VideoType::MAIN && _outline_content;
        }
+       boost::optional<dcpomatic::Rect<double>> outline_subtitles(VideoType type) const;
        bool pad_black () const {
                return _pad_black;
        }
@@ -138,9 +136,7 @@ public:
        }
        void finished ();
        void image_changed (std::shared_ptr<PlayerVideo> video);
-       boost::optional<dcpomatic::Rect<float>> crop_guess () const {
-               return _crop_guess;
-       }
+       boost::optional<dcpomatic::Rect<float>> crop_guess(VideoType type) const;
 
        bool pending_idle_get () const {
                return _idle_get;
@@ -158,7 +154,7 @@ public:
 
 private:
 
-       void video_view_sized ();
+       void video_view_sized(VideoType type);
        void calculate_sizes ();
        void player_change (ChangeType type, int, bool);
        void player_change (std::vector<int> properties);
@@ -181,7 +177,7 @@ private:
        std::shared_ptr<Film> _film;
        boost::optional<Player> _player;
 
-       std::shared_ptr<VideoView> _video_view;
+       EnumIndexedVector<std::shared_ptr<VideoView>, VideoType> _video_view;
        bool _coalesce_player_changes = false;
        std::vector<int> _pending_player_changes;
 
index 397693f51f1fbd7afe26a5fb796f788e60488564..1ba5c43e64bcb52301100a35f7c853b7b6e13def 100644 (file)
@@ -76,8 +76,8 @@ check_gl_error (char const * last)
 }
 
 
-GLVideoView::GLVideoView (FilmViewer* viewer, wxWindow *parent)
-       : VideoView (viewer)
+GLVideoView::GLVideoView(FilmViewer* viewer, VideoType type, wxWindow *parent)
+       : VideoView(viewer, type)
        , _context (nullptr)
        , _rec2020(false)
        , _vsync_enabled (false)
@@ -574,12 +574,12 @@ GLVideoView::draw ()
                _subtitle_texture->bind();
                glDrawElements (GL_TRIANGLES, indices_subtitle_texture_number, GL_UNSIGNED_INT, reinterpret_cast<void*>(indices_subtitle_texture_offset * sizeof(int)));
        }
-       if (_viewer->outline_content()) {
+       if (_viewer->outline_content(_type)) {
                glUniform1i(_fragment_type, static_cast<GLint>(FragmentType::OUTLINE_CONTENT));
                glDrawElements (GL_LINES, indices_outline_content_number, GL_UNSIGNED_INT, reinterpret_cast<void*>(indices_outline_content_offset * sizeof(int)));
                check_gl_error ("glDrawElements");
        }
-       if (auto guess = _viewer->crop_guess()) {
+       if (auto const guess = _viewer->crop_guess(_type)) {
                glUniform1i(_fragment_type, static_cast<GLint>(FragmentType::CROP_GUESS));
                glDrawElements (GL_LINES, indices_crop_guess_number, GL_UNSIGNED_INT, reinterpret_cast<void*>(indices_crop_guess_offset * sizeof(int)));
                check_gl_error ("glDrawElements");
@@ -624,7 +624,7 @@ GLVideoView::set_image (shared_ptr<const PlayerVideo> pv)
        auto const inter_position = player_video().first->inter_position();
        auto const inter_size = player_video().first->inter_size();
        auto const out_size = player_video().first->out_size();
-       auto const crop_guess = _viewer->crop_guess();
+       auto const crop_guess = _viewer->crop_guess(_type);
 
        auto x_offset = std::max(0, (canvas_width - out_size.width) / 2);
        auto y_offset = std::max(0, (canvas_height - out_size.height) / 2);
index 964f6f1ab9db2db8469e1fce8a36bd2d93279fa3..a60d01d27da0645ed9dd329c07f7153584411322 100644 (file)
@@ -68,7 +68,7 @@ private:
 class GLVideoView : public VideoView
 {
 public:
-       GLVideoView (FilmViewer* viewer, wxWindow* parent);
+       GLVideoView(FilmViewer* viewer, VideoType type, wxWindow* parent);
        ~GLVideoView ();
 
        wxWindow* get () const override {
index 857e4380b5019dbd46ee900e617fd1a9e3d3c0fa..7f01bbbc2bf8f74670f63c9094c3e982bda38984 100644 (file)
@@ -28,7 +28,7 @@ using std::make_shared;
 
 
 SignLanguageDialog::SignLanguageDialog(wxWindow* parent)
-       : wxDialog(parent, wxID_ANY, _("Sign language"), wxDefaultPosition, wxSize(SIGN_LANGUAGE_WIDTH, SIGN_LANGUAGE_HEIGHT))
+       : wxDialog(parent, wxID_ANY, _("Sign language"), wxDefaultPosition, wxSize(SIGN_LANGUAGE_WIDTH, SIGN_LANGUAGE_HEIGHT), wxDEFAULT_FRAME_STYLE | wxRESIZE_BORDER)
 {
 
 }
index 09c17217194bbe0f0423e755bbec2e7070f0a92c..d58c06183dce3dd61d8f0153ff0b60095b1d0014 100644 (file)
@@ -46,8 +46,8 @@ using namespace boost::placeholders;
 using namespace dcpomatic;
 
 
-SimpleVideoView::SimpleVideoView (FilmViewer* viewer, wxWindow* parent)
-       : VideoView (viewer)
+SimpleVideoView::SimpleVideoView(FilmViewer* viewer, VideoType type, wxWindow* parent)
+       : VideoView (viewer, type)
        , _rec2020_filter("convert", "convert", "", "colorspace=all=bt709:iall=bt2020")
        , _rec2020_filter_graph({ &_rec2020_filter }, dcp::Fraction(24, 1))
 {
@@ -109,14 +109,14 @@ SimpleVideoView::paint ()
                dc.DrawRectangle (0, gap + out_size.height + 1, panel_size.GetWidth(), gap + 1);
        }
 
-       if (_viewer->outline_content()) {
+       if (_viewer->outline_content(_type)) {
                wxPen p (outline_content_colour(), 2);
                dc.SetPen (p);
                dc.SetBrush (*wxTRANSPARENT_BRUSH);
                dc.DrawRectangle (_inter_position.x, _inter_position.y + (panel_size.GetHeight() - out_size.height) / 2, _inter_size.width, _inter_size.height);
        }
 
-       auto subs = _viewer->outline_subtitles();
+       auto subs = _viewer->outline_subtitles(_type);
        if (subs) {
                wxPen p (outline_subtitles_colour(), 2);
                dc.SetPen (p);
@@ -124,16 +124,15 @@ SimpleVideoView::paint ()
                dc.DrawRectangle (subs->x * out_size.width, subs->y * out_size.height, subs->width * out_size.width, subs->height * out_size.height);
        }
 
-       if (_viewer->crop_guess()) {
+       if (auto const crop_guess = _viewer->crop_guess(_type)) {
                wxPen p (crop_guess_colour(), 2);
                dc.SetPen (p);
                dc.SetBrush (*wxTRANSPARENT_BRUSH);
-               auto const crop_guess = _viewer->crop_guess().get();
                dc.DrawRectangle (
-                       _inter_position.x + _inter_size.width * crop_guess.x,
-                       _inter_position.y + _inter_size.height * crop_guess.y,
-                       _inter_size.width * crop_guess.width,
-                       _inter_size.height * crop_guess.height
+                       _inter_position.x + _inter_size.width * crop_guess->x,
+                       _inter_position.y + _inter_size.height * crop_guess->y,
+                       _inter_size.width * crop_guess->width,
+                       _inter_size.height * crop_guess->height
                        );
        }
 
index e19068979b5ef2c4724f6aa2ddec848cf1393a0f..8fb2329d057a9fcec9abeaf982629d9c8857cfab 100644 (file)
@@ -37,7 +37,7 @@ class Filter;
 class SimpleVideoView : public VideoView
 {
 public:
-       SimpleVideoView (FilmViewer* viewer, wxWindow* parent);
+       SimpleVideoView(FilmViewer* viewer, VideoType type, wxWindow* parent);
 
        wxWindow* get () const override {
                return _panel;
index fbae2e010ec57f7cbe9dc455e399b1a2f87c3401..5dbef0eca1a376ae085ba2d7d1de9e4ef8e71aea 100644 (file)
@@ -44,7 +44,7 @@ using std::shared_ptr;
 SystemInformationDialog::SystemInformationDialog(wxWindow* parent, FilmViewer const& viewer)
        : TableDialog (parent, _("System information"), 2, 1, false)
 {
-       auto gl = std::dynamic_pointer_cast<const GLVideoView>(viewer.video_view());
+       auto gl = std::dynamic_pointer_cast<const GLVideoView>(viewer.video_view(VideoType::MAIN));
 
        if (!gl) {
                add (_("OpenGL version"), true);
index 74d543265fa4a59e1779631839f7fb3a050c0ffc..685268588e06683d4a490c5e9a2537abf237cc90 100644 (file)
@@ -36,8 +36,9 @@ static constexpr int TOO_MANY_DROPPED_FRAMES = 20;
 static constexpr int TOO_MANY_DROPPED_PERIOD = 5.0;
 
 
-VideoView::VideoView (FilmViewer* viewer)
+VideoView::VideoView(FilmViewer* viewer, VideoType type)
        : _viewer (viewer)
+       , _type(type)
        , _state_timer ("viewer")
 {
 
@@ -75,7 +76,7 @@ VideoView::get_next_frame (bool non_blocking)
 
        do {
                Butler::Error e;
-               auto pv = butler->get_video(VideoType::MAIN, non_blocking ? Butler::Behaviour::NON_BLOCKING : Butler::Behaviour::BLOCKING, &e);
+               auto pv = butler->get_video(_type, non_blocking ? Butler::Behaviour::NON_BLOCKING : Butler::Behaviour::BLOCKING, &e);
                if (e.code == Butler::Error::Code::DIED) {
                        LOG_ERROR ("Butler died with %1", e.summary());
                }
index b815afb7cc9da251283f21c3170fac3b0d53f1fc..e3166a15cd24dfb56210b3981d23f9609e67800a 100644 (file)
@@ -28,6 +28,7 @@
 #include "lib/signaller.h"
 #include "lib/timer.h"
 #include "lib/types.h"
+#include "lib/video_type.h"
 #include <dcp/warnings.h>
 LIBDCP_DISABLE_WARNINGS
 #include <wx/wx.h>
@@ -46,7 +47,7 @@ class wxWindow;
 class VideoView : public ExceptionStore, public Signaller
 {
 public:
-       VideoView (FilmViewer* viewer);
+       VideoView(FilmViewer* viewer, VideoType type);
        virtual ~VideoView () {}
 
        VideoView (VideoView const&) = delete;
@@ -176,6 +177,7 @@ protected:
        }
 
        FilmViewer* _viewer;
+       VideoType _type;
 
        StateTimer _state_timer;