summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--player/audio.c4
-rw-r--r--player/core.h2
-rw-r--r--player/video.c2
3 files changed, 6 insertions, 2 deletions
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) {