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:
@@ -26,31 +26,24 @@
|
|||||||
#include "avfilter.h"
|
#include "avfilter.h"
|
||||||
#include "avfiltergraph.h"
|
#include "avfiltergraph.h"
|
||||||
|
|
||||||
struct AVFilterGraph {
|
typedef struct AVFilterGraph {
|
||||||
unsigned filter_count;
|
unsigned filter_count;
|
||||||
AVFilterContext **filters;
|
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 --)
|
for(; graph->filter_count > 0; graph->filter_count --)
|
||||||
avfilter_destroy(graph->filters[graph->filter_count - 1]);
|
avfilter_destroy(graph->filters[graph->filter_count - 1]);
|
||||||
av_freep(&graph->filters);
|
av_freep(&graph->filters);
|
||||||
}
|
}
|
||||||
|
|
||||||
void avfilter_destroy_graph(AVFilterGraph *graph)
|
void avfilter_graph_add_filter(AVFilterContext *graphctx, AVFilterContext *filter)
|
||||||
{
|
{
|
||||||
destroy_graph_filters(graph);
|
GraphContext *graph = graphctx->priv;
|
||||||
av_free(graph);
|
|
||||||
}
|
|
||||||
|
|
||||||
void avfilter_graph_add_filter(AVFilterGraph *graph, AVFilterContext *filter)
|
|
||||||
{
|
|
||||||
graph->filters = av_realloc(graph->filters,
|
graph->filters = av_realloc(graph->filters,
|
||||||
sizeof(AVFilterContext*) * ++graph->filter_count);
|
sizeof(AVFilterContext*) * ++graph->filter_count);
|
||||||
graph->filters[graph->filter_count - 1] = filter;
|
graph->filters[graph->filter_count - 1] = filter;
|
||||||
@@ -89,7 +82,7 @@ fail:
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int avfilter_graph_load_chain(AVFilterGraph *graph,
|
static int graph_load_chain(AVFilterContext *graphctx,
|
||||||
unsigned count, char **filter_list, void **opaque,
|
unsigned count, char **filter_list, void **opaque,
|
||||||
AVFilterContext **first, AVFilterContext **last)
|
AVFilterContext **first, AVFilterContext **last)
|
||||||
{
|
{
|
||||||
@@ -112,7 +105,7 @@ int avfilter_graph_load_chain(AVFilterGraph *graph,
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
avfilter_graph_add_filter(graph, filters[1]);
|
avfilter_graph_add_filter(graphctx, filters[1]);
|
||||||
filters[0] = filters[1];
|
filters[0] = filters[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,9 +113,68 @@ int avfilter_graph_load_chain(AVFilterGraph *graph,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
destroy_graph_filters(graph);
|
uninit(graphctx);
|
||||||
if(first) *first = NULL;
|
if(first) *first = NULL;
|
||||||
if(last) *last = NULL;
|
if(last) *last = NULL;
|
||||||
return -1;
|
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"
|
#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.
|
* Add an existing filter instance to a filter graph.
|
||||||
* @param graph The filter graph
|
* @param graph The filter graph
|
||||||
* @param filter The filter to be added
|
* @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 */
|
#endif /* FFMPEG_AVFILTER_H */
|
||||||
|
Reference in New Issue
Block a user