diff options
author | Andrey Semashev <andysem@mail.ru> | 2013-06-02 23:26:18 +0300 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2013-06-04 15:05:42 +0300 |
commit | 7c020e1ad37d27c9d5db4d714401f09c80e3cc44 (patch) | |
tree | 2eaae6e250a77d977a0e5f299883de4d6893c342 | |
parent | ab1189766a82a95f108005463cde75f73fcc0ae5 (diff) | |
download | ffmpeg-7c020e1ad37d27c9d5db4d714401f09c80e3cc44.tar.gz |
movenc: Grow the frag_info array in chunks
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>
-rw-r--r-- | libavformat/movenc.c | 11 | ||||
-rw-r--r-- | libavformat/movenc.h | 2 |
2 files changed, 10 insertions, 3 deletions
diff --git a/libavformat/movenc.c b/libavformat/movenc.c index e819d75b88..1dde214e3f 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -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; diff --git a/libavformat/movenc.h b/libavformat/movenc.h index 103b918361..d15d69ccaa 100644 --- a/libavformat/movenc.h +++ b/libavformat/movenc.h @@ -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; |