Potential fix for #1568; we calculate the remaining DCPTime but
authorCarl Hetherington <cth@carlh.net>
Sun, 26 May 2019 01:58:17 +0000 (02:58 +0100)
committerCarl Hetherington <cth@carlh.net>
Sun, 16 Feb 2020 20:25:49 +0000 (21:25 +0100)
then convert it back to resampled content frames using the DCP
rate rather than the resampled content rate, which seems wrong.

If we want to go from metric time to frames we surely have to use
the frame rate of the thing we are working with (not the frame rate
which that thing will be played back at).

Backported from 26c62598730d1d32333bfab0d5f463b90d26ee4d in v2.15.x.

src/lib/player.cc

index 1d83b9b5a64122efc02b7e627c03e8f913d5d5dd..f22ace1b90b1810b79b4759c7945c8d575f91693 100644 (file)
@@ -858,10 +858,12 @@ Player::audio (weak_ptr<Piece> wp, AudioStreamPtr stream, ContentAudio content_a
        shared_ptr<AudioContent> content = piece->content->audio;
        DCPOMATIC_ASSERT (content);
 
+       int const rfr = content->resampled_frame_rate (_film);
+
        /* Compute time in the DCP */
        DCPTime time = resampled_audio_to_dcp (piece, content_audio.frame);
        /* And the end of this block in the DCP */
-       DCPTime end = time + DCPTime::from_frames(content_audio.audio->frames(), content->resampled_frame_rate(_film));
+       DCPTime end = time + DCPTime::from_frames(content_audio.audio->frames(), rfr);
 
        /* Remove anything that comes before the start or after the end of the content */
        if (time < piece->content->position()) {
@@ -876,7 +878,7 @@ Player::audio (weak_ptr<Piece> wp, AudioStreamPtr stream, ContentAudio content_a
                /* Discard it all */
                return;
        } else if (end > piece->content->end(_film)) {
-               Frame const remaining_frames = DCPTime(piece->content->end(_film) - time).frames_round(_film->audio_frame_rate());
+               Frame const remaining_frames = DCPTime(piece->content->end(_film) - time).frames_round(rfr);
                if (remaining_frames == 0) {
                        return;
                }