[FFmpeg-devel] [PATCH 3/4] avformat/flvenc: Use array instead of linked list for index

Andreas Rheinhardt andreas.rheinhardt at gmail.com
Sat Oct 26 06:04:20 EEST 2019


On Fri, Oct 25, 2019 at 10:44 PM Michael Niedermayer <michael at niedermayer.cc>
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.rheinhardt at 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_realloc_array checks that the multiplication doesn't overflow (it
actually checks that
the product fits in an int). Given that sizeof(*flv->filepositions) is
bigger than 2, no overflow
can happen in 2 * flv->filepositions_allocated + 1.

- Andreas


More information about the ffmpeg-devel mailing list