diff options
author | Anton Khirnov <anton@khirnov.net> | 2013-04-03 11:20:36 +0400 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2013-04-11 22:44:03 +0400 |
commit | fa2a34cd40d124161c748bb0f430dc63c94dd0da (patch) | |
tree | 149c1a579d496d8331ffca26d9b750bdf870f5f1 /libavfilter | |
parent | 7e8fe4be5fb4c98aa3c6a4ed3cec999f4e3cc3aa (diff) |
lavfi: change the filter registering system to match the other libraries
Removes an arbitrary hardcoded limit on the number of filters.
Diffstat (limited to 'libavfilter')
-rw-r--r-- | libavfilter/avfilter.c | 46 | ||||
-rw-r--r-- | libavfilter/avfilter.h | 16 | ||||
-rw-r--r-- | libavfilter/version.h | 3 |
3 files changed, 43 insertions, 22 deletions
diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c index a707c0dfdb..199d8f97fc 100644 --- a/libavfilter/avfilter.c +++ b/libavfilter/avfilter.c @@ -267,42 +267,44 @@ int ff_poll_frame(AVFilterLink *link) return min; } -#define MAX_REGISTERED_AVFILTERS_NB 64 - -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) { - if (next_registered_avfilter_idx == MAX_REGISTERED_AVFILTERS_NB) - return -1; - - registered_avfilters[next_registered_avfilter_idx++] = filter; + AVFilter **f = &first_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) { @@ -331,15 +333,15 @@ 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; - while (prev && *(f = av_filter_next(f))) - if ((*f)->priv_class == prev) + while (prev && (f = avfilter_next(f))) + if (f->priv_class == prev) break; - 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; } diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h index 73dbd886fc..51d0fb5148 100644 --- a/libavfilter/avfilter.h +++ b/libavfilter/avfilter.h @@ -457,6 +457,8 @@ typedef struct AVFilter { int (*query_formats)(AVFilterContext *); int priv_size; ///< size of private data to allocate for the filter + + struct AVFilter *next; } AVFilter; /** An instance of a filter */ @@ -622,8 +624,11 @@ AVFilterBufferRef *avfilter_get_audio_buffer_ref_from_arrays(uint8_t **data, /** Initialize the filter system. Register all builtin filters. */ void avfilter_register_all(void); +#if FF_API_OLD_FILTER_REGISTER /** Uninitialize the filter system. Unregister all filters. */ +attribute_deprecated void avfilter_uninit(void); +#endif /** * Register a filter. This is only needed if you plan to use @@ -647,12 +652,23 @@ int avfilter_register(AVFilter *filter); AVFilter *avfilter_get_by_name(const char *name); /** + * Iterate over all registered filters. + * @return If prev is non-NULL, next registered filter after prev or NULL if + * prev is the last filter. If prev is NULL, return the first registered filter. + */ +const AVFilter *avfilter_next(const AVFilter *prev); + +#if FF_API_OLD_FILTER_REGISTER +/** * If filter is NULL, returns a pointer to the first registered filter pointer, * if filter is non-NULL, returns the next pointer after filter. * If the returned pointer points to NULL, the last registered filter * was already reached. + * @deprecated use avfilter_next() */ +attribute_deprecated AVFilter **av_filter_next(AVFilter **filter); +#endif #if FF_API_AVFILTER_OPEN /** diff --git a/libavfilter/version.h b/libavfilter/version.h index f58a9d5e8f..36a03f7aa3 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -64,5 +64,8 @@ #ifndef FF_API_AVFILTER_INIT_FILTER #define FF_API_AVFILTER_INIT_FILTER (LIBAVFILTER_VERSION_MAJOR < 4) #endif +#ifndef FF_API_OLD_FILTER_REGISTER +#define FF_API_OLD_FILTER_REGISTER (LIBAVFILTER_VERSION_MAJOR < 4) +#endif #endif /* AVFILTER_VERSION_H */ |