From b7f6dfc19ad1a051a8365c055c2a9629cb2341b4 Mon Sep 17 00:00:00 2001 From: wm4 Date: Tue, 9 Feb 2016 22:19:01 +0100 Subject: [PATCH] player: force refresh seek when changing audio filters Unfortunately I see no better solution. The refresh seek is skipped if the amount of buffered audio is not overly huge. Unfortunately softvol af_volume insertion still can cause this issue, because it's outside of the normal dynamic filter chain changing code. Move the video refresh call to reinit_video_filters() to make it more uniform along with the audio code. --- player/audio.c | 17 ++++++++++++++++- player/command.c | 3 --- player/video.c | 2 ++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/player/audio.c b/player/audio.c index 27be10a4de..9634891283 100644 --- a/player/audio.c +++ b/player/audio.c @@ -147,8 +147,23 @@ int reinit_audio_filters(struct MPContext *mpctx) if (!ao_c) return 0; + double delay = 0; + if (ao_c->af->initialized > 0) + delay = af_calc_delay(ao_c->af); + af_uninit(ao_c->af); - return recreate_audio_filters(mpctx) < 0 ? -1 : 1; + if (recreate_audio_filters(mpctx) < 0) + return -1; + + // Only force refresh if the amount of dropped buffered data is going to + // cause "issues" for the A/V sync logic. + if (mpctx->audio_status == STATUS_PLAYING && + mpctx->playback_pts != MP_NOPTS_VALUE && delay > 0.2) + { + queue_seek(mpctx, MPSEEK_ABSOLUTE, mpctx->playback_pts, + MPSEEK_EXACT, true); + } + return 1; } // Call this if opts->playback_speed or mpctx->speed_factor_* change. diff --git a/player/command.c b/player/command.c index 997d60591c..96f9dd0819 100644 --- a/player/command.c +++ b/player/command.c @@ -4044,9 +4044,6 @@ static int set_filters(struct MPContext *mpctx, enum stream_type mediatype, reinit_filters(mpctx, mediatype); } - if (mediatype == STREAM_VIDEO) - mp_force_video_refresh(mpctx); - return success ? 0 : -1; } diff --git a/player/video.c b/player/video.c index 4179690416..9768a53b85 100644 --- a/player/video.c +++ b/player/video.c @@ -226,6 +226,8 @@ int reinit_video_filters(struct MPContext *mpctx) if (need_reconfig) filter_reconfig(vo_c); + mp_force_video_refresh(mpctx); + mp_notify(mpctx, MPV_EVENT_VIDEO_RECONFIG, NULL); return vo_c->vf->initialized;