summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libavformat/movenc.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 3338f46..39d4e44 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -3074,7 +3074,9 @@ static int mov_write_header(AVFormatContext *s)
}
}
- mov->tracks = av_mallocz(mov->nb_streams * sizeof(*mov->tracks));
+ // Reserve an extra stream for chapters for the case where chapters
+ // are written in the trailer
+ mov->tracks = av_mallocz((mov->nb_streams + 1) * sizeof(*mov->tracks));
if (!mov->tracks)
return AVERROR(ENOMEM);
@@ -3212,8 +3214,19 @@ static int mov_write_trailer(AVFormatContext *s)
AVIOContext *pb = s->pb;
int res = 0;
int i;
+ int64_t moov_pos;
+
+ // If there were no chapters when the header was written, but there
+ // are chapters now, write them in the trailer. This only works
+ // when we are not doing fragments.
+ if (!mov->chapter_track && !(mov->flags & FF_MOV_FLAG_FRAGMENT)) {
+ if (mov->mode & (MODE_MP4|MODE_MOV|MODE_IPOD) && s->nb_chapters) {
+ mov->chapter_track = mov->nb_streams++;
+ mov_create_chapter_track(s, mov->chapter_track);
+ }
+ }
- int64_t moov_pos = avio_tell(pb);
+ moov_pos = avio_tell(pb);
if (!(mov->flags & FF_MOV_FLAG_FRAGMENT)) {
/* Write size of mdat tag */
OpenPOWER on IntegriCloud