1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-01-08 13:22:53 +02:00

Merge commit 'bc1a985ba030e9861d24965d42792850b43a43ea'

* commit 'bc1a985ba030e9861d24965d42792850b43a43ea':
  lavfi: replace avfilter_open() with avfilter_graph_alloc_filter().

Conflicts:
	libavfilter/avfiltergraph.c
	libavfilter/internal.h
	libavfilter/version.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer 2013-04-11 23:56:39 +02:00
commit 86070b8e5a
7 changed files with 86 additions and 21 deletions

View File

@ -159,6 +159,7 @@ API changes, most recent first:
2013-xx-xx - lavfi 3.8.0 2013-xx-xx - lavfi 3.8.0
Move all content from avfiltergraph.h to avfilter.h. Deprecate Move all content from avfiltergraph.h to avfilter.h. Deprecate
avfilterhraph.h, user applications should include just avfilter.h avfilterhraph.h, user applications should include just avfilter.h
Add avfilter_graph_alloc_filter(), deprecate avfilter_open().
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

View File

@ -490,17 +490,16 @@ static const AVClass avfilter_class = {
.child_class_next = filter_child_class_next, .child_class_next = filter_child_class_next,
}; };
int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name) AVFilterContext *ff_filter_alloc(const AVFilter *filter, const char *inst_name)
{ {
AVFilterContext *ret; AVFilterContext *ret;
*filter_ctx = NULL;
if (!filter) if (!filter)
return AVERROR(EINVAL); return NULL;
ret = av_mallocz(sizeof(AVFilterContext)); ret = av_mallocz(sizeof(AVFilterContext));
if (!ret) if (!ret)
return AVERROR(ENOMEM); return NULL;
ret->av_class = &avfilter_class; ret->av_class = &avfilter_class;
ret->filter = filter; ret->filter = filter;
@ -542,8 +541,7 @@ int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *in
ret->input_count = ret->nb_inputs; ret->input_count = ret->nb_inputs;
#endif #endif
*filter_ctx = ret; return ret;
return 0;
err: err:
av_freep(&ret->inputs); av_freep(&ret->inputs);
@ -554,9 +552,17 @@ err:
ret->nb_outputs = 0; ret->nb_outputs = 0;
av_freep(&ret->priv); av_freep(&ret->priv);
av_free(ret); av_free(ret);
return AVERROR(ENOMEM); return NULL;
} }
#if FF_API_AVFILTER_OPEN
int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name)
{
*filter_ctx = ff_filter_alloc(filter, inst_name);
return *filter_ctx ? 0 : AVERROR(ENOMEM);
}
#endif
void avfilter_free(AVFilterContext *filter) void avfilter_free(AVFilterContext *filter)
{ {
int i; int i;

View File

@ -817,8 +817,8 @@ void avfilter_uninit(void);
/** /**
* Register a filter. This is only needed if you plan to use * Register a filter. This is only needed if you plan to use
* avfilter_get_by_name later to lookup the AVFilter structure by name. A * avfilter_get_by_name later to lookup the AVFilter structure by name. A
* filter can still by instantiated with avfilter_open even if it is not * filter can still by instantiated with avfilter_graph_alloc_filter even if it
* registered. * is not registered.
* *
* @param filter the filter to register * @param filter the filter to register
* @return 0 if the registration was successful, a negative value * @return 0 if the registration was successful, a negative value
@ -843,6 +843,7 @@ AVFilter *avfilter_get_by_name(const char *name);
*/ */
AVFilter **av_filter_next(AVFilter **filter); AVFilter **av_filter_next(AVFilter **filter);
#if FF_API_AVFILTER_OPEN
/** /**
* Create a filter instance. * Create a filter instance.
* *
@ -851,8 +852,11 @@ AVFilter **av_filter_next(AVFilter **filter);
* @param filter the filter to create an instance of * @param filter the filter to create an instance of
* @param inst_name Name to give to the new instance. Can be NULL for none. * @param inst_name Name to give to the new instance. Can be NULL for none.
* @return >= 0 in case of success, a negative error code otherwise * @return >= 0 in case of success, a negative error code otherwise
* @deprecated use avfilter_graph_alloc_filter() instead
*/ */
attribute_deprecated
int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name); int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name);
#endif
/** /**
* Initialize a filter. * Initialize a filter.
@ -948,6 +952,24 @@ typedef struct AVFilterGraph {
*/ */
AVFilterGraph *avfilter_graph_alloc(void); AVFilterGraph *avfilter_graph_alloc(void);
/**
* Create a new filter instance in a filter graph.
*
* @param graph graph in which the new filter will be used
* @param filter the filter to create an instance of
* @param name Name to give to the new instance (will be copied to
* AVFilterContext.name). This may be used by the caller to identify
* different filters, libavfilter itself assigns no semantics to
* this parameter. May be NULL.
*
* @return the context of the newly created filter instance (note that it is
* also retrievable directly through AVFilterGraph.filters or with
* avfilter_graph_get_filter()) on success or NULL or failure.
*/
AVFilterContext *avfilter_graph_alloc_filter(AVFilterGraph *graph,
const AVFilter *filter,
const char *name);
/** /**
* Get a filter instance with name name from graph. * Get a filter instance with name name from graph.
* *

View File

@ -96,12 +96,14 @@ int avfilter_graph_create_filter(AVFilterContext **filt_ctx, AVFilter *filt,
{ {
int ret; int ret;
if ((ret = avfilter_open(filt_ctx, filt, name)) < 0) *filt_ctx = avfilter_graph_alloc_filter(graph_ctx, filt, name);
goto fail; if (!*filt_ctx)
if ((ret = avfilter_init_filter(*filt_ctx, args, opaque)) < 0) return AVERROR(ENOMEM);
goto fail; if ((ret = avfilter_init_filter(*filt_ctx, args, opaque)) < 0) {
if ((ret = avfilter_graph_add_filter(graph_ctx, *filt_ctx)) < 0) graph_ctx->filters[graph_ctx->nb_filters-1] = NULL;
goto fail; goto fail;
}
return 0; return 0;
fail: fail:
@ -116,6 +118,32 @@ void avfilter_graph_set_auto_convert(AVFilterGraph *graph, unsigned flags)
graph->disable_auto_convert = flags; graph->disable_auto_convert = flags;
} }
AVFilterContext *avfilter_graph_alloc_filter(AVFilterGraph *graph,
const AVFilter *filter,
const char *name)
{
AVFilterContext **filters, *s;
s = ff_filter_alloc(filter, name);
if (!s)
return NULL;
filters = av_realloc(graph->filters, sizeof(*filters) * (graph->nb_filters + 1));
if (!filters) {
avfilter_free(s);
return NULL;
}
graph->filters = filters;
graph->filters[graph->nb_filters++] = s;
#if FF_API_FOO_COUNT
graph->filter_count_unused = graph->nb_filters;
#endif
return s;
}
/** /**
* Check for the validity of graph. * Check for the validity of graph.
* *

View File

@ -109,16 +109,11 @@ static int create_filter(AVFilterContext **filt_ctx, AVFilterGraph *ctx, int ind
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
ret = avfilter_open(filt_ctx, filt, inst_name); *filt_ctx = avfilter_graph_alloc_filter(ctx, filt, inst_name);
if (!*filt_ctx) { if (!*filt_ctx) {
av_log(log_ctx, AV_LOG_ERROR, av_log(log_ctx, AV_LOG_ERROR,
"Error creating filter '%s'\n", filt_name); "Error creating filter '%s'\n", filt_name);
return ret; return AVERROR(ENOMEM);
}
if ((ret = avfilter_graph_add_filter(ctx, *filt_ctx)) < 0) {
avfilter_free(*filt_ctx);
return ret;
} }
if (!strcmp(filt_name, "scale") && args && !strstr(args, "flags") && if (!strcmp(filt_name, "scale") && args && !strstr(args, "flags") &&

View File

@ -339,4 +339,14 @@ enum {
}; };
/**
* Allocate a new filter context and return it.
*
* @param filter what filter to create an instance of
* @param inst_name name to give to the new filter context
*
* @return newly created filter context or NULL on failure
*/
AVFilterContext *ff_filter_alloc(const AVFilter *filter, const char *inst_name);
#endif /* AVFILTER_INTERNAL_H */ #endif /* AVFILTER_INTERNAL_H */

View File

@ -69,5 +69,8 @@
#ifndef FF_API_ACONVERT_FILTER #ifndef FF_API_ACONVERT_FILTER
#define FF_API_ACONVERT_FILTER (LIBAVFILTER_VERSION_MAJOR < 4) #define FF_API_ACONVERT_FILTER (LIBAVFILTER_VERSION_MAJOR < 4)
#endif #endif
#ifndef FF_API_AVFILTER_OPEN
#define FF_API_AVFILTER_OPEN (LIBAVFILTER_VERSION_MAJOR < 4)
#endif
#endif /* AVFILTER_VERSION_H */ #endif /* AVFILTER_VERSION_H */