summaryrefslogtreecommitdiffstats
path: root/player/playloop.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-08-15 23:33:33 +0200
committerwm4 <wm4@nowhere>2014-08-15 23:33:33 +0200
commit543ba6c114303c8c3a71b37864f6d901c41808eb (patch)
tree3735649107f6df38de3adaf9081ecb672546c7a3 /player/playloop.c
parent22a95290126398c1f416dbadaf596ba79c872996 (diff)
downloadmpv-543ba6c114303c8c3a71b37864f6d901c41808eb.tar.bz2
mpv-543ba6c114303c8c3a71b37864f6d901c41808eb.tar.xz
video: add VO framedropping mode
This mostly uses the same idea as with vo_vdpau.c, but much simplified. On X11, it tries to get the display framerate with XF86VM, and limits the frequency of new video frames against it. Note that this is an old extension, and is confirmed not to work correctly with multi-monitor setups. But we're using it because it was already around (it is also used by vo_vdpau). This attempts to predict the next vsync event by using the time of the last frame and the display FPS. Even if that goes completely wrong, the results are still relatively good. On other systems, or if the X11 code doesn't return a display FPS, a framerate of 1000 is assumed. This is infinite for all practical purposes, and means that only frames which are definitely too late are dropped. This probably has worse results, but is still useful. "--framedrop=yes" is basically replaced with "--framedrop=decoder". The old framedropping mode is kept around, and should perhaps be improved. Dropping on the decoder level is still useful if decoding itself is too slow.
Diffstat (limited to 'player/playloop.c')
-rw-r--r--player/playloop.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/player/playloop.c b/player/playloop.c
index 33e3f050cd..e3d1ada323 100644
--- a/player/playloop.c
+++ b/player/playloop.c
@@ -66,11 +66,10 @@ void pause_player(struct MPContext *mpctx)
mpctx->osd_function = 0;
mpctx->paused_for_cache = false;
- if (mpctx->video_out && mpctx->d_video && mpctx->video_out->config_ok)
- vo_control(mpctx->video_out, VOCTRL_PAUSE, NULL);
-
if (mpctx->ao && mpctx->d_audio)
- ao_pause(mpctx->ao); // pause audio, keep data if possible
+ ao_pause(mpctx->ao);
+ if (mpctx->video_out)
+ vo_set_paused(mpctx->video_out, true);
// Only print status if there's actually a file being played.
if (mpctx->num_sources)
@@ -97,8 +96,9 @@ void unpause_player(struct MPContext *mpctx)
if (mpctx->ao && mpctx->d_audio)
ao_resume(mpctx->ao);
- if (mpctx->video_out && mpctx->d_video && mpctx->video_out->config_ok)
- vo_control(mpctx->video_out, VOCTRL_RESUME, NULL); // resume video
+ if (mpctx->video_out)
+ vo_set_paused(mpctx->video_out, false);
+
(void)get_relative_time(mpctx); // ignore time that passed during pause
end: