[FFmpeg-devel] [PATCH 1/5] avfilter/avfilter: Add avfilter_alloc() and avfilter_query_formats() for initializing filters without a graph

Paul B Mahol onemda at gmail.com
Wed Oct 13 10:16:15 EEST 2021


On Wed, Oct 13, 2021 at 6:50 AM Soft Works <softworkz at hotmail.com> wrote:

> The purpose of these additions is for being able to programatically
> retrieve
> the supported formats of a filter for each input and output without adding
> the filter to a graph and creating connections.
>

That is flawed by definition.


>
> Signed-off-by: softworkz <softworkz at hotmail.com>
> ---
>  doc/APIchanges              |  3 +++
>  libavfilter/avfilter.c      |  4 ++--
>  libavfilter/avfilter.h      | 22 ++++++++++++++++++++++
>  libavfilter/avfiltergraph.c | 18 ++++++++++++++----
>  libavfilter/version.h       |  2 +-
>  5 files changed, 42 insertions(+), 7 deletions(-)
>
> diff --git a/doc/APIchanges b/doc/APIchanges
> index 7b267a79ac..903de43365 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -14,6 +14,9 @@ libavutil:     2021-04-27
>
>  API changes, most recent first:
>
> +2021-10-12 - xxxxxxxxxx - lavf 8.13.100 - avfilter.h
> +  Add avfilter_alloc() and avfilter_query_formats().
> +
>  2021-09-21 - xxxxxxxxxx - lavu 57.7.100 - pixfmt.h
>    Add AV_PIX_FMT_X2BGR10.
>
> diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
> index 7362bcdab5..645af2cb11 100644
> --- a/libavfilter/avfilter.c
> +++ b/libavfilter/avfilter.c
> @@ -769,12 +769,12 @@ void avfilter_free(AVFilterContext *filter)
>
>      for (i = 0; i < filter->nb_inputs; i++) {
>          free_link(filter->inputs[i]);
> -        if (filter->input_pads[i].flags  & AVFILTERPAD_FLAG_FREE_NAME)
> +        if (filter->input_pads && filter->input_pads[i].flags  &
> AVFILTERPAD_FLAG_FREE_NAME)
>              av_freep(&filter->input_pads[i].name);
>      }
>      for (i = 0; i < filter->nb_outputs; i++) {
>          free_link(filter->outputs[i]);
> -        if (filter->output_pads[i].flags & AVFILTERPAD_FLAG_FREE_NAME)
> +        if (filter->output_pads && filter->output_pads[i].flags &
> AVFILTERPAD_FLAG_FREE_NAME)
>              av_freep(&filter->output_pads[i].name);
>      }
>
> diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h
> index f7208754a7..24119993d6 100644
> --- a/libavfilter/avfilter.h
> +++ b/libavfilter/avfilter.h
> @@ -911,6 +911,28 @@ typedef struct AVFilterGraph {
>      unsigned disable_auto_convert;
>  } AVFilterGraph;
>
> +/**
> + * Allocate a new filter context and return it.
> + *
> + * @param filter what filter to create an instance of
> + * @param inst_name name to give to the new filter context
> + *
> + * @return newly created filter context or NULL on failure
> + *
> + * @note for adding a filter to a filtergraph, use
> + *       avfilter_graph_alloc_filter() instead.
> + */
> +AVFilterContext *avfilter_alloc(const AVFilter *filter, const char
> *inst_name);
> +
> +/**
> + * Query the formats of a filter.
> + *
> + * @param filter the filter context
> + *
> + * @return 0 on success
> + */
> +int avfilter_query_formats(AVFilterContext *filter);
> +
>  /**
>   * Allocate a filter graph.
>   *
> diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c
> index b8b432e98b..64379782fc 100644
> --- a/libavfilter/avfiltergraph.c
> +++ b/libavfilter/avfiltergraph.c
> @@ -81,6 +81,11 @@ int ff_graph_thread_init(AVFilterGraph *graph)
>  }
>  #endif
>
> +AVFilterContext *avfilter_alloc(const AVFilter *filter, const char
> *inst_name)
> +{
> +    return ff_filter_alloc(filter, inst_name);
> +}
> +
>  AVFilterGraph *avfilter_graph_alloc(void)
>  {
>      AVFilterGraph *ret = av_mallocz(sizeof(*ret));
> @@ -395,6 +400,14 @@ static int formats_declared(AVFilterContext *f)
>      return 1;
>  }
>
> +int avfilter_query_formats(AVFilterContext *filter)
> +{
> +    if (filter->filter->formats_state == FF_FILTER_FORMATS_QUERY_FUNC)
> +        return filter_query_formats(filter);
> +
> +    return ff_default_query_formats(filter);
> +}
> +
>  /**
>   * Perform one round of query_formats() and merging formats lists on the
>   * filter graph.
> @@ -418,10 +431,7 @@ static int query_formats(AVFilterGraph *graph, void
> *log_ctx)
>          AVFilterContext *f = graph->filters[i];
>          if (formats_declared(f))
>              continue;
> -        if (f->filter->formats_state == FF_FILTER_FORMATS_QUERY_FUNC)
> -            ret = filter_query_formats(f);
> -        else
> -            ret = ff_default_query_formats(f);
> +        ret = avfilter_query_formats(f);
>          if (ret < 0 && ret != AVERROR(EAGAIN))
>              return ret;
>          /* note: EAGAIN could indicate a partial success, not counted yet
> */
> diff --git a/libavfilter/version.h b/libavfilter/version.h
> index e4c25b9225..dca5aacb45 100644
> --- a/libavfilter/version.h
> +++ b/libavfilter/version.h
> @@ -30,7 +30,7 @@
>  #include "libavutil/version.h"
>
>  #define LIBAVFILTER_VERSION_MAJOR   8
> -#define LIBAVFILTER_VERSION_MINOR  12
> +#define LIBAVFILTER_VERSION_MINOR  13
>  #define LIBAVFILTER_VERSION_MICRO 100
>
>
> --
> 2.30.2.windows.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>


More information about the ffmpeg-devel mailing list