|
@@ -386,55 +386,53 @@ int avfilter_process_command(AVFilterContext *filter, const char *cmd, const cha
|
|
|
return AVERROR(ENOSYS);
|
|
|
}
|
|
|
|
|
|
-#define MAX_REGISTERED_AVFILTERS_NB 256
|
|
|
-
|
|
|
-static AVFilter *registered_avfilters[MAX_REGISTERED_AVFILTERS_NB + 1];
|
|
|
-
|
|
|
-static int next_registered_avfilter_idx = 0;
|
|
|
+static AVFilter *first_filter;
|
|
|
|
|
|
AVFilter *avfilter_get_by_name(const char *name)
|
|
|
{
|
|
|
- int i;
|
|
|
+ AVFilter *f = NULL;
|
|
|
|
|
|
- for (i = 0; registered_avfilters[i]; i++)
|
|
|
- if (!strcmp(registered_avfilters[i]->name, name))
|
|
|
- return registered_avfilters[i];
|
|
|
+ while ((f = avfilter_next(f)))
|
|
|
+ if (!strcmp(f->name, name))
|
|
|
+ return f;
|
|
|
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
int avfilter_register(AVFilter *filter)
|
|
|
{
|
|
|
+ AVFilter **f = &first_filter;
|
|
|
int i;
|
|
|
|
|
|
- if (next_registered_avfilter_idx == MAX_REGISTERED_AVFILTERS_NB) {
|
|
|
- av_log(NULL, AV_LOG_ERROR,
|
|
|
- "Maximum number of registered filters %d reached, "
|
|
|
- "impossible to register filter with name '%s'\n",
|
|
|
- MAX_REGISTERED_AVFILTERS_NB, filter->name);
|
|
|
- return AVERROR(ENOMEM);
|
|
|
- }
|
|
|
-
|
|
|
for(i=0; filter->inputs && filter->inputs[i].name; i++) {
|
|
|
const AVFilterPad *input = &filter->inputs[i];
|
|
|
av_assert0( !input->filter_frame
|
|
|
|| (!input->start_frame && !input->end_frame));
|
|
|
}
|
|
|
|
|
|
- registered_avfilters[next_registered_avfilter_idx++] = filter;
|
|
|
+ while (*f)
|
|
|
+ f = &(*f)->next;
|
|
|
+ *f = filter;
|
|
|
+ filter->next = NULL;
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+const AVFilter *avfilter_next(const AVFilter *prev)
|
|
|
+{
|
|
|
+ return prev ? prev->next : first_filter;
|
|
|
+}
|
|
|
+
|
|
|
+#if FF_API_OLD_FILTER_REGISTER
|
|
|
AVFilter **av_filter_next(AVFilter **filter)
|
|
|
{
|
|
|
- return filter ? ++filter : ®istered_avfilters[0];
|
|
|
+ return filter ? &(*filter)->next : &first_filter;
|
|
|
}
|
|
|
|
|
|
void avfilter_uninit(void)
|
|
|
{
|
|
|
- memset(registered_avfilters, 0, sizeof(registered_avfilters));
|
|
|
- next_registered_avfilter_idx = 0;
|
|
|
}
|
|
|
+#endif
|
|
|
|
|
|
int avfilter_pad_count(const AVFilterPad *pads)
|
|
|
{
|
|
@@ -463,21 +461,22 @@ static void *filter_child_next(void *obj, void *prev)
|
|
|
|
|
|
static const AVClass *filter_child_class_next(const AVClass *prev)
|
|
|
{
|
|
|
- AVFilter **f = NULL;
|
|
|
+ AVFilter *f = NULL;
|
|
|
|
|
|
/* find the filter that corresponds to prev */
|
|
|
- while (prev && *(f = av_filter_next(f)))
|
|
|
- if ((*f)->priv_class == prev)
|
|
|
+ while (prev && (f = avfilter_next(f)))
|
|
|
+ if (f->priv_class == prev)
|
|
|
break;
|
|
|
|
|
|
/* could not find filter corresponding to prev */
|
|
|
- if (prev && !(*f))
|
|
|
+ if (prev && !f)
|
|
|
return NULL;
|
|
|
|
|
|
/* find next filter with specific options */
|
|
|
- while (*(f = av_filter_next(f)))
|
|
|
- if ((*f)->priv_class)
|
|
|
- return (*f)->priv_class;
|
|
|
+ while ((f = avfilter_next(f)))
|
|
|
+ if (f->priv_class)
|
|
|
+ return f->priv_class;
|
|
|
+
|
|
|
return NULL;
|
|
|
}
|
|
|
|