Merge commit '832a202c47a246ed15e3edc6b05dfcfa7d82c4b2'
authorDerek Buitenhuis <derek.buitenhuis@gmail.com>
Mon, 29 Feb 2016 18:07:41 +0000 (18:07 +0000)
committerDerek Buitenhuis <derek.buitenhuis@gmail.com>
Mon, 29 Feb 2016 18:08:15 +0000 (18:08 +0000)
* commit '832a202c47a246ed15e3edc6b05dfcfa7d82c4b2':
  protocols: make the list of protocols static

Merged-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
1  2 
libavformat/avio.c
libavformat/protocols.c
libavformat/url.h

@@@ -236,9 -135,10 +236,10 @@@ int ffurl_handshake(URLContext *c
      "ABCDEFGHIJKLMNOPQRSTUVWXYZ"                \
      "0123456789+-."
  
 -int ffurl_alloc(URLContext **puc, const char *filename, int flags,
 -                const AVIOInterruptCB *int_cb)
 +static const struct URLProtocol *url_find_protocol(const char *filename)
  {
 +    const URLProtocol *up;
+     const URLProtocol **protocols;
      char proto_str[128], proto_nested[128], *ptr;
      size_t proto_len = strspn(filename, URL_SCHEME_CHARS);
      int i;
      if ((ptr = strchr(proto_nested, '+')))
          *ptr = '\0';
  
-     for (i = 0; ff_url_protocols[i]; i++) {
-         up = ff_url_protocols[i];
+     protocols = ffurl_get_protocols(NULL, NULL);
+     for (i = 0; protocols[i]; i++) {
 -        const URLProtocol *up = protocols[i];
 -        if (!strcmp(proto_str, up->name)) {
 -            av_freep(&protocols);
 -            return url_alloc_for_protocol(puc, up, filename, flags, int_cb);
 -        }
++        up = protocols[i];
 +        if (!strcmp(proto_str, up->name))
 +            break;
          if (up->flags & URL_PROTOCOL_FLAG_NESTED_SCHEME &&
 -            !strcmp(proto_nested, up->name)) {
 -            av_freep(&protocols);
 -            return url_alloc_for_protocol(puc, up, filename, flags, int_cb);
 -        }
 +            !strcmp(proto_nested, up->name))
 +            break;
      }
++    av_freep(&protocols);
 +
 +    return up;
 +}
 +
 +int ffurl_alloc(URLContext **puc, const char *filename, int flags,
 +                const AVIOInterruptCB *int_cb)
 +{
 +    const URLProtocol *p = NULL;
 +
 +    p = url_find_protocol(filename);
 +    if (p)
 +       return url_alloc_for_protocol(puc, p, filename, flags, int_cb);
 +
      *puc = NULL;
 +    if (av_strstart(filename, "https:", NULL))
 +        av_log(NULL, AV_LOG_WARNING, "https protocol not found, recompile FFmpeg with "
 +                                     "openssl, gnutls,\n"
 +                                     "or securetransport enabled.\n");
      return AVERROR_PROTOCOL_NOT_FOUND;
  }
  
  
  #include "config.h"
  
+ #include "libavutil/avstring.h"
+ #include "libavutil/mem.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;
@@@ -63,19 -57,8 +66,19 @@@ extern const URLProtocol ff_librtmpe_pr
  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[] = {
+ static const URLProtocol *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
@@@ -302,15 -264,22 +302,29 @@@ int ff_url_join(char *str, int size, co
  void ff_make_absolute_url(char *buf, int size, const char *base,
                            const char *rel);
  
 +/**
 + * Allocate directory entry with default values.
 + *
 + * @return entry or NULL on error
 + */
 +AVIODirEntry *ff_alloc_dir_entry(void);
 +
  const AVClass *ff_urlcontext_child_class_next(const AVClass *prev);
  
- extern const URLProtocol *ff_url_protocols[];
+ /**
+  * Construct a list of protocols matching a given whitelist and/or blacklist.
+  *
+  * @param whitelist a comma-separated list of allowed protocol names or NULL. If
+  *                  this is a non-empty string, only protocols in this list will
+  *                  be included.
+  * @param blacklist a comma-separated list of forbidden protocol names or NULL.
+  *                  If this is a non-empty string, all protocols in this list
+  *                  will be excluded.
+  *
+  * @return a NULL-terminated array of matching protocols. The array must be
+  * freed by the caller.
+  */
+ const URLProtocol **ffurl_get_protocols(const char *whitelist,
+                                         const char *blacklist);
  
  #endif /* AVFORMAT_URL_H */