summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVitor Sessak <vitor1001@gmail.com>2008-04-04 20:06:17 +0000
committerVitor Sessak <vitor1001@gmail.com>2008-04-04 20:06:17 +0000
commitb9a7a65ab4e920e0bbdbd1b6d27e0cde07d63869 (patch)
tree9117f5f976d55e877bb3e5679cc8e6106f674bfc
parent1ac87cc890128fb1276610f6b9f23cfb0746fe6a (diff)
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
-rw-r--r--libavfilter/avfiltergraph.c84
-rw-r--r--libavfilter/avfiltergraph.h28
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 */