diff options
author | wm4 <wm4@nowhere> | 2015-08-17 23:59:44 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2015-08-17 23:59:55 +0200 |
commit | bf5eac8dd3f142acd0d506407f1ae853ada3c5bc (patch) | |
tree | a19ee90daa0d1ca469455bd8dba9d6d6a336e020 | |
parent | 41d7989800aef7b52affdddf0a5f539fb2a1d562 (diff) | |
download | mpv-bf5eac8dd3f142acd0d506407f1ae853ada3c5bc.tar.bz2 mpv-bf5eac8dd3f142acd0d506407f1ae853ada3c5bc.tar.xz |
demux_libarchive: open flat compressed files
Things like .gz etc., which have no real file header. A mixed bag,
because it e.g. tends to misdetect mp3 files as compressed files or
something (of course it has no mp3 support - I don't know as what it
detects them). But requested by someone (or maybe not, I'm not sure
how to interpret that).
-rw-r--r-- | demux/demux_libarchive.c | 5 | ||||
-rw-r--r-- | stream/stream_libarchive.c | 7 | ||||
-rw-r--r-- | stream/stream_libarchive.h | 5 |
3 files changed, 13 insertions, 4 deletions
diff --git a/demux/demux_libarchive.c b/demux/demux_libarchive.c index b95f37228c..ae2bd95599 100644 --- a/demux/demux_libarchive.c +++ b/demux/demux_libarchive.c @@ -32,7 +32,10 @@ static int cmp_filename(const void *a, const void *b) static int open_file(struct demuxer *demuxer, enum demux_check check) { - struct mp_archive *mpa = mp_archive_new(demuxer->log, demuxer->stream); + int flags = 0; + if (check <= DEMUX_CHECK_REQUEST) + flags |= MP_ARCHIVE_FLAG_UNSAFE; + struct mp_archive *mpa = mp_archive_new(demuxer->log, demuxer->stream, flags); if (!mpa) return -1; diff --git a/stream/stream_libarchive.c b/stream/stream_libarchive.c index c2a64dbf63..4dbb7bde08 100644 --- a/stream/stream_libarchive.c +++ b/stream/stream_libarchive.c @@ -71,7 +71,8 @@ void mp_archive_free(struct mp_archive *mpa) talloc_free(mpa); } -struct mp_archive *mp_archive_new(struct mp_log *log, struct stream *src) +struct mp_archive *mp_archive_new(struct mp_log *log, struct stream *src, + int flags) { struct mp_archive *mpa = talloc_zero(NULL, struct mp_archive); mpa->src = src; @@ -81,6 +82,8 @@ struct mp_archive *mp_archive_new(struct mp_log *log, struct stream *src) goto err; archive_read_support_format_all(mpa->arch); archive_read_support_filter_all(mpa->arch); + if (flags & MP_ARCHIVE_FLAG_UNSAFE) + archive_read_support_format_raw(mpa->arch); archive_read_set_callback_data(mpa->arch, mpa); archive_read_set_read_callback(mpa->arch, read_cb); archive_read_set_skip_callback(mpa->arch, skip_cb); @@ -106,7 +109,7 @@ static int reopen_archive(stream_t *s) { struct priv *p = s->priv; mp_archive_free(p->mpa); - p->mpa = mp_archive_new(s->log, p->src); + p->mpa = mp_archive_new(s->log, p->src, MP_ARCHIVE_FLAG_UNSAFE); if (!p->mpa) return STREAM_ERROR; diff --git a/stream/stream_libarchive.h b/stream/stream_libarchive.h index 5d10eb33c5..f69faade72 100644 --- a/stream/stream_libarchive.h +++ b/stream/stream_libarchive.h @@ -7,4 +7,7 @@ struct mp_archive { }; void mp_archive_free(struct mp_archive *mpa); -struct mp_archive *mp_archive_new(struct mp_log *log, struct stream *src); + +#define MP_ARCHIVE_FLAG_UNSAFE 1 +struct mp_archive *mp_archive_new(struct mp_log *log, struct stream *src, + int flags); |