movenc: Grow the frag_info array in chunks
authorAndrey Semashev <andysem@mail.ru>
Sun, 2 Jun 2013 20:26:18 +0000 (23:26 +0300)
committerMartin Storsjö <martin@martin.st>
Tue, 4 Jun 2013 12:05:42 +0000 (15:05 +0300)
Previously it was grown one element at a time, which leads to
excessive reallocations.

Bug-Id: 525
Signed-off-by: Martin Storsjö <martin@martin.st>
libavformat/movenc.c
libavformat/movenc.h

index e819d75..1dde214 100644 (file)
@@ -2757,9 +2757,14 @@ static int mov_flush_fragment(AVFormatContext *s)
             MOVFragmentInfo *info;
             avio_flush(s->pb);
             track->nb_frag_info++;
-            track->frag_info = av_realloc(track->frag_info,
-                                          sizeof(*track->frag_info) *
-                                          track->nb_frag_info);
+            if (track->nb_frag_info >= track->frag_info_capacity) {
+                unsigned new_capacity = track->nb_frag_info + MOV_FRAG_INFO_ALLOC_INCREMENT;
+                if (av_reallocp_array(&track->frag_info,
+                                      new_capacity,
+                                      sizeof(*track->frag_info)))
+                    return AVERROR(ENOMEM);
+                track->frag_info_capacity = new_capacity;
+            }
             info = &track->frag_info[track->nb_frag_info - 1];
             info->offset   = avio_tell(s->pb);
             info->time     = mov->tracks[i].frag_start;
index 103b918..d15d69c 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "avformat.h"
 
+#define MOV_FRAG_INFO_ALLOC_INCREMENT 64
 #define MOV_INDEX_CLUSTER_SIZE 1024
 #define MOV_TIMESCALE 1000
 
@@ -121,6 +122,7 @@ typedef struct MOVTrack {
 
     int         nb_frag_info;
     MOVFragmentInfo *frag_info;
+    unsigned    frag_info_capacity;
 
     struct {
         int64_t struct_offset;