diff --git a/player/core.h b/player/core.h index fb88c8d0f0..c300c82df9 100644 --- a/player/core.h +++ b/player/core.h @@ -184,6 +184,7 @@ struct vo_chain { bool is_sparse; bool underrun; + bool underrun_signaled; }; // Like vo_chain, for audio. diff --git a/player/video.c b/player/video.c index af795c316f..e92aaf7024 100644 --- a/player/video.c +++ b/player/video.c @@ -92,6 +92,7 @@ static void vo_chain_reset_state(struct vo_chain *vo_c) { vo_seek_reset(vo_c->vo); vo_c->underrun = false; + vo_c->underrun_signaled = false; } void reset_video_state(struct MPContext *mpctx) @@ -1013,8 +1014,12 @@ void write_video(struct MPContext *mpctx) if (r == VD_WAIT) { // Heuristic to detect underruns. - if (mpctx->video_status == STATUS_PLAYING && !vo_still_displaying(vo)) + if (mpctx->video_status == STATUS_PLAYING && !vo_still_displaying(vo) && + !vo_c->underrun_signaled) + { vo_c->underrun = true; + vo_c->underrun_signaled = true; + } // Demuxer will wake us up for more packets to decode. return; } @@ -1217,6 +1222,8 @@ void write_video(struct MPContext *mpctx) mpctx->max_frames--; } + vo_c->underrun_signaled = false; + screenshot_flip(mpctx); mp_wakeup_core(mpctx);