summaryrefslogtreecommitdiffstats
path: root/libavfilter/formats.c
diff options
context:
space:
mode:
authorNiklas Haas <[email protected]>2025-08-13 11:27:32 +0200
committerNiklas Haas <[email protected]>2025-09-02 17:06:08 +0200
commiteea99a77eda6aa843a52e1996fcf10408248aa38 (patch)
treec18d5ed2cdb6fc8db3835d570d0c41d98187f38e /libavfilter/formats.c
parent8b375b2ffd4377909180241cdc65d63d372a35a3 (diff)
avfilter: add link negotiation for AVAlphaMode
Diffstat (limited to 'libavfilter/formats.c')
-rw-r--r--libavfilter/formats.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/libavfilter/formats.c b/libavfilter/formats.c
index 81c63e50cd..4aa171a06e 100644
--- a/libavfilter/formats.c
+++ b/libavfilter/formats.c
@@ -372,6 +372,11 @@ static const AVFilterFormatsMerger mergers_video[] = {
.can_merge = can_merge_generic,
CONVERSION_FILTER_SWSCALE
},
+ {
+ .offset = offsetof(AVFilterFormatsConfig, alpha_modes),
+ .merge = merge_generic,
+ .can_merge = can_merge_generic,
+ },
};
static const AVFilterFormatsMerger mergers_audio[] = {
@@ -665,6 +670,17 @@ AVFilterFormats *ff_all_color_ranges(void)
return ret;
}
+AVFilterFormats *ff_all_alpha_modes(void)
+{
+ AVFilterFormats *ret = NULL;
+ for (int range = 0; range < AVALPHA_MODE_NB; range++) {
+ if (ff_add_format(&ret, range) < 0)
+ return NULL;
+ }
+
+ return ret;
+}
+
#define FORMATS_REF(f, ref, unref_fn) \
void *tmp; \
\
@@ -870,6 +886,24 @@ int ff_set_common_all_color_ranges(AVFilterContext *ctx)
return ff_set_common_color_ranges(ctx, ff_all_color_ranges());
}
+int ff_set_common_alpha_modes(AVFilterContext *ctx,
+ AVFilterFormats *alpha_modes)
+{
+ SET_COMMON_FORMATS(ctx, alpha_modes, AVMEDIA_TYPE_VIDEO,
+ ff_formats_ref, ff_formats_unref);
+}
+
+int ff_set_common_alpha_modes_from_list(AVFilterContext *ctx,
+ const int *alpha_modes)
+{
+ return ff_set_common_alpha_modes(ctx, ff_make_format_list(alpha_modes));
+}
+
+int ff_set_common_all_alpha_modes(AVFilterContext *ctx)
+{
+ return ff_set_common_alpha_modes(ctx, ff_all_alpha_modes());
+}
+
/**
* A helper for query_formats() which sets all links to the same list of
* formats. If there are no links hooked to this filter, the list of formats is
@@ -1015,6 +1049,30 @@ int ff_set_common_all_color_ranges2(const AVFilterContext *ctx,
return ff_set_common_color_ranges2(ctx, cfg_in, cfg_out, ff_all_color_ranges());
}
+int ff_set_common_alpha_modes2(const AVFilterContext *ctx,
+ AVFilterFormatsConfig **cfg_in,
+ AVFilterFormatsConfig **cfg_out,
+ AVFilterFormats *alpha_modes)
+{
+ SET_COMMON_FORMATS2(ctx, cfg_in, cfg_out, alpha_modes, AVMEDIA_TYPE_VIDEO,
+ ff_formats_ref, ff_formats_unref);
+}
+
+int ff_set_common_alpha_modes_from_list2(const AVFilterContext *ctx,
+ AVFilterFormatsConfig **cfg_in,
+ AVFilterFormatsConfig **cfg_out,
+ const int *alpha_modes)
+{
+ return ff_set_common_alpha_modes2(ctx, cfg_in, cfg_out, ff_make_format_list(alpha_modes));
+}
+
+int ff_set_common_all_alpha_modes2(const AVFilterContext *ctx,
+ AVFilterFormatsConfig **cfg_in,
+ AVFilterFormatsConfig **cfg_out)
+{
+ return ff_set_common_alpha_modes2(ctx, cfg_in, cfg_out, ff_all_alpha_modes());
+}
+
int ff_set_common_formats2(const AVFilterContext *ctx,
AVFilterFormatsConfig **cfg_in,
AVFilterFormatsConfig **cfg_out,
@@ -1080,6 +1138,9 @@ int ff_default_query_formats(AVFilterContext *ctx)
ret = ff_set_common_all_color_ranges(ctx);
if (ret < 0)
return ret;
+ ret = ff_set_common_all_alpha_modes(ctx);
+ if (ret < 0)
+ return ret;
}
if (type != AVMEDIA_TYPE_VIDEO) {
ret = ff_set_common_all_channel_counts(ctx);
@@ -1147,6 +1208,11 @@ int ff_formats_check_color_ranges(void *log, const AVFilterFormats *fmts)
return check_list(log, "color range", fmts);
}
+int ff_formats_check_alpha_modes(void *log, const AVFilterFormats *fmts)
+{
+ return check_list(log, "alpha mode", fmts);
+}
+
static int layouts_compatible(const AVChannelLayout *a, const AVChannelLayout *b)
{
return !av_channel_layout_compare(a, b) ||