Re-use ImageMagickDecoders when possible.
authorCarl Hetherington <cth@carlh.net>
Mon, 6 May 2013 13:51:14 +0000 (14:51 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 6 May 2013 13:51:14 +0000 (14:51 +0100)
src/lib/imagemagick_decoder.h
src/lib/player.cc

index 12a40976b5b72e1ab148a3269e798ada81a79775..cb68655cee2f2a6362dc3be6d0089d095db5b2d9 100644 (file)
@@ -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;
 
index a3d52f43ee9dfac3a85a0d643c3d78e0af1d89e6..d86437cd29bb38d6ba2f0eb2f6208632db770bd6 100644 (file)
@@ -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();