[FFmpeg-devel] [PATCH 2/2] avformat/mov: simplify allocating stts/ctts arrays
James Almer
jamrial at gmail.com
Tue Jan 14 00:27:38 EET 2025
No point using av_fast_realloc() in a loop when we want to allocate all
entries to begin with, and any duplicate stts/ctts will just replace the
old arrays.
Furthermore, these are temporary arrays that will be merged into tts_data
when building the index.
Signed-off-by: James Almer <jamrial at gmail.com>
---
libavformat/isom.h | 2 --
libavformat/mov.c | 40 ++++++----------------------------------
2 files changed, 6 insertions(+), 36 deletions(-)
diff --git a/libavformat/isom.h b/libavformat/isom.h
index ccdead7192..16981dc918 100644
--- a/libavformat/isom.h
+++ b/libavformat/isom.h
@@ -183,12 +183,10 @@ typedef struct MOVStreamContext {
unsigned int tts_allocated_size;
MOVTimeToSample *tts_data;
unsigned int stts_count;
- unsigned int stts_allocated_size;
MOVStts *stts_data;
unsigned int sdtp_count;
uint8_t *sdtp_data;
unsigned int ctts_count;
- unsigned int ctts_allocated_size;
MOVCtts *ctts_data;
unsigned int stsc_count;
MOVStsc *stsc_data;
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 138120488a..f310cb8d49 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -3498,22 +3498,14 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
av_log(c->fc, AV_LOG_WARNING, "Duplicated STTS atom\n");
av_freep(&sc->stts_data);
sc->stts_count = 0;
- if (entries >= INT_MAX / sizeof(*sc->stts_data))
+
+ sc->stts_data = av_malloc_array(entries, sizeof(*sc->stts_data));
+ if (!sc->stts_data)
return AVERROR(ENOMEM);
for (i = 0; i < entries && !pb->eof_reached; i++) {
unsigned int sample_duration;
unsigned int sample_count;
- unsigned int min_entries = FFMIN(FFMAX(i + 1, 1024 * 1024), entries);
- MOVStts *stts_data = av_fast_realloc(sc->stts_data, &sc->stts_allocated_size,
- min_entries * sizeof(*sc->stts_data));
- if (!stts_data) {
- av_freep(&sc->stts_data);
- sc->stts_count = 0;
- return AVERROR(ENOMEM);
- }
- sc->stts_count = min_entries;
- sc->stts_data = stts_data;
sample_count = avio_rb32(pb);
sample_duration = avio_rb32(pb);
@@ -3656,20 +3648,12 @@ static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
if (!entries)
return 0;
- if (entries >= UINT_MAX / sizeof(*sc->ctts_data))
- return AVERROR_INVALIDDATA;
av_freep(&sc->ctts_data);
- sc->ctts_data = av_fast_realloc(NULL, &sc->ctts_allocated_size, entries * sizeof(*sc->ctts_data));
+ sc->ctts_data = av_malloc_array(entries, sizeof(*sc->ctts_data));
if (!sc->ctts_data)
return AVERROR(ENOMEM);
for (i = 0; i < entries && !pb->eof_reached; i++) {
- MOVCtts *ctts_data;
- const size_t min_size_needed = (ctts_count + 1) * sizeof(MOVCtts);
- const size_t requested_size =
- min_size_needed > sc->ctts_allocated_size ?
- FFMAX(min_size_needed, 2 * sc->ctts_allocated_size) :
- min_size_needed;
int count = avio_rb32(pb);
int duration = avio_rb32(pb);
@@ -3680,18 +3664,8 @@ static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
continue;
}
- if (ctts_count >= UINT_MAX / sizeof(MOVCtts) - 1)
- return AVERROR(ENOMEM);
-
- ctts_data = av_fast_realloc(sc->ctts_data, &sc->ctts_allocated_size, requested_size);
-
- if (!ctts_data)
- return AVERROR(ENOMEM);
-
- sc->ctts_data = ctts_data;
-
- ctts_data[ctts_count].count = count;
- ctts_data[ctts_count].offset = duration;
+ sc->ctts_data[ctts_count].count = count;
+ sc->ctts_data[ctts_count].offset = duration;
ctts_count++;
av_log(c->fc, AV_LOG_TRACE, "count=%d, duration=%d\n",
@@ -4585,7 +4559,6 @@ static int mov_merge_tts_data(MOVContext *mov, AVStream *st, int flags)
} else
sc->ctts_count = 0;
av_freep(&sc->ctts_data);
- sc->ctts_allocated_size = 0;
idx = 0;
if (stts) {
@@ -4610,7 +4583,6 @@ static int mov_merge_tts_data(MOVContext *mov, AVStream *st, int flags)
} else
sc->stts_count = 0;
av_freep(&sc->stts_data);
- sc->stts_allocated_size = 0;
return 0;
}
--
2.48.0
More information about the ffmpeg-devel
mailing list