PR #23080 opened by vigneshvg
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23080
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23080.patch

Handle SMPTE-2094-50 metadata that appears as a SEI message.

Signed-off-by: Vignesh Venkat <[email protected]>


>From 3a05cd4bfcd75413fd4a4d80d4f71f65b80b0787 Mon Sep 17 00:00:00 2001
From: Vignesh Venkat <[email protected]>
Date: Mon, 11 May 2026 14:02:36 -0700
Subject: [PATCH] avcodec/hevcdec: Support SMPTE-2094-50 metadata

Handle SMPTE-2094-50 metadata that appears as a SEI message.

Signed-off-by: Vignesh Venkat <[email protected]>
---
 libavcodec/h2645_sei.c    | 43 +++++++++++++++++++++++++++++++++++++++
 libavcodec/h2645_sei.h    |  5 +++++
 libavcodec/hevc/hevcdec.c | 10 +++++++++
 3 files changed, 58 insertions(+)

diff --git a/libavcodec/h2645_sei.c b/libavcodec/h2645_sei.c
index 638362fbf6..0f4f86d778 100644
--- a/libavcodec/h2645_sei.c
+++ b/libavcodec/h2645_sei.c
@@ -75,6 +75,32 @@ static int 
decode_registered_user_data_dynamic_hdr_plus(HEVCSEIDynamicHDRPlus *s
     return 0;
 }
 
+static int 
decode_registered_user_data_dynamic_hdr_smpte2094_app5(HEVCSEIDynamicHDRSmpte2094App5
 *s,
+                                                                  
GetByteContext *gb)
+{
+    size_t meta_size;
+    int err;
+    AVDynamicHDRSmpte2094App5 *metadata = 
av_dynamic_hdr_smpte2094_app5_alloc(&meta_size);
+    if (!metadata)
+        return AVERROR(ENOMEM);
+
+    err = av_dynamic_hdr_smpte2094_app5_from_t35(metadata, gb->buffer,
+                                                 
bytestream2_get_bytes_left(gb));
+    if (err < 0) {
+        av_free(metadata);
+        return err;
+    }
+
+    av_buffer_unref(&s->info);
+    s->info = av_buffer_create((uint8_t *)metadata, meta_size, NULL, NULL, 0);
+    if (!s->info) {
+        av_free(metadata);
+        return AVERROR(ENOMEM);
+    }
+
+    return 0;
+}
+
 static int 
decode_registered_user_data_dynamic_hdr_vivid(HEVCSEIDynamicHDRVivid *s,
                                                          GetByteContext *gb)
 {
@@ -225,6 +251,23 @@ static int decode_registered_user_data(H2645SEI *h, 
GetByteContext *gb,
             }
             break;
         }
+        case ITU_T_T35_PROVIDER_CODE_SMPTE: {
+            const uint16_t smpte2094_app5_provider_oriented_code = 0x0001;
+            uint16_t provider_oriented_code;
+
+            if (!IS_HEVC(codec_id))
+                break;
+
+            if (bytestream2_get_bytes_left(gb) < 2)
+                return AVERROR_INVALIDDATA;
+
+            provider_oriented_code = bytestream2_get_be16u(gb);
+            if (provider_oriented_code == 
smpte2094_app5_provider_oriented_code) {
+                return 
decode_registered_user_data_dynamic_hdr_smpte2094_app5(&h->dynamic_hdr_smpte2094_app5,
+                                                                              
gb);
+            }
+            break;
+        }
 #endif
         default:
             break;
diff --git a/libavcodec/h2645_sei.h b/libavcodec/h2645_sei.h
index f2ad7147c6..48138c1fc1 100644
--- a/libavcodec/h2645_sei.h
+++ b/libavcodec/h2645_sei.h
@@ -46,6 +46,10 @@ typedef struct HEVCSEIDynamicHDRPlus {
     AVBufferRef *info;
 } HEVCSEIDynamicHDRPlus;
 
+typedef struct HEVCSEIDynamicHDRSmpte2094App5 {
+    AVBufferRef *info;
+} HEVCSEIDynamicHDRSmpte2094App5;
+
 typedef struct HEVCSEIDynamicHDRVivid {
     AVBufferRef *info;
 } HEVCSEIDynamicHDRVivid;
@@ -129,6 +133,7 @@ typedef struct H2645SEI {
     H2645SEIA53Caption a53_caption;
     H2645SEIAFD afd;
     HEVCSEIDynamicHDRPlus  dynamic_hdr_plus;     //< HEVC only
+    HEVCSEIDynamicHDRSmpte2094App5  dynamic_hdr_smpte2094_app5;
     HEVCSEIDynamicHDRVivid dynamic_hdr_vivid;    //< HEVC only
     HEVCSEILCEVC lcevc;
     H2645SEIUnregistered unregistered;
diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
index b576b09b42..3d156476a6 100644
--- a/libavcodec/hevc/hevcdec.c
+++ b/libavcodec/hevc/hevcdec.c
@@ -3142,6 +3142,16 @@ static int set_side_data(HEVCContext *s)
             return ret;
     }
 
+    if (s->sei.common.dynamic_hdr_smpte2094_app5.info) {
+        AVBufferRef *info_ref = 
av_buffer_ref(s->sei.common.dynamic_hdr_smpte2094_app5.info);
+        if (!info_ref)
+            return AVERROR(ENOMEM);
+
+        ret = ff_frame_new_side_data_from_buf(s->avctx, out, 
AV_FRAME_DATA_DYNAMIC_HDR_SMPTE_2094_APP5, &info_ref);
+        if (ret < 0)
+            return ret;
+    }
+
     if (s->rpu_buf) {
         AVFrameSideData *rpu = av_frame_new_side_data_from_buf(out, 
AV_FRAME_DATA_DOVI_RPU_BUFFER, s->rpu_buf);
         if (!rpu)
-- 
2.52.0

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to