diff --git a/player/audio.c b/player/audio.c index df80fcd161..3a691fed09 100644 --- a/player/audio.c +++ b/player/audio.c @@ -329,8 +329,8 @@ static bool get_sync_samples(struct MPContext *mpctx, int *skip) double sync_pts = MP_NOPTS_VALUE; if (sync_to_video) { - if (mpctx->video_pts != MP_NOPTS_VALUE) { - sync_pts = mpctx->video_pts; + if (mpctx->video_next_pts != MP_NOPTS_VALUE) { + sync_pts = mpctx->video_next_pts; } else if (mpctx->video_status < STATUS_READY) { return false; // wait until we know a video PTS } diff --git a/player/core.h b/player/core.h index 6c69e5e261..2c5328df38 100644 --- a/player/core.h +++ b/player/core.h @@ -275,6 +275,8 @@ typedef struct MPContext { * (or at least queued to be flipped by VO) */ double video_pts; double last_seek_pts; + // Mostly unused; for proper audio resync on speed changes. + double video_next_pts; // As video_pts, but is not reset when seeking away. (For the very short // period of time until a new frame is decoded and shown.) double last_vo_pts; diff --git a/player/video.c b/player/video.c index b7d3f27cbe..6a8fade027 100644 --- a/player/video.c +++ b/player/video.c @@ -215,6 +215,7 @@ void reset_video_state(struct MPContext *mpctx) mpctx->delay = 0; mpctx->time_frame = 0; mpctx->video_pts = MP_NOPTS_VALUE; + mpctx->video_next_pts = MP_NOPTS_VALUE; mpctx->total_avsync_change = 0; mpctx->drop_frame_cnt = 0; mpctx->dropped_frames = 0; @@ -552,6 +553,7 @@ static int video_output_image(struct MPContext *mpctx, double endpts) MP_WARN(mpctx, "Jump in video pts: %f -> %f\n", last_pts, pts); frame_time = 0; } + mpctx->video_next_pts = pts; if (mpctx->d_audio) mpctx->delay -= frame_time; if (mpctx->video_status >= STATUS_READY) {