[FFmpeg-devel,1/2] avformat/url.h add av_find_protocol_by_name for find URLProtocol by name

Submitted by Steven Liu on Nov. 22, 2019, 8:56 a.m.

Details

Message ID 20191122085620.14296-1-lq@chinaffmpeg.org
State New
Headers show

Commit Message

Steven Liu Nov. 22, 2019, 8:56 a.m.
Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
---
 doc/APIchanges          |  3 +++
 libavformat/protocols.c | 16 ++++++++++++++++
 libavformat/url.h       |  9 +++++++++
 libavformat/version.h   |  2 +-
 4 files changed, 29 insertions(+), 1 deletion(-)

Comments

Andreas Rheinhardt Nov. 22, 2019, 9:05 a.m.
Steven Liu:
> Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
> ---
>  doc/APIchanges          |  3 +++
>  libavformat/protocols.c | 16 ++++++++++++++++
>  libavformat/url.h       |  9 +++++++++
>  libavformat/version.h   |  2 +-
>  4 files changed, 29 insertions(+), 1 deletion(-)
> 
> diff --git a/doc/APIchanges b/doc/APIchanges
> index 401c65a753..804a57de41 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -15,6 +15,9 @@ libavutil:     2017-10-21
>  
>  API changes, most recent first:
>  
> +2019-11-22 - xxxxxxxxxx - lavf 58.35.101 - url.h
> +  Add av_find_protocol_by_name().
> +
>  2019-11-17 - 1c23abc88f - lavu 56.36.100 - eval API
>    Add av_expr_count_vars().
>  
> diff --git a/libavformat/protocols.c b/libavformat/protocols.c
> index face5b29b5..d4dee23a8e 100644
> --- a/libavformat/protocols.c
> +++ b/libavformat/protocols.c
> @@ -107,6 +107,22 @@ const char *avio_enum_protocols(void **opaque, int output)
>      return avio_enum_protocols(opaque, output);
>  }
>  
> +const URLProtocol *av_find_protocol_by_name(const char *name)
> +{
> +    int i = 0;
> +    const URLProtocol **protocols;
> +    protocols = ffurl_get_protocols(NULL, NULL);

You should not call ffurl_get_protocols as you don't use its
functionality (namely filtering out unwanted protocols). Instead you
should simply directly search the list yourself. This way you won't
have to free anything.

- Andreas
Zhao Zhili Nov. 22, 2019, 9:16 a.m.
> On Nov 22, 2019, at 4:56 PM, Steven Liu <lq@chinaffmpeg.org> wrote:
> 
> Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
> ---
> doc/APIchanges          |  3 +++
> libavformat/protocols.c | 16 ++++++++++++++++
> libavformat/url.h       |  9 +++++++++
> libavformat/version.h   |  2 +-
> 4 files changed, 29 insertions(+), 1 deletion(-)
> 
> diff --git a/doc/APIchanges b/doc/APIchanges
> index 401c65a753..804a57de41 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -15,6 +15,9 @@ libavutil:     2017-10-21
> 
> API changes, most recent first:
> 
> +2019-11-22 - xxxxxxxxxx - lavf 58.35.101 - url.h
> +  Add av_find_protocol_by_name().
> +
> 2019-11-17 - 1c23abc88f - lavu 56.36.100 - eval API
>   Add av_expr_count_vars().
> 
> diff --git a/libavformat/protocols.c b/libavformat/protocols.c
> index face5b29b5..d4dee23a8e 100644
> --- a/libavformat/protocols.c
> +++ b/libavformat/protocols.c
> @@ -107,6 +107,22 @@ const char *avio_enum_protocols(void **opaque, int output)
>     return avio_enum_protocols(opaque, output);
> }
> 
> +const URLProtocol *av_find_protocol_by_name(const char *name)
> +{
> +    int i = 0;
> +    const URLProtocol **protocols;
> +    protocols = ffurl_get_protocols(NULL, NULL);
> +    for (i = 0; protocols[i]; i++) {
> +        const URLProtocol *proto = protocols[i];
> +        if (!strcmp(proto->name, name)) {
> +            av_freep(&protocols);
> +            return proto;
> +        }
> +    }
> +    av_freep(&protocols);
> +    return NULL;
> +}
> +

No null pointer check on ‘name’. And I prefer av_free() is this case.

> const URLProtocol **ffurl_get_protocols(const char *whitelist,
>                                         const char *blacklist)
> {
> diff --git a/libavformat/url.h b/libavformat/url.h
> index 4750bfff82..fe0aa10b27 100644
> --- a/libavformat/url.h
> +++ b/libavformat/url.h
> @@ -322,6 +322,15 @@ void ff_make_absolute_url(char *buf, int size, const char *base,
>  */
> AVIODirEntry *ff_alloc_dir_entry(void);
> 
> +/**
> + * Return the URLProtocol of the protocol that will handle the passed name.
> + *
> + * NULL is returned if no protocol could be found for the name.
> + *
> + * @return URLProtocol of the protocol or NULL.
> + */
> +const URLProtocol *av_find_protocol_by_name(const char *name);
> +
> const AVClass *ff_urlcontext_child_class_next(const AVClass *prev);
> 
> /**
> diff --git a/libavformat/version.h b/libavformat/version.h
> index bac54aed9d..213b66b45f 100644
> --- a/libavformat/version.h
> +++ b/libavformat/version.h
> @@ -33,7 +33,7 @@
> // Also please add any ticket numbers that you believe might be affected here
> #define LIBAVFORMAT_VERSION_MAJOR  58
> #define LIBAVFORMAT_VERSION_MINOR  35
> -#define LIBAVFORMAT_VERSION_MICRO 100
> +#define LIBAVFORMAT_VERSION_MICRO 101
> 
> #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
>                                                LIBAVFORMAT_VERSION_MINOR, \
> -- 
> 2.15.1
> 
> 
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Andreas Rheinhardt Nov. 22, 2019, 9:22 a.m.
Steven Liu:
> diff --git a/libavformat/url.h b/libavformat/url.h
> index 4750bfff82..fe0aa10b27 100644
> --- a/libavformat/url.h
> +++ b/libavformat/url.h
> @@ -322,6 +322,15 @@ void ff_make_absolute_url(char *buf, int size, const char *base,
>   */
>  AVIODirEntry *ff_alloc_dir_entry(void);
>  
> +/**
> + * Return the URLProtocol of the protocol that will handle the passed name.
> + *
> + * NULL is returned if no protocol could be found for the name.
> + *
> + * @return URLProtocol of the protocol or NULL.
> + */
> +const URLProtocol *av_find_protocol_by_name(const char *name);
> +
>  const AVClass *ff_urlcontext_child_class_next(const AVClass *prev);
>  
>  /**

And url.h is not a public header and therefore the wrong place for
this; it should be avio.h (which already contains avio_enum_protocols).

- Andreas
Nicolas George Nov. 22, 2019, 11:10 a.m.
Steven Liu (12019-11-22):
> Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
> ---
>  doc/APIchanges          |  3 +++
>  libavformat/protocols.c | 16 ++++++++++++++++
>  libavformat/url.h       |  9 +++++++++
>  libavformat/version.h   |  2 +-
>  4 files changed, 29 insertions(+), 1 deletion(-)
> 
> diff --git a/doc/APIchanges b/doc/APIchanges
> index 401c65a753..804a57de41 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -15,6 +15,9 @@ libavutil:     2017-10-21
>  
>  API changes, most recent first:
>  
> +2019-11-22 - xxxxxxxxxx - lavf 58.35.101 - url.h
> +  Add av_find_protocol_by_name().
> +
>  2019-11-17 - 1c23abc88f - lavu 56.36.100 - eval API
>    Add av_expr_count_vars().
>  
> diff --git a/libavformat/protocols.c b/libavformat/protocols.c
> index face5b29b5..d4dee23a8e 100644
> --- a/libavformat/protocols.c
> +++ b/libavformat/protocols.c
> @@ -107,6 +107,22 @@ const char *avio_enum_protocols(void **opaque, int output)
>      return avio_enum_protocols(opaque, output);
>  }
>  
> +const URLProtocol *av_find_protocol_by_name(const char *name)
> +{
> +    int i = 0;
> +    const URLProtocol **protocols;
> +    protocols = ffurl_get_protocols(NULL, NULL);
> +    for (i = 0; protocols[i]; i++) {
> +        const URLProtocol *proto = protocols[i];
> +        if (!strcmp(proto->name, name)) {
> +            av_freep(&protocols);
> +            return proto;
> +        }
> +    }
> +    av_freep(&protocols);
> +    return NULL;
> +}
> +
>  const URLProtocol **ffurl_get_protocols(const char *whitelist,
>                                          const char *blacklist)
>  {
> diff --git a/libavformat/url.h b/libavformat/url.h
> index 4750bfff82..fe0aa10b27 100644
> --- a/libavformat/url.h
> +++ b/libavformat/url.h
> @@ -322,6 +322,15 @@ void ff_make_absolute_url(char *buf, int size, const char *base,
>   */
>  AVIODirEntry *ff_alloc_dir_entry(void);
>  
> +/**
> + * Return the URLProtocol of the protocol that will handle the passed name.
> + *
> + * NULL is returned if no protocol could be found for the name.
> + *
> + * @return URLProtocol of the protocol or NULL.
> + */

> +const URLProtocol *av_find_protocol_by_name(const char *name);

URLProtocol is not AVURLProtocol, that means it was decided that this
structure was private.

You can try to change that decision, but there are steps to do that,
including renaming the structure in the AV namespace. But is it
necessary?

> +
>  const AVClass *ff_urlcontext_child_class_next(const AVClass *prev);
>  
>  /**
> diff --git a/libavformat/version.h b/libavformat/version.h
> index bac54aed9d..213b66b45f 100644
> --- a/libavformat/version.h
> +++ b/libavformat/version.h
> @@ -33,7 +33,7 @@
>  // Also please add any ticket numbers that you believe might be affected here
>  #define LIBAVFORMAT_VERSION_MAJOR  58
>  #define LIBAVFORMAT_VERSION_MINOR  35

> -#define LIBAVFORMAT_VERSION_MICRO 100
> +#define LIBAVFORMAT_VERSION_MICRO 101

I think adding a public function requires minor bump.

>  
>  #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
>                                                 LIBAVFORMAT_VERSION_MINOR, \

Regards,

Patch hide | download patch | download mbox

diff --git a/doc/APIchanges b/doc/APIchanges
index 401c65a753..804a57de41 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -15,6 +15,9 @@  libavutil:     2017-10-21
 
 API changes, most recent first:
 
+2019-11-22 - xxxxxxxxxx - lavf 58.35.101 - url.h
+  Add av_find_protocol_by_name().
+
 2019-11-17 - 1c23abc88f - lavu 56.36.100 - eval API
   Add av_expr_count_vars().
 
diff --git a/libavformat/protocols.c b/libavformat/protocols.c
index face5b29b5..d4dee23a8e 100644
--- a/libavformat/protocols.c
+++ b/libavformat/protocols.c
@@ -107,6 +107,22 @@  const char *avio_enum_protocols(void **opaque, int output)
     return avio_enum_protocols(opaque, output);
 }
 
+const URLProtocol *av_find_protocol_by_name(const char *name)
+{
+    int i = 0;
+    const URLProtocol **protocols;
+    protocols = ffurl_get_protocols(NULL, NULL);
+    for (i = 0; protocols[i]; i++) {
+        const URLProtocol *proto = protocols[i];
+        if (!strcmp(proto->name, name)) {
+            av_freep(&protocols);
+            return proto;
+        }
+    }
+    av_freep(&protocols);
+    return NULL;
+}
+
 const URLProtocol **ffurl_get_protocols(const char *whitelist,
                                         const char *blacklist)
 {
diff --git a/libavformat/url.h b/libavformat/url.h
index 4750bfff82..fe0aa10b27 100644
--- a/libavformat/url.h
+++ b/libavformat/url.h
@@ -322,6 +322,15 @@  void ff_make_absolute_url(char *buf, int size, const char *base,
  */
 AVIODirEntry *ff_alloc_dir_entry(void);
 
+/**
+ * Return the URLProtocol of the protocol that will handle the passed name.
+ *
+ * NULL is returned if no protocol could be found for the name.
+ *
+ * @return URLProtocol of the protocol or NULL.
+ */
+const URLProtocol *av_find_protocol_by_name(const char *name);
+
 const AVClass *ff_urlcontext_child_class_next(const AVClass *prev);
 
 /**
diff --git a/libavformat/version.h b/libavformat/version.h
index bac54aed9d..213b66b45f 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -33,7 +33,7 @@ 
 // Also please add any ticket numbers that you believe might be affected here
 #define LIBAVFORMAT_VERSION_MAJOR  58
 #define LIBAVFORMAT_VERSION_MINOR  35
-#define LIBAVFORMAT_VERSION_MICRO 100
+#define LIBAVFORMAT_VERSION_MICRO 101
 
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
                                                LIBAVFORMAT_VERSION_MINOR, \