[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