diff options
Diffstat (limited to 'demux')
-rw-r--r-- | demux/demux_libarchive.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/demux/demux_libarchive.c b/demux/demux_libarchive.c index d0afb624c5..1ce8b32244 100644 --- a/demux/demux_libarchive.c +++ b/demux/demux_libarchive.c @@ -32,13 +32,25 @@ static int cmp_filename(const void *a, const void *b) static int open_file(struct demuxer *demuxer, enum demux_check check) { - if (stream_get_size(demuxer->stream) == 0) - return -1; - int flags = 0; - if (check <= DEMUX_CHECK_REQUEST) + int probe_size = STREAM_BUFFER_SIZE; + if (check <= DEMUX_CHECK_REQUEST) { flags |= MP_ARCHIVE_FLAG_UNSAFE; - struct mp_archive *mpa = mp_archive_new(demuxer->log, demuxer->stream, flags); + probe_size *= 100; + } + + bstr probe = stream_peek(demuxer->stream, probe_size); + if (probe.len == 0) + return -1; + struct stream *probe_stream = open_memory_stream(probe.start, probe.len); + struct mp_archive *mpa = mp_archive_new(mp_null_log, probe_stream, flags); + bool ok = !!mpa; + free_stream(probe_stream); + mp_archive_free(mpa); + if (!ok) + return -1; + + mpa = mp_archive_new(demuxer->log, demuxer->stream, flags); if (!mpa) return -1; |