summaryrefslogtreecommitdiffstats
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
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.
-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();
}
}
}