diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-05-06 14:51:14 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-05-06 14:51:14 +0100 |
| commit | 74040395aa25ade07f62f97d8a199b919b7487a2 (patch) | |
| tree | b631d7234fd184b859bb046362e407b9c1312b89 /src/lib | |
| parent | 930f0b02333ecc0a3a53fa57d943375daae99314 (diff) | |
Re-use ImageMagickDecoders when possible.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/imagemagick_decoder.h | 4 | ||||
| -rw-r--r-- | src/lib/player.cc | 17 |
2 files changed, 19 insertions, 2 deletions
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<const ImageMagickContent> 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<shared_ptr<VideoDecoder> > old_video_decoders = _video_decoders; + _video_decoders.clear (); _video_decoder = 0; _audio_decoders.clear (); @@ -260,10 +262,21 @@ Player::setup_decoders () shared_ptr<const ImageMagickContent> ic = dynamic_pointer_cast<const ImageMagickContent> (*i); if (ic) { video_content = ic; - video_decoder.reset (new ImageMagickDecoder (_film, ic)); + + /* See if we can re-use an old ImageMagickDecoder */ + for (vector<shared_ptr<VideoDecoder> >::const_iterator i = old_video_decoders.begin(); i != old_video_decoders.end(); ++i) { + shared_ptr<ImageMagickDecoder> imd = dynamic_pointer_cast<ImageMagickDecoder> (*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(); |
