Browse Source

movenc: Keep track of the allocated size for the cluster array

When writing fragmented mp4, the cluster array is reset when a
fragment is written. Instead of starting off reallocating the
array only based on the number of current elements in it, keep
track of how many elements there were allocated earlier.

This avoids reallocating this array needlessly when writing
fragmented mp4 files.

Bug-Id: 525
Signed-off-by: Martin Storsjö <martin@martin.st>
tags/n2.0
Andrey Semashev Martin Storsjö 12 years ago
parent
commit
3b4feac1ec
2 changed files with 7 additions and 4 deletions
  1. +6
    -4
      libavformat/movenc.c
  2. +1
    -0
      libavformat/movenc.h

+ 6
- 4
libavformat/movenc.c View File

@@ -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;


+ 1
- 0
libavformat/movenc.h View File

@@ -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;


Loading…
Cancel
Save