From 286a13747b5a5e3f1f99506e7df2b6c727a23588 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 6 Nov 2022 20:33:27 +0100 Subject: [PATCH] Put two video views inside FilmViewer, one for main and one for sign language. --- src/tools/dcpomatic.cc | 2 +- src/tools/dcpomatic_player.cc | 10 +- src/wx/film_viewer.cc | 165 +++++++++++++++++----------- src/wx/film_viewer.h | 28 ++--- src/wx/gl_video_view.cc | 10 +- src/wx/gl_video_view.h | 2 +- src/wx/sign_language_dialog.cc | 2 +- src/wx/simple_video_view.cc | 19 ++-- src/wx/simple_video_view.h | 2 +- src/wx/system_information_dialog.cc | 2 +- src/wx/video_view.cc | 5 +- src/wx/video_view.h | 4 +- 12 files changed, 142 insertions(+), 109 deletions(-) diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index eb245cef9..940ff4345 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -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); diff --git a/src/tools/dcpomatic_player.cc b/src/tools/dcpomatic_player.cc index 1b2b98729..4fabdfc54 100644 --- a/src/tools/dcpomatic_player.cc +++ b/src/tools/dcpomatic_player.cc @@ -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; } diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index 9f79bbe01..50a739093 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -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(this, p); + _video_view[VideoType::MAIN] = std::make_shared(this, VideoType::MAIN, p); + _video_view[VideoType::SIGN_LANGUAGE] = std::make_shared(this, VideoType::SIGN_LANGUAGE, _sign_language_dialog); break; case Config::VIDEO_VIEW_SIMPLE: - _video_view = std::make_shared(this, p); + _video_view[VideoType::MAIN] = std::make_shared(this, VideoType::MAIN, p); + _video_view[VideoType::SIGN_LANGUAGE] = std::make_shared(this, VideoType::SIGN_LANGUAGE, _sign_language_dialog); break; } #else _video_view = std::make_shared(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()); @@ -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; - _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) 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) _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(_video_view) && _optimise_for_j2k; + auto const j2k_gl_optimised = dynamic_pointer_cast(_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> 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(&_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 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> +FilmViewer::crop_guess(VideoType type) const +{ + if (type != VideoType::MAIN) { + return {}; + } + + return _crop_guess; +} + + +optional> +FilmViewer::outline_subtitles(VideoType type) const +{ + if (type != VideoType::MAIN) { + return {}; + } + + return _outline_subtitles; } diff --git a/src/wx/film_viewer.h b/src/wx/film_viewer.h index c95ab5b0a..73a981680 100644 --- a/src/wx/film_viewer.h +++ b/src/wx/film_viewer.h @@ -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 video_view () const { - return _video_view; + std::shared_ptr 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 position_in_content (std::shared_ptr 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> outline_subtitles () const { - return _outline_subtitles; + bool outline_content(VideoType type) const { + return type == VideoType::MAIN && _outline_content; } + boost::optional> 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 video); - boost::optional> crop_guess () const { - return _crop_guess; - } + boost::optional> 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 properties); @@ -181,7 +177,7 @@ private: std::shared_ptr _film; boost::optional _player; - std::shared_ptr _video_view; + EnumIndexedVector, VideoType> _video_view; bool _coalesce_player_changes = false; std::vector _pending_player_changes; diff --git a/src/wx/gl_video_view.cc b/src/wx/gl_video_view.cc index 397693f51..1ba5c43e6 100644 --- a/src/wx/gl_video_view.cc +++ b/src/wx/gl_video_view.cc @@ -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(indices_subtitle_texture_offset * sizeof(int))); } - if (_viewer->outline_content()) { + if (_viewer->outline_content(_type)) { glUniform1i(_fragment_type, static_cast(FragmentType::OUTLINE_CONTENT)); glDrawElements (GL_LINES, indices_outline_content_number, GL_UNSIGNED_INT, reinterpret_cast(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(FragmentType::CROP_GUESS)); glDrawElements (GL_LINES, indices_crop_guess_number, GL_UNSIGNED_INT, reinterpret_cast(indices_crop_guess_offset * sizeof(int))); check_gl_error ("glDrawElements"); @@ -624,7 +624,7 @@ GLVideoView::set_image (shared_ptr 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); diff --git a/src/wx/gl_video_view.h b/src/wx/gl_video_view.h index 964f6f1ab..a60d01d27 100644 --- a/src/wx/gl_video_view.h +++ b/src/wx/gl_video_view.h @@ -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 { diff --git a/src/wx/sign_language_dialog.cc b/src/wx/sign_language_dialog.cc index 857e4380b..7f01bbbc2 100644 --- a/src/wx/sign_language_dialog.cc +++ b/src/wx/sign_language_dialog.cc @@ -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) { } diff --git a/src/wx/simple_video_view.cc b/src/wx/simple_video_view.cc index 09c172171..d58c06183 100644 --- a/src/wx/simple_video_view.cc +++ b/src/wx/simple_video_view.cc @@ -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 ); } diff --git a/src/wx/simple_video_view.h b/src/wx/simple_video_view.h index e19068979..8fb2329d0 100644 --- a/src/wx/simple_video_view.h +++ b/src/wx/simple_video_view.h @@ -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; diff --git a/src/wx/system_information_dialog.cc b/src/wx/system_information_dialog.cc index fbae2e010..5dbef0eca 100644 --- a/src/wx/system_information_dialog.cc +++ b/src/wx/system_information_dialog.cc @@ -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(viewer.video_view()); + auto gl = std::dynamic_pointer_cast(viewer.video_view(VideoType::MAIN)); if (!gl) { add (_("OpenGL version"), true); diff --git a/src/wx/video_view.cc b/src/wx/video_view.cc index 74d543265..685268588 100644 --- a/src/wx/video_view.cc +++ b/src/wx/video_view.cc @@ -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()); } diff --git a/src/wx/video_view.h b/src/wx/video_view.h index b815afb7c..e3166a15c 100644 --- a/src/wx/video_view.h +++ b/src/wx/video_view.h @@ -28,6 +28,7 @@ #include "lib/signaller.h" #include "lib/timer.h" #include "lib/types.h" +#include "lib/video_type.h" #include LIBDCP_DISABLE_WARNINGS #include @@ -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; -- 2.30.2