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
18 changes: 9 additions & 9 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 67f3902..886ab11 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];
@@ -3376,7 +3376,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 Down
102 changes: 51 additions & 51 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 886ab11..6374f85 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,
@@ -2839,6 +2836,31 @@ static void mkv_write_blockadditional(EbmlWriter *writer, const uint8_t *buf,
ebml_writer_close_master(writer);
}

Expand Down Expand Up @@ -92,7 +92,7 @@ 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,
@@ -2857,7 +2879,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.
Expand All @@ -101,65 +101,65 @@ index 0bb3242..28821c4 100644
int ret;

mkv->cur_block.track = track;
@@ -2965,6 +2987,7 @@ static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv,
@@ -2964,6 +2986,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:
@@ -3375,24 +3398,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[] = {

@@ -3626,6 +3662,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
56 changes: 28 additions & 28 deletions 0013-matroskaenc-write-timecode-in-BlockAddition.patch
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Subject: [PATCH 13/19] matroskaenc: write timecode in BlockAddition
1 file changed, 44 insertions(+), 1 deletion(-)

diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 0af0bb5..9b0aca3 100644
index 63faa0e..374ca03 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -61,6 +61,7 @@
Expand Down Expand Up @@ -37,15 +37,15 @@ index 0af0bb5..9b0aca3 100644
int64_t blockadditionmapping_offset;
int codecpriv_offset;
unsigned codecpriv_size; ///< size reserved for CodecPrivate excluding header+length field
@@ -2873,6 +2878,7 @@ static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv,
@@ -2872,6 +2877,7 @@ static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv,
#define SMPTE_2094_APP5_MAX_SIZE 855
uint8_t smpte_2094_app5_buf[5 + SMPTE_2094_APP5_MAX_SIZE];
uint8_t *side_data;
+ uint8_t timecode_buf[MAX_MATROSKA_BLOCK_ADD_SMPTE_12M][8];
size_t side_data_size;
uint64_t additional_id;
unsigned track_number = track->track_num;
@@ -2880,7 +2886,7 @@ static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv,
@@ -2879,7 +2885,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.
Expand All @@ -54,7 +54,7 @@ index 0af0bb5..9b0aca3 100644
int ret;

mkv->cur_block.track = track;
@@ -2991,6 +2997,36 @@ static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv,
@@ -2990,6 +2996,36 @@ static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv,
}
}

Expand Down Expand Up @@ -91,32 +91,32 @@ index 0af0bb5..9b0aca3 100644
ebml_writer_close_or_discard_master(&writer);

if (!force_blockgroup && writer.nb_elements == 2) {
@@ -3404,11 +3440,15 @@ after_cues:
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;
+ int block_type_timecode_count = 0;
@@ -3402,11 +3438,15 @@ after_cues:
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;
+ int block_type_timecode_count = 0;

if (!track->max_blockaddid)
continue;
if (!track->max_blockaddid)
continue;

/* check what is possible to write in the reserved space, in priority order */
+ for (int i = 0; i < track->timecode_count; i++) {
+ block_type_timecode_count += mkv_simulate_blockadditional_header(s, &remaining_video_track_space, MATROSKA_BLOCK_ADD_ID_TYPE_SMPTE_12M, MATROSKA_BLOCK_ADD_ID_SMPTE_12M + i);
+ }
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);
}
@@ -3428,6 +3468,9 @@ after_cues:
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);
}
+ for (int i = 0; i < block_type_timecode_count; i++) {
+ mkv_write_blockadditional_header(s, MATROSKA_BLOCK_ADD_ID_TYPE_SMPTE_12M, MATROSKA_BLOCK_ADD_ID_SMPTE_12M + i);
+ }
if (remaining_video_track_space > 1) {
put_ebml_void(track_bc, remaining_video_track_space);
}
/* check what is possible to write in the reserved space, in priority order */
+ for (int i = 0; i < track->timecode_count; i++) {
+ block_type_timecode_count += mkv_simulate_blockadditional_header(s, &remaining_video_track_space, MATROSKA_BLOCK_ADD_ID_TYPE_SMPTE_12M, MATROSKA_BLOCK_ADD_ID_SMPTE_12M + i);
+ }
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);
}
@@ -3427,6 +3467,9 @@ after_cues:
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);
}
+ for (int i = 0; i < block_type_timecode_count; i++) {
+ mkv_write_blockadditional_header(s, MATROSKA_BLOCK_ADD_ID_TYPE_SMPTE_12M, MATROSKA_BLOCK_ADD_ID_SMPTE_12M + i);
+ }
if (remaining_video_track_space > 1) {
put_ebml_void(track_bc, remaining_video_track_space);
}
--
2.52.0

Loading