From 74040395aa25ade07f62f97d8a199b919b7487a2 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 6 May 2013 14:51:14 +0100 Subject: Re-use ImageMagickDecoders when possible. --- src/lib/imagemagick_decoder.h | 4 ++++ src/lib/player.cc | 17 +++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) (limited to 'src/lib') diff --git a/src/lib/imagemagick_decoder.h b/src/lib/imagemagick_decoder.h index 12a40976b..cb68655ce 100644 --- a/src/lib/imagemagick_decoder.h +++ b/src/lib/imagemagick_decoder.h @@ -40,6 +40,10 @@ public: bool seek (double); bool pass (); + boost::shared_ptr content () const { + return _imagemagick_content; + } + protected: PixelFormat pixel_format () const; diff --git a/src/lib/player.cc b/src/lib/player.cc index a3d52f43e..d86437cd2 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -219,6 +219,8 @@ Player::seek_forward () void Player::setup_decoders () { + vector > old_video_decoders = _video_decoders; + _video_decoders.clear (); _video_decoder = 0; _audio_decoders.clear (); @@ -260,10 +262,21 @@ Player::setup_decoders () shared_ptr ic = dynamic_pointer_cast (*i); if (ic) { video_content = ic; - video_decoder.reset (new ImageMagickDecoder (_film, ic)); + + /* See if we can re-use an old ImageMagickDecoder */ + for (vector >::const_iterator i = old_video_decoders.begin(); i != old_video_decoders.end(); ++i) { + shared_ptr imd = dynamic_pointer_cast (*i); + if (imd && imd->content() == ic) { + video_decoder = *i; + } + } + + if (!video_decoder) { + video_decoder.reset (new ImageMagickDecoder (_film, ic)); + video_decoder->connect_video (shared_from_this ()); + } } - video_decoder->connect_video (shared_from_this ()); _video_decoders.push_back (video_decoder); _video_start.push_back (video_so_far); video_so_far += video_content->video_length() / video_content->video_frame_rate(); -- cgit v1.2.3