提交 6d8c67a7 编写于 作者: V Vitor Sessak

Change registered filter list to a linked list

Commited in SoC by Bobby Bingham on 2007-08-17 23:24:32

Originally committed as revision 12013 to svn://svn.ffmpeg.org/ffmpeg/trunk
上级 e675dccd
...@@ -27,9 +27,12 @@ ...@@ -27,9 +27,12 @@
#include "avfilter.h" #include "avfilter.h"
#include "allfilters.h" #include "allfilters.h"
/** list of registered filters, sorted by name */ /** list of registered filters */
static int filter_count = 0; struct FilterList
static AVFilter **filters = NULL; {
AVFilter *filter;
struct FilterList *next;
} *filters = NULL;
/** helper macros to get the in/out pad on the dst/src filter */ /** helper macros to get the in/out pad on the dst/src filter */
#define link_dpad(link) link->dst-> input_pads[link->dstpad] #define link_dpad(link) link->dst-> input_pads[link->dstpad]
...@@ -239,30 +242,25 @@ void avfilter_draw_slice(AVFilterLink *link, int y, int h) ...@@ -239,30 +242,25 @@ void avfilter_draw_slice(AVFilterLink *link, int y, int h)
link_dpad(link).draw_slice(link, y, h); link_dpad(link).draw_slice(link, y, h);
} }
static int filter_cmp(const void *aa, const void *bb)
{
const AVFilter *a = *(const AVFilter **)aa, *b = *(const AVFilter **)bb;
return strcmp(a->name, b->name);
}
AVFilter *avfilter_get_by_name(char *name) AVFilter *avfilter_get_by_name(char *name)
{ {
AVFilter key = { .name = name, }; struct FilterList *filt;
AVFilter *key2 = &key;
AVFilter **ret; for(filt = filters; filt; filt = filt->next)
if(!strcmp(filt->filter->name, name))
return filt->filter;
ret = bsearch(&key2, filters, filter_count, sizeof(AVFilter **), filter_cmp);
if(ret)
return *ret;
return NULL; return NULL;
} }
/* FIXME: insert in order, rather than insert at end + resort */ /* FIXME: insert in order, rather than insert at end + resort */
void avfilter_register(AVFilter *filter) void avfilter_register(AVFilter *filter)
{ {
filters = av_realloc(filters, sizeof(AVFilter*) * (filter_count+1)); struct FilterList *newfilt = av_malloc(sizeof(struct FilterList));
filters[filter_count] = filter;
qsort(filters, ++filter_count, sizeof(AVFilter **), filter_cmp); newfilt->filter = filter;
newfilt->next = filters;
filters = newfilt;
} }
void avfilter_init(void) void avfilter_init(void)
...@@ -283,8 +281,12 @@ void avfilter_init(void) ...@@ -283,8 +281,12 @@ void avfilter_init(void)
void avfilter_uninit(void) void avfilter_uninit(void)
{ {
av_freep(&filters); struct FilterList *tmp;
filter_count = 0;
for(; filters; filters = tmp) {
tmp = filters->next;
av_free(filters);
}
} }
static int pad_count(const AVFilterPad *pads) static int pad_count(const AVFilterPad *pads)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册