aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Buitenhuis2016-02-29 16:50:39 +0000
committerDerek Buitenhuis2016-02-29 16:51:10 +0000
commit9c75148e6ebc88a0501e3d0242defb6dbdc3c23d (patch)
treee24939addbed549191606f8b6927b29b42c18394
parente3461197b1ffa0b4ebb80ee3d8567d3b286d7fc3 (diff)
parent2758cdedfb7ac61f8b5e4861f99218b6fd43491d (diff)
Merge commit '2758cdedfb7ac61f8b5e4861f99218b6fd43491d'
This commit also disables the async fate test, because it used internal APIs in a non-kosher way, which no longer exists. * commit '2758cdedfb7ac61f8b5e4861f99218b6fd43491d': lavf: reorganize URLProtocols Merged-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
-rwxr-xr-xconfigure10
-rw-r--r--libavformat/Makefile1
-rw-r--r--libavformat/allformats.c55
-rw-r--r--libavformat/async.c6
-rw-r--r--libavformat/avio.c66
-rw-r--r--libavformat/bluray.c2
-rw-r--r--libavformat/cache.c2
-rw-r--r--libavformat/concat.c2
-rw-r--r--libavformat/crypto.c2
-rw-r--r--libavformat/data_uri.c2
-rw-r--r--libavformat/file.c4
-rw-r--r--libavformat/ftp.c2
-rw-r--r--libavformat/gopher.c2
-rw-r--r--libavformat/hlsproto.c2
-rw-r--r--libavformat/http.c6
-rw-r--r--libavformat/icecast.c2
-rw-r--r--libavformat/librtmp.c10
-rw-r--r--libavformat/libsmbclient.c2
-rw-r--r--libavformat/libssh.c2
-rw-r--r--libavformat/md5proto.c2
-rw-r--r--libavformat/mmsh.c2
-rw-r--r--libavformat/mmst.c2
-rw-r--r--libavformat/protocols.c208
-rw-r--r--libavformat/rtmpcrypt.c2
-rw-r--r--libavformat/rtmphttp.c2
-rw-r--r--libavformat/rtmpproto.c2
-rw-r--r--libavformat/rtpproto.c2
-rw-r--r--libavformat/sctp.c2
-rw-r--r--libavformat/srtpproto.c2
-rw-r--r--libavformat/subfile.c2
-rw-r--r--libavformat/tcp.c2
-rw-r--r--libavformat/tls_gnutls.c2
-rw-r--r--libavformat/tls_openssl.c2
-rw-r--r--libavformat/tls_schannel.c2
-rw-r--r--libavformat/tls_securetransport.c2
-rw-r--r--libavformat/udp.c4
-rw-r--r--libavformat/unix.c2
-rw-r--r--libavformat/url.h16
-rw-r--r--tests/fate/libavformat.mak6
39 files changed, 291 insertions, 155 deletions
diff --git a/configure b/configure
index 8b7c423dc0..8491fa103e 100755
--- a/configure
+++ b/configure
@@ -3138,9 +3138,17 @@ MUXER_LIST=$(find_things muxer _MUX libavformat/allformats.c)
DEMUXER_LIST=$(find_things demuxer DEMUX libavformat/allformats.c)
OUTDEV_LIST=$(find_things outdev OUTDEV libavdevice/alldevices.c)
INDEV_LIST=$(find_things indev _IN libavdevice/alldevices.c)
-PROTOCOL_LIST=$(find_things protocol PROTOCOL libavformat/allformats.c)
FILTER_LIST=$(find_things filter FILTER libavfilter/allfilters.c)
+find_things_extern(){
+ thing=$1
+ pattern=$2
+ file=$source_path/$3
+ sed -n "s/^[^#]*extern.*$pattern *ff_\([^ ]*\)_$thing;/\1_$thing/p" "$file"
+}
+
+PROTOCOL_LIST=$(find_things_extern protocol URLProtocol libavformat/protocols.c)
+
ALL_COMPONENTS="
$BSF_LIST
$DECODER_LIST
diff --git a/libavformat/Makefile b/libavformat/Makefile
index edfa695437..d3c2071a19 100644
--- a/libavformat/Makefile
+++ b/libavformat/Makefile
@@ -19,6 +19,7 @@ OBJS = allformats.o \
options.o \
os_support.o \
qtpalette.o \
+ protocols.o \
riff.o \
sdp.o \
url.o \
diff --git a/libavformat/allformats.c b/libavformat/allformats.c
index fc87900d96..94f258d2ea 100644
--- a/libavformat/allformats.c
+++ b/libavformat/allformats.c
@@ -41,13 +41,6 @@
#define REGISTER_MUXDEMUX(X, x) REGISTER_MUXER(X, x); REGISTER_DEMUXER(X, x)
-#define REGISTER_PROTOCOL(X, x) \
- { \
- extern URLProtocol ff_##x##_protocol; \
- if (CONFIG_##X##_PROTOCOL) \
- ffurl_register_protocol(&ff_##x##_protocol); \
- }
-
void av_register_all(void)
{
static int initialized;
@@ -367,57 +360,9 @@ void av_register_all(void)
REGISTER_DEMUXER (IMAGE_TIFF_PIPE, image_tiff_pipe);
REGISTER_DEMUXER (IMAGE_WEBP_PIPE, image_webp_pipe);
-
- /* protocols */
- REGISTER_PROTOCOL(ASYNC, async);
- REGISTER_PROTOCOL(BLURAY, bluray);
- REGISTER_PROTOCOL(CACHE, cache);
- REGISTER_PROTOCOL(CONCAT, concat);
- REGISTER_PROTOCOL(CRYPTO, crypto);
- REGISTER_PROTOCOL(DATA, data);
- REGISTER_PROTOCOL(FFRTMPCRYPT, ffrtmpcrypt);
- REGISTER_PROTOCOL(FFRTMPHTTP, ffrtmphttp);
- REGISTER_PROTOCOL(FILE, file);
- REGISTER_PROTOCOL(FTP, ftp);
- REGISTER_PROTOCOL(GOPHER, gopher);
- REGISTER_PROTOCOL(HLS, hls);
- REGISTER_PROTOCOL(HTTP, http);
- REGISTER_PROTOCOL(HTTPPROXY, httpproxy);
- REGISTER_PROTOCOL(HTTPS, https);
- REGISTER_PROTOCOL(ICECAST, icecast);
- REGISTER_PROTOCOL(MMSH, mmsh);
- REGISTER_PROTOCOL(MMST, mmst);
- REGISTER_PROTOCOL(MD5, md5);
- REGISTER_PROTOCOL(PIPE, pipe);
- REGISTER_PROTOCOL(RTMP, rtmp);
- REGISTER_PROTOCOL(RTMPE, rtmpe);
- REGISTER_PROTOCOL(RTMPS, rtmps);
- REGISTER_PROTOCOL(RTMPT, rtmpt);
- REGISTER_PROTOCOL(RTMPTE, rtmpte);
- REGISTER_PROTOCOL(RTMPTS, rtmpts);
- REGISTER_PROTOCOL(RTP, rtp);
- REGISTER_PROTOCOL(SCTP, sctp);
- REGISTER_PROTOCOL(SRTP, srtp);
- REGISTER_PROTOCOL(SUBFILE, subfile);
- REGISTER_PROTOCOL(TCP, tcp);
- REGISTER_PROTOCOL(TLS_SCHANNEL, tls_schannel);
- REGISTER_PROTOCOL(TLS_SECURETRANSPORT, tls_securetransport);
- REGISTER_PROTOCOL(TLS_GNUTLS, tls_gnutls);
- REGISTER_PROTOCOL(TLS_OPENSSL, tls_openssl);
- REGISTER_PROTOCOL(UDP, udp);
- REGISTER_PROTOCOL(UDPLITE, udplite);
- REGISTER_PROTOCOL(UNIX, unix);
-
/* external libraries */
REGISTER_MUXER (CHROMAPRINT, chromaprint);
REGISTER_DEMUXER (LIBGME, libgme);
REGISTER_DEMUXER (LIBMODPLUG, libmodplug);
REGISTER_MUXDEMUX(LIBNUT, libnut);
- REGISTER_PROTOCOL(LIBRTMP, librtmp);
- REGISTER_PROTOCOL(LIBRTMPE, librtmpe);
- REGISTER_PROTOCOL(LIBRTMPS, librtmps);
- REGISTER_PROTOCOL(LIBRTMPT, librtmpt);
- REGISTER_PROTOCOL(LIBRTMPTE, librtmpte);
- REGISTER_PROTOCOL(LIBSSH, libssh);
- REGISTER_PROTOCOL(LIBSMBCLIENT, libsmbclient);
}
diff --git a/libavformat/async.c b/libavformat/async.c
index 138ef137cf..a835292e05 100644
--- a/libavformat/async.c
+++ b/libavformat/async.c
@@ -479,7 +479,7 @@ static const AVClass async_context_class = {
.version = LIBAVUTIL_VERSION_INT,
};
-URLProtocol ff_async_protocol = {
+const URLProtocol ff_async_protocol = {
.name = "async",
.url_open2 = async_open,
.url_read = async_read,
@@ -489,7 +489,7 @@ URLProtocol ff_async_protocol = {
.priv_data_class = &async_context_class,
};
-#ifdef TEST
+#if 0
#define TEST_SEEK_POS (1536)
#define TEST_STREAM_SIZE (2048)
@@ -581,7 +581,7 @@ static const AVClass async_test_context_class = {
.version = LIBAVUTIL_VERSION_INT,
};
-URLProtocol ff_async_test_protocol = {
+const URLProtocol ff_async_test_protocol = {
.name = "async-test",
.url_open2 = async_test_open,
.url_read = async_test_read,
diff --git a/libavformat/avio.c b/libavformat/avio.c
index 362099dd82..bd276f64d6 100644
--- a/libavformat/avio.c
+++ b/libavformat/avio.c
@@ -31,13 +31,6 @@
#endif
#include "url.h"
-static URLProtocol *first_protocol = NULL;
-
-URLProtocol *ffurl_protocol_next(const URLProtocol *prev)
-{
- return prev ? prev->next : first_protocol;
-}
-
/** @name Logging context. */
/*@{*/
static const char *urlcontext_to_name(void *ptr)
@@ -59,17 +52,20 @@ static void *urlcontext_child_next(void *obj, void *prev)
static const AVClass *urlcontext_child_class_next(const AVClass *prev)
{
- URLProtocol *p = NULL;
+ int i;
/* find the protocol that corresponds to prev */
- while (prev && (p = ffurl_protocol_next(p)))
- if (p->priv_data_class == prev)
+ for (i = 0; ff_url_protocols[i]; i++) {
+ if (ff_url_protocols[i]->priv_data_class == prev) {
+ i++;
break;
+ }
+ }
/* find next protocol with priv options */
- while (p = ffurl_protocol_next(p))
- if (p->priv_data_class)
- return p->priv_data_class;
+ for (; ff_url_protocols[i]; i++)
+ if (ff_url_protocols[i]->priv_data_class)
+ return ff_url_protocols[i]->priv_data_class;
return NULL;
}
@@ -92,27 +88,20 @@ const AVClass ffurl_context_class = {
const char *avio_enum_protocols(void **opaque, int output)
{
- URLProtocol *p;
- *opaque = ffurl_protocol_next(*opaque);
- if (!(p = *opaque))
+ const URLProtocol **p = *opaque;
+
+ p = p ? p + 1 : ff_url_protocols;
+ *opaque = p;
+ if (!*p) {
+ *opaque = NULL;
return NULL;
- if ((output && p->url_write) || (!output && p->url_read))
- return p->name;
+ }
+ if ((output && (*p)->url_write) || (!output && (*p)->url_read))
+ return (*p)->name;
return avio_enum_protocols(opaque, output);
}
-int ffurl_register_protocol(URLProtocol *protocol)
-{
- URLProtocol **p;
- p = &first_protocol;
- while (*p)
- p = &(*p)->next;
- *p = protocol;
- protocol->next = NULL;
- return 0;
-}
-
-static int url_alloc_for_protocol(URLContext **puc, struct URLProtocol *up,
+static int url_alloc_for_protocol(URLContext **puc, const URLProtocol *up,
const char *filename, int flags,
const AVIOInterruptCB *int_cb)
{
@@ -280,11 +269,12 @@ int ffurl_handshake(URLContext *c)
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
"0123456789+-."
-static struct URLProtocol *url_find_protocol(const char *filename)
+static const struct URLProtocol *url_find_protocol(const char *filename)
{
- URLProtocol *up = NULL;
+ const URLProtocol *up;
char proto_str[128], proto_nested[128], *ptr;
size_t proto_len = strspn(filename, URL_SCHEME_CHARS);
+ int i;
if (filename[proto_len] != ':' &&
(strncmp(filename, "subfile,", 8) || !strchr(filename + proto_len + 1, ':')) ||
@@ -300,7 +290,8 @@ static struct URLProtocol *url_find_protocol(const char *filename)
if ((ptr = strchr(proto_nested, '+')))
*ptr = '\0';
- while (up = ffurl_protocol_next(up)) {
+ for (i = 0; ff_url_protocols[i]; i++) {
+ up = ff_url_protocols[i];
if (!strcmp(proto_str, up->name))
break;
if (up->flags & URL_PROTOCOL_FLAG_NESTED_SCHEME &&
@@ -314,12 +305,7 @@ static struct URLProtocol *url_find_protocol(const char *filename)
int ffurl_alloc(URLContext **puc, const char *filename, int flags,
const AVIOInterruptCB *int_cb)
{
- URLProtocol *p = NULL;
-
- if (!first_protocol) {
- av_log(NULL, AV_LOG_WARNING, "No URL Protocols are registered. "
- "Missing call to av_register_all()?\n");
- }
+ const URLProtocol *p = NULL;
p = url_find_protocol(filename);
if (p)
@@ -484,7 +470,7 @@ int ffurl_close(URLContext *h)
const char *avio_find_protocol_name(const char *url)
{
- URLProtocol *p = url_find_protocol(url);
+ const URLProtocol *p = url_find_protocol(url);
return p ? p->name : NULL;
}
diff --git a/libavformat/bluray.c b/libavformat/bluray.c
index d2c57aab9c..9282bf9956 100644
--- a/libavformat/bluray.c
+++ b/libavformat/bluray.c
@@ -224,7 +224,7 @@ static int64_t bluray_seek(URLContext *h, int64_t pos, int whence)
}
-URLProtocol ff_bluray_protocol = {
+const URLProtocol ff_bluray_protocol = {
.name = "bluray",
.url_close = bluray_close,
.url_open = bluray_open,
diff --git a/libavformat/cache.c b/libavformat/cache.c
index 8e8b9e8412..2889e3b2a8 100644
--- a/libavformat/cache.c
+++ b/libavformat/cache.c
@@ -312,7 +312,7 @@ static const AVClass cache_context_class = {
.version = LIBAVUTIL_VERSION_INT,
};
-URLProtocol ff_cache_protocol = {
+const URLProtocol ff_cache_protocol = {
.name = "cache",
.url_open2 = cache_open,
.url_read = cache_read,
diff --git a/libavformat/concat.c b/libavformat/concat.c
index 7a8eb1be9e..190f36d43a 100644
--- a/libavformat/concat.c
+++ b/libavformat/concat.c
@@ -186,7 +186,7 @@ static int64_t concat_seek(URLContext *h, int64_t pos, int whence)
return result;
}
-URLProtocol ff_concat_protocol = {
+const URLProtocol ff_concat_protocol = {
.name = "concat",
.url_open = concat_open,
.url_read = concat_read,
diff --git a/libavformat/crypto.c b/libavformat/crypto.c
index b1871fe974..221cb9aa9a 100644
--- a/libavformat/crypto.c
+++ b/libavformat/crypto.c
@@ -284,7 +284,7 @@ static int crypto_close(URLContext *h)
return 0;
}
-URLProtocol ff_crypto_protocol = {
+const URLProtocol ff_crypto_protocol = {
.name = "crypto",
.url_open2 = crypto_open2,
.url_read = crypto_read,
diff --git a/libavformat/data_uri.c b/libavformat/data_uri.c
index 1598b999ae..1863830abe 100644
--- a/libavformat/data_uri.c
+++ b/libavformat/data_uri.c
@@ -109,7 +109,7 @@ static int data_read(URLContext *h, unsigned char *buf, int size)
return size;
}
-URLProtocol ff_data_protocol = {
+const URLProtocol ff_data_protocol = {
.name = "data",
.url_open = data_open,
.url_close = data_close,
diff --git a/libavformat/file.c b/libavformat/file.c
index 4812ad1b17..0c16b49f51 100644
--- a/libavformat/file.c
+++ b/libavformat/file.c
@@ -329,7 +329,7 @@ static int file_close_dir(URLContext *h)
#endif /* HAVE_LSTAT */
}
-URLProtocol ff_file_protocol = {
+const URLProtocol ff_file_protocol = {
.name = "file",
.url_open = file_open,
.url_read = file_read,
@@ -375,7 +375,7 @@ static int pipe_open(URLContext *h, const char *filename, int flags)
return 0;
}
-URLProtocol ff_pipe_protocol = {
+const URLProtocol ff_pipe_protocol = {
.name = "pipe",
.url_open = pipe_open,
.url_read = file_read,
diff --git a/libavformat/ftp.c b/libavformat/ftp.c
index c2a60f6115..50b28e2c2b 100644
--- a/libavformat/ftp.c
+++ b/libavformat/ftp.c
@@ -1099,7 +1099,7 @@ cleanup:
return ret;
}
-URLProtocol ff_ftp_protocol = {
+const URLProtocol ff_ftp_protocol = {
.name = "ftp",
.url_open = ftp_open,
.url_read = ftp_read,
diff --git a/libavformat/gopher.c b/libavformat/gopher.c
index 835ad7f9c1..271c825b3b 100644
--- a/libavformat/gopher.c
+++ b/libavformat/gopher.c
@@ -114,7 +114,7 @@ static int gopher_read(URLContext *h, uint8_t *buf, int size)
}
-URLProtocol ff_gopher_protocol = {
+const URLProtocol ff_gopher_protocol = {
.name = "gopher",
.url_open = gopher_open,
.url_read = gopher_read,
diff --git a/libavformat/hlsproto.c b/libavformat/hlsproto.c
index b8f2f3796b..1f2e63dff2 100644
--- a/libavformat/hlsproto.c
+++ b/libavformat/hlsproto.c
@@ -318,7 +318,7 @@ retry:
goto start;
}
-URLProtocol ff_hls_protocol = {
+const URLProtocol ff_hls_protocol = {
.name = "hls",
.url_open = hls_open,
.url_read = hls_read,
diff --git a/libavformat/http.c b/libavformat/http.c
index d1b91e23d6..a4ce479e34 100644
--- a/libavformat/http.c
+++ b/libavformat/http.c
@@ -1508,7 +1508,7 @@ static const AVClass flavor ## _context_class = { \
#if CONFIG_HTTP_PROTOCOL
HTTP_CLASS(http);
-URLProtocol ff_http_protocol = {
+const URLProtocol ff_http_protocol = {
.name = "http",
.url_open2 = http_open,
.url_accept = http_accept,
@@ -1529,7 +1529,7 @@ URLProtocol ff_http_protocol = {
#if CONFIG_HTTPS_PROTOCOL
HTTP_CLASS(https);
-URLProtocol ff_https_protocol = {
+const URLProtocol ff_https_protocol = {
.name = "https",
.url_open2 = http_open,
.url_read = http_read,
@@ -1644,7 +1644,7 @@ static int http_proxy_write(URLContext *h, const uint8_t *buf, int size)
return ffurl_write(s->hd, buf, size);
}
-URLProtocol ff_httpproxy_protocol = {
+const URLProtocol ff_httpproxy_protocol = {
.name = "httpproxy",
.url_open = http_proxy_open,
.url_read = http_buf_read,
diff --git a/libavformat/icecast.c b/libavformat/icecast.c
index a3b9a36b21..e5f1a95379 100644
--- a/libavformat/icecast.c
+++ b/libavformat/icecast.c
@@ -209,7 +209,7 @@ static const AVClass icecast_context_class = {
.version = LIBAVUTIL_VERSION_INT,
};
-URLProtocol ff_icecast_protocol = {
+const URLProtocol ff_icecast_protocol = {
.name = "icecast",
.url_open = icecast_open,
.url_write = icecast_write,
diff --git a/libavformat/librtmp.c b/libavformat/librtmp.c
index bfa9a718f1..0fea675b38 100644
--- a/libavformat/librtmp.c
+++ b/libavformat/librtmp.c
@@ -337,7 +337,7 @@ static const AVClass lib ## flavor ## _class = {\
};
RTMP_CLASS(rtmp)
-URLProtocol ff_librtmp_protocol = {
+const URLProtocol ff_librtmp_protocol = {
.name = "rtmp",
.url_open = rtmp_open,
.url_read = rtmp_read,
@@ -352,7 +352,7 @@ URLProtocol ff_librtmp_protocol = {
};
RTMP_CLASS(rtmpt)
-URLProtocol ff_librtmpt_protocol = {
+const URLProtocol ff_librtmpt_protocol = {
.name = "rtmpt",
.url_open = rtmp_open,
.url_read = rtmp_read,
@@ -367,7 +367,7 @@ URLProtocol ff_librtmpt_protocol = {
};
RTMP_CLASS(rtmpe)
-URLProtocol ff_librtmpe_protocol = {
+const URLProtocol ff_librtmpe_protocol = {
.name = "rtmpe",
.url_open = rtmp_open,
.url_read = rtmp_read,
@@ -382,7 +382,7 @@ URLProtocol ff_librtmpe_protocol = {
};
RTMP_CLASS(rtmpte)
-URLProtocol ff_librtmpte_protocol = {
+const URLProtocol ff_librtmpte_protocol = {
.name = "rtmpte",
.url_open = rtmp_open,
.url_read = rtmp_read,
@@ -397,7 +397,7 @@ URLProtocol ff_librtmpte_protocol = {
};
RTMP_CLASS(rtmps)
-URLProtocol ff_librtmps_protocol = {
+const URLProtocol ff_librtmps_protocol = {
.name = "rtmps",
.url_open = rtmp_open,
.url_read = rtmp_read,
diff --git a/libavformat/libsmbclient.c b/libavformat/libsmbclient.c
index 84fef7f162..b68cd8bd79 100644
--- a/libavformat/libsmbclient.c
+++ b/libavformat/libsmbclient.c
@@ -365,7 +365,7 @@ static const AVClass libsmbclient_context_class = {
.version = LIBAVUTIL_VERSION_INT,
};
-URLProtocol ff_libsmbclient_protocol = {
+const URLProtocol ff_libsmbclient_protocol = {
.name = "smb",
.url_open = libsmbc_open,
.url_read = libsmbc_read,
diff --git a/libavformat/libssh.c b/libavformat/libssh.c
index 3c056f874a..49e92e7516 100644
--- a/libavformat/libssh.c
+++ b/libavformat/libssh.c
@@ -489,7 +489,7 @@ static const AVClass libssh_context_class = {
.version = LIBAVUTIL_VERSION_INT,
};
-URLProtocol ff_libssh_protocol = {
+const URLProtocol ff_libssh_protocol = {
.name = "sftp",
.url_open = libssh_open,
.url_read = libssh_read,
diff --git a/libavformat/md5proto.c b/libavformat/md5proto.c
index 9a092e4b3c..3d8c2a084e 100644
--- a/libavformat/md5proto.c
+++ b/libavformat/md5proto.c
@@ -87,7 +87,7 @@ static int md5_close(URLContext *h)
}
-URLProtocol ff_md5_protocol = {
+const URLProtocol ff_md5_protocol = {
.name = "md5",
.url_open = md5_open,
.url_write = md5_write,
diff --git a/libavformat/mmsh.c b/libavformat/mmsh.c
index 16f07fec0e..b359da551e 100644
--- a/libavformat/mmsh.c
+++ b/libavformat/mmsh.c
@@ -401,7 +401,7 @@ static int64_t mmsh_seek(URLContext *h, int64_t pos, int whence)
return AVERROR(ENOSYS);
}
-URLProtocol ff_mmsh_protocol = {
+const URLProtocol ff_mmsh_protocol = {
.name = "mmsh",
.url_open = mmsh_open,
.url_read = mmsh_read,
diff --git a/libavformat/mmst.c b/libavformat/mmst.c
index 21cf2a6d43..b168903378 100644
--- a/libavformat/mmst.c
+++ b/libavformat/mmst.c
@@ -629,7 +629,7 @@ static int mms_read(URLContext *h, uint8_t *buf, int size)
return result;
}
-URLProtocol ff_mmst_protocol = {
+const URLProtocol ff_mmst_protocol = {
.name = "mmst",
.url_open = mms_open,
.url_read = mms_read,
diff --git a/libavformat/protocols.c b/libavformat/protocols.c
new file mode 100644
index 0000000000..269a63b507
--- /dev/null
+++ b/libavformat/protocols.c
@@ -0,0 +1,208 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+
+#include "url.h"
+
+extern const URLProtocol ff_async_protocol;
+extern const URLProtocol ff_bluray_protocol;
+extern const URLProtocol ff_cache_protocol;
+extern const URLProtocol ff_concat_protocol;
+extern const URLProtocol ff_crypto_protocol;
+extern const URLProtocol ff_data_protocol;
+extern const URLProtocol ff_ffrtmpcrypt_protocol;
+extern const URLProtocol ff_ffrtmphttp_protocol;
+extern const URLProtocol ff_file_protocol;
+extern const URLProtocol ff_ftp_protocol;
+extern const URLProtocol ff_gopher_protocol;
+extern const URLProtocol ff_hls_protocol;
+extern const URLProtocol ff_http_protocol;
+extern const URLProtocol ff_httpproxy_protocol;
+extern const URLProtocol ff_https_protocol;
+extern const URLProtocol ff_icecast_protocol;
+extern const URLProtocol ff_mmsh_protocol;
+extern const URLProtocol ff_mmst_protocol;
+extern const URLProtocol ff_md5_protocol;
+extern const URLProtocol ff_pipe_protocol;
+extern const URLProtocol ff_rtmp_protocol;
+extern const URLProtocol ff_rtmpe_protocol;
+extern const URLProtocol ff_rtmps_protocol;
+extern const URLProtocol ff_rtmpt_protocol;
+extern const URLProtocol ff_rtmpte_protocol;
+extern const URLProtocol ff_rtmpts_protocol;
+extern const URLProtocol ff_rtp_protocol;
+extern const URLProtocol ff_sctp_protocol;
+extern const URLProtocol ff_srtp_protocol;
+extern const URLProtocol ff_subfile_protocol;
+extern const URLProtocol ff_tcp_protocol;
+extern const URLProtocol ff_tls_gnutls_protocol;
+extern const URLProtocol ff_tls_schannel_protocol;
+extern const URLProtocol ff_tls_securetransport_protocol;
+extern const URLProtocol ff_tls_openssl_protocol;
+extern const URLProtocol ff_udp_protocol;
+extern const URLProtocol ff_udplite_protocol;
+extern const URLProtocol ff_unix_protocol;
+extern const URLProtocol ff_librtmp_protocol;
+extern const URLProtocol ff_librtmpe_protocol;
+extern const URLProtocol ff_librtmps_protocol;
+extern const URLProtocol ff_librtmpt_protocol;
+extern const URLProtocol ff_librtmpte_protocol;
+extern const URLProtocol ff_libssh_protocol;
+extern const URLProtocol ff_libsmbclient_protocol;
+
+const URLProtocol *ff_url_protocols[] = {
+#if CONFIG_ASYNC_PROTOCOL
+ &ff_async_protocol,
+#endif
+#if CONFIG_BLURAY_PROTOCOL
+ &ff_bluray_protocol,
+#endif
+#if CONFIG_CACHE_PROTOCOL
+ &ff_cache_protocol,
+#endif
+#if CONFIG_CONCAT_PROTOCOL
+ &ff_concat_protocol,
+#endif
+#if CONFIG_CRYPTO_PROTOCOL
+ &ff_crypto_protocol,
+#endif
+#if CONFIG_DATA_PROTOCOL
+ &ff_data_protocol,
+#endif
+#if CONFIG_FFRTMPCRYPT_PROTOCOL
+ &ff_ffrtmpcrypt_protocol,
+#endif
+#if CONFIG_FFRTMPHTTP_PROTOCOL
+ &ff_ffrtmphttp_protocol,
+#endif
+#if CONFIG_FILE_PROTOCOL
+ &ff_file_protocol,
+#endif
+#if CONFIG_FTP_PROTOCOL
+ &ff_ftp_protocol,
+#endif
+#if CONFIG_GOPHER_PROTOCOL
+ &ff_gopher_protocol,
+#endif
+#if CONFIG_HLS_PROTOCOL
+ &ff_hls_protocol,
+#endif
+#if CONFIG_HTTP_PROTOCOL
+ &ff_http_protocol,
+#endif
+#if CONFIG_HTTPPROXY_PROTOCOL
+ &ff_httpproxy_protocol,
+#endif
+#if CONFIG_HTTPS_PROTOCOL
+ &ff_https_protocol,
+#endif
+#if CONFIG_ICECAST_PROTOCOL
+ &ff_icecast_protocol,
+#endif
+#if CONFIG_MMSH_PROTOCOL
+ &ff_mmsh_protocol,
+#endif
+#if CONFIG_MMST_PROTOCOL
+ &ff_mmst_protocol,
+#endif
+#if CONFIG_MD5_PROTOCOL
+ &ff_md5_protocol,
+#endif
+#if CONFIG_PIPE_PROTOCOL
+ &ff_pipe_protocol,
+#endif
+#if CONFIG_RTMP_PROTOCOL
+ &ff_rtmp_protocol,
+#endif
+#if CONFIG_RTMPE_PROTOCOL
+ &ff_rtmpe_protocol,
+#endif
+#if CONFIG_RTMPS_PROTOCOL
+ &ff_rtmps_protocol,
+#endif
+#if CONFIG_RTMPT_PROTOCOL
+ &ff_rtmpt_protocol,
+#endif
+#if CONFIG_RTMPTE_PROTOCOL
+ &ff_rtmpte_protocol,
+#endif
+#if CONFIG_RTMPTS_PROTOCOL
+ &ff_rtmpts_protocol,
+#endif
+#if CONFIG_RTP_PROTOCOL
+ &ff_rtp_protocol,
+#endif
+#if CONFIG_SCTP_PROTOCOL
+ &ff_sctp_protocol,
+#endif
+#if CONFIG_SRTP_PROTOCOL
+ &ff_srtp_protocol,
+#endif
+#if CONFIG_SUBFILE_PROTOCOL
+ &ff_subfile_protocol,
+#endif
+#if CONFIG_TCP_PROTOCOL
+ &ff_tcp_protocol,
+#endif
+#if CONFIG_TLS_GNUTLS_PROTOCOL
+ &ff_tls_gnutls_protocol,
+#endif
+#if CONFIG_TLS_SCHANNEL_PROTOCOL
+ &ff_tls_schannel_protocol,
+#endif
+#if CONFIG_TLS_SECURETRANSPORT_PROTOCOL
+ &ff_tls_securetransport_protocol,
+#endif
+#if CONFIG_TLS_OPENSSL_PROTOCOL
+ &ff_tls_openssl_protocol,
+#endif
+#if CONFIG_UDP_PROTOCOL
+ &ff_udp_protocol,
+#endif
+#if CONFIG_UDPLITE_PROTOCOL
+ &ff_udplite_protocol,
+#endif
+#if CONFIG_UNIX_PROTOCOL
+ &ff_unix_protocol,
+#endif
+
+ /* external libraries */
+#if CONFIG_LIBRTMP_PROTOCOL
+ &ff_librtmp_protocol,
+#endif
+#if CONFIG_LIBRTMPE_PROTOCOL
+ &ff_librtmpe_protocol,
+#endif
+#if CONFIG_LIBRTMPS_PROTOCOL
+ &ff_librtmps_protocol,
+#endif
+#if CONFIG_LIBRTMPT_PROTOCOL
+ &ff_librtmpt_protocol,
+#endif
+#if CONFIG_LIBRTMPTE_PROTOCOL
+ &ff_librtmpte_protocol,
+#endif
+#if CONFIG_LIBSSH_PROTOCOL
+ &ff_libssh_protocol,
+#endif
+#if CONFIG_LIBSMBCLIENT_PROTOCOL
+ &ff_libsmbclient_protocol,
+#endif
+ NULL,
+};
diff --git a/libavformat/rtmpcrypt.c b/libavformat/rtmpcrypt.c
index 811c74cdfa..77ca2d154f 100644
--- a/libavformat/rtmpcrypt.c
+++ b/libavformat/rtmpcrypt.c
@@ -325,7 +325,7 @@ static const AVClass ffrtmpcrypt_class = {
.version = LIBAVUTIL_VERSION_INT,
};
-URLProtocol ff_ffrtmpcrypt_protocol = {
+const URLProtocol ff_ffrtmpcrypt_protocol = {
.name = "ffrtmpcrypt",
.url_open = rtmpe_open,
.url_read = rtmpe_read,
diff --git a/libavformat/rtmphttp.c b/libavformat/rtmphttp.c
index 8ed5eb1963..2f78b155ba 100644
--- a/libavformat/rtmphttp.c
+++ b/libavformat/rtmphttp.c
@@ -265,7 +265,7 @@ static const AVClass ffrtmphttp_class = {
.version = LIBAVUTIL_VERSION_INT,
};
-URLProtocol ff_ffrtmphttp_protocol = {
+const URLProtocol ff_ffrtmphttp_protocol = {
.name = "ffrtmphttp",
.url_open = rtmp_http_open,
.url_read = rtmp_http_read,
diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c
index a5485ab9e8..ee8c8a6faa 100644
--- a/libavformat/rtmpproto.c
+++ b/libavformat/rtmpproto.c
@@ -3110,7 +3110,7 @@ static const AVClass flavor##_class = { \
.version = LIBAVUTIL_VERSION_INT, \
}; \
\
-URLProtocol ff_##flavor##_protocol = { \
+const URLProtocol ff_##flavor##_protocol = { \
.name = #flavor, \
.url_open = rtmp_open, \
.url_read = rtmp_read, \
diff --git a/libavformat/rtpproto.c b/libavformat/rtpproto.c
index 538a7b24ea..a35ff5f216 100644
--- a/libavformat/rtpproto.c
+++ b/libavformat/rtpproto.c
@@ -605,7 +605,7 @@ static int rtp_get_multi_file_handle(URLContext *h, int **handles,
return 0;
}
-URLProtocol ff_rtp_protocol = {
+const URLProtocol ff_rtp_protocol = {
.name = "rtp",
.url_open = rtp_open,
.url_read = rtp_read,
diff --git a/libavformat/sctp.c b/libavformat/sctp.c
index 5fee7e3b89..9a80e9b015 100644
--- a/libavformat/sctp.c
+++ b/libavformat/sctp.c
@@ -359,7 +359,7 @@ static int sctp_get_file_handle(URLContext *h)
return s->fd;
}
-URLProtocol ff_sctp_protocol = {
+const URLProtocol ff_sctp_protocol = {
.name = "sctp",
.url_open = sctp_open,
.url_read = sctp_read,
diff --git a/libavformat/srtpproto.c b/libavformat/srtpproto.c
index 460799ae15..470f87bc37 100644
--- a/libavformat/srtpproto.c
+++ b/libavformat/srtpproto.c
@@ -132,7 +132,7 @@ static int srtp_get_multi_file_handle(URLContext *h, int **handles,
return ffurl_get_multi_file_handle(s->rtp_hd, handles, numhandles);
}
-URLProtocol ff_srtp_protocol = {
+const URLProtocol ff_srtp_protocol = {
.name = "srtp",
.url_open = srtp_open,
.url_read = srtp_read,
diff --git a/libavformat/subfile.c b/libavformat/subfile.c
index 2b53438caf..8a3c167d74 100644
--- a/libavformat/subfile.c
+++ b/libavformat/subfile.c
@@ -137,7 +137,7 @@ static int64_t subfile_seek(URLContext *h, int64_t pos, int whence)
return c->pos - c->start;
}
-URLProtocol ff_subfile_protocol = {
+const URLProtocol ff_subfile_protocol = {
.name = "subfile",
.url_open2 = subfile_open,
.url_read = subfile_read,
diff --git a/libavformat/tcp.c b/libavformat/tcp.c
index 5738690843..c1054799c4 100644
--- a/libavformat/tcp.c
+++ b/libavformat/tcp.c
@@ -255,7 +255,7 @@ static int tcp_get_file_handle(URLContext *h)
return s->fd;
}
-URLProtocol ff_tcp_protocol = {
+const URLProtocol ff_tcp_protocol = {
.name = "tcp",
.url_open = tcp_open,
.url_accept = tcp_accept,
diff --git a/libavformat/tls_gnutls.c b/libavformat/tls_gnutls.c
index 4bf9448534..991b36b95f 100644
--- a/libavformat/tls_gnutls.c
+++ b/libavformat/tls_gnutls.c
@@ -247,7 +247,7 @@ static const AVClass tls_class = {
.version = LIBAVUTIL_VERSION_INT,
};
-URLProtocol ff_tls_gnutls_protocol = {
+const URLProtocol ff_tls_gnutls_protocol = {
.name = "tls",
.url_open2 = tls_open,
.url_read = tls_read,
diff --git a/libavformat/tls_openssl.c b/libavformat/tls_openssl.c
index 636d4ee910..46eb3e68c7 100644
--- a/libavformat/tls_openssl.c
+++ b/libavformat/tls_openssl.c
@@ -295,7 +295,7 @@ static const AVClass tls_class = {
.version = LIBAVUTIL_VERSION_INT,
};
-URLProtocol ff_tls_openssl_protocol = {
+const URLProtocol ff_tls_openssl_protocol = {
.name = "tls",
.url_open2 = tls_open,
.url_read = tls_read,
diff --git a/libavformat/tls_schannel.c b/libavformat/tls_schannel.c
index 85c01a0d64..c11b7d42cf 100644
--- a/libavformat/tls_schannel.c
+++ b/libavformat/tls_schannel.c
@@ -589,7 +589,7 @@ static const AVClass tls_class = {
.version = LIBAVUTIL_VERSION_INT,
};
-URLProtocol ff_tls_schannel_protocol = {
+const URLProtocol ff_tls_schannel_protocol = {
.name = "tls",
.url_open2 = tls_open,
.url_read = tls_read,
diff --git a/libavformat/tls_securetransport.c b/libavformat/tls_securetransport.c
index 482771a926..a26b9694cd 100644
--- a/libavformat/tls_securetransport.c
+++ b/libavformat/tls_securetransport.c
@@ -387,7 +387,7 @@ static const AVClass tls_class = {
.version = LIBAVUTIL_VERSION_INT,
};
-URLProtocol ff_tls_securetransport_protocol = {
+const URLProtocol ff_tls_securetransport_protocol = {
.name = "tls",
.url_open2 = tls_open,
.url_read = tls_read,
diff --git a/libavformat/udp.c b/libavformat/udp.c
index ea80e52210..e42b911c42 100644
--- a/libavformat/udp.c
+++ b/libavformat/udp.c
@@ -983,7 +983,7 @@ static int udp_close(URLContext *h)
return 0;
}
-URLProtocol ff_udp_protocol = {
+const URLProtocol ff_udp_protocol = {
.name = "udp",
.url_open = udp_open,
.url_read = udp_read,
@@ -995,7 +995,7 @@ URLProtocol ff_udp_protocol = {
.flags = URL_PROTOCOL_FLAG_NETWORK,
};
-URLProtocol ff_udplite_protocol = {
+const URLProtocol ff_udplite_protocol = {
.name = "udplite",
.url_open = udplite_open,
.url_read = udp_read,
diff --git a/libavformat/unix.c b/libavformat/unix.c
index 6375be15b6..70d00ef47b 100644
--- a/libavformat/unix.c
+++ b/libavformat/unix.c
@@ -140,7 +140,7 @@ static int unix_get_file_handle(URLContext *h)
return s->fd;
}
-URLProtocol ff_unix_protocol = {
+const URLProtocol ff_unix_protocol = {
.name = "unix",
.url_open = unix_open,
.url_read = unix_read,
diff --git a/libavformat/url.h b/libavformat/url.h
index 5948df684f..085c24c628 100644
--- a/libavformat/url.h
+++ b/libavformat/url.h
@@ -37,7 +37,7 @@ extern const AVClass ffurl_context_class;
typedef struct URLContext {
const AVClass *av_class; /**< information for av_log(). Set by url_open(). */
- struct URLProtocol *prot;
+ const struct URLProtocol *prot;
void *priv_data;
char *filename; /**< specified URL */
int flags;
@@ -77,7 +77,6 @@ typedef struct URLProtocol {
int (*url_write)(URLContext *h, const unsigned char *buf, int size);
int64_t (*url_seek)( URLContext *h, int64_t pos, int whence);
int (*url_close)(URLContext *h);
- struct URLProtocol *next;
int (*url_read_pause)(URLContext *h, int pause);
int64_t (*url_read_seek)(URLContext *h, int stream_index,
int64_t timestamp, int flags);
@@ -258,23 +257,11 @@ int ffurl_get_multi_file_handle(URLContext *h, int **handles, int *numhandles);
int ffurl_shutdown(URLContext *h, int flags);
/**
- * Register the URLProtocol protocol.
- */
-int ffurl_register_protocol(URLProtocol *protocol);
-
-/**
* Check if the user has requested to interrup a blocking function
* associated with cb.
*/
int ff_check_interrupt(AVIOInterruptCB *cb);
-/**
- * Iterate over all available protocols.
- *
- * @param prev result of the previous call to this functions or NULL.
- */
-URLProtocol *ffurl_protocol_next(const URLProtocol *prev);
-
/* udp.c */
int ff_udp_set_remote_url(URLContext *h, const char *uri);
int ff_udp_get_local_port(URLContext *h);
@@ -322,5 +309,6 @@ void ff_make_absolute_url(char *buf, int size, const char *base,
*/
AVIODirEntry *ff_alloc_dir_entry(void);
+extern const URLProtocol *ff_url_protocols[];
#endif /* AVFORMAT_URL_H */
diff --git a/tests/fate/libavformat.mak b/tests/fate/libavformat.mak
index 1d6aa863b6..965011d0b9 100644
--- a/tests/fate/libavformat.mak
+++ b/tests/fate/libavformat.mak
@@ -1,6 +1,6 @@
-FATE_LIBAVFORMAT-$(HAVE_PTHREADS) += fate-async
-fate-async: libavformat/async-test$(EXESUF)
-fate-async: CMD = run libavformat/async-test
+#FATE_LIBAVFORMAT-$(HAVE_PTHREADS) += fate-async
+#fate-async: libavformat/async-test$(EXESUF)
+#fate-async: CMD = run libavformat/async-test
FATE_LIBAVFORMAT-$(CONFIG_NETWORK) += fate-noproxy
fate-noproxy: libavformat/noproxy-test$(EXESUF)