diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-04-11 23:56:39 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-04-12 00:31:44 +0200 |
commit | 86070b8e5a0e0ba087a9ce2a050c00094e29f35b (patch) | |
tree | 6e82eb3de383fa6f8756c5053d26e52fbf29f07b /libavfilter | |
parent | 9da369604ecf31d9dce2dee21ed214b8c43264c6 (diff) | |
parent | bc1a985ba030e9861d24965d42792850b43a43ea (diff) | |
download | ffmpeg-86070b8e5a0e0ba087a9ce2a050c00094e29f35b.tar.gz |
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>
Diffstat (limited to 'libavfilter')
-rw-r--r-- | libavfilter/avfilter.c | 20 | ||||
-rw-r--r-- | libavfilter/avfilter.h | 26 | ||||
-rw-r--r-- | libavfilter/avfiltergraph.c | 38 | ||||
-rw-r--r-- | libavfilter/graphparser.c | 9 | ||||
-rw-r--r-- | libavfilter/internal.h | 10 | ||||
-rw-r--r-- | libavfilter/version.h | 3 |
6 files changed, 85 insertions, 21 deletions
diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c index 5a99fdddd5..406537a5a6 100644 --- a/libavfilter/avfilter.c +++ b/libavfilter/avfilter.c @@ -490,17 +490,16 @@ static const AVClass avfilter_class = { .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; - *filter_ctx = NULL; if (!filter) - return AVERROR(EINVAL); + return NULL; ret = av_mallocz(sizeof(AVFilterContext)); if (!ret) - return AVERROR(ENOMEM); + return NULL; ret->av_class = &avfilter_class; ret->filter = filter; @@ -542,8 +541,7 @@ int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *in ret->input_count = ret->nb_inputs; #endif - *filter_ctx = ret; - return 0; + return ret; err: av_freep(&ret->inputs); @@ -554,8 +552,16 @@ err: ret->nb_outputs = 0; av_freep(&ret->priv); 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) { diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h index 296cc420b1..dbdcf9d210 100644 --- a/libavfilter/avfilter.h +++ b/libavfilter/avfilter.h @@ -817,8 +817,8 @@ void avfilter_uninit(void); /** * 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 - * filter can still by instantiated with avfilter_open even if it is not - * registered. + * filter can still by instantiated with avfilter_graph_alloc_filter even if it + * is not registered. * * @param filter the filter to register * @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); +#if FF_API_AVFILTER_OPEN /** * Create a filter instance. * @@ -851,8 +852,11 @@ AVFilter **av_filter_next(AVFilter **filter); * @param filter the filter to create an instance of * @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 + * @deprecated use avfilter_graph_alloc_filter() instead */ +attribute_deprecated int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name); +#endif /** * Initialize a filter. @@ -949,6 +953,24 @@ typedef struct AVFilterGraph { 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. * * @return the pointer to the found filter instance or NULL if it diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c index 28fc743b59..771c7dfda6 100644 --- a/libavfilter/avfiltergraph.c +++ b/libavfilter/avfiltergraph.c @@ -96,12 +96,14 @@ int avfilter_graph_create_filter(AVFilterContext **filt_ctx, AVFilter *filt, { int ret; - if ((ret = avfilter_open(filt_ctx, filt, name)) < 0) - goto fail; - if ((ret = avfilter_init_filter(*filt_ctx, args, opaque)) < 0) - goto fail; - if ((ret = avfilter_graph_add_filter(graph_ctx, *filt_ctx)) < 0) + *filt_ctx = avfilter_graph_alloc_filter(graph_ctx, filt, name); + if (!*filt_ctx) + return AVERROR(ENOMEM); + if ((ret = avfilter_init_filter(*filt_ctx, args, opaque)) < 0) { + graph_ctx->filters[graph_ctx->nb_filters-1] = NULL; goto fail; + } + return 0; fail: @@ -116,6 +118,32 @@ void avfilter_graph_set_auto_convert(AVFilterGraph *graph, unsigned 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. * diff --git a/libavfilter/graphparser.c b/libavfilter/graphparser.c index 2911b06693..3af9b56021 100644 --- a/libavfilter/graphparser.c +++ b/libavfilter/graphparser.c @@ -109,16 +109,11 @@ static int create_filter(AVFilterContext **filt_ctx, AVFilterGraph *ctx, int ind return AVERROR(EINVAL); } - ret = avfilter_open(filt_ctx, filt, inst_name); + *filt_ctx = avfilter_graph_alloc_filter(ctx, filt, inst_name); if (!*filt_ctx) { av_log(log_ctx, AV_LOG_ERROR, "Error creating filter '%s'\n", filt_name); - return ret; - } - - if ((ret = avfilter_graph_add_filter(ctx, *filt_ctx)) < 0) { - avfilter_free(*filt_ctx); - return ret; + return AVERROR(ENOMEM); } if (!strcmp(filt_name, "scale") && args && !strstr(args, "flags") && diff --git a/libavfilter/internal.h b/libavfilter/internal.h index 0b28422f1f..6907b76a71 100644 --- a/libavfilter/internal.h +++ b/libavfilter/internal.h @@ -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 */ diff --git a/libavfilter/version.h b/libavfilter/version.h index b2e0b5e221..f3508b7d51 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -69,5 +69,8 @@ #ifndef FF_API_ACONVERT_FILTER #define FF_API_ACONVERT_FILTER (LIBAVFILTER_VERSION_MAJOR < 4) #endif +#ifndef FF_API_AVFILTER_OPEN +#define FF_API_AVFILTER_OPEN (LIBAVFILTER_VERSION_MAJOR < 4) +#endif #endif /* AVFILTER_VERSION_H */ |