Make the filter graph just another normal filter.
authorVitor Sessak <vitor1001@gmail.com>
Fri, 4 Apr 2008 20:06:17 +0000 (20:06 +0000)
committerVitor Sessak <vitor1001@gmail.com>
Fri, 4 Apr 2008 20:06:17 +0000 (20:06 +0000)
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
libavfilter/avfiltergraph.h

index ac2fb00..83b3ed2 100644 (file)
 #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, }},
+};
+
index c5a0641..9b0783d 100644 (file)
 
 #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 */