summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavformat/movenc.c10
-rw-r--r--libavformat/movenc.h1
2 files changed, 7 insertions, 4 deletions
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 4ed99b7ea3..e2591681a5 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -2869,10 +2869,12 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
memcpy(trk->vos_data, pkt->data, size);
}
- if (!(trk->entry % MOV_INDEX_CLUSTER_SIZE)) {
- trk->cluster = av_realloc(trk->cluster, (trk->entry + MOV_INDEX_CLUSTER_SIZE) * sizeof(*trk->cluster));
- if (!trk->cluster)
- return -1;
+ if (trk->entry >= trk->cluster_capacity) {
+ unsigned new_capacity = trk->entry + MOV_INDEX_CLUSTER_SIZE;
+ if (av_reallocp_array(&trk->cluster, new_capacity,
+ sizeof(*trk->cluster)))
+ return AVERROR(ENOMEM);
+ trk->cluster_capacity = new_capacity;
}
trk->cluster[trk->entry].pos = avio_tell(pb) - size;
diff --git a/libavformat/movenc.h b/libavformat/movenc.h
index 879c942a9f..2aa8ffb7e4 100644
--- a/libavformat/movenc.h
+++ b/libavformat/movenc.h
@@ -93,6 +93,7 @@ typedef struct MOVTrack {
int vos_len;
uint8_t *vos_data;
MOVIentry *cluster;
+ unsigned cluster_capacity;
int audio_vbr;
int height; ///< active picture (w/o VBI) height for D-10/IMX
uint32_t tref_tag;