From 23220db92443a5748cb034edf29b4c3b428bee5a Mon Sep 17 00:00:00 2001 From: wm4 Date: Wed, 8 Jul 2015 22:04:35 +0200 Subject: player: disable seeking even if the cache is enabled Until now, if a stream wasn't seekable, but the stream cache was enabled (--cache), we've enabled seeking anyway. The idea was that at least short seeks would typically fall within the cache. And if not, the user was out of luck and terrible things happened. In other words, it was unreliable. Be stricter about it and remove this behavior. Effectively, this will for example disable seeking in piped data. Instead of trying to be clever, add an --force-seekable option, which will always enable seeking if the user really wants it. --- DOCS/interface-changes.rst | 1 + DOCS/man/options.rst | 5 +++++ demux/demux.c | 5 ++--- options/options.c | 2 ++ options/options.h | 1 + 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/DOCS/interface-changes.rst b/DOCS/interface-changes.rst index bf2b17d1cd..7ffe4351a8 100644 --- a/DOCS/interface-changes.rst +++ b/DOCS/interface-changes.rst @@ -20,6 +20,7 @@ Interface changes :: --- mpv 0.10.0 will be released --- + - add --force-seekable, and change default seekability in some cases - add vf yadif/vavpp/vdpaupp interlaced-only suboptions Also, the option is enabled by default (Except vf_yadif, which has it enabled only if it's inserted by the deinterlace property.) diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst index da0038bfbf..8a0587e383 100644 --- a/DOCS/man/options.rst +++ b/DOCS/man/options.rst @@ -2229,6 +2229,11 @@ Demuxer ``--demuxer-readahead-bytes=`` See ``--demuxer-readahead-packets``. +``--force-seekable=`` + If the player thinks that the media is not seekable (e.g. playing from a + pipe, or it's a http stream with a server that doesn't support range + requests), seeking will be disabled. This option can forcibly enable it. + For seeks within the cache, there's a good chance of success. Input ----- diff --git a/demux/demux.c b/demux/demux.c index aa3308b87f..ff6bf40ec0 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -990,9 +990,8 @@ static struct demuxer *open_given_type(struct mpv_global *global, mp_verbose(log, "Detected file format: %s\n", desc->desc); if (!in->d_thread->seekable) mp_verbose(log, "Stream is not seekable.\n"); - // Pretend we can seek if we can't seek, but there's a cache. - if (!in->d_thread->seekable && stream->uncached_stream) { - mp_verbose(log, "Enabling seeking because stream cache is active.\n"); + if (!in->d_thread->seekable && demuxer->opts->force_seekable) { + mp_warn(log, "Not seekable, but enabling seeking on user request.\n"); in->d_thread->seekable = true; in->d_thread->partially_seekable = true; } diff --git a/options/options.c b/options/options.c index d92a0eef5d..7523be990a 100644 --- a/options/options.c +++ b/options/options.c @@ -243,6 +243,8 @@ const m_option_t mp_opts[] = { OPT_INTRANGE("demuxer-readahead-packets", demuxer_min_packs, 0, 0, MAX_PACKS), OPT_INTRANGE("demuxer-readahead-bytes", demuxer_min_bytes, 0, 0, MAX_PACK_BYTES), + OPT_FLAG("force-seekable", force_seekable, 0), + OPT_DOUBLE("cache-secs", demuxer_min_secs_cache, M_OPT_MIN, .min = 0), OPT_FLAG("cache-pause", cache_pausing, 0), diff --git a/options/options.h b/options/options.h index 9d211390e0..b43e28a06f 100644 --- a/options/options.h +++ b/options/options.h @@ -199,6 +199,7 @@ typedef struct MPOpts { double demuxer_min_secs; char *audio_demuxer_name; char *sub_demuxer_name; + int force_seekable; double demuxer_min_secs_cache; int cache_pausing; -- cgit v1.2.3