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 | |
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.
-rw-r--r-- | player/core.h | 1 | ||||
-rw-r--r-- | player/playloop.c | 13 |
2 files changed, 13 insertions, 1 deletions
diff --git a/player/core.h b/player/core.h index fb335851d9..341ea84c47 100644 --- a/player/core.h +++ b/player/core.h @@ -345,6 +345,7 @@ typedef struct MPContext { bool playing_msg_shown; bool paused_for_cache; + double cache_stop_time, cache_wait_time; // Set after showing warning about decoding being too slow for realtime // playback rate. Used to avoid showing it multiple times. 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(); } } } |