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
This commit is contained in:
Vitor Sessak 2008-04-04 20:06:17 +00:00
parent 1ac87cc890
commit b9a7a65ab4
2 changed files with 69 additions and 43 deletions

View File

@ -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, }},
};

View File

@ -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 */