On 10/25/2019 5:44 PM, Michael Niedermayer wrote: > On Fri, Oct 25, 2019 at 11:11:46AM +0200, Andreas Rheinhardt wrote: >> Using a linked list had very much overhead (the pointer to the next >> entry increased the size of the index entry struct from 16 to 24 bytes, >> not to mention the overhead of having separate allocations), so it is >> better to (re)allocate a continuous array for the index. >> >> Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@gmail.com> >> --- >> libavformat/flvenc.c | 58 +++++++++++++++----------------------------- >> 1 file changed, 19 insertions(+), 39 deletions(-) >> >> diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c >> index 0e6c66a5ff..a2bd791c59 100644 >> --- a/libavformat/flvenc.c >> +++ b/libavformat/flvenc.c >> @@ -74,7 +74,6 @@ typedef enum { >> typedef struct FLVFileposition { >> int64_t keyframe_position; >> double keyframe_timestamp; >> - struct FLVFileposition *next; >> } FLVFileposition; >> >> typedef struct FLVContext { >> @@ -108,9 +107,9 @@ typedef struct FLVContext { >> int acurframeindex; >> int64_t keyframes_info_offset; >> >> - int64_t filepositions_count; >> FLVFileposition *filepositions; >> - FLVFileposition *head_filepositions; >> + size_t filepositions_allocated; >> + int64_t filepositions_count; >> >> AVCodecParameters *audio_par; >> AVCodecParameters *video_par; >> @@ -549,27 +548,19 @@ static void flv_write_codec_header(AVFormatContext* s, >> AVCodecParameters* par, i >> >> static int flv_append_keyframe_info(AVFormatContext *s, FLVContext *flv, >> double ts, int64_t pos) >> { >> - FLVFileposition *position = av_malloc(sizeof(FLVFileposition)); >> - >> - if (!position) { >> - av_log(s, AV_LOG_WARNING, "no mem for add keyframe index!\n"); >> - return AVERROR(ENOMEM); >> - } >> - >> - position->keyframe_timestamp = ts; >> - position->keyframe_position = pos; >> - >> - if (!flv->filepositions_count) { >> - flv->filepositions = position; >> - flv->head_filepositions = flv->filepositions; >> - position->next = NULL; >> - } else { >> - flv->filepositions->next = position; >> - position->next = NULL; >> - flv->filepositions = flv->filepositions->next; >> + if (flv->filepositions_count >= flv->filepositions_allocated) { >> + void *pos = av_realloc_array(flv->filepositions, >> + 2 * flv->filepositions_allocated + 1, >> + sizeof(*flv->filepositions)); > > can the 2* overflow ? > av_fast_realloc() would check for that > i wonder if a av_fast_realloc_array() would make sense
av_fast_realloc() doesn't do any overflow check. It only checks that the min_size argument is below the max allowed alloc size. But i agree that using it preceded by a sanity check that ensures something like "flv->filepositions_count + 1 <= INT_MAX / sizeof(*flv->filepositions)" would be more adequate than av_realloc_array() with 2*size steps. > > thx > > [...] > > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".