From 3f6f2ba3afb6612a34a23f52289d9d5f7b527004 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 | 12 +- 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, 143 insertions(+), 110 deletions(-) diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index 4cad8dbbf..91c73fb2d 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -389,7 +389,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 55cd00027..f66cd7d72 100644 --- a/src/tools/dcpomatic_player.cc +++ b/src/tools/dcpomatic_player.cc @@ -335,11 +335,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); @@ -908,8 +908,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 (); LOG_DEBUG_PLAYER("Setting up dual screen mode with %1 displays", wxDisplay::GetCount()); for (auto index = 0U; index < wxDisplay::GetCount(); ++index) { @@ -930,13 +930,13 @@ private: }; auto const image_display = Config::instance()->image_display(); _dual_screen->Move(geometry[image_display].GetX(), geometry[image_display].GetY()); - _viewer.panel()->SetSize(geometry[image_display].GetWidth(), geometry[image_display].GetHeight()); + _viewer.panel(VideoType::MAIN)->SetSize(geometry[image_display].GetWidth(), geometry[image_display].GetHeight()); Move(geometry[1 - image_display].GetX(), geometry[1 - image_display].GetY()); } _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 a17103315..ab1b0debe 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -99,18 +99,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()); @@ -146,7 +149,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 { @@ -164,7 +167,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(); @@ -172,7 +176,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; } @@ -183,7 +188,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; @@ -238,7 +243,7 @@ void FilmViewer::create_butler() { #if wxCHECK_VERSION(3, 1, 0) - auto const opengl = dynamic_pointer_cast(_video_view); + auto const opengl = dynamic_pointer_cast(_video_view[VideoType::MAIN]); #else auto const opengl = false; #endif @@ -268,7 +273,7 @@ void FilmViewer::set_outline_content (bool o) { _outline_content = o; - _video_view->update (); + _video_view[VideoType::MAIN]->update(); } @@ -276,20 +281,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()) { @@ -305,41 +310,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); } @@ -357,7 +364,7 @@ void FilmViewer::start_audio_stream_if_open () { if (_audio.isStreamOpen()) { - _audio.setStreamTime (_video_view->position().seconds()); + _audio.setStreamTime(_video_view[VideoType::MAIN]->position().seconds()); #if (RTAUDIO_VERSION_MAJOR >= 6) if (_audio.startStream() != RTAUDIO_NO_ERROR) { _audio_channels = 0; @@ -372,7 +379,7 @@ FilmViewer::start_audio_stream_if_open () } 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()) ); } @@ -388,7 +395,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(); } } @@ -424,7 +432,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(); } @@ -441,10 +450,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; } @@ -512,9 +523,10 @@ FilmViewer::film_change(ChangeType type, FilmProperty p) if (p == FilmProperty::AUDIO_CHANNELS) { destroy_and_maybe_create_butler(); } else if (p == FilmProperty::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 == FilmProperty::THREE_D) { - _video_view->set_three_d (_film->three_d()); + _video_view[VideoType::MAIN]->set_three_d(_film->three_d()); } else if (p == FilmProperty::CONTENT) { _closed_captions_dialog->update_tracks (_film); } @@ -524,7 +536,8 @@ FilmViewer::film_change(ChangeType type, FilmProperty 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()); } @@ -532,7 +545,7 @@ FilmViewer::film_length_change () void FilmViewer::slow_refresh () { - seek (_video_view->position(), true); + seek(_video_view[VideoType::MAIN]->position(), true); } @@ -543,10 +556,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)); } @@ -602,7 +615,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 (); @@ -690,7 +703,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()) ); } @@ -711,7 +724,7 @@ FilmViewer::uncorrected_time () const return DCPTime::from_seconds (const_cast(&_audio)->getStreamTime()); } - return _video_view->position(); + return _video_view[VideoType::MAIN]->position(); } @@ -730,7 +743,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()); } @@ -825,7 +838,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); } @@ -858,21 +871,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(); } @@ -887,7 +900,7 @@ void FilmViewer::set_optimisation(Optimisation o) { _optimisation = o; - _video_view->set_optimisation(o); + _video_view[VideoType::MAIN]->set_optimisation(o); destroy_and_maybe_create_butler(); } @@ -897,7 +910,7 @@ FilmViewer::set_crop_guess (dcpomatic::Rect crop) { if (crop != _crop_guess) { _crop_guess = crop; - _video_view->update (); + _video_view[VideoType::MAIN]->update(); } } @@ -906,7 +919,29 @@ 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 0c4e76557..1c615e1cd 100644 --- a/src/wx/film_viewer.h +++ b/src/wx/film_viewer.h @@ -63,12 +63,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 (); @@ -89,7 +89,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; @@ -126,16 +126,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; } @@ -147,9 +145,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; @@ -167,7 +163,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); @@ -197,7 +193,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 c96fd02a0..8e616dc51 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) @@ -604,12 +604,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"); @@ -671,7 +671,7 @@ GLVideoView::set_image (shared_ptr pv) auto const inter_position = pv->inter_position(); auto const inter_size = pv->inter_size(); auto const out_size = pv->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 25750b64b..e81b98f44 100644 --- a/src/wx/gl_video_view.h +++ b/src/wx/gl_video_view.h @@ -71,7 +71,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 cbfd7d4ac..445bae0e5 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.width, 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.height - 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 26138900a..8d037695a 100644 --- a/src/wx/system_information_dialog.cc +++ b/src/wx/system_information_dialog.cc @@ -45,7 +45,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 3ea03a5fd..759fc27d5 100644 --- a/src/wx/video_view.h +++ b/src/wx/video_view.h @@ -29,6 +29,7 @@ #include "lib/signaller.h" #include "lib/timer.h" #include "lib/types.h" +#include "lib/video_type.h" #include #include LIBDCP_DISABLE_WARNINGS @@ -48,7 +49,7 @@ class wxWindow; class VideoView : public ExceptionStore, public Signaller { public: - VideoView (FilmViewer* viewer); + VideoView(FilmViewer* viewer, VideoType type); virtual ~VideoView () {} VideoView (VideoView const&) = delete; @@ -178,6 +179,7 @@ protected: } FilmViewer* _viewer; + VideoType _type; StateTimer _state_timer; -- 2.30.2