diff options
-rw-r--r-- | demux/demux.c | 20 | ||||
-rw-r--r-- | demux/demux_lavf.c | 35 |
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; |