summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--demux/demux.c20
-rw-r--r--demux/demux_lavf.c35
2 files changed, 23 insertions, 32 deletions
diff --git a/demux/demux.c b/demux/demux.c
index 742619b30a..7025d95161 100644
--- a/demux/demux.c
+++ b/demux/demux.c
@@ -3201,6 +3201,22 @@ done:
return demuxer;
}
+static struct stream *create_webshit_concat_stream(struct mpv_global *global,
+ struct mp_cancel *c,
+ bstr init, struct stream *real)
+{
+ struct stream *mem = stream_memory_open(global, init.start, init.len);
+ assert(mem);
+
+ struct stream *streams[2] = {mem, real};
+ struct stream *concat = stream_concat_open(global, c, streams, 2);
+ if (!concat) {
+ free_stream(mem);
+ free_stream(real);
+ }
+ return concat;
+}
+
// Convenience function: open the stream, enable the cache (according to params
// and global opts.), open the demuxer.
// Also for some reason may close the opened stream if it's not needed.
@@ -3220,6 +3236,10 @@ struct demuxer *demux_open_url(const char *url,
mp_cancel_set_parent(priv_cancel, cancel);
struct stream *s = stream_create(url, STREAM_READ | params->stream_flags,
priv_cancel, global);
+ if (s && params->init_fragment.len) {
+ s = create_webshit_concat_stream(global, priv_cancel,
+ params->init_fragment, s);
+ }
if (!s) {
talloc_free(priv_cancel);
return NULL;
diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c
index bacbfa24de..ad2e6df6ea 100644
--- a/demux/demux_lavf.c
+++ b/demux/demux_lavf.c
@@ -218,8 +218,6 @@ typedef struct lavf_priv {
AVInputFormat *avif;
int avif_flags;
AVFormatContext *avfc;
- bstr init_fragment;
- int64_t stream_pos;
AVIOContext *pb;
struct stream_info **streams; // NULL for unknown streams
int num_streams;
@@ -281,16 +279,8 @@ static int mp_read(void *opaque, uint8_t *buf, int size)
struct demuxer *demuxer = opaque;
lavf_priv_t *priv = demuxer->priv;
struct stream *stream = priv->stream;
- int ret;
- if (priv->stream_pos < priv->init_fragment.len) {
- ret = MPMIN(size, priv->init_fragment.len - priv->stream_pos);
- memcpy(buf, priv->init_fragment.start + priv->stream_pos, ret);
- priv->stream_pos += ret;
- } else {
- ret = stream_read_partial(stream, buf, size);
- priv->stream_pos = priv->init_fragment.len + stream_tell(stream);
- }
+ int ret = stream_read_partial(stream, buf, size);
MP_TRACE(demuxer, "%d=mp_read(%p, %p, %d), pos: %"PRId64", eof:%d\n",
ret, stream, buf, size, stream_tell(stream), stream->eof);
@@ -311,12 +301,11 @@ static int64_t mp_seek(void *opaque, int64_t pos, int whence)
int64_t end = stream_get_size(stream);
if (end < 0)
return -1;
- end += priv->init_fragment.len;
if (whence == AVSEEK_SIZE)
return end;
pos += end;
} else if (whence == SEEK_CUR) {
- pos += priv->stream_pos;
+ pos += stream_tell(stream);
} else if (whence != SEEK_SET) {
return -1;
}
@@ -324,23 +313,12 @@ static int64_t mp_seek(void *opaque, int64_t pos, int whence)
if (pos < 0)
return -1;
- int64_t stream_target = pos - priv->init_fragment.len;
- bool seek_before = stream_target < 0;
- if (seek_before)
- stream_target = 0; // within init segment - seek real stream to 0
-
int64_t current_pos = stream_tell(stream);
- if (stream_seek(stream, stream_target) == 0) {
+ if (stream_seek(stream, pos) == 0) {
stream_seek(stream, current_pos);
return -1;
}
- if (seek_before) {
- priv->stream_pos = pos;
- } else {
- priv->stream_pos = priv->init_fragment.len + stream_tell(stream);
- }
-
return pos;
}
@@ -478,10 +456,6 @@ static int lavf_check_file(demuxer_t *demuxer, enum demux_check check)
int nsize = av_clip(avpd.buf_size * 2, INITIAL_PROBE_SIZE,
PROBE_BUF_SIZE);
bstr buf = stream_peek(s, nsize);
- if (demuxer->params && demuxer->params->init_fragment.len) {
- buf = demuxer->params->init_fragment;
- buf.len = MPMIN(buf.len, nsize);
- }
if (buf.len <= avpd.buf_size)
final_probe = true;
memcpy(avpd.buf, buf.start, buf.len);
@@ -933,9 +907,6 @@ static int demux_open_lavf(demuxer_t *demuxer, enum demux_check check)
if (lavf_check_file(demuxer, check) < 0)
return -1;
- if (demuxer->params)
- priv->init_fragment = bstrdup(priv, demuxer->params->init_fragment);
-
avfc = avformat_alloc_context();
if (!avfc)
return -1;