diff options
author | wm4 <wm4@nowhere> | 2014-08-27 23:12:24 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2014-08-27 23:24:55 +0200 |
commit | f8a1bd1253fdc6076415e67e006ab99a2cae568e (patch) | |
tree | 821b96dea8238bbd8c0e4d8a541642980f27988d /player/playloop.c | |
parent | cb642e7c846be2540ec5c88c854682fc26d787f8 (diff) | |
download | mpv-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.c | 13 |
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(); } } } |