From b9a7a65ab4e920e0bbdbd1b6d27e0cde07d63869 Mon Sep 17 00:00:00 2001 From: Vitor Sessak Date: Fri, 4 Apr 2008 20:06:17 +0000 Subject: [PATCH] Make the filter graph just another normal filter. Commited in SoC by Bobby Bingham on 2007-07-31 20:08:38 Originally committed as revision 12693 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavfilter/avfiltergraph.c | 84 ++++++++++++++++++++++++++++++------- libavfilter/avfiltergraph.h | 28 +------------ 2 files changed, 69 insertions(+), 43 deletions(-) diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c index ac2fb00a08..83b3ed2546 100644 --- a/libavfilter/avfiltergraph.c +++ b/libavfilter/avfiltergraph.c @@ -26,31 +26,24 @@ #include "avfilter.h" #include "avfiltergraph.h" -struct AVFilterGraph { +typedef struct AVFilterGraph { unsigned filter_count; AVFilterContext **filters; -}; +} GraphContext; -AVFilterGraph *avfilter_create_graph(void) +static void uninit(AVFilterContext *ctx) { - return av_mallocz(sizeof(AVFilterGraph)); -} + GraphContext *graph = ctx->priv; -static void destroy_graph_filters(AVFilterGraph *graph) -{ for(; graph->filter_count > 0; graph->filter_count --) avfilter_destroy(graph->filters[graph->filter_count - 1]); av_freep(&graph->filters); } -void avfilter_destroy_graph(AVFilterGraph *graph) +void avfilter_graph_add_filter(AVFilterContext *graphctx, AVFilterContext *filter) { - destroy_graph_filters(graph); - av_free(graph); -} + GraphContext *graph = graphctx->priv; -void avfilter_graph_add_filter(AVFilterGraph *graph, AVFilterContext *filter) -{ graph->filters = av_realloc(graph->filters, sizeof(AVFilterContext*) * ++graph->filter_count); graph->filters[graph->filter_count - 1] = filter; @@ -89,7 +82,7 @@ fail: return NULL; } -int avfilter_graph_load_chain(AVFilterGraph *graph, +static int graph_load_chain(AVFilterContext *graphctx, unsigned count, char **filter_list, void **opaque, AVFilterContext **first, AVFilterContext **last) { @@ -112,7 +105,7 @@ int avfilter_graph_load_chain(AVFilterGraph *graph, goto fail; } } - avfilter_graph_add_filter(graph, filters[1]); + avfilter_graph_add_filter(graphctx, filters[1]); filters[0] = filters[1]; } @@ -120,9 +113,68 @@ int avfilter_graph_load_chain(AVFilterGraph *graph, return 0; fail: - destroy_graph_filters(graph); + uninit(graphctx); if(first) *first = NULL; if(last) *last = NULL; return -1; } +static int graph_load_chain_from_string(AVFilterContext *ctx, const char *str, + AVFilterContext **first, + AVFilterContext **last) +{ + int count, ret = 0; + char **strings; + char *filt; + + strings = av_malloc(sizeof(char *)); + strings[0] = av_strdup(str); + + filt = strchr(strings[0], ','); + for(count = 1; filt; count ++) { + if(filt == strings[count-1]) { + ret = -1; + goto done; + } + + strings = av_realloc(strings, sizeof(char *) * (count+1)); + strings[count] = filt + 1; + *filt = '\0'; + filt = strchr(strings[count], ','); + } + + ret = graph_load_chain(ctx, count, strings, NULL, first, last); + +done: + av_free(strings[0]); + av_free(strings); + + return ret; +} + +static int init(AVFilterContext *ctx, const char *args, void *opaque) +{ + AVFilterContext **filters = opaque; + + if(!args) + return 0; + if(!opaque) + return -1; + + return graph_load_chain_from_string(ctx, args, filters, filters + 1); +} + +AVFilter vf_graph = +{ + .name = "graph", + .author = "Bobby Bingham", + + .priv_size = sizeof(GraphContext), + + .init = init, + .uninit = uninit, + + .inputs = (AVFilterPad[]) {{ .name = NULL, }}, + .outputs = (AVFilterPad[]) {{ .name = NULL, }}, +}; + diff --git a/libavfilter/avfiltergraph.h b/libavfilter/avfiltergraph.h index c5a0641b39..9b0783d277 100644 --- a/libavfilter/avfiltergraph.h +++ b/libavfilter/avfiltergraph.h @@ -24,37 +24,11 @@ #include "avfilter.h" -typedef struct AVFilterGraph AVFilterGraph; - -/** - * Create a new filter graph - */ -AVFilterGraph *avfilter_create_graph(void); - -/** - * Destroy a filter graph, and any filters in it. - * @param graph The filter graph to destroy - */ -void avfilter_destroy_graph(AVFilterGraph *graph); - /** * Add an existing filter instance to a filter graph. * @param graph The filter graph * @param filter The filter to be added */ -void avfilter_graph_add_filter(AVFilterGraph *graph, AVFilterContext *filter); +void avfilter_graph_add_filter(AVFilterContext *graphctx, AVFilterContext *filter); -/** - * Loads the filter graph with a simple chain described by filters. - * @param graph The filter graph to load filters into - * @param count The number of filters to be created - * @param filters_list An array of strings describing the filters to be created. - * The format of each string is "name=params". - * @param first If non-NULL, will be set to the first filter in the chain. - * @param last If non-NULL, will be set to the last filter in the chain. - * @return 0 on success. -1 on error. - */ -int avfilter_graph_load_chain(AVFilterGraph *graph, - unsigned count, char **filter_list, void **opaque, - AVFilterContext **first, AVFilterContext **last); #endif /* FFMPEG_AVFILTER_H */