Browse Source

lavfi: change the filter registering system to match the other libraries

Removes an arbitrary hardcoded limit on the number of filters.
tags/n2.0
Anton Khirnov 12 years ago
parent
commit
fa2a34cd40
7 changed files with 48 additions and 29 deletions
  1. +0
    -1
      avconv.c
  2. +0
    -3
      avplay.c
  3. +3
    -3
      cmdutils.c
  4. +2
    -0
      doc/APIchanges
  5. +24
    -22
      libavfilter/avfilter.c
  6. +16
    -0
      libavfilter/avfilter.h
  7. +3
    -0
      libavfilter/version.h

+ 0
- 1
avconv.c View File

@@ -211,7 +211,6 @@ static void exit_program(void)


uninit_opts(); uninit_opts();


avfilter_uninit();
avformat_network_deinit(); avformat_network_deinit();


if (received_sigterm) { if (received_sigterm) {


+ 0
- 3
avplay.c View File

@@ -1246,9 +1246,6 @@ static void do_exit(void)
cur_stream = NULL; cur_stream = NULL;
} }
uninit_opts(); uninit_opts();
#if CONFIG_AVFILTER
avfilter_uninit();
#endif
avformat_network_deinit(); avformat_network_deinit();
if (show_status) if (show_status)
printf("\n"); printf("\n");


+ 3
- 3
cmdutils.c View File

@@ -1130,12 +1130,12 @@ int show_protocols(void *optctx, const char *opt, const char *arg)


int show_filters(void *optctx, const char *opt, const char *arg) int show_filters(void *optctx, const char *opt, const char *arg)
{ {
AVFilter av_unused(**filter) = NULL;
const AVFilter av_unused(*filter) = NULL;


printf("Filters:\n"); printf("Filters:\n");
#if CONFIG_AVFILTER #if CONFIG_AVFILTER
while ((filter = av_filter_next(filter)) && *filter)
printf("%-16s %s\n", (*filter)->name, (*filter)->description);
while ((filter = avfilter_next(filter)))
printf("%-16s %s\n", filter->name, filter->description);
#endif #endif
return 0; return 0;
} }


+ 2
- 0
doc/APIchanges View File

@@ -24,6 +24,8 @@ API changes, most recent first:
Add avfilter_init_dict(). Add avfilter_init_dict().
Add AVFilter.flags field and AVFILTER_FLAG_DYNAMIC_{INPUTS,OUTPUTS} flags. Add AVFilter.flags field and AVFILTER_FLAG_DYNAMIC_{INPUTS,OUTPUTS} flags.
Add avfilter_pad_count() for counting filter inputs/outputs. Add avfilter_pad_count() for counting filter inputs/outputs.
Add avfilter_next(), deprecate av_filter_next().
Deprecate avfilter_uninit().


2013-xx-xx - lavfi 3.7.0 - avfilter.h 2013-xx-xx - lavfi 3.7.0 - avfilter.h
Add AVFilter.priv_class for exporting filter options through the AVOptions API Add AVFilter.priv_class for exporting filter options through the AVOptions API


+ 24
- 22
libavfilter/avfilter.c View File

@@ -267,42 +267,44 @@ int ff_poll_frame(AVFilterLink *link)
return min; 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) 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; return NULL;
} }


int avfilter_register(AVFilter *filter) 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; 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) AVFilter **av_filter_next(AVFilter **filter)
{ {
return filter ? ++filter : &registered_avfilters[0];
return filter ? &(*filter)->next : &first_filter;
} }


void avfilter_uninit(void) void avfilter_uninit(void)
{ {
memset(registered_avfilters, 0, sizeof(registered_avfilters));
next_registered_avfilter_idx = 0;
} }
#endif


int avfilter_pad_count(const AVFilterPad *pads) 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) 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; 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; return NULL;
} }


+ 16
- 0
libavfilter/avfilter.h View File

@@ -457,6 +457,8 @@ typedef struct AVFilter {
int (*query_formats)(AVFilterContext *); int (*query_formats)(AVFilterContext *);


int priv_size; ///< size of private data to allocate for the filter int priv_size; ///< size of private data to allocate for the filter

struct AVFilter *next;
} AVFilter; } AVFilter;


/** An instance of a filter */ /** 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. */ /** Initialize the filter system. Register all builtin filters. */
void avfilter_register_all(void); void avfilter_register_all(void);


#if FF_API_OLD_FILTER_REGISTER
/** Uninitialize the filter system. Unregister all filters. */ /** Uninitialize the filter system. Unregister all filters. */
attribute_deprecated
void avfilter_uninit(void); void avfilter_uninit(void);
#endif


/** /**
* Register a filter. This is only needed if you plan to use * Register a filter. This is only needed if you plan to use
@@ -646,13 +651,24 @@ int avfilter_register(AVFilter *filter);
*/ */
AVFilter *avfilter_get_by_name(const char *name); 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 NULL, returns a pointer to the first registered filter pointer,
* if filter is non-NULL, returns the next pointer after filter. * if filter is non-NULL, returns the next pointer after filter.
* If the returned pointer points to NULL, the last registered filter * If the returned pointer points to NULL, the last registered filter
* was already reached. * was already reached.
* @deprecated use avfilter_next()
*/ */
attribute_deprecated
AVFilter **av_filter_next(AVFilter **filter); AVFilter **av_filter_next(AVFilter **filter);
#endif


#if FF_API_AVFILTER_OPEN #if FF_API_AVFILTER_OPEN
/** /**


+ 3
- 0
libavfilter/version.h View File

@@ -64,5 +64,8 @@
#ifndef FF_API_AVFILTER_INIT_FILTER #ifndef FF_API_AVFILTER_INIT_FILTER
#define FF_API_AVFILTER_INIT_FILTER (LIBAVFILTER_VERSION_MAJOR < 4) #define FF_API_AVFILTER_INIT_FILTER (LIBAVFILTER_VERSION_MAJOR < 4)
#endif #endif
#ifndef FF_API_OLD_FILTER_REGISTER
#define FF_API_OLD_FILTER_REGISTER (LIBAVFILTER_VERSION_MAJOR < 4)
#endif


#endif /* AVFILTER_VERSION_H */ #endif /* AVFILTER_VERSION_H */

Loading…
Cancel
Save