From 3a78eefc88ecb354d1415f43bbf19d57caa31918 Mon Sep 17 00:00:00 2001 From: wm4 Date: Sat, 22 Oct 2016 17:17:04 +0200 Subject: demux_mkv: don't recursively resolve timeline for opened reference files Instead, resolve all references and so on in the top-level timeline. --- demux/demux.c | 22 ++++++++++++---------- demux/demux.h | 1 + demux/demux_mkv_timeline.c | 1 + 3 files changed, 14 insertions(+), 10 deletions(-) (limited to 'demux') diff --git a/demux/demux.c b/demux/demux.c index 6041ada753..5072eb9f05 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -1287,16 +1287,18 @@ static struct demuxer *open_given_type(struct mpv_global *global, demux_changed(in->d_thread, DEMUX_EVENT_ALL); demux_update(demuxer); stream_control(demuxer->stream, STREAM_CTRL_SET_READAHEAD, &(int){false}); - struct timeline *tl = timeline_load(global, log, demuxer); - if (tl) { - struct demuxer_params params2 = {0}; - params2.timeline = tl; - struct demuxer *sub = open_given_type(global, log, - &demuxer_desc_timeline, stream, - ¶ms2, DEMUX_CHECK_FORCE); - if (sub) - return sub; - timeline_destroy(tl); + 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 = + open_given_type(global, log, &demuxer_desc_timeline, stream, + ¶ms2, DEMUX_CHECK_FORCE); + if (sub) + return sub; + timeline_destroy(tl); + } } return demuxer; } diff --git a/demux/demux.h b/demux/demux.h index 39c2600257..18f52d463d 100644 --- a/demux/demux.h +++ b/demux/demux.h @@ -161,6 +161,7 @@ struct demuxer_params { int matroska_wanted_segment; bool *matroska_was_valid; struct timeline *timeline; + bool disable_timeline; // -- demux_open_url() only int stream_flags; bool allow_capture; diff --git a/demux/demux_mkv_timeline.c b/demux/demux_mkv_timeline.c index 30d669c77f..6e18fd2562 100644 --- a/demux/demux_mkv_timeline.c +++ b/demux/demux_mkv_timeline.c @@ -170,6 +170,7 @@ static bool check_file_seg(struct tl_ctx *ctx, char *filename, int segment) .matroska_wanted_uids = ctx->uids, .matroska_wanted_segment = segment, .matroska_was_valid = &was_valid, + .disable_timeline = true, .disable_cache = true, }; struct mp_cancel *cancel = ctx->tl->cancel; -- cgit v1.2.3