diff options
author | Niklas Haas <[email protected]> | 2025-08-13 11:27:32 +0200 |
---|---|---|
committer | Niklas Haas <[email protected]> | 2025-09-02 17:06:08 +0200 |
commit | eea99a77eda6aa843a52e1996fcf10408248aa38 (patch) | |
tree | c18d5ed2cdb6fc8db3835d570d0c41d98187f38e /libavfilter/formats.c | |
parent | 8b375b2ffd4377909180241cdc65d63d372a35a3 (diff) |
avfilter: add link negotiation for AVAlphaMode
Diffstat (limited to 'libavfilter/formats.c')
-rw-r--r-- | libavfilter/formats.c | 66 |
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) || |