This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

The following commit(s) were added to refs/heads/master by this push:
     new 7faa6ee2aa libavformat/matroska: Support smpte 2094-50 metadata
7faa6ee2aa is described below

commit 7faa6ee2aa01e3bd747ce6c55e6d44c2ba7b0bb8
Author:     Vignesh Venkat <[email protected]>
AuthorDate: Tue Apr 14 15:12:10 2026 -0700
Commit:     James Almer <[email protected]>
CommitDate: Fri Apr 17 18:51:25 2026 +0000

    libavformat/matroska: Support smpte 2094-50 metadata
    
    Add support for parsing and muxing smpte 2094-50 metadata. It will
    be stored as an ITUT-T35 message in the BlockAdditional element with
    an AddId type of 4 (which is reserved for ITUT-T35 in the matroska
    spec).
    
    https://www.matroska.org/technical/codec_specs.html#itu-t35-metadata
    
    Signed-off-by: Vignesh Venkatasubramanian <[email protected]>
---
 doc/APIchanges            |  3 +++
 libavcodec/decode.c       | 13 +++++++------
 libavcodec/packet.c       |  1 +
 libavcodec/packet.h       |  7 +++++++
 libavcodec/version.h      |  4 ++--
 libavformat/matroskadec.c | 25 +++++++++++++++++++++++++
 libavformat/matroskaenc.c | 24 ++++++++++++++++++++++++
 7 files changed, 69 insertions(+), 8 deletions(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index c57321cc39..ffa142a078 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -2,6 +2,9 @@ The last version increases of all libraries were on 2025-03-28
 
 API changes, most recent first:
 
+2026-04-xx - xxxxxxxxxx - lavc 60.30.100 - packet.h
+  Add AV_PKT_DATA_DYNAMIC_HDR_SMPTE_2094_APP5 side data type.
+
 2026-04-09 - 6ba6db4f19 - lavu 60.30.100 - hdr_dynamic_metadata.h frame.h
   Add AVDynamicHDRSmpte2094App5 struct and functions.
   Add AV_FRAME_DATA_DYNAMIC_HDR_SMPTE_2094_APP5 side data type.
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index ac654f1f4c..d64f089b82 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -1542,12 +1542,13 @@ int ff_decode_frame_props_from_pkt(const AVCodecContext 
*avctx,
                                    AVFrame *frame, const AVPacket *pkt)
 {
     static const SideDataMap sd[] = {
-        { AV_PKT_DATA_A53_CC,                     AV_FRAME_DATA_A53_CC },
-        { AV_PKT_DATA_AFD,                        AV_FRAME_DATA_AFD },
-        { AV_PKT_DATA_DYNAMIC_HDR10_PLUS,         
AV_FRAME_DATA_DYNAMIC_HDR_PLUS },
-        { AV_PKT_DATA_S12M_TIMECODE,              AV_FRAME_DATA_S12M_TIMECODE 
},
-        { AV_PKT_DATA_SKIP_SAMPLES,               AV_FRAME_DATA_SKIP_SAMPLES },
-        { AV_PKT_DATA_LCEVC,                      AV_FRAME_DATA_LCEVC },
+        { AV_PKT_DATA_A53_CC,                      AV_FRAME_DATA_A53_CC },
+        { AV_PKT_DATA_AFD,                         AV_FRAME_DATA_AFD },
+        { AV_PKT_DATA_DYNAMIC_HDR10_PLUS,          
AV_FRAME_DATA_DYNAMIC_HDR_PLUS },
+        { AV_PKT_DATA_DYNAMIC_HDR_SMPTE_2094_APP5, 
AV_FRAME_DATA_DYNAMIC_HDR_SMPTE_2094_APP5 },
+        { AV_PKT_DATA_S12M_TIMECODE,               AV_FRAME_DATA_S12M_TIMECODE 
},
+        { AV_PKT_DATA_SKIP_SAMPLES,                AV_FRAME_DATA_SKIP_SAMPLES 
},
+        { AV_PKT_DATA_LCEVC,                       AV_FRAME_DATA_LCEVC },
         { AV_PKT_DATA_NB }
     };
 
diff --git a/libavcodec/packet.c b/libavcodec/packet.c
index a2d453a4b3..37defa4a45 100644
--- a/libavcodec/packet.c
+++ b/libavcodec/packet.c
@@ -301,6 +301,7 @@ const char *av_packet_side_data_name(enum 
AVPacketSideDataType type)
     case AV_PKT_DATA_DOVI_CONF:                  return "DOVI configuration 
record";
     case AV_PKT_DATA_S12M_TIMECODE:              return "SMPTE ST 12-1:2014 
timecode";
     case AV_PKT_DATA_DYNAMIC_HDR10_PLUS:         return "HDR10+ Dynamic 
Metadata (SMPTE 2094-40)";
+    case AV_PKT_DATA_DYNAMIC_HDR_SMPTE_2094_APP5:return "HDR Dynamic Metadata 
(SMPTE 2094-50)";
     case AV_PKT_DATA_AMBIENT_VIEWING_ENVIRONMENT:return "Ambient viewing 
environment";
     case AV_PKT_DATA_IAMF_MIX_GAIN_PARAM:        return "IAMF Mix Gain 
Parameter Data";
     case AV_PKT_DATA_IAMF_DEMIXING_INFO_PARAM:   return "IAMF Demixing Info 
Parameter Data";
diff --git a/libavcodec/packet.h b/libavcodec/packet.h
index 59bfddf4cc..d2895bfe5d 100644
--- a/libavcodec/packet.h
+++ b/libavcodec/packet.h
@@ -368,6 +368,13 @@ enum AVPacketSideDataType {
      */
      AV_PKT_DATA_EXIF,
 
+    /**
+     * HDR dynamic metadata associated with a video frame. The payload is an
+     * AVDynamicHDRSmpte2094App5 type and contains information for color volume
+     * transform as specified in the SMPTE 2094-50 standard.
+     */
+    AV_PKT_DATA_DYNAMIC_HDR_SMPTE_2094_APP5,
+
     /**
      * The number of side data types.
      * This is not part of the public API/ABI in the sense that it may
diff --git a/libavcodec/version.h b/libavcodec/version.h
index e60d3c1afc..aeb58e3fed 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -29,8 +29,8 @@
 
 #include "version_major.h"
 
-#define LIBAVCODEC_VERSION_MINOR  29
-#define LIBAVCODEC_VERSION_MICRO 101
+#define LIBAVCODEC_VERSION_MINOR  30
+#define LIBAVCODEC_VERSION_MICRO 100
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                LIBAVCODEC_VERSION_MINOR, \
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 1900a93210..de14ff96b8 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -3964,6 +3964,31 @@ static int 
matroska_parse_block_additional(MatroskaDemuxContext *matroska,
 
                 break;
             }
+            case ITU_T_T35_PROVIDER_CODE_SMPTE: {
+                AVDynamicHDRSmpte2094App5 *hdr_smpte_2094_app5;
+                size_t hdr_smpte_2094_app5_size;
+
+                provider_oriented_code = bytestream2_get_be16u(&bc);
+                if (provider_oriented_code != 1)
+                    break; // ignore
+
+                hdr_smpte_2094_app5 = 
av_dynamic_hdr_smpte2094_app5_alloc(&hdr_smpte_2094_app5_size);
+                if (!hdr_smpte_2094_app5_size)
+                    return AVERROR(ENOMEM);
+
+                if ((res = 
av_dynamic_hdr_smpte2094_app5_from_t35(hdr_smpte_2094_app5,
+                                                                  bc.buffer,
+                                                                  
bytestream2_get_bytes_left(&bc))) < 0 ||
+                    (res = av_packet_add_side_data(pkt,
+                                                   
AV_PKT_DATA_DYNAMIC_HDR_SMPTE_2094_APP5,
+                                                   (uint8_t 
*)hdr_smpte_2094_app5,
+                                                   hdr_smpte_2094_app5_size)) 
< 0) {
+                    av_free(hdr_smpte_2094_app5);
+                    return res;
+                }
+
+                break;
+            }
             default:
                 break;
             }
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index cb19584b2b..a3b45257db 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -2939,6 +2939,30 @@ static int mkv_write_block(void *logctx, 
MatroskaMuxContext *mkv,
             track->max_blockaddid = FFMAX(track->max_blockaddid,
                                           MATROSKA_BLOCK_ADD_ID_ITU_T_T35);
         }
+        side_data = av_packet_get_side_data(pkt,
+                                            
AV_PKT_DATA_DYNAMIC_HDR_SMPTE_2094_APP5,
+                                            &side_data_size);
+        if (side_data && side_data_size) {
+            // The maximum possible payload size for SMPTE_2094_APP5 metadata 
is
+            // 855 bytes. So it will fit into the t35_buf which is of size
+            // 6 + AV_HDR_PLUS_MAX_PAYLOAD_SIZE = 913.
+            uint8_t *payload = t35_buf;
+            size_t payload_size = sizeof(t35_buf) - 5;
+
+            bytestream_put_byte(&payload, ITU_T_T35_COUNTRY_CODE_US);
+            bytestream_put_be16(&payload, ITU_T_T35_PROVIDER_CODE_SMPTE);
+            bytestream_put_be16(&payload, 0x01); // provider_oriented_code
+
+            ret = 
av_dynamic_hdr_smpte2094_app5_to_t35((AVDynamicHDRSmpte2094App5 *)side_data,
+                                                       &payload, 
&payload_size);
+            if (ret < 0)
+                return ret;
+
+            mkv_write_blockadditional(&writer, t35_buf, payload_size + 5,
+                                      MATROSKA_BLOCK_ADD_ID_ITU_T_T35);
+            track->max_blockaddid = FFMAX(track->max_blockaddid,
+                                          MATROSKA_BLOCK_ADD_ID_ITU_T_T35);
+        }
     }
 
     ebml_writer_close_or_discard_master(&writer);

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

Reply via email to