summaryrefslogtreecommitdiffstats
path: root/player
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
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')
-rw-r--r--player/core.h1
-rw-r--r--player/playloop.c13
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();
}
}
}