From: Carl Hetherington Date: Mon, 6 May 2013 13:51:14 +0000 (+0100) Subject: Re-use ImageMagickDecoders when possible. X-Git-Tag: v2.0.48~1337^2~400 X-Git-Url: https://git.carlh.net/gitweb/?a=commitdiff_plain;h=74040395aa25ade07f62f97d8a199b919b7487a2;p=dcpomatic.git Re-use ImageMagickDecoders when possible. --- 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();