Commit 163a3113 authored by Anton Khirnov's avatar Anton Khirnov

avio: add and use ffurl_protocol_next().

parent 6ef350c1
...@@ -30,6 +30,13 @@ ...@@ -30,6 +30,13 @@
#endif #endif
#include "url.h" #include "url.h"
static URLProtocol *first_protocol = NULL;
URLProtocol *ffurl_protocol_next(URLProtocol *prev)
{
return prev ? prev->next : first_protocol;
}
/** @name Logging context. */ /** @name Logging context. */
/*@{*/ /*@{*/
static const char *urlcontext_to_name(void *ptr) static const char *urlcontext_to_name(void *ptr)
...@@ -49,21 +56,19 @@ static const AVClass urlcontext_class = { ...@@ -49,21 +56,19 @@ static const AVClass urlcontext_class = {
static int default_interrupt_cb(void); static int default_interrupt_cb(void);
URLProtocol *first_protocol = NULL;
int (*url_interrupt_cb)(void) = default_interrupt_cb; int (*url_interrupt_cb)(void) = default_interrupt_cb;
#if FF_API_OLD_AVIO #if FF_API_OLD_AVIO
URLProtocol *av_protocol_next(URLProtocol *p) URLProtocol *av_protocol_next(URLProtocol *p)
{ {
if(p) return p->next; return ffurl_protocol_next(p);
else return first_protocol;
} }
#endif #endif
const char *avio_enum_protocols(void **opaque, int output) const char *avio_enum_protocols(void **opaque, int output)
{ {
URLProtocol **p = opaque; URLProtocol **p = opaque;
*p = *p ? (*p)->next : first_protocol; *p = ffurl_protocol_next(*p);
if (!*p) return NULL; if (!*p) return NULL;
if ((output && (*p)->url_write) || (!output && (*p)->url_read)) if ((output && (*p)->url_write) || (!output && (*p)->url_read))
return (*p)->name; return (*p)->name;
...@@ -225,7 +230,7 @@ int av_register_protocol2(URLProtocol *protocol, int size) ...@@ -225,7 +230,7 @@ int av_register_protocol2(URLProtocol *protocol, int size)
int ffurl_alloc(URLContext **puc, const char *filename, int flags, int ffurl_alloc(URLContext **puc, const char *filename, int flags,
const AVIOInterruptCB *int_cb) const AVIOInterruptCB *int_cb)
{ {
URLProtocol *up; URLProtocol *up = NULL;
char proto_str[128], proto_nested[128], *ptr; char proto_str[128], proto_nested[128], *ptr;
size_t proto_len = strspn(filename, URL_SCHEME_CHARS); size_t proto_len = strspn(filename, URL_SCHEME_CHARS);
...@@ -238,14 +243,12 @@ int ffurl_alloc(URLContext **puc, const char *filename, int flags, ...@@ -238,14 +243,12 @@ int ffurl_alloc(URLContext **puc, const char *filename, int flags,
if ((ptr = strchr(proto_nested, '+'))) if ((ptr = strchr(proto_nested, '+')))
*ptr = '\0'; *ptr = '\0';
up = first_protocol; while (up = ffurl_protocol_next(up)) {
while (up != NULL) {
if (!strcmp(proto_str, up->name)) if (!strcmp(proto_str, up->name))
return url_alloc_for_protocol (puc, up, filename, flags, int_cb); return url_alloc_for_protocol (puc, up, filename, flags, int_cb);
if (up->flags & URL_PROTOCOL_FLAG_NESTED_SCHEME && if (up->flags & URL_PROTOCOL_FLAG_NESTED_SCHEME &&
!strcmp(proto_nested, up->name)) !strcmp(proto_nested, up->name))
return url_alloc_for_protocol (puc, up, filename, flags, int_cb); return url_alloc_for_protocol (puc, up, filename, flags, int_cb);
up = up->next;
} }
*puc = NULL; *puc = NULL;
return AVERROR(ENOENT); return AVERROR(ENOENT);
......
...@@ -182,6 +182,13 @@ int ffurl_register_protocol(URLProtocol *protocol, int size); ...@@ -182,6 +182,13 @@ int ffurl_register_protocol(URLProtocol *protocol, int size);
*/ */
int ff_check_interrupt(AVIOInterruptCB *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(URLProtocol *prev);
/* udp.c */ /* udp.c */
int ff_udp_set_remote_url(URLContext *h, const char *uri); int ff_udp_set_remote_url(URLContext *h, const char *uri);
int ff_udp_get_local_port(URLContext *h); int ff_udp_get_local_port(URLContext *h);
......
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