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

Fixes #22816.


>From 6db0c9878482ed108e4b46c356457b42ad481672 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <[email protected]>
Date: Fri, 17 Apr 2026 21:26:25 +0200
Subject: [PATCH 1/3] avformat/matroskaenc: Increase size of EBML_WRITER array

7faa6ee2aa01e3bd747ce6c55e6d44c2ba7b0bb8 added support
for writing AV_PKT_DATA_DYNAMIC_HDR_SMPTE_2094_APP5,
yet forgot to update the size of the EBML element buffer.

Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavformat/matroskaenc.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index a3b45257db9..4f4337ff8b6 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -2852,7 +2852,11 @@ static int mkv_write_block(void *logctx, 
MatroskaMuxContext *mkv,
     size_t side_data_size;
     uint64_t additional_id;
     unsigned track_number = track->track_num;
-    EBML_WRITER(12);
+    // BlockGroup, Block, BlockDuration, DiscardPadding, BlockReference
+    // and BlockAdditions with three elements per BlockMore
+    // Don't forget to increment the number of BlockMore when adding
+    // support for writing a new blockadditional.
+    EBML_WRITER(5 + (1 + 3 * 3));
     int ret;
 
     mkv->cur_block.track  = track;
-- 
2.52.0


>From fe8179a84a5557989c703e0243a5b643fd8e5a06 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <[email protected]>
Date: Fri, 17 Apr 2026 21:30:59 +0200
Subject: [PATCH 2/3] avformat/matroskaenc: Use separate buffer for SMPTE 2094
 blockadditional

Otherwise the buffer for the hdr10+ blockadditional would
be clobbered if both are present (the buffers can only be
reused after the ebml_writer_write() call).

Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavformat/matroskaenc.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 4f4337ff8b6..84409f84cd3 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -2848,6 +2848,8 @@ static int mkv_write_block(void *logctx, 
MatroskaMuxContext *mkv,
 {
     const AVCodecParameters *par  = st->codecpar;
     uint8_t t35_buf[6 + AV_HDR_PLUS_MAX_PAYLOAD_SIZE];
+#define SMPTE_2094_APP5_MAX_SIZE 855
+    uint8_t smpte_2094_app5_buf[5 + SMPTE_2094_APP5_MAX_SIZE];
     uint8_t *side_data;
     size_t side_data_size;
     uint64_t additional_id;
@@ -2947,11 +2949,8 @@ static int mkv_write_block(void *logctx, 
MatroskaMuxContext *mkv,
                                             
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;
+            uint8_t *payload = smpte_2094_app5_buf;
+            size_t payload_size = sizeof(smpte_2094_app5_buf) - 5;
 
             bytestream_put_byte(&payload, ITU_T_T35_COUNTRY_CODE_US);
             bytestream_put_be16(&payload, ITU_T_T35_PROVIDER_CODE_SMPTE);
-- 
2.52.0


>From 950c0c20c9d4409f67e30c67cf79de2494c38265 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <[email protected]>
Date: Fri, 17 Apr 2026 21:34:15 +0200
Subject: [PATCH 3/3] avformat/matroskaenc: Remove pointless side-data size
 checks

Just presume that we any present side data is actually valid.

Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavformat/matroskaenc.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 84409f84cd3..f4d4a9cc88d 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -2925,8 +2925,8 @@ static int mkv_write_block(void *logctx, 
MatroskaMuxContext *mkv,
     if (par->codec_type == AVMEDIA_TYPE_VIDEO) {
         side_data = av_packet_get_side_data(pkt,
                                             AV_PKT_DATA_DYNAMIC_HDR10_PLUS,
-                                            &side_data_size);
-        if (side_data && side_data_size) {
+                                            NULL);
+        if (side_data) {
             uint8_t *payload = t35_buf;
             size_t payload_size = sizeof(t35_buf) - 6;
 
@@ -2947,8 +2947,8 @@ static int mkv_write_block(void *logctx, 
MatroskaMuxContext *mkv,
         }
         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) {
+                                            NULL);
+        if (side_data) {
             uint8_t *payload = smpte_2094_app5_buf;
             size_t payload_size = sizeof(smpte_2094_app5_buf) - 5;
 
-- 
2.52.0

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

Reply via email to