Optimise checking of existing image data.
[dcpomatic.git] / src / lib / player.cc
index d6e142c5e810ffd8dd5ec359345d4f35acb2590f..acf977def557f4b9873a0117d9b92d88f889138f 100644 (file)
@@ -74,7 +74,9 @@ Player::Player (shared_ptr<const Film> film, shared_ptr<const Playlist> playlist
        , _playlist (playlist)
        , _have_valid_pieces (false)
        , _ignore_video (false)
+       , _ignore_audio (false)
        , _always_burn_subtitles (false)
+       , _fast (false)
 {
        _film_changed_connection = _film->Changed.connect (bind (&Player::film_changed, this, _1));
        _playlist_changed_connection = _playlist->Changed.connect (bind (&Player::playlist_changed, this));
@@ -126,13 +128,13 @@ Player::setup_pieces ()
                /* FFmpeg */
                shared_ptr<const FFmpegContent> fc = dynamic_pointer_cast<const FFmpegContent> (i);
                if (fc) {
-                       decoder.reset (new FFmpegDecoder (fc, _film->log()));
+                       decoder.reset (new FFmpegDecoder (fc, _film->log(), _fast));
                        frc = FrameRateChange (fc->video_frame_rate(), _film->video_frame_rate());
                }
 
                shared_ptr<const DCPContent> dc = dynamic_pointer_cast<const DCPContent> (i);
                if (dc) {
-                       decoder.reset (new DCPDecoder (dc));
+                       decoder.reset (new DCPDecoder (dc, _fast));
                        frc = FrameRateChange (dc->video_frame_rate(), _film->video_frame_rate());
                }
 
@@ -157,7 +159,7 @@ Player::setup_pieces ()
                /* SndfileContent */
                shared_ptr<const SndfileContent> sc = dynamic_pointer_cast<const SndfileContent> (i);
                if (sc) {
-                       decoder.reset (new SndfileDecoder (sc));
+                       decoder.reset (new SndfileDecoder (sc, _fast));
                        frc = best_overlap_frc;
                }
 
@@ -180,6 +182,11 @@ Player::setup_pieces ()
                        vd->set_ignore_video ();
                }
 
+               shared_ptr<AudioDecoder> ad = dynamic_pointer_cast<AudioDecoder> (decoder);
+               if (ad && _ignore_audio) {
+                       ad->set_ignore_audio ();
+               }
+
                _pieces.push_back (shared_ptr<Piece> (new Piece (i, decoder, frc.get ())));
        }
 
@@ -501,7 +508,7 @@ Player::get_audio (DCPTime time, DCPTime length, bool accurate)
                        }
 
                        if (_audio_processor) {
-                               dcp_mapped = _audio_processor->run (dcp_mapped);
+                               dcp_mapped = _audio_processor->run (dcp_mapped, _film->audio_channels ());
                        }
 
                        all.audio = dcp_mapped;
@@ -540,8 +547,9 @@ DCPTime
 Player::content_video_to_dcp (shared_ptr<const Piece> piece, Frame f) const
 {
        shared_ptr<const VideoContent> vc = dynamic_pointer_cast<const VideoContent> (piece->content);
-       ContentTime const c = ContentTime::from_frames (f, vc->video_frame_rate ()) - piece->content->trim_start ();
-       return max (DCPTime (), DCPTime (c, piece->frc) + piece->content->position ());
+       /* See comment in dcp_to_content_video */
+       DCPTime const d = DCPTime::from_frames (f * piece->frc.factor(), piece->frc.dcp) - DCPTime (piece->content->trim_start (), piece->frc);
+       return max (DCPTime (), d + piece->content->position ());
 }
 
 Frame
@@ -651,6 +659,13 @@ Player::set_ignore_video ()
        _ignore_video = true;
 }
 
+/** Set this player never to produce any audio data */
+void
+Player::set_ignore_audio ()
+{
+       _ignore_audio = true;
+}
+
 /** Set whether or not this player should always burn text subtitles into the image,
  *  regardless of the content settings.
  *  @param burn true to always burn subtitles, false to obey content settings.
@@ -660,3 +675,10 @@ Player::set_always_burn_subtitles (bool burn)
 {
        _always_burn_subtitles = burn;
 }
+
+void
+Player::set_fast ()
+{
+       _fast = true;
+       _have_valid_pieces = false;
+}