Removes an arbitrary hardcoded limit on the number of filters.
Showing the changes to libavfilter/avfilter.c (1 of 7 files). Show all
Unified · Split
| @@ -267,42 +267,44 @@ int ff_poll_frame(AVFilterLink *link) · 266 unmodified lines | ||
| 267 | 267 | return min; |
| 268 | 268 | } |
| 269 | 269 | |
| 270 | −#define MAX_REGISTERED_AVFILTERS_NB 64 | |
| 271 | − | |
| 272 | −static AVFilter *registered_avfilters[MAX_REGISTERED_AVFILTERS_NB + 1]; | |
| 273 | − | |
| 274 | −static int next_registered_avfilter_idx = 0; | |
| 270 | +static AVFilter *first_filter; | |
| 275 | 271 | |
| 276 | 272 | AVFilter *avfilter_get_by_name(const char *name) |
| 277 | 273 | { |
| 278 | − int i; | |
| 274 | + AVFilter *f = NULL; | |
| 279 | 275 | |
| 280 | − for (i = 0; registered_avfilters[i]; i++) | |
| 281 | − if (!strcmp(registered_avfilters[i]->name, name)) | |
| 282 | − return registered_avfilters[i]; | |
| 276 | + while ((f = avfilter_next(f))) | |
| 277 | + if (!strcmp(f->name, name)) | |
| 278 | + return f; | |
| 283 | 279 | |
| 284 | 280 | return NULL; |
| 285 | 281 | } |
| 286 | 282 | |
| 287 | 283 | int avfilter_register(AVFilter *filter) |
| 288 | 284 | { |
| 289 | − if (next_registered_avfilter_idx == MAX_REGISTERED_AVFILTERS_NB) | |
| 290 | − return -1; | |
| 291 | − | |
| 292 | − registered_avfilters[next_registered_avfilter_idx++] = filter; | |
| 285 | + AVFilter **f = &first_filter; | |
| 286 | + while (*f) | |
| 287 | + f = &(*f)->next; | |
| 288 | + *f = filter; | |
| 289 | + filter->next = NULL; | |
| 293 | 290 | return 0; |
| 294 | 291 | } |
| 295 | 292 | |
| 293 | +const AVFilter *avfilter_next(const AVFilter *prev) | |
| 294 | +{ | |
| 295 | + return prev ? prev->next : first_filter; | |
| 296 | +} | |
| 297 | + | |
| 298 | +#if FF_API_OLD_FILTER_REGISTER | |
| 296 | 299 | AVFilter **av_filter_next(AVFilter **filter) |
| 297 | 300 | { |
| 298 | − return filter ? ++filter : ®istered_avfilters[0]; | |
| 301 | + return filter ? &(*filter)->next : &first_filter; | |
| 299 | 302 | } |
| 300 | 303 | |
| 301 | 304 | void avfilter_uninit(void) |
| 302 | 305 | { |
| 303 | − memset(registered_avfilters, 0, sizeof(registered_avfilters)); | |
| 304 | − next_registered_avfilter_idx = 0; | |
| 305 | 306 | } |
| 307 | +#endif | |
| 306 | 308 | |
| 307 | 309 | int avfilter_pad_count(const AVFilterPad *pads) |
| 308 | 310 | { |
| @@ -331,15 +333,15 @@ static void *filter_child_next(void *obj, void *prev) · 22 unmodified lines | ||
| 331 | 333 | |
| 332 | 334 | static const AVClass *filter_child_class_next(const AVClass *prev) |
| 333 | 335 | { |
| 334 | − AVFilter **f = NULL; | |
| 336 | + AVFilter *f = NULL; | |
| 335 | 337 | |
| 336 | − while (prev && *(f = av_filter_next(f))) | |
| 337 | − if ((*f)->priv_class == prev) | |
| 338 | + while (prev && (f = avfilter_next(f))) | |
| 339 | + if (f->priv_class == prev) | |
| 338 | 340 | break; |
| 339 | 341 | |
| 340 | − while (*(f = av_filter_next(f))) | |
| 341 | − if ((*f)->priv_class) | |
| 342 | − return (*f)->priv_class; | |
| 342 | + while ((f = avfilter_next(f))) | |
| 343 | + if (f->priv_class) | |
| 344 | + return f->priv_class; | |
| 343 | 345 | |
| 344 | 346 | return NULL; |
| 345 | 347 | } |