diff options
Diffstat (limited to 'stream')
-rw-r--r-- | stream/stream.c | 18 | ||||
-rw-r--r-- | stream/stream.h | 2 |
2 files changed, 20 insertions, 0 deletions
diff --git a/stream/stream.c b/stream/stream.c index b17b7fc19a..4650535890 100644 --- a/stream/stream.c +++ b/stream/stream.c @@ -742,6 +742,7 @@ static int stream_enable_cache(stream_t **stream, int64_t size, int64_t min, cache->url = talloc_strdup(cache, orig->url); cache->mime_type = talloc_strdup(cache, orig->mime_type); cache->lavf_type = talloc_strdup(cache, orig->lavf_type); + cache->safe_origin = orig->safe_origin; cache->opts = orig->opts; cache->start_pos = orig->start_pos; cache->end_pos = orig->end_pos; @@ -862,6 +863,8 @@ unsigned char *stream_read_line(stream_t *s, unsigned char *mem, int max, int len; const unsigned char *end; unsigned char *ptr = mem; + if (utf16 == -1) + utf16 = 0; if (max < 1) return NULL; max--; // reserve one for 0-termination @@ -891,6 +894,21 @@ unsigned char *stream_read_line(stream_t *s, unsigned char *mem, int max, return mem; } +static const char *bom[3] = {"\xEF\xBB\xBF", "\xFF\xFE", "\xFE\xFF"}; + +// Return utf16 argument for stream_read_line +int stream_skip_bom(struct stream *s) +{ + bstr data = stream_peek(s, 4); + for (int n = 0; n < 3; n++) { + if (bstr_startswith0(data, bom[n])) { + stream_skip(s, strlen(bom[n])); + return n; + } + } + return -1; // default to 8 bit codepages +} + // Read the rest of the stream into memory (current pos to EOF), and return it. // talloc_ctx: used as talloc parent for the returned allocation // max_size: must be set to >0. If the file is larger than that, it is treated diff --git a/stream/stream.h b/stream/stream.h index f19ab4203f..27043206c9 100644 --- a/stream/stream.h +++ b/stream/stream.h @@ -150,6 +150,7 @@ typedef struct stream { char *mime_type; // when HTTP streaming is used char *demuxer; // request demuxer to be used char *lavf_type; // name of expected demuxer type for lavf + bool safe_origin; // used for playlists that can be opened safely struct MPOpts *opts; FILE *capture_file; @@ -208,6 +209,7 @@ inline static uint64_t stream_read_qword(stream_t *s) unsigned char *stream_read_line(stream_t *s, unsigned char *mem, int max, int utf16); +int stream_skip_bom(struct stream *s); inline static int stream_eof(stream_t *s) { |