Merge commit '448c8cfe4c53e9e806effd8505b46d57fa707061'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 10 Mar 2015 10:42:44 +0000 (11:42 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 10 Mar 2015 10:42:44 +0000 (11:42 +0100)
* commit '448c8cfe4c53e9e806effd8505b46d57fa707061':
  movenc: Support setting fragment_index before the moov atom is written

Conflicts:
libavformat/movenc.c

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

@@@ -76,11 -70,9 +76,11 @@@ static const AVOption options[] = 
      { "min_frag_duration", "Minimum fragment duration", offsetof(MOVMuxContext, min_fragment_duration), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
      { "frag_size", "Maximum fragment size", offsetof(MOVMuxContext, max_fragment_size), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
      { "ism_lookahead", "Number of lookahead entries for ISM files", offsetof(MOVMuxContext, ism_lookahead), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
 +    { "video_track_timescale", "set timescale of all video tracks", offsetof(MOVMuxContext, video_track_timescale), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
      { "brand",    "Override major brand", offsetof(MOVMuxContext, major_brand),   AV_OPT_TYPE_STRING, {.str = NULL}, .flags = AV_OPT_FLAG_ENCODING_PARAM },
      { "use_editlist", "use edit list", offsetof(MOVMuxContext, use_editlist), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 1, AV_OPT_FLAG_ENCODING_PARAM},
-     { "fragment_index", "Fragment number of the next fragment", offsetof(MOVMuxContext, fragments), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
+     { "fragment_index", "Fragment number of the next fragment", offsetof(MOVMuxContext, fragments), AV_OPT_TYPE_INT, {.i64 = 1}, 1, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
 +    { "mov_gamma", "gamma value for gama atom", offsetof(MOVMuxContext, gamma), AV_OPT_TYPE_FLOAT, {.dbl = 0.0 }, 0.0, 10, AV_OPT_FLAG_ENCODING_PARAM},
      { NULL },
  };
  
@@@ -4058,10 -3119,12 +4058,10 @@@ static int mov_flush_fragment(AVFormatC
      if (!(mov->flags & FF_MOV_FLAG_FRAGMENT))
          return 0;
  
-     if (mov->fragments == 0) {
+     if (!mov->moov_written) {
          int64_t pos = avio_tell(s->pb);
 -        int ret;
 -        AVIOContext *moov_buf;
          uint8_t *buf;
 -        int buf_size;
 +        int buf_size, moov_size;
  
          for (i = 0; i < mov->nb_streams; i++)
              if (!mov->tracks[i].entry)
@@@ -4192,24 -3258,9 +4193,24 @@@ int ff_mov_write_packet(AVFormatContex
      int size = pkt->size, ret = 0;
      uint8_t *reformatted_data = NULL;
  
 +    if (trk->entry) {
 +        int64_t duration = pkt->dts - trk->cluster[trk->entry - 1].dts;
 +        if (duration < 0 || duration > INT_MAX) {
 +            av_log(s, AV_LOG_ERROR, "Application provided duration: %"PRId64" / timestamp: %"PRId64" is out of range for mov/mp4 format\n",
 +                duration, pkt->dts
 +            );
 +
 +            pkt->dts = trk->cluster[trk->entry - 1].dts + 1;
 +            pkt->pts = AV_NOPTS_VALUE;
 +        }
 +        if (pkt->duration < 0) {
 +            av_log(s, AV_LOG_ERROR, "Application provided duration: %d is invalid\n", pkt->duration);
 +            return AVERROR(EINVAL);
 +        }
 +    }
      if (mov->flags & FF_MOV_FLAG_FRAGMENT) {
          int ret;
-         if (mov->fragments > 0 || mov->flags & FF_MOV_FLAG_EMPTY_MOOV) {
+         if (mov->moov_written || mov->flags & FF_MOV_FLAG_EMPTY_MOOV) {
              if (!trk->mdat_buf) {
                  if ((ret = avio_open_dyn_buf(&trk->mdat_buf)) < 0)
                      return ret;
@@@ -5141,9 -3898,8 +5142,9 @@@ static int mov_write_header(AVFormatCon
  
      if (mov->flags & FF_MOV_FLAG_EMPTY_MOOV &&
          !(mov->flags & FF_MOV_FLAG_DELAY_MOOV)) {
 -        mov_write_moov_tag(pb, mov, s);
 +        if ((ret = mov_write_moov_tag(pb, mov, s)) < 0)
 +            return ret;
-         mov->fragments++;
+         mov->moov_written = 1;
          if (mov->flags & FF_MOV_FLAG_FASTSTART)
              mov->reserved_moov_pos = avio_tell(pb);
      }
Simple merge