#include <string.h>
#include <stddef.h>
+#include "avstring.h"
#include "avfilter.h"
#include "avfiltergraph.h"
static void destroy_graph_filters(AVFilterGraph *graph)
{
- unsigned i;
-
- for(i = 0; i < graph->filter_count; i ++)
- avfilter_destroy(graph->filters[i]);
+ for(; graph->filter_count > 0; graph->filter_count --)
+ avfilter_destroy(graph->filters[graph->filter_count - 1]);
av_freep(&graph->filters);
}
graph->filters[graph->filter_count - 1] = filter;
}
-static AVFilterContext *create_filter_with_args(char *filter)
+static AVFilterContext *create_filter_with_args(const char *filt, void *opaque)
{
AVFilterContext *ret;
+ char *filter = av_strdup(filt); /* copy - don't mangle the input string */
char *name, *args;
name = filter;
if((args = strchr(filter, '='))) {
/* ensure we at least have a name */
if(args == filter)
- return NULL;
+ goto fail;
*args ++ = 0;
}
name, args ? args : "(none)");
if((ret = avfilter_create_by_name(name, NULL))) {
- if(avfilter_init_filter(ret, args)) {
+ if(avfilter_init_filter(ret, args, opaque)) {
av_log(NULL, AV_LOG_ERROR, "error initializing filter!\n");
avfilter_destroy(ret);
- ret = NULL;
+ goto fail;
}
} else av_log(NULL, AV_LOG_ERROR, "error creating filter!\n");
return ret;
+
+fail:
+ av_free(filter);
+ return NULL;
}
int avfilter_graph_load_chain(AVFilterGraph *graph,
- unsigned count, char **filter_list,
+ unsigned count, char **filter_list, void **opaque,
AVFilterContext **first, AVFilterContext **last)
{
unsigned i;
AVFilterContext *filters[2] = {NULL,NULL};
for(i = 0; i < count; i ++) {
- if(!(filters[1] = create_filter_with_args(filter_list[i])))
+ void *op;
+
+ if(opaque) op = opaque[i];
+ else op = NULL;
+
+ if(!(filters[1] = create_filter_with_args(filter_list[i], op)))
goto fail;
if(i == 0) {
if(first) *first = filters[1];
fail:
destroy_graph_filters(graph);
- *first = *last = NULL;
+ if(first) *first = NULL;
+ if(last) *last = NULL;
return -1;
}