[FFmpeg-devel] [PATCH v4 7/7] lavc/bsf: make BSF iteration the same as other iterators

wm4 nfxjfg at googlemail.com
Sat Feb 3 12:39:19 EET 2018


On Fri,  2 Feb 2018 19:44:18 +0000
Josh de Kock <josh at itanimul.li> wrote:

> ---
>  fftools/cmdutils.c             |  2 +-
>  libavcodec/avcodec.h           |  6 +++++-
>  libavcodec/bitstream_filter.c  |  4 ++--
>  libavcodec/bitstream_filters.c | 29 ++++++++++++++++++-----------
>  4 files changed, 26 insertions(+), 15 deletions(-)
> 
> diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c
> index 9ecc51b..0b06ccc 100644
> --- a/fftools/cmdutils.c
> +++ b/fftools/cmdutils.c
> @@ -1586,7 +1586,7 @@ int show_bsfs(void *optctx, const char *opt, const char *arg)
>      void *opaque = NULL;
>  
>      printf("Bitstream filters:\n");
> -    while ((bsf = av_bsf_next(&opaque)))
> +    while ((bsf = av_bsf_iterate(&opaque)))
>          printf("%s\n", bsf->name);
>      printf("\n");
>      return 0;
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index 99f5fb9..c41779a 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -5728,7 +5728,7 @@ attribute_deprecated
>  void av_bitstream_filter_close(AVBitStreamFilterContext *bsf);
>  /**
>   * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext)
> - * is deprecated. Use av_bsf_next() from the new bitstream filtering API (using
> + * is deprecated. Use av_bsf_iterate() from the new bitstream filtering API (using
>   * AVBSFContext).
>   */
>  attribute_deprecated
> @@ -5750,7 +5750,11 @@ const AVBitStreamFilter *av_bsf_get_by_name(const char *name);
>   * @return the next registered bitstream filter or NULL when the iteration is
>   *         finished
>   */
> +const AVBitStreamFilter *av_bsf_iterate(void **opaque);
> +#if FF_API_NEXT
> +attribute_deprecated
>  const AVBitStreamFilter *av_bsf_next(void **opaque);
> +#endif
>  
>  /**
>   * Allocate a context for a given bitstream filter. The caller must fill in the
> diff --git a/libavcodec/bitstream_filter.c b/libavcodec/bitstream_filter.c
> index ed1cf33..ca11ed3 100644
> --- a/libavcodec/bitstream_filter.c
> +++ b/libavcodec/bitstream_filter.c
> @@ -34,9 +34,9 @@ const AVBitStreamFilter *av_bitstream_filter_next(const AVBitStreamFilter *f)
>      void *opaque = NULL;
>  
>      while (filter != f)
> -        filter = av_bsf_next(&opaque);
> +        filter = av_bsf_iterate(&opaque);
>  
> -    return av_bsf_next(&opaque);
> +    return av_bsf_iterate(&opaque);
>  }
>  
>  void av_register_bitstream_filter(AVBitStreamFilter *bsf)
> diff --git a/libavcodec/bitstream_filters.c b/libavcodec/bitstream_filters.c
> index 7b0cb50..338ef82 100644
> --- a/libavcodec/bitstream_filters.c
> +++ b/libavcodec/bitstream_filters.c
> @@ -52,7 +52,7 @@ extern const AVBitStreamFilter ff_vp9_superframe_split_bsf;
>  
>  #include "libavcodec/bsf_list.c"
>  
> -const AVBitStreamFilter *av_bsf_next(void **opaque)
> +const AVBitStreamFilter *av_bsf_iterate(void **opaque)
>  {
>      uintptr_t i = (uintptr_t)*opaque;
>      const AVBitStreamFilter *f = bitstream_filters[i];
> @@ -63,12 +63,18 @@ const AVBitStreamFilter *av_bsf_next(void **opaque)
>      return f;
>  }
>  
> +#if FF_API_NEXT
> +const AVBitStreamFilter *av_bsf_next(void **opaque) {
> +    return av_bsf_iterate(opaque);
> +}
> +#endif
> +
>  const AVBitStreamFilter *av_bsf_get_by_name(const char *name)
>  {
> -    int i;
> +    const AVBitStreamFilter *f = NULL;
> +    void *i = 0;
>  
> -    for (i = 0; bitstream_filters[i]; i++) {
> -        const AVBitStreamFilter *f = bitstream_filters[i];
> +    while ((f = av_bsf_iterate(&i))) {
>          if (!strcmp(f->name, name))
>              return f;
>      }
> @@ -78,19 +84,20 @@ const AVBitStreamFilter *av_bsf_get_by_name(const char *name)
>  
>  const AVClass *ff_bsf_child_class_next(const AVClass *prev)
>  {
> -    int i;
> +    const AVBitStreamFilter *f = NULL;
> +    void *i = 0;
>  
>      /* find the filter that corresponds to prev */
> -    for (i = 0; prev && bitstream_filters[i]; i++) {
> -        if (bitstream_filters[i]->priv_class == prev) {
> -            i++;
> +    while (prev && (f = av_bsf_iterate(&i))) {
> +        if (f->priv_class == prev) {
>              break;
>          }
>      }
>  
>      /* find next filter with priv options */
> -    for (; bitstream_filters[i]; i++)
> -        if (bitstream_filters[i]->priv_class)
> -            return bitstream_filters[i]->priv_class;
> +    while ((f = av_bsf_iterate(&i))) {
> +        if (f->priv_class)
> +            return f->priv_class;
> +    }
>      return NULL;
>  }

I like _next better than _iterate (as others have also said), but I
think I can tolerate it. At least it'll be consistent across all those
APIs.


More information about the ffmpeg-devel mailing list