avio_seek(pb, pos, SEEK_SET);
}
-static int start_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp, MatroskaMuxContext *mkv,
- uint32_t elementid)
+static int start_ebml_master_crc32(AVIOContext **dyn_cp, MatroskaMuxContext *mkv)
{
int ret;
if ((ret = avio_open_dyn_buf(dyn_cp)) < 0)
return ret;
- put_ebml_id(pb, elementid);
if (mkv->write_crc)
put_ebml_void(*dyn_cp, 6); /* Reserve space for CRC32 so position/size calculations using avio_tell() take it into account */
return 0;
}
-static void end_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp, MatroskaMuxContext *mkv)
+static void end_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp,
+ MatroskaMuxContext *mkv, uint32_t id)
{
uint8_t *buf, crc[4];
int size, skip = 0;
+ put_ebml_id(pb, id);
size = avio_close_dyn_buf(*dyn_cp, &buf);
put_ebml_num(pb, size, 0);
if (mkv->write_crc) {
* Complete ebml master without destroying the buffer, allowing for later updates
*/
static void end_ebml_master_crc32_preliminary(AVIOContext *pb, AVIOContext **dyn_cp, MatroskaMuxContext *mkv,
- int64_t *pos)
+ uint32_t id, int64_t *pos)
{
uint8_t *buf;
int size = avio_get_dyn_buf(*dyn_cp, &buf);
*pos = avio_tell(pb);
+ put_ebml_id(pb, id);
put_ebml_num(pb, size, 0);
avio_write(pb, buf, size);
}
if ((ret64 = avio_seek(pb, seekhead->filepos, SEEK_SET)) < 0)
return error_on_seek_failure ? ret64 : 0;
- ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_SEEKHEAD);
+ ret = start_ebml_master_crc32(&dyn_cp, mkv);
if (ret < 0)
return ret;
put_ebml_uint(dyn_cp, MATROSKA_ID_SEEKPOSITION, entry->segmentpos);
end_ebml_master(dyn_cp, seekentry);
}
- end_ebml_master_crc32(pb, &dyn_cp, mkv);
+ end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_SEEKHEAD);
remaining = seekhead->filepos + seekhead->reserved_size - avio_tell(pb);
put_ebml_void(pb, remaining);
int ret;
currentpos = avio_tell(pb);
- ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CUES);
+ ret = start_ebml_master_crc32(&dyn_cp, mkv);
if (ret < 0)
return ret;
ffio_reset_dyn_buf(cuepoint);
}
ffio_free_dyn_buf(&cuepoint);
- end_ebml_master_crc32(pb, &dyn_cp, mkv);
+ end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CUES);
return currentpos;
}
mkv_add_seekhead_entry(mkv, MATROSKA_ID_TRACKS, avio_tell(pb));
- ret = start_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, MATROSKA_ID_TRACKS);
+ ret = start_ebml_master_crc32(&mkv->tracks_bc, mkv);
if (ret < 0)
return ret;
}
if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live)
- end_ebml_master_crc32_preliminary(pb, &mkv->tracks_bc, mkv, &mkv->tracks_pos);
+ end_ebml_master_crc32_preliminary(pb, &mkv->tracks_bc, mkv,
+ MATROSKA_ID_TRACKS, &mkv->tracks_pos);
else
- end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv);
+ end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, MATROSKA_ID_TRACKS);
return 0;
}
mkv_add_seekhead_entry(mkv, MATROSKA_ID_CHAPTERS, avio_tell(pb));
- ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CHAPTERS);
+ ret = start_ebml_master_crc32(&dyn_cp, mkv);
if (ret < 0) return ret;
editionentry = start_ebml_master(dyn_cp, MATROSKA_ID_EDITIONENTRY, 0);
end_ebml_master(dyn_cp, chapteratom);
}
end_ebml_master(dyn_cp, editionentry);
- end_ebml_master_crc32(pb, &dyn_cp, mkv);
+ end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CHAPTERS);
mkv->wrote_chapters = 1;
return 0;
if (!mkv->tags_bc) {
mkv_add_seekhead_entry(mkv, MATROSKA_ID_TAGS, avio_tell(s->pb));
- ret = start_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS);
+ ret = start_ebml_master_crc32(&mkv->tags_bc, mkv);
if (ret < 0)
return ret;
}
if (mkv->tags_bc) {
if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live)
- end_ebml_master_crc32_preliminary(s->pb, &mkv->tags_bc, mkv, &mkv->tags_pos);
+ end_ebml_master_crc32_preliminary(s->pb, &mkv->tags_bc, mkv,
+ MATROSKA_ID_TAGS, &mkv->tags_pos);
else
- end_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv);
+ end_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS);
}
return 0;
}
mkv_add_seekhead_entry(mkv, MATROSKA_ID_ATTACHMENTS, avio_tell(pb));
- ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_ATTACHMENTS);
+ ret = start_ebml_master_crc32(&dyn_cp, mkv);
if (ret < 0) return ret;
for (i = 0; i < s->nb_streams; i++) {
mkv->attachments->entries[mkv->attachments->num_entries].stream_idx = i;
mkv->attachments->entries[mkv->attachments->num_entries++].fileuid = fileuid;
}
- end_ebml_master_crc32(pb, &dyn_cp, mkv);
+ end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_ATTACHMENTS);
return 0;
}
mkv_add_seekhead_entry(mkv, MATROSKA_ID_INFO, avio_tell(pb));
- ret = start_ebml_master_crc32(pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO);
+ ret = start_ebml_master_crc32(&mkv->info_bc, mkv);
if (ret < 0)
return ret;
pb = mkv->info_bc;
}
}
if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live)
- end_ebml_master_crc32_preliminary(s->pb, &mkv->info_bc, mkv, &mkv->info_pos);
+ end_ebml_master_crc32_preliminary(s->pb, &mkv->info_bc, mkv,
+ MATROSKA_ID_INFO, &mkv->info_pos);
else
- end_ebml_master_crc32(s->pb, &mkv->info_bc, mkv);
+ end_ebml_master_crc32(s->pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO);
pb = s->pb;
ret = mkv_write_tracks(s);
{
MatroskaMuxContext *mkv = s->priv_data;
- end_ebml_master_crc32(s->pb, &mkv->cluster_bc, mkv);
+ end_ebml_master_crc32(s->pb, &mkv->cluster_bc, mkv, MATROSKA_ID_CLUSTER);
mkv->cluster_pos = -1;
avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
}
if (mkv->cluster_pos == -1) {
mkv->cluster_pos = avio_tell(s->pb);
- ret = start_ebml_master_crc32(s->pb, &mkv->cluster_bc, mkv, MATROSKA_ID_CLUSTER);
+ ret = start_ebml_master_crc32(&mkv->cluster_bc, mkv);
if (ret < 0)
return ret;
put_ebml_uint(mkv->cluster_bc, MATROSKA_ID_CLUSTERTIMECODE, FFMAX(0, ts));
}
if (mkv->cluster_bc) {
- end_ebml_master_crc32(pb, &mkv->cluster_bc, mkv);
+ end_ebml_master_crc32(pb, &mkv->cluster_bc, mkv, MATROSKA_ID_CLUSTER);
}
ret = mkv_write_chapters(s);
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);
+ end_ebml_master_crc32(pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO);
// write tracks master
avio_seek(pb, mkv->tracks_pos, SEEK_SET);
- end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv);
+ end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, MATROSKA_ID_TRACKS);
// update stream durations
if (!mkv->is_live) {
}
if (mkv->tags_bc && !mkv->is_live) {
avio_seek(pb, mkv->tags_pos, SEEK_SET);
- end_ebml_master_crc32(pb, &mkv->tags_bc, mkv);
+ end_ebml_master_crc32(pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS);
}
avio_seek(pb, currentpos, SEEK_SET);