Remove FFmpegDecoder minimal_run and care on seeking, as the VideoDecoder/AudioDecode...
[dcpomatic.git] / src / lib / player.cc
index b634028ba3a99ab6b8455041882c8b7eaa6c01fb..9257191693aab11bd89a2c120227071cd51bc6b5 100644 (file)
@@ -293,11 +293,12 @@ Player::set_approximate_size ()
 }
 
 shared_ptr<PlayerVideo>
-Player::black_player_video_frame () const
+Player::black_player_video_frame (DCPTime time) const
 {
        return shared_ptr<PlayerVideo> (
                new PlayerVideo (
                        shared_ptr<const ImageProxy> (new RawImageProxy (_black_image, _film->log ())),
+                       time,
                        Crop (),
                        _video_container_size,
                        _video_container_size,
@@ -326,7 +327,7 @@ Player::get_video (DCPTime time, bool accurate)
 
        if (ov.empty ()) {
                /* No video content at this time */
-               pvf.push_back (black_player_video_frame ());
+               pvf.push_back (black_player_video_frame (time));
        } else {
                /* Create a PlayerVideo from the content's video at this time */
 
@@ -338,7 +339,7 @@ Player::get_video (DCPTime time, bool accurate)
 
                list<ContentVideo> content_video = decoder->get_video (dcp_to_content_video (piece, time), accurate);
                if (content_video.empty ()) {
-                       pvf.push_back (black_player_video_frame ());
+                       pvf.push_back (black_player_video_frame (time));
                        return pvf;
                }
                
@@ -353,6 +354,7 @@ Player::get_video (DCPTime time, bool accurate)
                                shared_ptr<PlayerVideo> (
                                        new PlayerVideo (
                                                i->image,
+                                               content_video_to_dcp (piece, i->frame),
                                                content->crop (),
                                                image_size,
                                                _video_container_size,
@@ -508,6 +510,17 @@ Player::dcp_to_content_video (shared_ptr<const Piece> piece, DCPTime t) const
        return DCPTime (s + piece->content->trim_start()).frames (_film->video_frame_rate()) * piece->frc.factor ();
 }
 
+DCPTime
+Player::content_video_to_dcp (shared_ptr<const Piece> piece, VideoFrame f) const
+{
+       DCPTime t = DCPTime::from_frames (f / piece->frc.factor (), _film->video_frame_rate()) - piece->content->trim_start () + piece->content->position ();
+       if (t < DCPTime ()) {
+               t = DCPTime ();
+       }
+
+       return t;
+}
+
 AudioFrame
 Player::dcp_to_content_audio (shared_ptr<const Piece> piece, DCPTime t) const
 {