提交 26b241c0 编写于 作者: J John Stebbins 提交者: Anton Khirnov

matroskaenc: Allow chapters to be written in trailer

This allows creation of frame accurate chapter marks from sources like
DVD and BD where the precise chapter location is not known until the
chapter mark has been reached during reading.
Signed-off-by: NAnton Khirnov <anton@khirnov.net>
上级 a711a2cb
......@@ -948,6 +948,17 @@ typedef struct AVFormatContext {
*/
unsigned int max_picture_buffer;
/**
* Number of chapters in AVChapter array.
* When muxing, chapters are normally written in the file header,
* so nb_chapters should normally be initialized before write_header
* is called. Some muxers (e.g. mov and mkv) can also write chapters
* in the trailer. To write chapters in the trailer, nb_chapters
* must be zero when write_header is called and non-zero when
* write_trailer is called.
* muxing : set by user
* demuxing: set by libavformat
*/
unsigned int nb_chapters;
AVChapter **chapters;
......
......@@ -103,6 +103,7 @@ typedef struct MatroskaMuxContext {
int cluster_size_limit;
int64_t cues_pos;
int64_t cluster_time_limit;
int wrote_chapters;
} MatroskaMuxContext;
......@@ -710,7 +711,7 @@ static int mkv_write_chapters(AVFormatContext *s)
AVRational scale = {1, 1E9};
int i, ret;
if (!s->nb_chapters)
if (!s->nb_chapters || mkv->wrote_chapters)
return 0;
ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CHAPTERS, avio_tell(pb));
......@@ -743,6 +744,8 @@ static int mkv_write_chapters(AVFormatContext *s)
}
end_ebml_master(pb, editionentry);
end_ebml_master(pb, chapters);
mkv->wrote_chapters = 1;
return 0;
}
......@@ -1391,6 +1394,11 @@ static int mkv_write_trailer(AVFormatContext *s)
end_ebml_master(pb, mkv->cluster);
}
if (mkv->mode != MODE_WEBM) {
ret = mkv_write_chapters(s);
if (ret < 0) return ret;
}
if (pb->seekable) {
if (mkv->cues->num_entries) {
if (mkv->reserve_cues_space) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册