Some fixes to playback of drop-frame content.
[dcpomatic.git] / src / lib / player.cc
index a5f0006d99547cdf000ebad7b0b1e83aa53c6c27..3e282136fe604db7443564ba2034975353ab8c52 100644 (file)
@@ -147,7 +147,7 @@ Player::pass ()
                if (_just_did_inaccurate_seek) {
                        /* Just emit; no subtlety */
                        emit_video (earliest_piece, dv);
-                       earliest_piece->decoder->get ();
+                       earliest_piece->decoder->consume ();
                } else if (earliest_time > (_video_position + half_frame)) {
 
                        /* See if we're inside some video content */
@@ -167,14 +167,14 @@ Player::pass ()
                } else {
 
                        if (
-                               dv->dcp_time >= _video_position &&
+                               abs (dv->dcp_time - _video_position) < half_frame &&
                                !earliest_piece->content->trimmed (dv->dcp_time - earliest_piece->content->position ())
                                ) {
 
                                emit_video (earliest_piece, dv);
                        }
                
-                       earliest_piece->decoder->get ();
+                       earliest_piece->decoder->consume ();
                }
 
        } else if (da && _audio) {
@@ -182,13 +182,13 @@ Player::pass ()
                        emit_silence (earliest_time - _audio_position);
                } else {
                        emit_audio (earliest_piece, da);
-                       earliest_piece->decoder->get ();
+                       earliest_piece->decoder->consume ();
                }
        } else if (ds && _video) {
                _in_subtitle.piece = earliest_piece;
                _in_subtitle.subtitle = ds;
                update_subtitle ();
-               earliest_piece->decoder->get ();
+               earliest_piece->decoder->consume ();
        }
 
        _just_did_inaccurate_seek = false;
@@ -232,8 +232,8 @@ Player::emit_video (weak_ptr<Piece> weak_piece, shared_ptr<DecodedVideo> video)
        
        if (
                _film->with_subtitles () &&
-               _out_subtitle.subtitle->image &&
-               video->dcp_time >= _out_subtitle.subtitle->dcp_time && video->dcp_time <= _out_subtitle.subtitle->dcp_time_to
+               _out_subtitle.image &&
+               video->dcp_time >= _out_subtitle.from && video->dcp_time <= _out_subtitle.to
                ) {
 
                Position<int> const container_offset (
@@ -241,7 +241,7 @@ Player::emit_video (weak_ptr<Piece> weak_piece, shared_ptr<DecodedVideo> video)
                        (_video_container_size.height - image_size.width) / 2
                        );
 
-               pi->set_subtitle (_out_subtitle.subtitle->image, _out_subtitle.position + container_offset);
+               pi->set_subtitle (_out_subtitle.image, _out_subtitle.position + container_offset);
        }
                                            
 #ifdef DCPOMATIC_DEBUG
@@ -561,7 +561,7 @@ Player::update_subtitle ()
        }
 
        if (!_in_subtitle.subtitle->image) {
-               _out_subtitle.subtitle->image.reset ();
+               _out_subtitle.image.reset ();
                return;
        }
 
@@ -591,16 +591,16 @@ Player::update_subtitle ()
        
        _out_subtitle.position.x = rint (_video_container_size.width * (in_rect.x + (in_rect.width * (1 - sc->subtitle_scale ()) / 2)));
        _out_subtitle.position.y = rint (_video_container_size.height * (in_rect.y + (in_rect.height * (1 - sc->subtitle_scale ()) / 2)));
-       
-       _out_subtitle.subtitle->image = _in_subtitle.subtitle->image->scale (
+
+       _out_subtitle.image = _in_subtitle.subtitle->image->scale (
                scaled_size,
                Scaler::from_id ("bicubic"),
-               _in_subtitle.subtitle->image->pixel_format (),
+               PIX_FMT_RGBA,
                true
                );
-       
-       _out_subtitle.subtitle->dcp_time = _in_subtitle.subtitle->dcp_time;
-       _out_subtitle.subtitle->dcp_time = _in_subtitle.subtitle->dcp_time;
+
+       _out_subtitle.from = _in_subtitle.subtitle->dcp_time;
+       _out_subtitle.to = _in_subtitle.subtitle->dcp_time_to;
 }
 
 /** Re-emit the last frame that was emitted, using current settings for crop, ratio, scaler and subtitles.