summaryrefslogtreecommitdiffstats
path: root/player/playloop.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-08-27 23:12:24 +0200
committerwm4 <wm4@nowhere>2014-08-27 23:24:55 +0200
commitf8a1bd1253fdc6076415e67e006ab99a2cae568e (patch)
tree821b96dea8238bbd8c0e4d8a541642980f27988d /player/playloop.c
parentcb642e7c846be2540ec5c88c854682fc26d787f8 (diff)
downloadmpv-f8a1bd1253fdc6076415e67e006ab99a2cae568e.tar.bz2
mpv-f8a1bd1253fdc6076415e67e006ab99a2cae568e.tar.xz
player: dynamically change cache wait times
Remove the hardcoded wait time of 2 seconds. Instead, adjust the wait time each time we unpause: if downloading the data took longer than its estimated playback time, increase the amount of data we wait for. If it's shorter, decrease it. The +/- is supposed to avoid oscillating between two values if the elapsed time and the wait time are similar. It's not sure if this actually helps with anything, but it can't harm.
Diffstat (limited to 'player/playloop.c')
-rw-r--r--player/playloop.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/player/playloop.c b/player/playloop.c
index 694c3e6f25..9d6e007e40 100644
--- a/player/playloop.c
+++ b/player/playloop.c
@@ -128,6 +128,7 @@ void reset_playback_state(struct MPContext *mpctx)
mpctx->hrseek_framedrop = false;
mpctx->playback_pts = MP_NOPTS_VALUE;
mpctx->last_seek_pts = MP_NOPTS_VALUE;
+ mpctx->cache_wait_time = 0;
mpctx->restart_complete = false;
#if HAVE_ENCODING
@@ -529,7 +530,16 @@ static void handle_pause_on_low_cache(struct MPContext *mpctx)
if (mpctx->restart_complete && idle != -1) {
if (mpctx->paused && mpctx->paused_for_cache) {
- if (!opts->cache_pausing || s.ts_duration >= 2.0 || s.idle) {
+ mpctx->cache_wait_time = MPCLAMP(mpctx->cache_wait_time, 1, 10);
+ if (!opts->cache_pausing || s.ts_duration >= mpctx->cache_wait_time
+ || s.idle)
+ {
+ double elapsed_time = mp_time_sec() - mpctx->cache_stop_time;
+ if (elapsed_time > mpctx->cache_wait_time) {
+ mpctx->cache_wait_time *= 1.5 + 0.1;
+ } else {
+ mpctx->cache_wait_time /= 1.5 - 0.1;
+ }
mpctx->paused_for_cache = false;
if (!opts->pause)
unpause_player(mpctx);
@@ -541,6 +551,7 @@ static void handle_pause_on_low_cache(struct MPContext *mpctx)
pause_player(mpctx);
mpctx->paused_for_cache = true;
opts->pause = prev_paused_user;
+ mpctx->cache_stop_time = mp_time_sec();
}
}
}