diff options
author | James Almer <jamrial@gmail.com> | 2016-10-04 01:20:53 +0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2016-10-06 23:08:14 +0300 |
commit | eccefece616ee69ff4766a55cfcb78b6944550f6 (patch) | |
tree | 2148fcc45a864026fbc67670b15ce07bf3e02202 /libavformat | |
parent | 87ce2595de2c307d7b9c28d9a11b38eee5f1a38d (diff) |
avformat/matroskaenc: write a CRC32 element on Chapters
Implements part of ticket #4347
Tested-by: Dave Rice <dave@dericed.com>
Tested-by: Jerome Martinez <jerome@mediaarea.net>
Reviewed-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/matroskaenc.c | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index b3a3b941b1..98fdccf59e 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1270,7 +1270,7 @@ static int mkv_write_tracks(AVFormatContext *s) static int mkv_write_chapters(AVFormatContext *s) { MatroskaMuxContext *mkv = s->priv_data; - AVIOContext *pb = s->pb; + AVIOContext *dyn_cp, *pb = s->pb; ebml_master chapters, editionentry; AVRational scale = {1, 1E9}; int i, ret; @@ -1281,10 +1281,12 @@ static int mkv_write_chapters(AVFormatContext *s) ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CHAPTERS, avio_tell(pb)); if (ret < 0) return ret; - chapters = start_ebml_master(pb, MATROSKA_ID_CHAPTERS , 0); - editionentry = start_ebml_master(pb, MATROSKA_ID_EDITIONENTRY, 0); - put_ebml_uint(pb, MATROSKA_ID_EDITIONFLAGDEFAULT, 1); - put_ebml_uint(pb, MATROSKA_ID_EDITIONFLAGHIDDEN , 0); + ret = start_ebml_master_crc32(pb, &dyn_cp, &chapters, MATROSKA_ID_CHAPTERS, 0); + if (ret < 0) return ret; + + editionentry = start_ebml_master(dyn_cp, MATROSKA_ID_EDITIONENTRY, 0); + put_ebml_uint(dyn_cp, MATROSKA_ID_EDITIONFLAGDEFAULT, 1); + put_ebml_uint(dyn_cp, MATROSKA_ID_EDITIONFLAGHIDDEN , 0); for (i = 0; i < s->nb_chapters; i++) { ebml_master chapteratom, chapterdisplay; AVChapter *c = s->chapters[i]; @@ -1298,22 +1300,22 @@ static int mkv_write_chapters(AVFormatContext *s) return AVERROR_INVALIDDATA; } - chapteratom = start_ebml_master(pb, MATROSKA_ID_CHAPTERATOM, 0); - put_ebml_uint(pb, MATROSKA_ID_CHAPTERUID, c->id + mkv->chapter_id_offset); - put_ebml_uint(pb, MATROSKA_ID_CHAPTERTIMESTART, chapterstart); - put_ebml_uint(pb, MATROSKA_ID_CHAPTERTIMEEND, chapterend); - put_ebml_uint(pb, MATROSKA_ID_CHAPTERFLAGHIDDEN , 0); - put_ebml_uint(pb, MATROSKA_ID_CHAPTERFLAGENABLED, 1); + chapteratom = start_ebml_master(dyn_cp, MATROSKA_ID_CHAPTERATOM, 0); + put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERUID, c->id + mkv->chapter_id_offset); + put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERTIMESTART, chapterstart); + put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERTIMEEND, chapterend); + put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERFLAGHIDDEN , 0); + put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERFLAGENABLED, 1); if ((t = av_dict_get(c->metadata, "title", NULL, 0))) { - chapterdisplay = start_ebml_master(pb, MATROSKA_ID_CHAPTERDISPLAY, 0); - put_ebml_string(pb, MATROSKA_ID_CHAPSTRING, t->value); - put_ebml_string(pb, MATROSKA_ID_CHAPLANG , "und"); - end_ebml_master(pb, chapterdisplay); + chapterdisplay = start_ebml_master(dyn_cp, MATROSKA_ID_CHAPTERDISPLAY, 0); + put_ebml_string(dyn_cp, MATROSKA_ID_CHAPSTRING, t->value); + put_ebml_string(dyn_cp, MATROSKA_ID_CHAPLANG , "und"); + end_ebml_master(dyn_cp, chapterdisplay); } - end_ebml_master(pb, chapteratom); + end_ebml_master(dyn_cp, chapteratom); } - end_ebml_master(pb, editionentry); - end_ebml_master(pb, chapters); + end_ebml_master(dyn_cp, editionentry); + end_ebml_master_crc32(pb, &dyn_cp, mkv, chapters); mkv->wrote_chapters = 1; return 0; |