diff options
author | wm4 <wm4@nowhere> | 2019-06-07 17:09:22 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2019-09-19 20:37:05 +0200 |
commit | e8147843fc072c5056d99b6c162216d82f1eedc7 (patch) | |
tree | 6e171dd19e5a439804e4de349874f7aa7f20312b /demux/demux.c | |
parent | 5d6b7c39abab4fc4dd7d5fb11af6439715064c98 (diff) | |
download | mpv-e8147843fc072c5056d99b6c162216d82f1eedc7.tar.bz2 mpv-e8147843fc072c5056d99b6c162216d82f1eedc7.tar.xz |
demux: really disable cache for sub-demuxers
It seems the so called demuxer cache wasn't really disabled for
sub-demuxers (timeline stuff). This was relatively harmless, since the
actual packet data was shared anyway via refcounting. But with the
addition of a mmap cache backend, this may change a lot.
So strictly disable any caching for sub-demuxers. This assumes that
users of sub-demuxers (only demux_timeline.c by now?) strictly use
demux_read_any_packet(), since demux_read_packet_async() will require
some minor read-ahead if a low level packet read returned a packet for a
different stream.
This requires some awkward messing with this fucking heap of trash. The
thing that is really wrong here is that the demuxer API mixes different
concepts, and sub-demuxers get the same API as decoders, and use the
cache code.
Diffstat (limited to 'demux/demux.c')
-rw-r--r-- | demux/demux.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/demux/demux.c b/demux/demux.c index 775d95b187..882e8e605f 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -2923,21 +2923,26 @@ static struct demuxer *open_given_type(struct mpv_global *global, seekable = 1; } in->seekable_cache = seekable == 1; + struct demuxer *sub = NULL; if (!(params && params->disable_timeline)) { struct timeline *tl = timeline_load(global, log, demuxer); if (tl) { struct demuxer_params params2 = {0}; params2.timeline = tl; - struct demuxer *sub = + params2.is_top_level = params && params->is_top_level; + sub = open_given_type(global, log, &demuxer_desc_timeline, demuxer->stream, ¶ms2, DEMUX_CHECK_FORCE); - if (sub) { - demuxer = sub; - } else { + if (!sub) timeline_destroy(tl); - } } } + if (!(params && params->is_top_level) || sub) { + in->seekable_cache = false; + in->min_secs = 0; + in->max_bytes = 1; + } + demuxer = sub ? sub : demuxer; // Let this demuxer free demuxer->stream. Timeline sub-demuxers can // share a stream, and in these cases the demux_timeline instance // should own the stream, as it frees the sub demuxers first. |