diff options
Diffstat (limited to 'contrib/ffmpeg/A07-mp4-chapters.patch')
-rw-r--r-- | contrib/ffmpeg/A07-mp4-chapters.patch | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/contrib/ffmpeg/A07-mp4-chapters.patch b/contrib/ffmpeg/A07-mp4-chapters.patch index e69de29bb..0fec0eaf9 100644 --- a/contrib/ffmpeg/A07-mp4-chapters.patch +++ b/contrib/ffmpeg/A07-mp4-chapters.patch @@ -0,0 +1,60 @@ +From 36bdd52964ef68532eea50a81431c0c4c9f329e5 Mon Sep 17 00:00:00 2001 +From: John Stebbins <[email protected]> +Date: Fri, 10 May 2013 08:51:46 -0700 +Subject: [PATCH 4/9] movenc: 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. +--- + libavformat/movenc.c | 19 ++++++++++++++++--- + 1 file changed, 16 insertions(+), 3 deletions(-) + +diff --git a/libavformat/movenc.c b/libavformat/movenc.c +index 496158c..f41f8d7 100644 +--- a/libavformat/movenc.c ++++ b/libavformat/movenc.c +@@ -3038,7 +3038,7 @@ static int mov_write_header(AVFormatContext *s) + } + + mov->nb_streams = s->nb_streams; +- if (mov->mode & (MODE_MOV|MODE_IPOD) && s->nb_chapters) ++ if (mov->mode & (MODE_MP4|MODE_MOV|MODE_IPOD) && s->nb_chapters) + mov->chapter_track = mov->nb_streams++; + + if (mov->flags & FF_MOV_FLAG_RTP_HINT) { +@@ -3053,7 +3053,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); + +@@ -3189,8 +3191,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 */ +-- +1.8.1.4 + |