From e24d0def5b4e6c1825620b032af9f63c9eb78693 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 16 Oct 2013 11:46:36 +0100 Subject: [PATCH] Optimise the fetch-same-frame case a bit (#196). --- ChangeLog | 5 +++++ src/lib/player.cc | 24 ++++++++++++++++++++++++ src/lib/player.h | 10 ++++++++++ src/wx/film_viewer.cc | 17 +++++++---------- 4 files changed, 46 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 050c1c424..8390a7ee8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-10-16 Carl Hetherington + + * Speed up response to some settings changes + (e.g. crop) (#196). + 2013-10-15 Carl Hetherington * Version 1.16 released. diff --git a/src/lib/player.cc b/src/lib/player.cc index ff484e749..a235d1622 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -190,6 +190,13 @@ Player::pass () void Player::process_video (weak_ptr weak_piece, shared_ptr image, Eyes eyes, bool same, VideoContent::Frame frame) { + /* Keep a note of what came in so that we can repeat it if required */ + _last_process_video.weak_piece = weak_piece; + _last_process_video.image = image; + _last_process_video.eyes = eyes; + _last_process_video.same = same; + _last_process_video.frame = frame; + shared_ptr piece = weak_piece.lock (); if (!piece) { return; @@ -608,3 +615,20 @@ Player::update_subtitle () _out_subtitle.from = _in_subtitle.from + piece->content->position (); _out_subtitle.to = _in_subtitle.to + piece->content->position (); } + +/** Re-emit the last frame that was emitted, using current settings for crop, ratio, scaler and subtitles */ +void +Player::repeat_last_video () +{ + if (!_last_process_video.image) { + return; + } + + process_video ( + _last_process_video.weak_piece, + _last_process_video.image, + _last_process_video.eyes, + _last_process_video.same, + _last_process_video.frame + ); +} diff --git a/src/lib/player.h b/src/lib/player.h index 2261f66ea..5604d8e03 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -59,6 +59,8 @@ public: void set_video_container_size (libdcp::Size); + void repeat_last_video (); + /** Emitted when a video frame is ready. * First parameter is the video image. * Second parameter is the eye(s) that should see this image. @@ -138,6 +140,14 @@ private: bool _last_emit_was_black; + struct { + boost::weak_ptr weak_piece; + boost::shared_ptr image; + Eyes eyes; + bool same; + VideoContent::Frame frame; + } _last_process_video; + boost::signals2::scoped_connection _playlist_changed_connection; boost::signals2::scoped_connection _playlist_content_changed_connection; boost::signals2::scoped_connection _film_changed_connection; diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index 69cd276e1..291ab422d 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -135,7 +135,7 @@ FilmViewer::set_film (shared_ptr f) _player->Changed.connect (boost::bind (&FilmViewer::player_changed, this, _1)); calculate_sizes (); - fetch_current_frame_again (); + fetch_next_frame (); } void @@ -145,17 +145,14 @@ FilmViewer::fetch_current_frame_again () return; } - /* Player::video_position is the time after the last frame that we received. - We want to see it again, so seek back one frame. + /* We could do this with a seek and a fetch_next_frame, but this is + a shortcut to make it quicker. */ - Time p = _player->video_position() - _film->video_frames_to_time (1); - if (p < 0) { - p = 0; - } - - _player->seek (p, true); - fetch_next_frame (); + _got_frame = false; + _player->repeat_last_video (); + _panel->Refresh (); + _panel->Update (); } void -- 2.30.2