Merge commit 'f369b9356c4606cd4d713d60f7db5de119d901fa'
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 11 Sep 2013 08:54:41 +0000 (10:54 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 11 Sep 2013 09:23:40 +0000 (11:23 +0200)
* commit 'f369b9356c4606cd4d713d60f7db5de119d901fa':
  avformat: Use av_reallocp_array() where suitable

Conflicts:
libavformat/asfenc.c
libavformat/gxfenc.c
libavformat/mov.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavformat/asfenc.c
libavformat/gxfenc.c
libavformat/matroskadec.c
libavformat/matroskaenc.c
libavformat/mov.c
libavformat/mpegts.c
libavformat/mxfdec.c
libavformat/oggdec.c
libavformat/utils.c

@@@ -760,43 -757,15 +760,52 @@@ static void put_frame(AVFormatContext *
      stream->seq++;
  }
  
- static void update_index(AVFormatContext *s, int start_sec,
++static int update_index(AVFormatContext *s, int start_sec,
 +                         uint32_t packet_number, uint16_t packet_count)
 +{
 +    ASFContext *asf = s->priv_data;
 +
 +    if (start_sec > asf->next_start_sec) {
 +        int i;
 +
 +        if (!asf->next_start_sec) {
 +            asf->next_packet_number = packet_number;
 +            asf->next_packet_count  = packet_count;
 +        }
 +
 +        if (start_sec > asf->nb_index_memory_alloc) {
++            int err;
 +            asf->nb_index_memory_alloc = (start_sec + ASF_INDEX_BLOCK) & ~(ASF_INDEX_BLOCK - 1);
-             asf->index_ptr = av_realloc( asf->index_ptr, sizeof(ASFIndex) * asf->nb_index_memory_alloc );
++            if ((err = av_reallocp_array(&asf->index_ptr,
++                                         asf->nb_index_memory_alloc,
++                                         sizeof(*asf->index_ptr))) < 0) {
++                asf->nb_index_memory_alloc = 0;
++                return err;
++            }
 +        }
 +        for (i = asf->next_start_sec; i < start_sec; i++) {
 +            asf->index_ptr[i].packet_number = asf->next_packet_number;
 +            asf->index_ptr[i].packet_count  = asf->next_packet_count;
 +        }
 +    }
 +    asf->maximum_packet     = FFMAX(asf->maximum_packet, packet_count);
 +    asf->next_packet_number = packet_number;
 +    asf->next_packet_count  = packet_count;
 +    asf->next_start_sec     = start_sec;
++
++    return 0;
 +}
 +
  static int asf_write_packet(AVFormatContext *s, AVPacket *pkt)
  {
      ASFContext *asf = s->priv_data;
      ASFStream *stream;
 -    int64_t duration;
      AVCodecContext *codec;
 -    int64_t packet_st, pts;
 -    int start_sec, i;
 +    uint32_t packet_number;
 +    int64_t pts;
 +    int start_sec;
      int flags = pkt->flags;
++    int ret;
  
      codec  = s->streams[pkt->stream_index]->codec;
      stream = &asf->streams[pkt->stream_index];
      put_frame(s, stream, s->streams[pkt->stream_index],
                pkt->dts, pkt->data, pkt->size, flags);
  
 +    start_sec = (int)((PREROLL_TIME * 10000 + pts + ASF_INDEXED_INTERVAL - 1)
 +              / ASF_INDEXED_INTERVAL);
 +
      /* check index */
      if ((!asf->is_streamed) && (flags & AV_PKT_FLAG_KEY)) {
 -        start_sec = (int)(duration / INT64_C(10000000));
 -        if (start_sec != (int)(asf->last_indexed_pts / INT64_C(10000000))) {
 -            for (i = asf->nb_index_count; i < start_sec; i++) {
 -                if (i >= asf->nb_index_memory_alloc) {
 -                    int err;
 -                    asf->nb_index_memory_alloc += ASF_INDEX_BLOCK;
 -                    if ((err = av_reallocp_array(&asf->index_ptr,
 -                                                asf->nb_index_memory_alloc,
 -                                                sizeof(*asf->index_ptr))) < 0) {
 -                       asf->nb_index_memory_alloc = 0;
 -                       return err;
 -                   }
 -                }
 -                // store
 -                asf->index_ptr[i].packet_number = (uint32_t)packet_st;
 -                asf->index_ptr[i].packet_count  = (uint16_t)(asf->nb_packets - packet_st);
 -                asf->maximum_packet             = FFMAX(asf->maximum_packet,
 -                                                        (uint16_t)(asf->nb_packets - packet_st));
 -            }
 -            asf->nb_index_count   = start_sec;
 -            asf->last_indexed_pts = duration;
 -        }
 +        uint16_t packet_count = asf->nb_packets - packet_number;
-         update_index(s, start_sec, packet_number, packet_count);
++        if ((ret = update_index(s, start_sec, packet_number, packet_count)) < 0)
++            return ret;
      }
 +    asf->end_sec = start_sec;
 +
      return 0;
  }
  
@@@ -850,6 -834,6 +860,7 @@@ static int asf_write_trailer(AVFormatCo
  {
      ASFContext *asf = s->priv_data;
      int64_t file_size, data_size;
++    int ret;
  
      /* flush the current packet */
      if (asf->pb.buf_ptr > asf->pb.buffer)
  
      /* write index */
      data_size = avio_tell(s->pb);
 -    if ((!asf->is_streamed) && (asf->nb_index_count != 0))
 -        asf_write_index(s, asf->index_ptr, asf->maximum_packet, asf->nb_index_count);
 +    if (!asf->is_streamed && asf->next_start_sec) {
-         update_index(s, asf->end_sec + 1, 0, 0);
++        if ((ret = update_index(s, asf->end_sec + 1, 0, 0)) < ret)
++            return ret;
 +        asf_write_index(s, asf->index_ptr, asf->maximum_packet, asf->next_start_sec);
 +    }
      avio_flush(s->pb);
  
      if (asf->is_streamed || !s->pb->seekable) {
Simple merge
Simple merge
@@@ -381,9 -377,10 +384,10 @@@ static mkv_cues * mkv_start_cues(int64_
      return cues;
  }
  
 -static int mkv_add_cuepoint(mkv_cues *cues, int stream, int64_t ts, int64_t cluster_pos)
 +static int mkv_add_cuepoint(mkv_cues *cues, int stream, int64_t ts, int64_t cluster_pos, int64_t relative_pos)
  {
      mkv_cuepoint *entries = cues->entries;
+     int err;
  
      if (ts < 0)
          return 0;
@@@ -2062,16 -1841,14 +2062,15 @@@ static void mov_build_index(MOVContext 
      unsigned int stps_index = 0;
      unsigned int i, j;
      uint64_t stream_size = 0;
-     AVIndexEntry *mem;
  
      /* adjust first dts according to edit list */
 -    if (sc->time_offset && mov->time_scale > 0) {
 -        if (sc->time_offset < 0)
 -            sc->time_offset = av_rescale(sc->time_offset, sc->time_scale, mov->time_scale);
 +    if ((sc->empty_duration || sc->start_time) && mov->time_scale > 0) {
 +        if (sc->empty_duration)
 +            sc->empty_duration = av_rescale(sc->empty_duration, sc->time_scale, mov->time_scale);
 +        sc->time_offset = sc->start_time - sc->empty_duration;
          current_dts = -sc->time_offset;
 -        if (sc->ctts_data && sc->stts_data && sc->stts_data[0].duration &&
 -            sc->ctts_data[0].duration / sc->stts_data[0].duration > 16) {
 +        if (sc->ctts_count>0 && sc->stts_count>0 &&
 +            sc->ctts_data[0].duration / FFMAX(sc->stts_data[0].duration, 1) > 16) {
              /* more than 16 frames delay, dts are likely wrong
                 this happens with files created by iMovie */
              sc->wrong_dts = 1;
@@@ -2584,13 -2314,11 +2588,14 @@@ static int mov_read_trex(MOVContext *c
  
      if ((uint64_t)c->trex_count+1 >= UINT_MAX / sizeof(*c->trex_data))
          return AVERROR_INVALIDDATA;
-     trex = av_realloc(c->trex_data, (c->trex_count+1)*sizeof(*c->trex_data));
-     if (!trex)
-         return AVERROR(ENOMEM);
+     if ((err = av_reallocp_array(&c->trex_data, c->trex_count + 1,
+                                  sizeof(*c->trex_data))) < 0) {
+         c->trex_count = 0;
+         return err;
+     }
 +
 +    c->fc->duration = AV_NOPTS_VALUE; // the duration from mvhd is not representing the whole file when fragments are used.
 +
-     c->trex_data = trex;
      trex = &c->trex_data[c->trex_count++];
      avio_r8(pb); /* version */
      avio_rb24(pb); /* flags */
Simple merge
Simple merge
@@@ -102,19 -97,15 +101,16 @@@ static int ogg_restore(AVFormatContext 
              av_free(ogg->streams[i].buf);
  
          avio_seek(bc, ost->pos, SEEK_SET);
 +        ogg->page_pos = -1;
          ogg->curidx   = ost->curidx;
          ogg->nstreams = ost->nstreams;
-         ogg->streams  = av_realloc(ogg->streams,
-                                    ogg->nstreams * sizeof(*ogg->streams));
-         if (ogg->streams) {
+         if ((err = av_reallocp_array(&ogg->streams, ogg->nstreams,
+                                      sizeof(*ogg->streams))) < 0) {
+             ogg->nstreams = 0;
+             return err;
+         } else
              memcpy(ogg->streams, ost->streams,
                     ost->nstreams * sizeof(*ogg->streams));
-         } else {
-             av_free(old_streams);
-             ogg->nstreams = 0;
-         }
      }
  
      av_free(ost);
Simple merge