Commit b9606064 authored by Steven Liu's avatar Steven Liu

avformat/hls: support data protocol in uri for EXT-X-MAP

Signed-off-by: 's avatarSteven Liu <lq@chinaffmpeg.org>
parent 62a0d226
...@@ -369,7 +369,7 @@ const URLProtocol ff_file_protocol = { ...@@ -369,7 +369,7 @@ const URLProtocol ff_file_protocol = {
.url_open_dir = file_open_dir, .url_open_dir = file_open_dir,
.url_read_dir = file_read_dir, .url_read_dir = file_read_dir,
.url_close_dir = file_close_dir, .url_close_dir = file_close_dir,
.default_whitelist = "file,crypto" .default_whitelist = "file,crypto,data"
}; };
#endif /* CONFIG_FILE_PROTOCOL */ #endif /* CONFIG_FILE_PROTOCOL */
...@@ -408,7 +408,7 @@ const URLProtocol ff_pipe_protocol = { ...@@ -408,7 +408,7 @@ const URLProtocol ff_pipe_protocol = {
.url_check = file_check, .url_check = file_check,
.priv_data_size = sizeof(FileContext), .priv_data_size = sizeof(FileContext),
.priv_data_class = &pipe_class, .priv_data_class = &pipe_class,
.default_whitelist = "crypto" .default_whitelist = "crypto,data"
}; };
#endif /* CONFIG_PIPE_PROTOCOL */ #endif /* CONFIG_PIPE_PROTOCOL */
...@@ -413,7 +413,11 @@ static struct segment *new_init_section(struct playlist *pls, ...@@ -413,7 +413,11 @@ static struct segment *new_init_section(struct playlist *pls,
if (!sec) if (!sec)
return NULL; 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); sec->url = av_strdup(tmp_str);
if (!sec->url) { if (!sec->url) {
av_free(sec); av_free(sec);
...@@ -627,6 +631,9 @@ static int open_url(AVFormatContext *s, AVIOContext **pb, const char *url, ...@@ -627,6 +631,9 @@ static int open_url(AVFormatContext *s, AVIOContext **pb, const char *url,
if (av_strstart(url, "crypto", NULL)) { if (av_strstart(url, "crypto", NULL)) {
if (url[6] == '+' || url[6] == ':') if (url[6] == '+' || url[6] == ':')
proto_name = avio_find_protocol_name(url + 7); 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) if (!proto_name)
...@@ -646,6 +653,8 @@ static int open_url(AVFormatContext *s, AVIOContext **pb, const char *url, ...@@ -646,6 +653,8 @@ static int open_url(AVFormatContext *s, AVIOContext **pb, const char *url,
} }
} else if (av_strstart(proto_name, "http", NULL)) { } else if (av_strstart(proto_name, "http", NULL)) {
is_http = 1; is_http = 1;
} else if (av_strstart(proto_name, "data", NULL)) {
;
} else } else
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
...@@ -653,6 +662,8 @@ static int open_url(AVFormatContext *s, AVIOContext **pb, const char *url, ...@@ -653,6 +662,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, "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)) else if (strcmp(proto_name, "file") || !strncmp(url, "file,", 5))
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
......
...@@ -1791,7 +1791,7 @@ const URLProtocol ff_http_protocol = { ...@@ -1791,7 +1791,7 @@ const URLProtocol ff_http_protocol = {
.priv_data_size = sizeof(HTTPContext), .priv_data_size = sizeof(HTTPContext),
.priv_data_class = &http_context_class, .priv_data_class = &http_context_class,
.flags = URL_PROTOCOL_FLAG_NETWORK, .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 */ #endif /* CONFIG_HTTP_PROTOCOL */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment