From af6652004d5f712e140996a17c683d437f4b8bb3 Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 23 Dec 2019 11:03:44 +0100 Subject: stream_concat, stream_memory: more stream_origin stuff Make concat streams use the "worst" origin of its parts, which may or may not be what makes sense. stream_memory has no natural way to do this, so just add a vague comment. --- stream/stream_concat.c | 17 +++++++++++++++++ stream/stream_memory.c | 2 ++ 2 files changed, 19 insertions(+) diff --git a/stream/stream_concat.c b/stream/stream_concat.c index 060583a604..21f04f9d62 100644 --- a/stream/stream_concat.c +++ b/stream/stream_concat.c @@ -87,6 +87,18 @@ static void s_close(struct stream *s) free_stream(p->streams[n]); } +// Return the "worst" origin value of the two. cur can be 0 to mean unset. +static int combine_origin(int cur, int new) +{ + if (cur == STREAM_ORIGIN_UNSAFE || new == STREAM_ORIGIN_UNSAFE) + return STREAM_ORIGIN_UNSAFE; + if (cur == STREAM_ORIGIN_NET || new == STREAM_ORIGIN_NET) + return STREAM_ORIGIN_NET; + if (cur == STREAM_ORIGIN_FS || new == STREAM_ORIGIN_FS) + return STREAM_ORIGIN_FS; + return new; // including cur==0 +} + static int open2(struct stream *stream, struct stream_open_args *args) { struct priv *p = talloc_zero(stream, struct priv); @@ -104,6 +116,8 @@ static int open2(struct stream *stream, struct stream_open_args *args) return STREAM_ERROR; } + stream->stream_origin = 0; + for (int n = 0; n < list->num_streams; n++) { struct stream *sub = list->streams[n]; @@ -119,6 +133,9 @@ static int open2(struct stream *stream, struct stream_open_args *args) if (!sub->seekable) stream->seekable = false; + stream->stream_origin = + combine_origin(stream->stream_origin, sub->stream_origin); + MP_TARRAY_APPEND(p, p->streams, p->num_streams, sub); } diff --git a/stream/stream_memory.c b/stream/stream_memory.c index 01246cf33f..7383ff4d6f 100644 --- a/stream/stream_memory.c +++ b/stream/stream_memory.c @@ -79,6 +79,8 @@ const stream_info_t stream_info_memory = { .protocols = (const char*const[]){ "memory", "hex", NULL }, }; +// The data is copied. +// Caller may need to set stream.stream_origin correctly. struct stream *stream_memory_open(struct mpv_global *global, void *data, int len) { assert(len >= 0); -- cgit v1.2.3