PR #21411 opened by nyh163925 URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21411 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21411.patch
We provide a more secure API for setting cfg in link, which avoid breaking ABI caused by int* and enum* . #https://code.ffmpeg.org/FFmpeg/FFmpeg/issues/21289 Signed-off-by: niyinghao <[email protected]> >From 748064f406fa9390a14605da671e17d48e27756c Mon Sep 17 00:00:00 2001 From: niyinghao <[email protected]> Date: Thu, 8 Jan 2026 20:44:48 +0800 Subject: [PATCH] avfilter/formats: Add set_list function for enum AVSampleFormat and enum AVPixelFormat to avoid breaking ABI by converting int* and enum* Signed-off-by: niyinghao <[email protected]> --- libavfilter/formats.c | 43 +++++++++++++++++++++++++++++++++++------- libavfilter/formats.h | 44 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 7 deletions(-) diff --git a/libavfilter/formats.c b/libavfilter/formats.c index 5ba961f059..e9b36747e1 100644 --- a/libavfilter/formats.c +++ b/libavfilter/formats.c @@ -497,14 +497,18 @@ int ff_fmt_is_in(int fmt, const int *fmts) } \ } -AVFilterFormats *ff_make_format_list(const int *fmts) -{ - MAKE_FORMAT_LIST(AVFilterFormats, formats, nb_formats); - while (count--) - formats->formats[count] = fmts[count]; +#define MAKE_FORMAT_LIST_TYPE(name, type) \ + AVFilterFormats *ff_make_ ## name ## _list(const type* fmts) \ + { \ + MAKE_FORMAT_LIST(AVFilterFormats, formats, nb_formats); \ + while (count--) \ + formats->formats[count] = (int)fmts[count]; \ + return formats; \ + } - return formats; -} +MAKE_FORMAT_LIST_TYPE(format, int) +MAKE_FORMAT_LIST_TYPE(sample_formats, enum AVSampleFormat) +MAKE_FORMAT_LIST_TYPE(pixel_formats, enum AVPixelFormat) AVFilterChannelLayouts *ff_make_channel_layout_list(const AVChannelLayout *fmts) { @@ -969,6 +973,16 @@ int ff_set_common_formats_from_list(AVFilterContext *ctx, const int *fmts) return ff_set_common_formats(ctx, ff_make_format_list(fmts)); } +int ff_set_sample_formats_from_list(AVFilterContext *ctx, const enum AVSampleFormat *fmts) +{ + return ff_set_common_formats(ctx, ff_make_sample_formats_list(fmts)); +} + +int ff_set_pixel_formats_from_list(AVFilterContext *ctx, const enum AVPixelFormat *fmts) +{ + return ff_set_common_formats(ctx, ff_make_pixel_formats_list(fmts)); +} + #define SET_COMMON_FORMATS2(ctx, cfg_in, cfg_out, fmts, media_type, \ ref_fn, unref_fn) \ if (!fmts) \ @@ -1139,6 +1153,21 @@ int ff_set_common_formats_from_list2(const AVFilterContext *ctx, return ff_set_common_formats2(ctx, cfg_in, cfg_out, ff_make_format_list(fmts)); } +int ff_set_sample_formats_from_list2(const AVFilterContext *ctx, + AVFilterFormatsConfig **cfg_in, + AVFilterFormatsConfig **cfg_out, + const enum AVSampleFormat *fmts) +{ + return ff_set_common_formats2(ctx, cfg_in, cfg_out, ff_make_sample_formats_list(fmts)); +} + +int ff_set_pixel_formats_from_list2(const AVFilterContext *ctx, + AVFilterFormatsConfig **cfg_in, + AVFilterFormatsConfig **cfg_out, + const enum AVPixelFormat *fmts) +{ + return ff_set_common_formats2(ctx, cfg_in, cfg_out, ff_make_pixel_formats_list(fmts)); +} int ff_default_query_formats(AVFilterContext *ctx) { diff --git a/libavfilter/formats.h b/libavfilter/formats.h index 969bb230f1..e2c527820b 100644 --- a/libavfilter/formats.h +++ b/libavfilter/formats.h @@ -248,6 +248,18 @@ int ff_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats); av_warn_unused_result int ff_set_common_formats_from_list(AVFilterContext *ctx, const int *fmts); +/** + * Equivalent to ff_set_common_formats(ctx, ff_make_sample_formats_list(fmts)) + */ +av_warn_unused_result +int ff_set_sample_formats_from_list(AVFilterContext *ctx, const enum AVSampleFormat *fmts); + +/** + * Equivalent to ff_set_common_formats(ctx, ff_make_pixel_formats_list(fmts)) + */ +av_warn_unused_result +int ff_set_pixel_formats_from_list(AVFilterContext *ctx, const enum AVPixelFormat *fmts); + /** * Helpers for query_formats2() which set all free audio links to the same list * of channel layouts/sample rates. If there are no links hooked to this list, @@ -349,6 +361,18 @@ int ff_set_common_formats_from_list2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_out, const int *fmts); +av_warn_unused_result +int ff_set_sample_formats_from_list2(const AVFilterContext *ctx, + AVFilterFormatsConfig **cfg_in, + AVFilterFormatsConfig **cfg_out, + const enum AVSampleFormat *fmts); + +av_warn_unused_result +int ff_set_pixel_formats_from_list2(const AVFilterContext *ctx, + AVFilterFormatsConfig **cfg_in, + AVFilterFormatsConfig **cfg_out, + const enum AVPixelFormat *fmts); + av_warn_unused_result int ff_add_channel_layout(AVFilterChannelLayouts **l, const AVChannelLayout *channel_layout); @@ -385,6 +409,26 @@ int ff_default_query_formats(AVFilterContext *ctx); av_warn_unused_result AVFilterFormats *ff_make_format_list(const int *fmts); +/** + * Create a list of supported sample formats. This is intended for use in + * AVFilter->query_formats(). + * + * @param fmts list of enum AVSampleFormat, terminated by AV_SAMPLE_FMT_NONE + * @return the format list, with no existing references + */ +av_warn_unused_result +AVFilterFormats *ff_make_sample_format_list(const enum AVSampleFormat *fmts); + +/** + * Create a list of supported formats. This is intended for use in + * AVFilter->query_formats(). + * + * @param fmts list of enum AVPixelFormat, terminated by AV_PIX_FMT_NONE + * @return the format list, with no existing references + */ +av_warn_unused_result +AVFilterFormats *ff_make_pixel_format_list(const enum AVPixelFormat *fmts); + /** * Equivalent to ff_make_format_list({const int[]}{ fmt, -1 }) */ -- 2.49.1 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
