From 7051e94e4bacd00e53e88835d28e9d9082de3bb3 Mon Sep 17 00:00:00 2001 From: Dudemanguy Date: Sat, 24 Feb 2024 14:02:41 -0600 Subject: [PATCH] player: remove speed adjustment from playing_audio_pts When calculating the audio pts, mpv multiplies the ao delay by the current audio speed and subtracts it from the written audio pts. This doesn't really make sense though. mpctx->video_pts is never affected by the playback speed, and this leads to weird behavior like the audio-pts property changing values while paused merely because the playback speed changes. Remove the multiplication and simply subtract the delay by a factor of 1 instead. When updating the av_diff in player/video, this does actually need to take in account the audio speed so we do the calculation there. --- player/audio.c | 2 +- player/video.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/player/audio.c b/player/audio.c index c697142012..72cb440014 100644 --- a/player/audio.c +++ b/player/audio.c @@ -634,7 +634,7 @@ double playing_audio_pts(struct MPContext *mpctx) double pts = written_audio_pts(mpctx); if (pts == MP_NOPTS_VALUE || !mpctx->ao) return pts; - return pts - mpctx->audio_speed * ao_get_delay(mpctx->ao); + return pts - ao_get_delay(mpctx->ao); } // This garbage is needed for untimed AOs. These consume audio infinitely fast, diff --git a/player/video.c b/player/video.c index 6fe9227461..70ef18958b 100644 --- a/player/video.c +++ b/player/video.c @@ -644,8 +644,9 @@ static void update_av_diff(struct MPContext *mpctx, double offset) if (mpctx->vo_chain && mpctx->vo_chain->is_sparse) return; - double a_pos = playing_audio_pts(mpctx); + double a_pos = written_audio_pts(mpctx); if (a_pos != MP_NOPTS_VALUE && mpctx->video_pts != MP_NOPTS_VALUE) { + a_pos -= mpctx->audio_speed * ao_get_delay(mpctx->ao); mpctx->last_av_difference = a_pos - mpctx->video_pts + opts->audio_delay + offset; }