summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2019-05-26 02:58:17 +0100
committerCarl Hetherington <cth@carlh.net>2020-02-16 21:25:49 +0100
commitac112cdc14b0f600ac1c2d4e24f8b19eea132f54 (patch)
tree44267e30f760c15d5e87a1f5ef21d6f2456dda9d
parent4b38c8f429407ec09609236fc7b2349459536571 (diff)
Potential fix for #1568; we calculate the remaining DCPTime but
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.
-rw-r--r--src/lib/player.cc6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/lib/player.cc b/src/lib/player.cc
index 1d83b9b5a..f22ace1b9 100644
--- a/src/lib/player.cc
+++ b/src/lib/player.cc
@@ -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;
}