summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDudemanguy <random342@airmail.cc>2024-03-02 09:50:23 -0600
committerDudemanguy <random342@airmail.cc>2024-03-03 16:24:28 -0600
commitd10cebec1317d1fd9006f3bd3bdc6d75e399ebaa (patch)
tree0d00d47147dca8d3ddc37e87383c5fb10b81c5e8
parent60abbb424bef6873e7bfcbae0f43c4b972fe4274 (diff)
downloadmpv-d10cebec1317d1fd9006f3bd3bdc6d75e399ebaa.tar.bz2
mpv-d10cebec1317d1fd9006f3bd3bdc6d75e399ebaa.tar.xz
player/video: subtract frame_time from delay when ao_chain starts audio
This seems more robust than relying on the audio status to actually be playing. For files where there is no audio or the audio start is delayed, this guards against that but it allows the subtraction to always occur otherwise on normal files with audio.
-rw-r--r--player/audio.c1
-rw-r--r--player/core.h2
-rw-r--r--player/video.c3
3 files changed, 5 insertions, 1 deletions
diff --git a/player/audio.c b/player/audio.c
index 05a39cd819..da91dd4340 100644
--- a/player/audio.c
+++ b/player/audio.c
@@ -846,6 +846,7 @@ void audio_start_ao(struct MPContext *mpctx)
}
MP_VERBOSE(mpctx, "starting audio playback\n");
+ ao_c->audio_started = true;
ao_start(ao_c->ao);
mpctx->audio_status = STATUS_PLAYING;
if (ao_c->out_eof) {
diff --git a/player/core.h b/player/core.h
index dcb3c27e12..fc5e2e3937 100644
--- a/player/core.h
+++ b/player/core.h
@@ -192,6 +192,8 @@ struct ao_chain {
double start_pts;
bool start_pts_known;
+ bool audio_started;
+
struct track *track;
struct mp_pin *filter_src;
struct mp_pin *dec_src;
diff --git a/player/video.c b/player/video.c
index 6b63cc7b0e..c33f947659 100644
--- a/player/video.c
+++ b/player/video.c
@@ -359,7 +359,6 @@ static void adjust_sync(struct MPContext *mpctx, double v_pts, double frame_time
if (mpctx->audio_status != STATUS_PLAYING)
return;
- mpctx->delay -= frame_time;
double a_pts = written_audio_pts(mpctx) + opts->audio_delay - mpctx->delay;
double av_delay = a_pts - v_pts;
@@ -401,6 +400,8 @@ static void handle_new_frame(struct MPContext *mpctx)
}
}
mpctx->time_frame += frame_time / mpctx->video_speed;
+ if (mpctx->ao_chain && mpctx->ao_chain->audio_started)
+ mpctx->delay -= frame_time;
if (mpctx->video_status >= STATUS_PLAYING)
adjust_sync(mpctx, pts, frame_time);
MP_TRACE(mpctx, "frametime=%5.3f\n", frame_time);