summaryrefslogtreecommitdiffstats
path: root/contrib/ffmpeg/A07-mp4-chapters.patch
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ffmpeg/A07-mp4-chapters.patch')
-rw-r--r--contrib/ffmpeg/A07-mp4-chapters.patch60
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
+