summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--demux/demux_libarchive.c22
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;