summaryrefslogtreecommitdiffstats
path: root/player/video.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2019-12-16 01:15:43 +0100
committerwm4 <wm4@nowhere>2019-12-16 01:15:43 +0100
commit76a92fd30b0fc12da024eb1187756d6432f8ab13 (patch)
tree127066616e531585f8f93c5e8b6df9747ed1df7b /player/video.c
parent31eb2f9f33b05060e5f63b3d53188814f8a30f32 (diff)
downloadmpv-76a92fd30b0fc12da024eb1187756d6432f8ab13.tar.bz2
mpv-76a92fd30b0fc12da024eb1187756d6432f8ab13.tar.xz
player: avoid underrun wakeup loop
The VO underrun detection (just a weak heuristic) added in commit f26dfb flagged the underrun state every time it was checked, and since the check happened in every playloop iteration, this caused the playloop to wake up itself on every iteration. It burned an entire core while in this state. Fix this by flagging this condition only once (as it should be), and requiring that a frame is displayed to trigger it again. This makes it work similar as the audio underrun check. The bug report referenced below says --demuxer-thread=no avoided this. This is because the demuxer layer doesn't do proper underrun reporting if the reader thread is disabled. Fixes: #7259
Diffstat (limited to 'player/video.c')
-rw-r--r--player/video.c9
1 files changed, 8 insertions, 1 deletions
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);