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]

Reply via email to