* [FFmpeg-devel] [PR] avfilter/formats: Add set_list function for enum AVSampleFormat and enum AVPixelFormat to avoid breaking ABI by converting int* and enum* (PR #21411)
@ 2026-01-08 13:18 nyh163925 via ffmpeg-devel
0 siblings, 0 replies; only message in thread
From: nyh163925 via ffmpeg-devel @ 2026-01-08 13:18 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: nyh163925
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 <niyinghao@xiaomi.com>
>From 748064f406fa9390a14605da671e17d48e27756c Mon Sep 17 00:00:00 2001
From: niyinghao <niyinghao@xiaomi.com>
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 <niyinghao@xiaomi.com>
---
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 -- ffmpeg-devel@ffmpeg.org
To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2026-01-08 13:19 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-01-08 13:18 [FFmpeg-devel] [PR] avfilter/formats: Add set_list function for enum AVSampleFormat and enum AVPixelFormat to avoid breaking ABI by converting int* and enum* (PR #21411) nyh163925 via ffmpeg-devel
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git