avio_seek(pb, pos, SEEK_SET);
}
+static void mkv_add_seekhead_entry(MatroskaMuxContext *mkv, uint32_t elementid,
+ uint64_t filepos)
+{
+ mkv_seekhead *seekhead = &mkv->seekhead;
+
+ av_assert1(seekhead->num_entries < MAX_SEEKHEAD_ENTRIES);
+
+ seekhead->entries[seekhead->num_entries].elementid = elementid;
+ seekhead->entries[seekhead->num_entries++].segmentpos = filepos - mkv->segment_offset;
+}
+
static int start_ebml_master_crc32(AVIOContext **dyn_cp, MatroskaMuxContext *mkv)
{
int ret;
static void end_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp,
MatroskaMuxContext *mkv, uint32_t id,
- int length_size, int keep_buffer)
+ int length_size, int keep_buffer,
+ int add_seekentry)
{
uint8_t *buf, crc[4];
int size, skip = 0;
+ if (add_seekentry)
+ mkv_add_seekhead_entry(mkv, id, avio_tell(pb));
+
put_ebml_id(pb, id);
size = avio_get_dyn_buf(*dyn_cp, &buf);
put_ebml_length(pb, size, length_size);
put_ebml_void(pb, mkv->seekhead.reserved_size);
}
-static void mkv_add_seekhead_entry(MatroskaMuxContext *mkv, uint32_t elementid,
- uint64_t filepos)
-{
- mkv_seekhead *seekhead = &mkv->seekhead;
-
- av_assert1(seekhead->num_entries < MAX_SEEKHEAD_ENTRIES);
-
- seekhead->entries[seekhead->num_entries].elementid = elementid;
- seekhead->entries[seekhead->num_entries++].segmentpos = filepos - mkv->segment_offset;
-}
-
/**
* Write the SeekHead to the file at the location reserved for it
* and seek to destpos afterwards. When error_on_seek_failure
put_ebml_uint(dyn_cp, MATROSKA_ID_SEEKPOSITION, entry->segmentpos);
end_ebml_master(dyn_cp, seekentry);
}
- end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_SEEKHEAD, 0, 0);
+ end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_SEEKHEAD, 0, 0, 0);
remaining = seekhead->filepos + seekhead->reserved_size - avio_tell(pb);
put_ebml_void(pb, remaining);
end_ebml_master_crc32_preliminary(pb, mkv->tracks_bc,
MATROSKA_ID_TRACKS, &mkv->tracks_pos);
else
- end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, MATROSKA_ID_TRACKS, 0, 0);
+ end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv,
+ MATROSKA_ID_TRACKS, 0, 0, 0);
return 0;
}
break;
}
- mkv_add_seekhead_entry(mkv, MATROSKA_ID_CHAPTERS, avio_tell(pb));
-
ret = start_ebml_master_crc32(&dyn_cp, mkv);
if (ret < 0)
return ret;
end_ebml_master(dyn_cp, chapteratom);
}
end_ebml_master(dyn_cp, editionentry);
- end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CHAPTERS, 0, 0);
+ end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CHAPTERS, 0, 0, 1);
mkv->wrote_chapters = 1;
return 0;
end_ebml_master_crc32_preliminary(s->pb, mkv->tags_bc,
MATROSKA_ID_TAGS, &mkv->tags_pos);
else
- end_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS, 0, 0);
+ end_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv,
+ MATROSKA_ID_TAGS, 0, 0, 0);
}
return 0;
}
if (!mkv->nb_attachments)
return 0;
- mkv_add_seekhead_entry(mkv, MATROSKA_ID_ATTACHMENTS, avio_tell(pb));
-
ret = start_ebml_master_crc32(&dyn_cp, mkv);
if (ret < 0)
return ret;
put_ebml_uid(dyn_cp, MATROSKA_ID_FILEUID, track->uid);
end_ebml_master(dyn_cp, attached_file);
}
- end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_ATTACHMENTS, 0, 0);
+ end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_ATTACHMENTS, 0, 0, 1);
return 0;
}
end_ebml_master_crc32_preliminary(s->pb, mkv->info_bc,
MATROSKA_ID_INFO, &mkv->info_pos);
else
- end_ebml_master_crc32(s->pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO, 0, 0);
+ end_ebml_master_crc32(s->pb, &mkv->info_bc, mkv,
+ MATROSKA_ID_INFO, 0, 0, 0);
pb = s->pb;
ret = mkv_write_tracks(s);
{
MatroskaMuxContext *mkv = s->priv_data;
- end_ebml_master_crc32(s->pb, &mkv->cluster_bc, mkv, MATROSKA_ID_CLUSTER, 0, 1);
+ end_ebml_master_crc32(s->pb, &mkv->cluster_bc, mkv,
+ MATROSKA_ID_CLUSTER, 0, 1, 0);
if (!mkv->have_video) {
for (unsigned i = 0; i < s->nb_streams; i++)
mkv->tracks[i].has_cue = 0;
if (mkv->cluster_pos != -1) {
end_ebml_master_crc32(pb, &mkv->cluster_bc, mkv,
- MATROSKA_ID_CLUSTER, 0, 0);
+ MATROSKA_ID_CLUSTER, 0, 0, 0);
}
ret = mkv_write_chapters(s);
if (mkv->cues.num_entries) {
AVIOContext *cues = NULL;
uint64_t size;
- int64_t cuespos = endpos;
int length_size = 0;
ret = start_ebml_master_crc32(&cues, mkv);
ffio_free_dyn_buf(&cues);
goto after_cues;
} else {
- cuespos = mkv->cues_pos;
if ((ret64 = avio_seek(pb, mkv->cues_pos, SEEK_SET)) < 0) {
ffio_free_dyn_buf(&cues);
return ret64;
}
}
}
- mkv_add_seekhead_entry(mkv, MATROSKA_ID_CUES, cuespos);
end_ebml_master_crc32(pb, &cues, mkv, MATROSKA_ID_CUES,
- length_size, 0);
+ length_size, 0, 1);
if (mkv->reserve_cues_space) {
if (size < mkv->reserve_cues_space)
put_ebml_void(pb, mkv->reserve_cues_space - size);
av_log(s, AV_LOG_DEBUG, "end duration = %" PRIu64 "\n", mkv->duration);
avio_seek(mkv->info_bc, mkv->duration_offset, SEEK_SET);
put_ebml_float(mkv->info_bc, MATROSKA_ID_DURATION, mkv->duration);
- end_ebml_master_crc32(pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO, 0, 0);
+ end_ebml_master_crc32(pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO, 0, 0, 0);
if (mkv->tracks_bc) {
// write Tracks master
avio_seek(pb, mkv->tracks_pos, SEEK_SET);
end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv,
- MATROSKA_ID_TRACKS, 0, 0);
+ MATROSKA_ID_TRACKS, 0, 0, 0);
}
// update stream durations
}
avio_seek(pb, mkv->tags_pos, SEEK_SET);
- end_ebml_master_crc32(pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS, 0, 0);
+ end_ebml_master_crc32(pb, &mkv->tags_bc, mkv,
+ MATROSKA_ID_TAGS, 0, 0, 0);
}
avio_seek(pb, endpos, SEEK_SET);