summaryrefslogtreecommitdiffstats
path: root/demux
diff options
context:
space:
mode:
Diffstat (limited to 'demux')
-rw-r--r--demux/demux_cue.c5
-rw-r--r--demux/demux_disc.c2
-rw-r--r--demux/demux_edl.c4
-rw-r--r--demux/demux_lavf.c7
-rw-r--r--demux/demux_libarchive.c8
-rw-r--r--demux/demux_mkv.c10
-rw-r--r--demux/demux_playlist.c18
7 files changed, 28 insertions, 26 deletions
diff --git a/demux/demux_cue.c b/demux/demux_cue.c
index 59628c74b4..35874972b9 100644
--- a/demux/demux_cue.c
+++ b/demux/demux_cue.c
@@ -265,8 +265,9 @@ static int try_open_file(struct demuxer *demuxer, enum demux_check check)
struct stream *s = demuxer->stream;
if (check >= DEMUX_CHECK_UNSAFE) {
- bstr d = stream_peek(s, PROBE_SIZE);
- if (d.len < 1 || !mp_probe_cue(d))
+ char probe[PROBE_SIZE];
+ int len = stream_read_peek(s, probe, sizeof(probe));
+ if (len < 1 || !mp_probe_cue((bstr){probe, len}))
return -1;
}
struct priv *p = talloc_zero(demuxer, struct priv);
diff --git a/demux/demux_disc.c b/demux/demux_disc.c
index 13e73caa39..919360d074 100644
--- a/demux/demux_disc.c
+++ b/demux/demux_disc.c
@@ -321,7 +321,7 @@ static int d_open(demuxer_t *demuxer, enum demux_check check)
// Initialize the playback time. We need to read _some_ data to get the
// correct stream-layer time (at least with libdvdnav).
- stream_peek(demuxer->stream, 1);
+ stream_read_peek(demuxer->stream, &(char){0}, 1);
reset_pts(demuxer);
p->slave = demux_open_url("-", &params, demuxer->cancel, demuxer->global);
diff --git a/demux/demux_edl.c b/demux/demux_edl.c
index 62e6c50070..aa650a383f 100644
--- a/demux/demux_edl.c
+++ b/demux/demux_edl.c
@@ -459,7 +459,9 @@ static int try_open_file(struct demuxer *demuxer, enum demux_check check)
return 0;
}
if (check >= DEMUX_CHECK_UNSAFE) {
- if (!bstr_equals0(stream_peek(s, strlen(HEADER)), HEADER))
+ char header[sizeof(HEADER) - 1];
+ int len = stream_read_peek(s, header, sizeof(header));
+ if (len != strlen(HEADER) || memcmp(header, HEADER, len) != 0)
return -1;
}
p->data = stream_read_complete(s, demuxer, 1000000);
diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c
index 670b611375..9ac6495f15 100644
--- a/demux/demux_lavf.c
+++ b/demux/demux_lavf.c
@@ -458,11 +458,10 @@ static int lavf_check_file(demuxer_t *demuxer, enum demux_check check)
} else {
int nsize = av_clip(avpd.buf_size * 2, INITIAL_PROBE_SIZE,
PROBE_BUF_SIZE);
- bstr buf = stream_peek(s, nsize);
- if (buf.len <= avpd.buf_size)
+ nsize = stream_read_peek(s, avpd.buf, nsize);
+ if (nsize <= avpd.buf_size)
final_probe = true;
- memcpy(avpd.buf, buf.start, buf.len);
- avpd.buf_size = buf.len;
+ avpd.buf_size = nsize;
priv->avif = av_probe_input_format2(&avpd, avpd.buf_size > 0, &score);
}
diff --git a/demux/demux_libarchive.c b/demux/demux_libarchive.c
index 3540082179..bb2ca24862 100644
--- a/demux/demux_libarchive.c
+++ b/demux/demux_libarchive.c
@@ -43,15 +43,17 @@ static int open_file(struct demuxer *demuxer, enum demux_check check)
probe_size *= 100;
}
- bstr probe = stream_peek(demuxer->stream, probe_size);
- if (probe.len == 0)
+ void *probe = ta_alloc_size(NULL, probe_size);
+ if (!probe)
return -1;
+ int probe_got = stream_read_peek(demuxer->stream, probe, probe_size);
struct stream *probe_stream =
- stream_memory_open(demuxer->global, probe.start, probe.len);
+ stream_memory_open(demuxer->global, probe, probe_got);
struct mp_archive *mpa = mp_archive_new(mp_null_log, probe_stream, flags);
bool ok = !!mpa;
free_stream(probe_stream);
mp_archive_free(mpa);
+ ta_free(probe);
if (!ok)
return -1;
diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c
index 5eaa7bbb07..db1ccff13a 100644
--- a/demux/demux_mkv.c
+++ b/demux/demux_mkv.c
@@ -1999,13 +1999,9 @@ static int demux_mkv_open(demuxer_t *demuxer, enum demux_check check)
if (demuxer->params)
mkv_d->probably_webm_dash_init = demuxer->params->init_fragment.len > 0;
- bstr start = stream_peek(s, 4);
- uint32_t start_id = 0;
- for (int n = 0; n < start.len; n++)
- start_id = (start_id << 8) | start.start[n];
- if (start_id != EBML_ID_EBML)
+ // Make sure you can seek back after read_ebml_header() if no EBML ID.
+ if (stream_read_peek(s, &(char[4]){0}, 4) != 4)
return -1;
-
if (!read_ebml_header(demuxer))
return -1;
MP_DBG(demuxer, "Found the head...\n");
@@ -2027,7 +2023,6 @@ static int demux_mkv_open(demuxer_t *demuxer, enum demux_check check)
while (1) {
start_pos = stream_tell(s);
- stream_peek(s, 4); // make sure we can always seek back
uint32_t id = ebml_read_id(s);
if (s->eof) {
if (!mkv_d->probably_webm_dash_init)
@@ -2836,7 +2831,6 @@ static int read_next_block_into_queue(demuxer_t *demuxer)
find_next_cluster:
mkv_d->cluster_end = 0;
for (;;) {
- stream_peek(s, 4); // guarantee we can undo ebml_read_id() below
mkv_d->cluster_start = stream_tell(s);
uint32_t id = ebml_read_id(s);
if (id == MATROSKA_ID_CLUSTER)
diff --git a/demux/demux_playlist.c b/demux/demux_playlist.c
index 95c89a18e2..a7650b2b69 100644
--- a/demux/demux_playlist.c
+++ b/demux/demux_playlist.c
@@ -92,12 +92,13 @@ static int read_characters(stream_t *s, uint8_t *dst, int dstsize, int utf16)
}
return cur - dst;
} else {
- bstr buf = stream_peek_buffer(s);
- uint8_t *end = memchr(buf.start, '\n', buf.len);
- int len = end ? end - buf.start + 1 : buf.len;
+ uint8_t buf[1024];
+ int buf_len = stream_read_peek(s, buf, sizeof(buf));
+ uint8_t *end = memchr(buf, '\n', buf_len);
+ int len = end ? end - buf + 1 : buf_len;
if (len > dstsize)
return -1; // line too long
- memcpy(dst, buf.start, len);
+ memcpy(dst, buf, len);
stream_skip(s, len);
return len;
}
@@ -178,7 +179,9 @@ static int parse_m3u(struct pl_parser *p)
// Last resort: if the file extension is m3u, it might be headerless.
if (p->check_level == DEMUX_CHECK_UNSAFE) {
char *ext = mp_splitext(p->real_stream->url, NULL);
- bstr data = stream_peek(p->real_stream, PROBE_SIZE);
+ char probe[PROBE_SIZE];
+ int len = stream_read_peek(p->real_stream, probe, sizeof(probe));
+ bstr data = {probe, len};
if (ext && data.len > 10 && maybe_text(data)) {
const char *exts[] = {"m3u", "m3u8", NULL};
for (int n = 0; exts[n]; n++) {
@@ -437,8 +440,9 @@ static int open_file(struct demuxer *demuxer, enum demux_check check)
p->real_stream = demuxer->stream;
p->add_base = true;
- bstr probe_buf = stream_peek(demuxer->stream, PROBE_SIZE);
- p->s = stream_memory_open(demuxer->global, probe_buf.start, probe_buf.len);
+ char probe[PROBE_SIZE];
+ int probe_len = stream_read_peek(p->real_stream, probe, sizeof(probe));
+ p->s = stream_memory_open(demuxer->global, probe, probe_len);
p->s->mime_type = demuxer->stream->mime_type;
p->utf16 = stream_skip_bom(p->s);
p->force = force;