Merge commit '6c786765cd5eb794dedd4a0970dfe689b16dfeeb'
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 21 Aug 2013 08:59:02 +0000 (10:59 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 21 Aug 2013 09:00:26 +0000 (11:00 +0200)
* commit '6c786765cd5eb794dedd4a0970dfe689b16dfeeb':
  movenc: Allow chapters to be written in trailer

Conflicts:
libavformat/movenc.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavformat/movenc.c

@@@ -3602,33 -3074,9 +3602,35 @@@ static int mov_write_header(AVFormatCon
          }
      }
  
-     mov->tracks = av_mallocz(mov->nb_streams * sizeof(*mov->tracks));
 +    if (mov->mode == MODE_MOV) {
 +        tmcd_track = mov->nb_streams;
 +
 +        /* +1 tmcd track for each video stream with a timecode */
 +        for (i = 0; i < s->nb_streams; i++) {
 +            AVStream *st = s->streams[i];
 +            if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
 +                (global_tcr || av_dict_get(st->metadata, "timecode", NULL, 0)))
 +                mov->nb_meta_tmcd++;
 +        }
 +
 +        /* check if there is already a tmcd track to remux */
 +        if (mov->nb_meta_tmcd) {
 +            for (i = 0; i < s->nb_streams; i++) {
 +                AVStream *st = s->streams[i];
 +                if (st->codec->codec_tag == MKTAG('t','m','c','d')) {
 +                    av_log(s, AV_LOG_WARNING, "You requested a copy of the original timecode track "
 +                           "so timecode metadata are now ignored\n");
 +                    mov->nb_meta_tmcd = 0;
 +                }
 +            }
 +        }
 +
 +        mov->nb_streams += mov->nb_meta_tmcd;
 +    }
 +
+     // 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);
  
@@@ -3897,23 -3212,20 +3899,33 @@@ static int mov_write_trailer(AVFormatCo
  {
      MOVMuxContext *mov = s->priv_data;
      AVIOContext *pb = s->pb;
-     int64_t moov_pos;
      int res = 0;
      int i;
+     int64_t moov_pos;
  
 +    /*
 +     * Before actually writing the trailer, make sure that there are no
 +     * dangling subtitles, that need a terminating sample.
 +     */
 +    for (i = 0; i < mov->nb_streams; i++) {
 +        MOVTrack *trk = &mov->tracks[i];
 +        if (trk->enc->codec_id == AV_CODEC_ID_MOV_TEXT &&
 +            !trk->last_sample_is_subtitle_end) {
 +            mov_write_subtitle_end_packet(s, i, trk->track_duration);
 +            trk->last_sample_is_subtitle_end = 1;
 +        }
 +    }
 +
+     // 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);
+         }
+     }
      moov_pos = avio_tell(pb);
  
      if (!(mov->flags & FF_MOV_FLAG_FRAGMENT)) {