Implement a new registration system for filters.
authorStefano Sabatini <stefano.sabatini-lala@poste.it>
Tue, 24 Nov 2009 23:47:33 +0000 (23:47 +0000)
committerStefano Sabatini <stefano.sabatini-lala@poste.it>
Tue, 24 Nov 2009 23:47:33 +0000 (23:47 +0000)
Create a new static array containing pointers to the AVFilter
definitions, so that the non-constant next filter in the AVFilter
struct is not anymore required and the AVFilter definitions may be
stored in shareable memory.

Also change the signature for avfilter_register(), make it return an
int since it may fail if there is not enough space in the static array
for the registered filters.

Originally committed as revision 20605 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavfilter/avfilter.c
libavfilter/avfilter.h

index 450a632..05a0fea 100644 (file)
@@ -328,33 +328,36 @@ void avfilter_draw_slice(AVFilterLink *link, int y, int h)
     draw_slice(link, y, h);
 }
 
-AVFilter *first_avfilter = NULL;
+#define MAX_REGISTERED_AVFILTERS_NB 64
+
+static AVFilter *registered_avfilters[MAX_REGISTERED_AVFILTERS_NB + 1];
+
+static int next_registered_avfilter_idx = 0;
 
 AVFilter *avfilter_get_by_name(const char *name)
 {
-    AVFilter *filter;
+    int i;
 
-    for (filter = first_avfilter; filter; filter = filter->next)
-        if (!strcmp(filter->name, name))
-            return filter;
+    for (i = 0; registered_avfilters[i]; i++)
+        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;
+    if (next_registered_avfilter_idx == MAX_REGISTERED_AVFILTERS_NB)
+        return -1;
 
-    *p = filter;
-    filter->next = NULL;
+    registered_avfilters[next_registered_avfilter_idx++] = filter;
+    return 0;
 }
 
 void avfilter_uninit(void)
 {
-    first_avfilter = NULL;
+    memset(registered_avfilters, 0, sizeof(registered_avfilters));
+    next_registered_avfilter_idx = 0;
 }
 
 static int pad_count(const AVFilterPad *pads)
index 52d942c..e273133 100644 (file)
@@ -25,7 +25,7 @@
 #include "libavutil/avutil.h"
 
 #define LIBAVFILTER_VERSION_MAJOR  1
-#define LIBAVFILTER_VERSION_MINOR  8
+#define LIBAVFILTER_VERSION_MINOR  9
 #define LIBAVFILTER_VERSION_MICRO  0
 
 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
@@ -581,8 +581,10 @@ void avfilter_uninit(void);
  * filter can still by instantiated with avfilter_open even if it is not
  * registered.
  * @param filter the filter to register
+ * @return 0 if the registration was succesfull, a negative value
+ * otherwise
  */
-void avfilter_register(AVFilter *filter);
+int avfilter_register(AVFilter *filter);
 
 /**
  * Gets a filter definition matching the given name.