[FFmpeg-devel] [PATCH v2] avformat/hls: support data protocol in uri for EXT-X-MAP
Steven Liu
lq at chinaffmpeg.org
Tue Sep 24 06:18:59 EEST 2019
Signed-off-by: Steven Liu <lq at chinaffmpeg.org>
---
libavformat/file.c | 4 ++--
libavformat/hls.c | 13 ++++++++++++-
libavformat/http.c | 2 +-
3 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/libavformat/file.c b/libavformat/file.c
index 08c7f8e6dd..8303436be0 100644
--- a/libavformat/file.c
+++ b/libavformat/file.c
@@ -369,7 +369,7 @@ const URLProtocol ff_file_protocol = {
.url_open_dir = file_open_dir,
.url_read_dir = file_read_dir,
.url_close_dir = file_close_dir,
- .default_whitelist = "file,crypto"
+ .default_whitelist = "file,crypto,data"
};
#endif /* CONFIG_FILE_PROTOCOL */
@@ -408,7 +408,7 @@ const URLProtocol ff_pipe_protocol = {
.url_check = file_check,
.priv_data_size = sizeof(FileContext),
.priv_data_class = &pipe_class,
- .default_whitelist = "crypto"
+ .default_whitelist = "crypto,data"
};
#endif /* CONFIG_PIPE_PROTOCOL */
diff --git a/libavformat/hls.c b/libavformat/hls.c
index 0611ddc6bb..891fe4e243 100644
--- a/libavformat/hls.c
+++ b/libavformat/hls.c
@@ -409,7 +409,11 @@ static struct segment *new_init_section(struct playlist *pls,
if (!sec)
return NULL;
- ff_make_absolute_url(tmp_str, sizeof(tmp_str), url_base, info->uri);
+ if (!av_strncasecmp(info->uri, "data:", 5)) {
+ strncpy(tmp_str, info->uri, strlen(info->uri));
+ } else {
+ ff_make_absolute_url(tmp_str, sizeof(tmp_str), url_base, info->uri);
+ }
sec->url = av_strdup(tmp_str);
if (!sec->url) {
av_free(sec);
@@ -623,6 +627,9 @@ static int open_url(AVFormatContext *s, AVIOContext **pb, const char *url,
if (av_strstart(url, "crypto", NULL)) {
if (url[6] == '+' || url[6] == ':')
proto_name = avio_find_protocol_name(url + 7);
+ } else if (av_strstart(url, "data", NULL)) {
+ if (url[4] == '+' || url[4] == ':')
+ proto_name = avio_find_protocol_name(url + 5);
}
if (!proto_name)
@@ -642,6 +649,8 @@ static int open_url(AVFormatContext *s, AVIOContext **pb, const char *url,
}
} else if (av_strstart(proto_name, "http", NULL)) {
is_http = 1;
+ } else if (av_strstart(proto_name, "data", NULL)) {
+ ;
} else
return AVERROR_INVALIDDATA;
@@ -649,6 +658,8 @@ static int open_url(AVFormatContext *s, AVIOContext **pb, const char *url,
;
else if (av_strstart(url, "crypto", NULL) && !strncmp(proto_name, url + 7, strlen(proto_name)) && url[7 + strlen(proto_name)] == ':')
;
+ else if (av_strstart(url, "data", NULL) && !strncmp(proto_name, url + 5, strlen(proto_name)) && url[5 + strlen(proto_name)] == ':')
+ ;
else if (strcmp(proto_name, "file") || !strncmp(url, "file,", 5))
return AVERROR_INVALIDDATA;
diff --git a/libavformat/http.c b/libavformat/http.c
index 71dd6c2b1f..e87818aa30 100644
--- a/libavformat/http.c
+++ b/libavformat/http.c
@@ -1785,7 +1785,7 @@ const URLProtocol ff_http_protocol = {
.priv_data_size = sizeof(HTTPContext),
.priv_data_class = &http_context_class,
.flags = URL_PROTOCOL_FLAG_NETWORK,
- .default_whitelist = "http,https,tls,rtp,tcp,udp,crypto,httpproxy"
+ .default_whitelist = "http,https,tls,rtp,tcp,udp,crypto,httpproxy,data"
};
#endif /* CONFIG_HTTP_PROTOCOL */
--
2.17.2 (Apple Git-113)
More information about the ffmpeg-devel
mailing list