[FFmpeg-devel] [PATCH] New registration system for avfilter filters

Stefano Sabatini stefano.sabatini-lala
Mon Nov 23 01:37:20 CET 2009


On date Monday 2009-11-23 00:07:02 +0100, Michael Niedermayer encoded:
> On Sun, Nov 22, 2009 at 08:47:47PM +0100, Stefano Sabatini wrote:
> > Hi,
> > 
> > this may be applied to the other list of registered elements in
> > libav*.
> > 
> > This system avoids a non-const field in struct AVFilter, thus allowing
> > for the use of shareable memory for the AVFilter definitions.
> > 
> > I'm also attaching a patch for an av_filter_next() which uses it, and
> > an application example.
> > 
> > Regards.
> > -- 
> > FFmpeg = Frightening and Funny Monstrous Pitiful ExchanGer
> 
> >  avfilter.c |   31 +++++++++++++++++--------------
> >  avfilter.h |    4 +++-
> >  2 files changed, 20 insertions(+), 15 deletions(-)
> > f971a01b2d1e8e9d30b76b68e9bbc99d7495b028  change-avfilter-register.patch
> > Index: ffmpeg/libavfilter/avfilter.c
> > ===================================================================
> > --- ffmpeg.orig/libavfilter/avfilter.c	2009-11-22 18:50:31.000000000 +0100
> > +++ ffmpeg/libavfilter/avfilter.c	2009-11-22 20:22:49.000000000 +0100
> > @@ -328,33 +328,36 @@
> >      draw_slice(link, y, h);
> >  }
> >  
> > -AVFilter *first_avfilter = NULL;
> > +#define MAX_REGISTERED_AVFILTERS_NB 64
> > +
> > +AVFilter *registered_avfilters[MAX_REGISTERED_AVFILTERS_NB + 1];
> >  
> >  AVFilter *avfilter_get_by_name(const char *name)
> >  {
> > -    AVFilter *filter;
> > -
> > -    for (filter = first_avfilter; filter; filter = filter->next)
> > -        if (!strcmp(filter->name, name))
> > -            return filter;
> 
> > +    for (int i = 0; registered_avfilters[i] && i < MAX_REGISTERED_AVFILTERS_NB; i++)
> 
> i suspect that breaks gcc 2.95
> 
> 
> > +        if (!strcmp(registered_avfilters[i]->name, name))
> > +            return registered_avfilters[i];
> >  
> >      return NULL;
> >  }
> >  
> 
> > -void avfilter_register(AVFilter *filter)
> > +int avfilter_register(AVFilter *filter)
> >  {
> > -    AVFilter **p;
> > -    p = &first_avfilter;
> > -    while (*p)
> > -        p = &(*p)->next;
> > +    int i;
> > +
> > +    for (i = 0; registered_avfilters[i] && i < MAX_REGISTERED_AVFILTERS_NB; i++)
> > +        ;
> 
> please keep a registered_avfilters_idx variable somewhere instead of this
> search

Done.

> > +
> > +    if (i == MAX_REGISTERED_AVFILTERS_NB)
> > +        return -1;
> >  
> > -    *p = filter;
> > -    filter->next = NULL;
> > +    registered_avfilters[i] = filter;
> > +    return 0;
> >  }
> >  
> 
> >  void avfilter_uninit(void)
> >  {
> > -    first_avfilter = NULL;
> > +    memset(registered_avfilters, 0, sizeof(AVFilter *) * MAX_REGISTERED_AVFILTERS_NB);
> 
> sizeof(registered_avfilters)

Fixed.
 
[...]

Regards.
-- 
FFmpeg = Faboulous Free Merciful Patchable Elastic God
-------------- next part --------------
A non-text attachment was scrubbed...
Name: change-avfilter-register.patch
Type: text/x-diff
Size: 2177 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20091123/0de68934/attachment.patch>



More information about the ffmpeg-devel mailing list