[FFmpeg-devel] [PATCH 0/7] ffmpeg: add a grow_array() helper function

Michael Niedermayer michaelni
Wed Aug 18 22:46:14 CEST 2010


On Tue, Aug 17, 2010 at 12:09:52AM +0200, Aurelien Jacobs wrote:
> On Mon, Aug 16, 2010 at 11:44:26AM -0400, Ronald S. Bultje wrote:
> > Hi,
> > 
> > On Mon, Aug 16, 2010 at 2:00 PM, Michael Niedermayer <michaelni at gmx.at> wrote:
> > > On Fri, Aug 13, 2010 at 08:28:12PM +0200, Aurelien Jacobs wrote:
> > >> Ooops... I slightly messed up this patch serie.
> > >> I forgot the first patch which adds a grow_array() function which is
> > >> then used by all the following patches. Here it is.
> > >> The rest of the serie changes each *[MAX_STREAMS] arrays from ffmpeg.c
> > >> into a dynamically allocated array.
> > >>
> > >> Aurel
> > >>
> > >>
> > >> diff --git a/ffmpeg.c b/ffmpeg.c
> > >> index aec1f79..28ce27f 100644
> > >> --- a/ffmpeg.c
> > >> +++ b/ffmpeg.c
> > >> @@ -646,6 +646,23 @@ static int ffmpeg_exit(int ret)
> > >> ? ? ?return ret;
> > >> ?}
> > >>
> > >> +static void *grow_array(void *array, int elem_size, int *size, int new_size)
> > >> +{
> > >> + ? ?if (*size < new_size) {
> > >> + ? ? ? ?uint8_t *tmp = av_realloc(array, new_size*elem_size);
> > >
> > > integer overflow
> 
> Added a check.
> 
> > > also see ff_dynarray_add() and add notes that refer to it and back so changed
> > > done to one can be checked if they would also be usefull to the other
> 
> Note added.
> 
> > Isn't this the same as av_fast_realloc()?
> 
> Not exactly. It is different from both ff_dynarray_add() and
> av_fast_realloc(). This one indeed extand the size of an allocation, but
> it also memset(0) the newly allocated part (to allow sparse array with
> no uninitialized elements) and it keep track of the number of elements
> in the array, instead of the size of the buffer.
> 
> Aurel
>  ffmpeg.c             |   22 ++++++++++++++++++++++
>  libavformat/cutils.c |    1 +
>  2 files changed, 23 insertions(+)
> f233c6a7f4fba2259ca9fa0fa8d9431965737e40  grow_array.diff
> commit a392dcf1f80cec191262051cbb315f24549e724f
> Author: Aurelien Jacobs <aurel at gnuage.org>
> Date:   Fri Aug 13 16:58:19 2010 +0200
> 
>     ffmpeg: add a grow_array() helper function
> 
> diff --git a/ffmpeg.c b/ffmpeg.c
> index aec1f79..da74dce 100644
> --- a/ffmpeg.c
> +++ b/ffmpeg.c
> @@ -646,6 +646,28 @@ static int ffmpeg_exit(int ret)
>      return ret;
>  }
>  
> +/* similar to ff_dynarray_add() and av_fast_realloc() */
> +static void *grow_array(void *array, int elem_size, int *size, int new_size)
> +{
> +    if (new_size >= INT_MAX / elem_size) {
> +        fprintf(stderr, "Array too big.\n");
> +        ffmpeg_exit(1);
> +    }
> +    if (*size < new_size) {
> +        uint8_t *tmp = av_realloc(array, new_size*elem_size);
> +        if (!tmp) {
> +            fprintf(stderr, "Could not alloc buffer.\n");
> +            ffmpeg_exit(1);
> +        }
> +        memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
> +        *size = new_size;
> +        return tmp;
> +    }
> +    return array;
> +}

> +#define GROW_ARRAY(array, size)  \
> +    array = grow_array(array, sizeof(*array), &nb_##array, size)

iam not a fan of such macros, they hurt readability alot for the little
gain of a few keypresses. (that is for everyone except the author who
remembers how the argumets to the macro are munged into indentifers and
what they are used for)

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

I do not agree with what you have to say, but I'll defend to the death your
right to say it. -- Voltaire
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 190 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20100818/d311ee75/attachment.pgp>



More information about the ffmpeg-devel mailing list