matroskaenc.c currently only allows BlockMore elements if the BlockAddID is
1. Recently YouTube has been using BlockAddID == 4 for HDR10+ dynamic
metadata (see [1]), which FFmpeg drops because of its filtering.

The attached patch changes matroskaenc.c so it stops filtering
by BlockAddID, allowing FFmpeg to retain metadata from WebM and Matroska
streams when remuxing.

[1]: https://www.webmproject.org/docs/container/#BlockAddID
From c4f6f8e0f9669938970416ff3ac159ecc1aa344f Mon Sep 17 00:00:00 2001
From: Michael Bradshaw <mjbshaw@google.com>
Date: Mon, 10 Feb 2020 12:33:32 -0800
Subject: [PATCH] lavf: stop filtering side data in mkv

---
 libavformat/matroskaenc.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 42f21eae8b..b561a4538e 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -2147,7 +2147,7 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb,
         side_data_size -= 8;
     }
 
-    if ((side_data_size && additional_id == 1) || discard_padding) {
+    if (side_data_size || discard_padding) {
         block_group = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, 0);
         blockid = MATROSKA_ID_BLOCK;
     }
@@ -2171,17 +2171,17 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb,
         put_ebml_sint(pb, MATROSKA_ID_DISCARDPADDING, discard_padding);
     }
 
-    if (side_data_size && additional_id == 1) {
+    if (side_data_size) {
         block_additions = start_ebml_master(pb, MATROSKA_ID_BLOCKADDITIONS, 0);
         block_more = start_ebml_master(pb, MATROSKA_ID_BLOCKMORE, 0);
-        put_ebml_uint(pb, MATROSKA_ID_BLOCKADDID, 1);
+        put_ebml_uint(pb, MATROSKA_ID_BLOCKADDID, additional_id);
         put_ebml_id(pb, MATROSKA_ID_BLOCKADDITIONAL);
         put_ebml_num(pb, side_data_size, 0);
         avio_write(pb, side_data, side_data_size);
         end_ebml_master(pb, block_more);
         end_ebml_master(pb, block_additions);
     }
-    if ((side_data_size && additional_id == 1) || discard_padding) {
+    if (side_data_size || discard_padding) {
         end_ebml_master(pb, block_group);
     }
 
-- 
2.24.0.525.g8f36a354ae-goog

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to