diff options
| author | Carl Hetherington <cth@carlh.net> | 2018-02-24 01:05:14 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2018-02-24 23:34:36 +0000 |
| commit | d08123f5e160b5737fa912cd36119e810abaa4cd (patch) | |
| tree | 1e3dd2a846f8fd67ef942d2689c73b4485b7a20f /src/wx | |
| parent | 3e961894051327bb62f0d41f2d59e63212a6622f (diff) | |
Speed some operations by re-using the last PlayerVideo but with
updated metadata (where possible). Helps with #1194.
Diffstat (limited to 'src/wx')
| -rw-r--r-- | src/wx/film_viewer.cc | 81 | ||||
| -rw-r--r-- | src/wx/film_viewer.h | 9 | ||||
| -rw-r--r-- | src/wx/video_waveform_dialog.cc | 2 |
3 files changed, 61 insertions, 31 deletions
diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index d521e5385..11505e510 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -87,7 +87,6 @@ FilmViewer::FilmViewer (wxWindow* p, bool outline_content, bool jump_to_selected , _timecode (new wxStaticText (this, wxID_ANY, wxT(""))) , _play_button (new wxToggleButton (this, wxID_ANY, _("Play"))) , _coalesce_player_changes (false) - , _pending_player_change (false) , _slider_being_moved (false) , _was_running_before_slider (false) , _audio (DCPOMATIC_RTAUDIO_API) @@ -146,8 +145,8 @@ FilmViewer::FilmViewer (wxWindow* p, bool outline_content, bool jump_to_selected if (_outline_content) { _outline_content->Bind (wxEVT_CHECKBOX, boost::bind (&FilmViewer::refresh_panel, this)); } - _left_eye->Bind (wxEVT_RADIOBUTTON, boost::bind (&FilmViewer::refresh, this)); - _right_eye->Bind (wxEVT_RADIOBUTTON, boost::bind (&FilmViewer::refresh, this)); + _left_eye->Bind (wxEVT_RADIOBUTTON, boost::bind (&FilmViewer::slow_refresh, this)); + _right_eye->Bind (wxEVT_RADIOBUTTON, boost::bind (&FilmViewer::slow_refresh, this)); _slider->Bind (wxEVT_SCROLL_THUMBTRACK, boost::bind (&FilmViewer::slider_moved, this, false)); _slider->Bind (wxEVT_SCROLL_PAGEUP, boost::bind (&FilmViewer::slider_moved, this, true)); _slider->Bind (wxEVT_SCROLL_PAGEDOWN, boost::bind (&FilmViewer::slider_moved, this, true)); @@ -222,7 +221,7 @@ FilmViewer::set_film (shared_ptr<Film> film) _player->set_play_referenced (); _film->Changed.connect (boost::bind (&FilmViewer::film_changed, this, _1)); - _player->Changed.connect (boost::bind (&FilmViewer::player_changed, this, _1)); + _player->Changed.connect (boost::bind (&FilmViewer::player_changed, this, _1, _2)); /* Keep about 1 second's worth of history samples */ _latency_history_count = _film->audio_frame_rate() / _audio_block_size; @@ -230,7 +229,7 @@ FilmViewer::set_film (shared_ptr<Film> film) recreate_butler (); calculate_sizes (); - refresh (); + slow_refresh (); setup_sensitivity (); } @@ -283,27 +282,32 @@ FilmViewer::get () { DCPOMATIC_ASSERT (_butler); - pair<shared_ptr<PlayerVideo>, DCPTime> video; do { - video = _butler->get_video (); + _player_video = _butler->get_video (); } while ( _film->three_d() && - ((_left_eye->GetValue() && video.first->eyes() == EYES_RIGHT) || (_right_eye->GetValue() && video.first->eyes() == EYES_LEFT)) + ((_left_eye->GetValue() && _player_video.first->eyes() == EYES_RIGHT) || (_right_eye->GetValue() && _player_video.first->eyes() == EYES_LEFT)) ); _butler->rethrow (); - if (!video.first) { + display_player_video (); +} + +void +FilmViewer::display_player_video () +{ + if (!_player_video.first) { _frame.reset (); refresh_panel (); return; } - if (_playing && (time() - video.second) > one_video_frame()) { + if (_playing && (time() - _player_video.second) > one_video_frame()) { /* Too late; just drop this frame before we try to get its image (which will be the time-consuming part if this frame is J2K). */ - _video_position = video.second; + _video_position = _player_video.second; ++_dropped; return; } @@ -326,17 +330,17 @@ FilmViewer::get () * image and convert it (from whatever the user has said it is) to RGB. */ - _frame = video.first->image ( + _frame = _player_video.first->image ( bind (&Log::dcp_log, _film->log().get(), _1, _2), bind (&PlayerVideo::always_rgb, _1), false, true ); - ImageChanged (video.first); + ImageChanged (_player_video.first); - _video_position = video.second; - _inter_position = video.first->inter_position (); - _inter_size = video.first->inter_size (); + _video_position = _player_video.second; + _inter_position = _player_video.first->inter_position (); + _inter_size = _player_video.first->inter_size (); refresh_panel (); } @@ -442,7 +446,7 @@ FilmViewer::panel_sized (wxSizeEvent& ev) _panel_size.height = ev.GetSize().GetHeight(); calculate_sizes (); - refresh (); + quick_refresh (); update_position_label (); update_position_slider (); } @@ -623,19 +627,31 @@ FilmViewer::forward_clicked (wxMouseEvent& ev) } void -FilmViewer::player_changed (bool frequent) +FilmViewer::player_changed (int property, bool frequent) { if (frequent) { return; } if (_coalesce_player_changes) { - _pending_player_change = true; + _pending_player_changes.push_back (property); return; } calculate_sizes (); - refresh (); + if ( + property == VideoContentProperty::CROP || + property == VideoContentProperty::SCALE || + property == VideoContentProperty::FADE_IN || + property == VideoContentProperty::FADE_OUT || + property == VideoContentProperty::COLOUR_CONVERSION || + property == PlayerProperty::VIDEO_CONTAINER_SIZE || + property == PlayerProperty::FILM_CONTAINER + ) { + quick_refresh (); + } else { + slow_refresh (); + } update_position_label (); update_position_slider (); } @@ -673,13 +689,25 @@ FilmViewer::film_changed (Film::Property p) } } -/** Re-get the current frame */ +/** Re-get the current frame slowly by seeking */ void -FilmViewer::refresh () +FilmViewer::slow_refresh () { seek (_video_position, true); } +/** Re-get the current frame quickly by resetting the metadata in the PlayerVideo that we used last time */ +void +FilmViewer::quick_refresh () +{ + if (!_player_video.first) { + return; + } + + _player_video.first->reset_metadata (_player->video_container_size(), _film->frame_size()); + display_player_video (); +} + void FilmViewer::set_position (DCPTime p) { @@ -694,12 +722,11 @@ FilmViewer::set_coalesce_player_changes (bool c) { _coalesce_player_changes = c; - if (c) { - _pending_player_change = false; - } else { - if (_pending_player_change) { - player_changed (false); + if (!c) { + BOOST_FOREACH (int i, _pending_player_changes) { + player_changed (i, false); } + _pending_player_changes.clear (); } } diff --git a/src/wx/film_viewer.h b/src/wx/film_viewer.h index 1c4f3c693..f769fd6b9 100644 --- a/src/wx/film_viewer.h +++ b/src/wx/film_viewer.h @@ -59,7 +59,8 @@ public: void set_dcp_decode_reduction (boost::optional<int> reduction); boost::optional<int> dcp_decode_reduction () const; - void refresh (); + void slow_refresh (); + void quick_refresh (); int dropped () const { return _dropped; @@ -82,10 +83,11 @@ private: void rewind_clicked (wxMouseEvent &); void back_clicked (wxMouseEvent &); void forward_clicked (wxMouseEvent &); - void player_changed (bool); + void player_changed (int, bool); void update_position_label (); void update_position_slider (); void get (); + void display_player_video (); void seek (DCPTime t, bool accurate); void refresh_panel (); void setup_sensitivity (); @@ -122,10 +124,11 @@ private: wxToggleButton* _play_button; wxTimer _timer; bool _coalesce_player_changes; - bool _pending_player_change; + std::list<int> _pending_player_changes; bool _slider_being_moved; bool _was_running_before_slider; + std::pair<boost::shared_ptr<PlayerVideo>, DCPTime> _player_video; boost::shared_ptr<const Image> _frame; DCPTime _video_position; Position<int> _inter_position; diff --git a/src/wx/video_waveform_dialog.cc b/src/wx/video_waveform_dialog.cc index 83253d335..c38dbf65d 100644 --- a/src/wx/video_waveform_dialog.cc +++ b/src/wx/video_waveform_dialog.cc @@ -106,7 +106,7 @@ VideoWaveformDialog::shown (wxShowEvent& ev) { _plot->set_enabled (ev.IsShown ()); if (ev.IsShown ()) { - _viewer->refresh (); + _viewer->slow_refresh (); } } |
