diff --git a/libavformat/avio.c b/libavformat/avio.c index a19ec37cb1..4ab1b6bd75 100644 --- a/libavformat/avio.c +++ b/libavformat/avio.c @@ -175,7 +175,7 @@ int url_open_protocol (URLContext **puc, struct URLProtocol *up, int url_alloc(URLContext **puc, const char *filename, int flags) { URLProtocol *up; - char proto_str[128]; + char proto_str[128], proto_nested[128], *ptr; size_t proto_len = strspn(filename, URL_SCHEME_CHARS); if (filename[proto_len] != ':' || is_dos_path(filename)) @@ -183,10 +183,17 @@ int url_alloc(URLContext **puc, const char *filename, int flags) else av_strlcpy(proto_str, filename, FFMIN(proto_len+1, sizeof(proto_str))); + av_strlcpy(proto_nested, proto_str, sizeof(proto_nested)); + if ((ptr = strchr(proto_nested, '+'))) + *ptr = '\0'; + up = first_protocol; while (up != NULL) { if (!strcmp(proto_str, up->name)) return url_alloc_for_protocol (puc, up, filename, flags); + if (up->flags & URL_PROTOCOL_FLAG_NESTED_SCHEME && + !strcmp(proto_nested, up->name)) + return url_alloc_for_protocol (puc, up, filename, flags); up = up->next; } *puc = NULL; diff --git a/libavformat/avio.h b/libavformat/avio.h index fd18f0d8ea..acdd0c1bd0 100644 --- a/libavformat/avio.h +++ b/libavformat/avio.h @@ -281,6 +281,8 @@ int64_t av_url_read_seek(URLContext *h, int stream_index, */ #define AVSEEK_FORCE 0x20000 +#define URL_PROTOCOL_FLAG_NESTED_SCHEME 1 /*< The protocol name can be the first part of a nested protocol scheme */ + typedef struct URLProtocol { const char *name; int (*url_open)(URLContext *h, const char *url, int flags);