You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +02:00
Merge commit 'fa2a34cd40d124161c748bb0f430dc63c94dd0da'
* commit 'fa2a34cd40d124161c748bb0f430dc63c94dd0da': lavfi: change the filter registering system to match the other libraries Conflicts: cmdutils.c ffplay.c libavfilter/avfilter.c libavfilter/avfilter.h This removes the ability to put AVFilters in read only memory and having them shareable. Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
@@ -1448,21 +1448,21 @@ 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;
|
||||||
char descr[64], *descr_cur;
|
char descr[64], *descr_cur;
|
||||||
int i, j;
|
int i, j;
|
||||||
const AVFilterPad *pad;
|
const AVFilterPad *pad;
|
||||||
|
|
||||||
printf("Filters:\n");
|
printf("Filters:\n");
|
||||||
#if CONFIG_AVFILTER
|
#if CONFIG_AVFILTER
|
||||||
while ((filter = av_filter_next(filter)) && *filter) {
|
while ((filter = avfilter_next(filter))) {
|
||||||
descr_cur = descr;
|
descr_cur = descr;
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < 2; i++) {
|
||||||
if (i) {
|
if (i) {
|
||||||
*(descr_cur++) = '-';
|
*(descr_cur++) = '-';
|
||||||
*(descr_cur++) = '>';
|
*(descr_cur++) = '>';
|
||||||
}
|
}
|
||||||
pad = i ? (*filter)->outputs : (*filter)->inputs;
|
pad = i ? filter->outputs : filter->inputs;
|
||||||
for (j = 0; pad && pad[j].name; j++) {
|
for (j = 0; pad && pad[j].name; j++) {
|
||||||
if (descr_cur >= descr + sizeof(descr) - 4)
|
if (descr_cur >= descr + sizeof(descr) - 4)
|
||||||
break;
|
break;
|
||||||
@@ -1472,7 +1472,7 @@ int show_filters(void *optctx, const char *opt, const char *arg)
|
|||||||
*(descr_cur++) = '|';
|
*(descr_cur++) = '|';
|
||||||
}
|
}
|
||||||
*descr_cur = 0;
|
*descr_cur = 0;
|
||||||
printf("%-16s %-10s %s\n", (*filter)->name, descr, (*filter)->description);
|
printf("%-16s %-10s %s\n", filter->name, descr, filter->description);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -171,6 +171,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
|
||||||
|
1
ffmpeg.c
1
ffmpeg.c
@@ -499,7 +499,6 @@ static void exit_program(void)
|
|||||||
|
|
||||||
uninit_opts();
|
uninit_opts();
|
||||||
|
|
||||||
avfilter_uninit();
|
|
||||||
avformat_network_deinit();
|
avformat_network_deinit();
|
||||||
|
|
||||||
if (received_sigterm) {
|
if (received_sigterm) {
|
||||||
|
1
ffplay.c
1
ffplay.c
@@ -1027,7 +1027,6 @@ static void do_exit(VideoState *is)
|
|||||||
av_lockmgr_register(NULL);
|
av_lockmgr_register(NULL);
|
||||||
uninit_opts();
|
uninit_opts();
|
||||||
#if CONFIG_AVFILTER
|
#if CONFIG_AVFILTER
|
||||||
avfilter_uninit();
|
|
||||||
av_freep(&vfilters);
|
av_freep(&vfilters);
|
||||||
#endif
|
#endif
|
||||||
avformat_network_deinit();
|
avformat_network_deinit();
|
||||||
|
@@ -386,55 +386,53 @@ int avfilter_process_command(AVFilterContext *filter, const char *cmd, const cha
|
|||||||
return AVERROR(ENOSYS);
|
return AVERROR(ENOSYS);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MAX_REGISTERED_AVFILTERS_NB 256
|
static AVFilter *first_filter;
|
||||||
|
|
||||||
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 *avfilter_get_by_name(const char *name)
|
||||||
{
|
{
|
||||||
int i;
|
AVFilter *f = NULL;
|
||||||
|
|
||||||
for (i = 0; registered_avfilters[i]; i++)
|
while ((f = avfilter_next(f)))
|
||||||
if (!strcmp(registered_avfilters[i]->name, name))
|
if (!strcmp(f->name, name))
|
||||||
return registered_avfilters[i];
|
return f;
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int avfilter_register(AVFilter *filter)
|
int avfilter_register(AVFilter *filter)
|
||||||
{
|
{
|
||||||
|
AVFilter **f = &first_filter;
|
||||||
int i;
|
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++) {
|
for(i=0; filter->inputs && filter->inputs[i].name; i++) {
|
||||||
const AVFilterPad *input = &filter->inputs[i];
|
const AVFilterPad *input = &filter->inputs[i];
|
||||||
av_assert0( !input->filter_frame
|
av_assert0( !input->filter_frame
|
||||||
|| (!input->start_frame && !input->end_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;
|
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 : ®istered_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)
|
||||||
{
|
{
|
||||||
@@ -463,21 +461,22 @@ 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;
|
||||||
|
|
||||||
/* find the filter that corresponds to prev */
|
/* find the filter that corresponds to prev */
|
||||||
while (prev && *(f = av_filter_next(f)))
|
while (prev && (f = avfilter_next(f)))
|
||||||
if ((*f)->priv_class == prev)
|
if (f->priv_class == prev)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* could not find filter corresponding to prev */
|
/* could not find filter corresponding to prev */
|
||||||
if (prev && !(*f))
|
if (prev && !f)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* find next filter with specific options */
|
/* find next filter with specific options */
|
||||||
while (*(f = av_filter_next(f)))
|
while ((f = avfilter_next(f)))
|
||||||
if ((*f)->priv_class)
|
if (f->priv_class)
|
||||||
return (*f)->priv_class;
|
return f->priv_class;
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -496,6 +496,8 @@ typedef struct AVFilter {
|
|||||||
|
|
||||||
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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Make the filter instance process a command.
|
* Make the filter instance process a command.
|
||||||
*
|
*
|
||||||
@@ -837,8 +839,11 @@ int avfilter_process_command(AVFilterContext *filter, const char *cmd, const cha
|
|||||||
/** 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
|
||||||
@@ -861,13 +866,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
|
||||||
/**
|
/**
|
||||||
|
@@ -75,5 +75,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 */
|
||||||
|
Reference in New Issue
Block a user