summaryrefslogtreecommitdiff
path: root/src/wx
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2018-02-24 01:05:14 +0000
committerCarl Hetherington <cth@carlh.net>2018-02-24 23:34:36 +0000
commitd08123f5e160b5737fa912cd36119e810abaa4cd (patch)
tree1e3dd2a846f8fd67ef942d2689c73b4485b7a20f /src/wx
parent3e961894051327bb62f0d41f2d59e63212a6622f (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.cc81
-rw-r--r--src/wx/film_viewer.h9
-rw-r--r--src/wx/video_waveform_dialog.cc2
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 ();
}
}