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;