Some tidying up. Do encode progress in the writer to improve progress bar movement...
[dcpomatic.git] / src / lib / player.cc
index a3d52f43ee9dfac3a85a0d643c3d78e0af1d89e6..95036cfe0ae18f1ca24ffebea6a8f2a899eb61c6 100644 (file)
@@ -78,7 +78,7 @@ Player::pass ()
        if (_video && _video_decoder < _video_decoders.size ()) {
 
                /* Run video decoder; this may also produce audio */
-               
+
                if (_video_decoders[_video_decoder]->pass ()) {
                        _video_decoder++;
                }
@@ -121,18 +121,6 @@ Player::pass ()
        return done;
 }
 
-void
-Player::set_progress (shared_ptr<Job> job)
-{
-       /* Assume progress can be divined from how far through the video we are */
-
-       if (_video_decoder >= _video_decoders.size() || !_playlist->video_length()) {
-               return;
-       }
-
-       job->set_progress ((_video_start[_video_decoder] + _video_decoders[_video_decoder]->video_frame()) / _playlist->video_length ());
-}
-
 void
 Player::process_video (shared_ptr<const Image> i, bool same, shared_ptr<Subtitle> s, double t)
 {
@@ -219,6 +207,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 ();
@@ -255,15 +245,28 @@ Player::setup_decoders ()
                                audio_content = fc;
                                video_decoder = fd;
                                audio_decoder = fd;
+
+                               video_decoder->connect_video (shared_from_this ());
                        }
                        
                        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();