From 5cbbd250908099b94cfaf7853adf8d5a5bb346e1 Mon Sep 17 00:00:00 2001 From: wm4 Date: Tue, 8 Oct 2019 23:55:05 +0200 Subject: [PATCH] demux_timeline, demux_edl: correctly enable cache in pseudo-DASH mode In pseudo-DASH mode, we may have no real streams opened until the demuxer layer is fully loaded and playback actually starts. The only hint that the stream is from network is, at that point, the init segment, which is only opened as stream, and then separately as demuxer (which is dumb but happened to fit the internal architecture better). So just propagate the flags from the init segment stream. Seems like an annoyance, but doesn't hurt that much I guess. (Until someone gets the idea to pass the init segment data inline or so, but nothing does that.) The sample link in the linked issue will probably soon switch to another format, because that service always does this after recent uploads or so. Fixes: #7038 --- demux/demux_edl.c | 5 ++++- demux/demux_timeline.c | 3 +++ demux/timeline.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/demux/demux_edl.c b/demux/demux_edl.c index 7016df3558..62e6c50070 100644 --- a/demux/demux_edl.c +++ b/demux/demux_edl.c @@ -270,8 +270,11 @@ static struct timeline_par *build_timeline(struct timeline *root, MP_VERBOSE(root, "Opening init fragment...\n"); stream_t *s = stream_create(parts->init_fragment_url, STREAM_READ, root->cancel, root->global); - if (s) + if (s) { + root->is_network |= s->is_network; + root->is_streaming |= s->streaming; tl->init_fragment = stream_read_complete(s, tl, 1000000); + } free_stream(s); if (!tl->init_fragment.len) { MP_ERR(root, "Could not read init fragment.\n"); diff --git a/demux/demux_timeline.c b/demux/demux_timeline.c index b18ae70faa..aefca9f1c9 100644 --- a/demux/demux_timeline.c +++ b/demux/demux_timeline.c @@ -525,6 +525,9 @@ static int d_open(struct demuxer *demuxer, enum demux_check check) if (!p->num_sources) return -1; + demuxer->is_network |= p->tl->is_network; + demuxer->is_streaming |= p->tl->is_streaming; + demuxer->duration = p->duration; print_timeline(demuxer); diff --git a/demux/timeline.h b/demux/timeline.h index d4a7b39403..e64b2f96c9 100644 --- a/demux/timeline.h +++ b/demux/timeline.h @@ -35,6 +35,7 @@ struct timeline { struct mp_log *log; struct mp_cancel *cancel; + bool is_network, is_streaming; const char *format; // main source, and all other sources (this usually only has special meaning