Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [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