summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-05-06 14:51:14 +0100
committerCarl Hetherington <cth@carlh.net>2013-05-06 14:51:14 +0100
commit74040395aa25ade07f62f97d8a199b919b7487a2 (patch)
treeb631d7234fd184b859bb046362e407b9c1312b89 /src
parent930f0b02333ecc0a3a53fa57d943375daae99314 (diff)
Re-use ImageMagickDecoders when possible.
Diffstat (limited to 'src')
-rw-r--r--src/lib/imagemagick_decoder.h4
-rw-r--r--src/lib/player.cc17
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();