Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 21 additions & 21 deletions 0007-matroskaenc-remove-unused-MaxBlockAdditionID.patch
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ For video tracks: simplify the temporary storage with only a void element and Ma
5 files changed, 32 insertions(+), 32 deletions(-)

diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index be9e0c2..e696502 100644
index 97d6655..4741009 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -1738,16 +1738,16 @@ static void mkv_write_blockadditionmapping(AVFormatContext *s, const MatroskaMux
@@ -1739,16 +1739,16 @@ static void mkv_write_blockadditionmapping(AVFormatContext *s, const MatroskaMux
const AVDOVIDecoderConfigurationRecord *dovi;
const AVPacketSideData *sd;

Expand All @@ -37,15 +37,15 @@ index be9e0c2..e696502 100644
+ 4 /* BlockAddIDValue */
+ 4 /* BlockAddIDType */);
}
@@ -3339,7 +3339,7 @@ after_cues:
for (unsigned i = 0; i < s->nb_streams; i++) {
const mkv_track *track = &mkv->tracks[i];
@@ -3422,7 +3422,7 @@ after_cues:
for (unsigned i = 0; i < s->nb_streams; i++) {
const mkv_track *track = &mkv->tracks[i];

- if (!track->max_blockaddid)
+ if (!track->max_blockaddid || !track->blockadditionmapping_offset)
continue;
- if (!track->max_blockaddid)
+ if (!track->max_blockaddid || !track->blockadditionmapping_offset)
continue;

// We reserved a single byte to write this value.
// We reserved a single byte to write this value.
diff --git a/tests/ref/lavf/mka b/tests/ref/lavf/mka
index 6f9a56b..6fe5ca8 100644
--- a/tests/ref/lavf/mka
Expand All @@ -57,25 +57,25 @@ index 6f9a56b..6fe5ca8 100644
+43584 tests/data/lavf/lavf.mka
tests/data/lavf/lavf.mka CRC=0x3a1da17e
diff --git a/tests/ref/lavf/mkv b/tests/ref/lavf/mkv
index 94605b3..bea4047 100644
index 018a9fe..a9b90ab 100644
--- a/tests/ref/lavf/mkv
+++ b/tests/ref/lavf/mkv
@@ -1,3 +1,3 @@
-dd709c2b5e173eaca39cdd4a10aac3ec *tests/data/lavf/lavf.mkv
-320447 tests/data/lavf/lavf.mkv
+9397da7654fc3a00a439545584608637 *tests/data/lavf/lavf.mkv
+320443 tests/data/lavf/lavf.mkv
tests/data/lavf/lavf.mkv CRC=0x29d44368
-96857fc58eceb82a0dc2c38dadd7f70b *tests/data/lavf/lavf.mkv
-320453 tests/data/lavf/lavf.mkv
+06c5fc8b62909ac4d4d2d1c30a8071cb *tests/data/lavf/lavf.mkv
+320449 tests/data/lavf/lavf.mkv
tests/data/lavf/lavf.mkv CRC=0x5df3232f
diff --git a/tests/ref/lavf/mkv_attachment b/tests/ref/lavf/mkv_attachment
index 6effac4..0276f33 100644
index 3105ddc..3884b23 100644
--- a/tests/ref/lavf/mkv_attachment
+++ b/tests/ref/lavf/mkv_attachment
@@ -1,3 +1,3 @@
-7cd7b06892b74d66da217c8dda90bfac *tests/data/lavf/lavf.mkv_attachment
-472597 tests/data/lavf/lavf.mkv_attachment
+1c40de58fae4e878e0a499bfe61d78e0 *tests/data/lavf/lavf.mkv_attachment
+472593 tests/data/lavf/lavf.mkv_attachment
tests/data/lavf/lavf.mkv_attachment CRC=0x29d44368
-96d4bab2f4ee95236480afbee2b64f77 *tests/data/lavf/lavf.mkv_attachment
-472603 tests/data/lavf/lavf.mkv_attachment
+1c1aebfb64399434db31b8236b596cac *tests/data/lavf/lavf.mkv_attachment
+472599 tests/data/lavf/lavf.mkv_attachment
tests/data/lavf/lavf.mkv_attachment CRC=0x5df3232f
diff --git a/tests/ref/seek/lavf-mkv b/tests/ref/seek/lavf-mkv
index e327959..2eb8506 100644
--- a/tests/ref/seek/lavf-mkv
Expand Down
106 changes: 53 additions & 53 deletions 0008-matroskaenc-reserve_video_track_space-option.patch
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ Subject: [PATCH 08/19] matroskaenc: reserve_video_track_space option
The number of block additions is not known in advance, so we need to be able to set more reserved space for when we add a lot more block additions.
It is also possible to reduce the reserved space (or even eliminate it) for those who want to keep the smallest header possible.
---
libavformat/matroskaenc.c | 82 ++++++++++++++++++++++++++++-----------
1 file changed, 59 insertions(+), 23 deletions(-)
libavformat/matroskaenc.c | 81 ++++++++++++++++++++++++++++-----------
1 file changed, 59 insertions(+), 22 deletions(-)

diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 0bb3242..28821c4 100644
index 4741009..88cf218 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -82,6 +82,8 @@
Expand Down Expand Up @@ -60,7 +60,7 @@ index 0bb3242..28821c4 100644
}

sd = av_packet_side_data_get(par->coded_side_data, par->nb_coded_side_data,
@@ -2840,6 +2837,31 @@ static void mkv_write_blockadditional(EbmlWriter *writer, const uint8_t *buf,
@@ -2861,6 +2858,31 @@ static void mkv_write_blockadditional(EbmlWriter *writer, const uint8_t *buf,
ebml_writer_close_master(writer);
}

Expand Down Expand Up @@ -92,74 +92,74 @@ index 0bb3242..28821c4 100644
static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv,
AVIOContext *pb, const AVStream *st,
mkv_track *track, const AVPacket *pkt,
@@ -2858,7 +2880,7 @@ static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv,
@@ -2880,7 +2902,7 @@ static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv,
// 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));
+ EBML_WRITER(4 + (1 + 3 * 3) + MAX_MATROSKA_BLOCK_ADD_ITU_T_T35);
- EBML_WRITER(5 + (1 + 4 /* BlockMore */ * 3));
+ EBML_WRITER(4 + (1 + 4 /* BlockMore */ * 3) + MAX_MATROSKA_BLOCK_ADD_ITU_T_T35);
int ret;

mkv->cur_block.track = track;
@@ -2965,6 +2987,7 @@ static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv,
@@ -3006,6 +3028,7 @@ static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv,
MATROSKA_BLOCK_ADD_ID_ITU_T_T35);
track->max_blockaddid = FFMAX(track->max_blockaddid,
MATROSKA_BLOCK_ADD_ID_ITU_T_T35);
+ track->itu_t_t35_count = 1;
}
}

@@ -3377,24 +3400,36 @@ after_cues:
@@ -3421,24 +3444,37 @@ after_cues:

for (unsigned i = 0; i < s->nb_streams; i++) {
const mkv_track *track = &mkv->tracks[i];
+ int remaining_video_track_space = mkv->reserve_video_track_space;
+ int max_block_add_id_count = 0;
+ int max_block_add_id_size = 3 + uint_size(track->max_blockaddid);
+ int block_type_t35_count = 0;
for (unsigned i = 0; i < s->nb_streams; i++) {
const mkv_track *track = &mkv->tracks[i];
+ int remaining_video_track_space = mkv->reserve_video_track_space;
+ int max_block_add_id_count = 0;
+ int max_block_add_id_size = 3 + uint_size(track->max_blockaddid);
+ int block_type_t35_count = 0;

- if (!track->max_blockaddid || !track->blockadditionmapping_offset)
+ if (!track->max_blockaddid)
continue;
- if (!track->max_blockaddid || !track->blockadditionmapping_offset)
+ if (!track->max_blockaddid)
continue;

- // We reserved a single byte to write this value.
- av_assert0(track->max_blockaddid <= 0xFF);
+ /* check what is possible to write in the reserved space, in priority order */
+ for (int i = 0; i < track->itu_t_t35_count; i++) {
+ block_type_t35_count += mkv_simulate_blockadditional_header(s, &remaining_video_track_space, MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35, MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35);
+ }
+ if (remaining_video_track_space >= max_block_add_id_size && remaining_video_track_space != max_block_add_id_size + 1) { /* min element full size is 2 so 1 byte is not something which can be let alone */
+ max_block_add_id_count++;
+ remaining_video_track_space -= max_block_add_id_size;
+ }
- // We reserved a single byte to write this value.
- av_assert0(track->max_blockaddid <= 0xFF);
+ /* check what is possible to write in the reserved space, in priority order */
+ for (int i = 0; i < track->itu_t_t35_count; i++) {
+ block_type_t35_count += mkv_simulate_blockadditional_header(s, &remaining_video_track_space, MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35, MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35);
+ }
+ if (remaining_video_track_space >= max_block_add_id_size && remaining_video_track_space != max_block_add_id_size + 1) { /* min element full size is 2 so 1 byte is not something which can be let alone */
+ max_block_add_id_count++;
+ remaining_video_track_space -= max_block_add_id_size;
+ }

+ /* write what is possible to write in the reserved space */
+ /* when you modify this part, adapt the check part above accordingly */
+ if (!track->blockadditionmapping_offset)
+ continue;
avio_seek(track_bc, track->blockadditionmapping_offset, SEEK_SET);
-
- put_ebml_uint(track_bc, MATROSKA_ID_TRACKMAXBLKADDID,
- track->max_blockaddid);
- if (track->max_blockaddid == MATROSKA_BLOCK_ADD_ID_ITU_T_T35) {
- ebml_master mapping_master = start_ebml_master(track_bc, MATROSKA_ID_TRACKBLKADDMAPPING, 8);
- put_ebml_uint(track_bc, MATROSKA_ID_BLKADDIDTYPE,
- MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35);
- put_ebml_uint(track_bc, MATROSKA_ID_BLKADDIDVALUE,
- MATROSKA_BLOCK_ADD_ID_ITU_T_T35);
- end_ebml_master(track_bc, mapping_master);
+ if (max_block_add_id_count) {
+ put_ebml_uint(track_bc, MATROSKA_ID_TRACKMAXBLKADDID, track->max_blockaddid);
+ }
+ for (int i = 0; i < block_type_t35_count; i++) {
+ mkv_write_blockadditional_header(s, MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35, MATROSKA_BLOCK_ADD_ID_ITU_T_T35);
+ }
+ if (remaining_video_track_space > 1) {
+ put_ebml_void(track_bc, remaining_video_track_space);
}
+ /* write what is possible to write in the reserved space */
+ /* when you modify this part, adapt the check part above accordingly */
+ if (!track->blockadditionmapping_offset)
+ continue;
avio_seek(track_bc, track->blockadditionmapping_offset, SEEK_SET);

- put_ebml_uint(track_bc, MATROSKA_ID_TRACKMAXBLKADDID,
- track->max_blockaddid);
- if (track->max_blockaddid == MATROSKA_BLOCK_ADD_ID_ITU_T_T35) {
- ebml_master mapping_master = start_ebml_master(track_bc, MATROSKA_ID_TRACKBLKADDMAPPING, 8);
- put_ebml_uint(track_bc, MATROSKA_ID_BLKADDIDTYPE,
- MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35);
- put_ebml_uint(track_bc, MATROSKA_ID_BLKADDIDVALUE,
- MATROSKA_BLOCK_ADD_ID_ITU_T_T35);
- end_ebml_master(track_bc, mapping_master);
+ if (max_block_add_id_count) {
+ put_ebml_uint(track_bc, MATROSKA_ID_TRACKMAXBLKADDID, track->max_blockaddid);
+ }
+ for (int i = 0; i < block_type_t35_count; i++) {
+ mkv_write_blockadditional_header(s, MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35, MATROSKA_BLOCK_ADD_ID_ITU_T_T35);
+ }
+ if (remaining_video_track_space > 1) {
+ put_ebml_void(track_bc, remaining_video_track_space);
}
}
@@ -3629,6 +3664,7 @@ static const AVCodecTag additional_subtitle_tags[] = {

@@ -3672,6 +3708,7 @@ static const AVCodecTag additional_subtitle_tags[] = {
#define FLAGS AV_OPT_FLAG_ENCODING_PARAM
static const AVOption options[] = {
{ "reserve_index_space", "reserve a given amount of space (in bytes) at the beginning of the file for the index (cues)", OFFSET(reserve_cues_space), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
Expand Down
28 changes: 14 additions & 14 deletions 0009-matroskaenc-increase-default-for-reserved-bytes-in-v.patch
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ This permits to handle by default more e.g. timecodes without having to set the
4 files changed, 27 insertions(+), 27 deletions(-)

diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 56c6553..c2ce9e6 100644
index 88cf218..77ea4a2 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -3625,7 +3625,7 @@ static const AVCodecTag additional_subtitle_tags[] = {
@@ -3708,7 +3708,7 @@ static const AVCodecTag additional_subtitle_tags[] = {
#define FLAGS AV_OPT_FLAG_ENCODING_PARAM
static const AVOption options[] = {
{ "reserve_index_space", "reserve a given amount of space (in bytes) at the beginning of the file for the index (cues)", OFFSET(reserve_cues_space), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
Expand All @@ -26,25 +26,25 @@ index 56c6553..c2ce9e6 100644
{ "cluster_size_limit", "store at most the provided amount of bytes in a cluster", OFFSET(cluster_size_limit), AV_OPT_TYPE_INT , { .i64 = -1 }, -1, INT_MAX, FLAGS },
{ "cluster_time_limit", "store at most the provided number of milliseconds in a cluster", OFFSET(cluster_time_limit), AV_OPT_TYPE_INT64, { .i64 = -1 }, -1, INT64_MAX, FLAGS },
diff --git a/tests/ref/lavf/mkv b/tests/ref/lavf/mkv
index bea4047..ec0728d 100644
index a9b90ab..186fd4c 100644
--- a/tests/ref/lavf/mkv
+++ b/tests/ref/lavf/mkv
@@ -1,3 +1,3 @@
-9397da7654fc3a00a439545584608637 *tests/data/lavf/lavf.mkv
-320443 tests/data/lavf/lavf.mkv
+c95871d60c576ae73f360145cb61db90 *tests/data/lavf/lavf.mkv
+320520 tests/data/lavf/lavf.mkv
tests/data/lavf/lavf.mkv CRC=0x29d44368
-06c5fc8b62909ac4d4d2d1c30a8071cb *tests/data/lavf/lavf.mkv
-320449 tests/data/lavf/lavf.mkv
+e25865bf205be8da1a18fc18cc4be6d0 *tests/data/lavf/lavf.mkv
+320526 tests/data/lavf/lavf.mkv
tests/data/lavf/lavf.mkv CRC=0x5df3232f
diff --git a/tests/ref/lavf/mkv_attachment b/tests/ref/lavf/mkv_attachment
index 0276f33..37fe4f8 100644
index 3884b23..2174046 100644
--- a/tests/ref/lavf/mkv_attachment
+++ b/tests/ref/lavf/mkv_attachment
@@ -1,3 +1,3 @@
-1c40de58fae4e878e0a499bfe61d78e0 *tests/data/lavf/lavf.mkv_attachment
-472593 tests/data/lavf/lavf.mkv_attachment
+fdfcb796a2e1a020bcc36ea926a243ce *tests/data/lavf/lavf.mkv_attachment
+472670 tests/data/lavf/lavf.mkv_attachment
tests/data/lavf/lavf.mkv_attachment CRC=0x29d44368
-1c1aebfb64399434db31b8236b596cac *tests/data/lavf/lavf.mkv_attachment
-472599 tests/data/lavf/lavf.mkv_attachment
+8453c623521e377fdb1368114e1852ab *tests/data/lavf/lavf.mkv_attachment
+472676 tests/data/lavf/lavf.mkv_attachment
tests/data/lavf/lavf.mkv_attachment CRC=0x5df3232f
diff --git a/tests/ref/seek/lavf-mkv b/tests/ref/seek/lavf-mkv
index 2eb8506..f2253e1 100644
--- a/tests/ref/seek/lavf-mkv
Expand Down
12 changes: 6 additions & 6 deletions 0012-matroskadec-read-timecode-in-BlockAddition.patch
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Subject: [PATCH 12/19] matroskadec: read timecode in BlockAddition
2 files changed, 35 insertions(+)

diff --git a/libavformat/matroska.h b/libavformat/matroska.h
index 719f2ef..d78b33d 100644
index c6986cf..7d22093 100644
--- a/libavformat/matroska.h
+++ b/libavformat/matroska.h
@@ -361,6 +361,7 @@ typedef enum {
Expand All @@ -19,20 +19,20 @@ index 719f2ef..d78b33d 100644
+ MATROSKA_BLOCK_ADD_ID_TYPE_SMPTE_12M = 121,
MATROSKA_BLOCK_ADD_ID_TYPE_DVCC = 0x64766343, // MKBETAG('d','v','c','C')
MATROSKA_BLOCK_ADD_ID_TYPE_DVVC = 0x64767643, // MKBETAG('d','v','v','C')
} MatroskaBlockAddIDType;
MATROSKA_BLOCK_ADD_ID_TYPE_HVCE = 0x68766345, // MKBETAG('h','v','c','E')
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 1900a93..3d8b7fc 100644
index 90fdb6c..499db9b 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -295,6 +295,7 @@ typedef struct MatroskaTrack {
@@ -296,6 +296,7 @@ typedef struct MatroskaTrack {

uint32_t palette[AVPALETTE_COUNT];
int has_palette;
+ int add_block_timecode_count;
} MatroskaTrack;

typedef struct MatroskaAttachment {
@@ -2530,6 +2531,9 @@ static int mkv_parse_block_addition_mappings(AVFormatContext *s, AVStream *st, M
@@ -2559,6 +2560,9 @@ static int mkv_parse_block_addition_mappings(AVFormatContext *s, AVStream *st, M
return AVERROR_INVALIDDATA;
}
break;
Expand All @@ -42,7 +42,7 @@ index 1900a93..3d8b7fc 100644
case MATROSKA_BLOCK_ADD_ID_TYPE_DVCC:
case MATROSKA_BLOCK_ADD_ID_TYPE_DVVC:
if ((ret = mkv_parse_dvcc_dvvc(s, st, track, &mapping->extradata)) < 0)
@@ -3999,6 +4003,36 @@ static int matroska_parse_block_additional(MatroskaDemuxContext *matroska,
@@ -4135,6 +4139,36 @@ static int matroska_parse_block_additional(MatroskaDemuxContext *matroska,
}
break;
}
Expand Down
Loading