PR #22476 opened by James Almer (jamrial) URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/22476 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/22476.patch
>From 7059bab484f28c2570ac97ed8d6ad8b8c9e9623e Mon Sep 17 00:00:00 2001 From: James Almer <[email protected]> Date: Wed, 11 Mar 2026 10:50:08 -0300 Subject: [PATCH 1/2] avutil/version: bump after recent additions Signed-off-by: James Almer <[email protected]> --- doc/APIchanges | 5 +++++ libavutil/version.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/doc/APIchanges b/doc/APIchanges index c59b82f107..d4b573b0d6 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -2,6 +2,11 @@ The last version increases of all libraries were on 2025-03-28 API changes, most recent first: +2026-03-11 - 910000fe59d - lavu 60.28.100 - hwcontext_amf.h + Add av_amf_display_mastering_meta_to_hdrmeta(), av_amf_light_metadata_to_hdrmeta(). + Add av_amf_extract_hdr_metadata(), av_amf_attach_hdr_metadata(). + Add av_amf_get_color_profile(). + 2026-03-07 - c23d56b173a - lavc 62.26.100 - codec_desc.h Add AV_CODEC_PROP_ENHANCEMENT. diff --git a/libavutil/version.h b/libavutil/version.h index b5f83705f7..b840a8aca2 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -79,7 +79,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 60 -#define LIBAVUTIL_VERSION_MINOR 27 +#define LIBAVUTIL_VERSION_MINOR 28 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ -- 2.52.0 >From 0aa3f1f5690d343512471c659d622f9927c4e085 Mon Sep 17 00:00:00 2001 From: James Almer <[email protected]> Date: Wed, 11 Mar 2026 10:51:08 -0300 Subject: [PATCH 2/2] avfilter/vf_vpp_amf: look for HDR metadata in link side data This is the correct way to use and propagate this kind of metadata. Signed-off-by: James Almer <[email protected]> --- doc/filters.texi | 13 ------- libavfilter/vf_amf_common.h | 2 -- libavfilter/vf_vpp_amf.c | 72 +++++++------------------------------ 3 files changed, 13 insertions(+), 74 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 569ff516d4..7f0c3cb99c 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -25664,19 +25664,6 @@ Full (or JPEG) color range. @end table -@item master_display -Set SMPTE2084 mastering display color volume info using libx265-style parameter -string, format is @code{G(%hu,%hu)B(%hu,%hu)R(%hu,%hu)WP(%hu,%hu)L(%u,%u)}. -Just like in libx265, %hu are unsigned 16bit integers and %u are unsigned -32bit integers. The SEI includes X,Y display primaries for RGB channels and -white point (WP) in units of 0.00002 and max,min luminance (L) values -in units of 0.0001 candela per meter square. - -@item max_cll -Set SMPTE2084 Max CLL and Max FALL values using libx265-style parameter string: -@code{%hu,%hu}, where %hu are unsigned 16bit integers. The first value is the -max content light level, the second value is the maximum picture average light level. - @anchor{color_profile} @item color_profile Specify all color properties at once. diff --git a/libavfilter/vf_amf_common.h b/libavfilter/vf_amf_common.h index 209ee966d8..0290a52c45 100644 --- a/libavfilter/vf_amf_common.h +++ b/libavfilter/vf_amf_common.h @@ -43,8 +43,6 @@ typedef struct AMFFilterContext { int fill_color; int keep_ratio; - char *disp_master; - char *max_cll; AVMasteringDisplayMetadata *master_display; AVContentLightMetadata *light_meta; diff --git a/libavfilter/vf_vpp_amf.c b/libavfilter/vf_vpp_amf.c index c86325642a..273f76794c 100644 --- a/libavfilter/vf_vpp_amf.c +++ b/libavfilter/vf_vpp_amf.c @@ -88,12 +88,11 @@ static int amf_filter_config_output(AVFilterLink *outlink) size_t size = 0; int ret; AMF_RESULT res; + const AVFrameSideData *sd; enum AMF_VIDEO_CONVERTER_COLOR_PROFILE_ENUM amf_color_profile; enum AVPixelFormat in_format; const int chroma_den = 50000; const int luma_den = 10000; - const int total_max_cll_args = 2; - const int total_disp_meta_args = 10; ret = amf_init_filter_config(outlink, &in_format); if (ret < 0) @@ -155,64 +154,26 @@ static int amf_filter_config_output(AVFilterLink *outlink) AMF_ASSIGN_PROPERTY_INT64(res, ctx->component, AMF_VIDEO_CONVERTER_INPUT_TRANSFER_CHARACTERISTIC, ctx->in_trc); } - if (ctx->disp_master) { - ctx->master_display = av_mastering_display_metadata_alloc(); + sd = av_frame_side_data_get(inlink->side_data, inlink->nb_side_data, + AV_FRAME_DATA_MASTERING_DISPLAY_METADATA); + if (sd) { + ctx->master_display = av_memdup(sd->data, sd->size); if (!ctx->master_display) return AVERROR(ENOMEM); - ret = sscanf(ctx->disp_master, - "G(%hu,%hu)B(%hu,%hu)R(%hu,%hu)WP(%hu,%hu)L(%u,%u)", - (uint16_t*)&ctx->master_display->display_primaries[1][0].num, - (uint16_t*)&ctx->master_display->display_primaries[1][1].num, - (uint16_t*)&ctx->master_display->display_primaries[2][0].num, - (uint16_t*)&ctx->master_display->display_primaries[2][1].num, - (uint16_t*)&ctx->master_display->display_primaries[0][0].num, - (uint16_t*)&ctx->master_display->display_primaries[0][1].num, - (uint16_t*)&ctx->master_display->white_point[0].num, - (uint16_t*)&ctx->master_display->white_point[1].num, - (unsigned*)&ctx->master_display->max_luminance.num, - (unsigned*)&ctx->master_display->min_luminance.num - ); - - if (ret != total_disp_meta_args) { - av_freep(&ctx->master_display); - av_log(avctx, AV_LOG_ERROR, "failed to parse mastering_display option\n"); - return AVERROR(EINVAL); - } - - ctx->master_display->display_primaries[1][0].den = chroma_den; - ctx->master_display->display_primaries[1][1].den = chroma_den; - ctx->master_display->display_primaries[2][0].den = chroma_den; - ctx->master_display->display_primaries[2][1].den = chroma_den; - ctx->master_display->display_primaries[0][0].den = chroma_den; - ctx->master_display->display_primaries[0][1].den = chroma_den; - ctx->master_display->white_point[0].den = chroma_den; - ctx->master_display->white_point[1].den = chroma_den; - ctx->master_display->max_luminance.den = luma_den; - ctx->master_display->min_luminance.den = luma_den; - - ctx->master_display->has_primaries = 1; - ctx->master_display->has_luminance = 1; + av_frame_side_data_remove(&outlink->side_data, &outlink->nb_side_data, + AV_FRAME_DATA_MASTERING_DISPLAY_METADATA); } - - if (ctx->max_cll) { - ctx->light_meta = av_content_light_metadata_alloc(&size); + sd = av_frame_side_data_get(inlink->side_data, inlink->nb_side_data, + AV_FRAME_DATA_CONTENT_LIGHT_LEVEL); + if (sd) { + ctx->light_meta = av_memdup(sd->data, sd->size); if (!ctx->light_meta) return AVERROR(ENOMEM); - ret = sscanf(ctx->max_cll, - "%hu,%hu", - (uint16_t*)&ctx->light_meta->MaxCLL, - (uint16_t*)&ctx->light_meta->MaxFALL - ); - - if (ret != total_max_cll_args) { - av_freep(ctx->light_meta); - ctx->light_meta = NULL; - av_log(avctx, AV_LOG_ERROR, "failed to parse max_cll option\n"); - return AVERROR(EINVAL); - } + av_frame_side_data_remove(&outlink->side_data, &outlink->nb_side_data, + AV_FRAME_DATA_CONTENT_LIGHT_LEVEL); } if (ctx->light_meta || ctx->master_display) { @@ -316,13 +277,6 @@ static const AVOption vpp_amf_options[] = { { "force_divisible_by", "enforce that the output resolution is divisible by a defined integer when force_original_aspect_ratio is used", OFFSET(force_divisible_by), AV_OPT_TYPE_INT, { .i64 = 1}, 1, 256, FLAGS }, { "reset_sar", "reset SAR to 1 and scale to square pixels if scaling proportionally", OFFSET(reset_sar), AV_OPT_TYPE_BOOL, { .i64 = 0}, 0, 1, FLAGS }, - { "master_display", - "set SMPTE2084 mastering display color volume info using libx265-style parameter string (G(%hu,%hu)B(%hu,%hu)R(%hu,%hu)WP(%hu,%hu)L(%u,%u)).", - OFFSET(disp_master), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, FLAGS - }, - - { "max_cll", "set SMPTE2084 Max CLL and Max FALL values using libx265-style parameter string (%hu,%hu)", OFFSET(max_cll), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, FLAGS }, - { NULL }, }; -- 2.52.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
