summaryrefslogtreecommitdiffstats
path: root/player
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-08-27 10:55:59 +0200
committerwm4 <wm4@nowhere>2014-08-27 10:59:22 +0200
commitdad90f616da5665e6e27a516f78c2a5fa66162c2 (patch)
tree1dbf9ee388dfe35c5baa0fccaa9ab6e7cc5172f2 /player
parent0b428e44829abc4387f051e3c618c1c878b3a838 (diff)
downloadmpv-dad90f616da5665e6e27a516f78c2a5fa66162c2.tar.bz2
mpv-dad90f616da5665e6e27a516f78c2a5fa66162c2.tar.xz
player: fix basic playback
The "buffering" logic was active even if the stream cache was disabled. This is contrary to what the manpage says. It also breaks playback because of another bug: the demuxer cache is smaller than 2 seconds, and thus the resume condition never becomes true. Explicitly run this code only if the stream cache is enabled. Also, fix the underlying problem of the breakage, and resume when the demuxer thread stops reading in any case, not just on EOF. Broken by previous commit. Unbreaks playback of local files.
Diffstat (limited to 'player')
-rw-r--r--player/playloop.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/player/playloop.c b/player/playloop.c
index 026e4fda83..89af8fa55b 100644
--- a/player/playloop.c
+++ b/player/playloop.c
@@ -525,22 +525,25 @@ static void handle_pause_on_low_cache(struct MPContext *mpctx)
{.idle = true, .ts_range = {MP_NOPTS_VALUE, MP_NOPTS_VALUE}};
demux_control(mpctx->demuxer, DEMUXER_CTRL_GET_READER_STATE, &s);
+ int idle = -1;
+ demux_stream_control(mpctx->demuxer, STREAM_CTRL_GET_CACHE_IDLE, &idle);
+
double range = -1;
if (s.ts_range[0] != MP_NOPTS_VALUE && s.ts_range[1] != MP_NOPTS_VALUE)
range = s.ts_range[1] - s.ts_range[0];
if (range < 0)
range = 1e20; // unknown/broken timestamps; disable
- if (mpctx->restart_complete) {
+ if (mpctx->restart_complete && idle != -1) {
if (mpctx->paused && mpctx->paused_for_cache) {
- if (!opts->cache_pausing || range >= 2.0 || s.eof) {
+ if (!opts->cache_pausing || range >= 2.0 || s.idle) {
mpctx->paused_for_cache = false;
if (!opts->pause)
unpause_player(mpctx);
}
mpctx->sleeptime = MPMIN(mpctx->sleeptime, 0.2);
} else {
- if (opts->cache_pausing && range < 0.5 && !s.eof) {
+ if (opts->cache_pausing && range < 0.5 && !s.idle) {
bool prev_paused_user = opts->pause;
pause_player(mpctx);
mpctx->paused_for_cache = true;
@@ -549,9 +552,6 @@ static void handle_pause_on_low_cache(struct MPContext *mpctx)
}
}
- int idle = 1;
- demux_stream_control(mpctx->demuxer, STREAM_CTRL_GET_CACHE_IDLE, &idle);
-
// Also update cache properties.
bool busy = idle == 0 || !s.idle;
if (busy || mpctx->next_cache_update > 0) {