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:
parent
1ac87cc890
commit
b9a7a65ab4
@ -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, }},
|
||||
};
|
||||
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user