[FFmpeg-devel] [PATCH 004/218] avfilter: Replace query_formats callback with union of list and callback

Nicolas George george at nsup.org
Tue Oct 5 13:57:27 EEST 2021


Andreas Rheinhardt (12021-09-30):
> If one looks at the many query_formats callbacks in existence,
> one will immediately recognize that there is one type of default
> callback for video and a slightly different default callback for
> audio: It is "return ff_set_common_formats_from_list(ctx, pix_fmts);"
> for video with a filter-specific pix_fmts list. For audio, it is
> the same with a filter-specific sample_fmts list together with
> ff_set_common_all_samplerates() and ff_set_common_all_channel_counts().
> 
> This commit allows to remove the boilerplate query_formats callbacks
> by replacing said callback with a union consisting the old callback
> and pointers for pixel and sample format arrays. For the not uncommon
> case in which these lists only contain a single entry (besides the
> sentinel) enum AVPixelFormat and enum AVSampleFormat fields are also
> added to the union to store them directly in the AVFilter,
> thereby avoiding a relocation.
> 
> The state of said union will be contained in a new, dedicated AVFilter
> field (the nb_inputs and nb_outputs fields have been shrunk to uint8_t
> in order to create a hole for this new field; this is no problem, as
> the maximum of all the nb_inputs is four; for nb_outputs it is only
> two).
> 
> The state's default value coincides with the earlier default of
> query_formats being unset, namely that the filter accepts all formats
> (and also sample rates and channel counts/layouts for audio)
> provided that these properties agree coincide for all inputs and
> outputs.
> 
> By using different union members for audio and video filters
> the type-unsafety of using the same functions for audio and video
> lists will furthermore be more confined to formats.c than before.
> 
> When the new fields are used, they will also avoid allocations:
> Currently something nearly equivalent to ff_default_query_formats()
> is called after every successful call to a query_formats callback;
> yet in the common case that the newly allocated AVFilterFormats
> are not used at all (namely if there are no free links) these newly
> allocated AVFilterFormats are freed again without ever being used.
> Filters no longer using the callback will not exhibit this any more.
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
> ---
> This patchset here aims to remove boilerplate code from the
> query-formats API. Despite touching lots of filters, there should be
> only very few conflicts (if at all) with Nicolas' earlier patch [1].
> The reason for this is that the filters touched here typically only
> use ff_set_common_* functions, which are unaffected by his change.

I do not like the aesthetics of this very much, but it is a useful
change.

I have not looked at each individual filter change, but they are
straightforward.

So ok for my part.

Regards,

-- 
  Nicolas George
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20211005/7cca6f1e/attachment.sig>


More information about the ffmpeg-devel mailing list