From 45a09319b2d780bd206701bed13cc8993ce76228 Mon Sep 17 00:00:00 2001 From: Vitor Sessak Date: Fri, 4 Apr 2008 20:08:40 +0000 Subject: [PATCH] Split graph_load_from_dest() to have a version independent of avfilter_vf_graph Commited in SoC by Vitor Sessak on 2008-03-24 19:19:38 Originally committed as revision 12731 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavfilter/avfiltergraph.c | 62 +++++++++++++++++++++++++++++++++++-- libavfilter/avfiltergraph.h | 5 +++ 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c index aea6c693af..f92ccf3557 100644 --- a/libavfilter/avfiltergraph.c +++ b/libavfilter/avfiltergraph.c @@ -488,11 +488,10 @@ int avfilter_graph_config_formats(AVFilterContext *graphctx) return 0; } -static int graph_load_from_desc(AVFilterContext *ctx, AVFilterGraphDesc *desc) +static int graph_load_from_desc2(AVFilterContext *ctx, AVFilterGraphDesc *desc) { AVFilterGraphDescFilter *curfilt; AVFilterGraphDescLink *curlink; - AVFilterGraphDescExport *curpad; AVFilterContext *filt, *filtb; AVFilter *filterdef; @@ -533,6 +532,22 @@ static int graph_load_from_desc(AVFilterContext *ctx, AVFilterGraphDesc *desc) } } + return 0; + +fail: + uninit(ctx); + return -1; +} + +static int graph_load_from_desc(AVFilterContext *ctx, AVFilterGraphDesc *desc) +{ + AVFilterGraphDescExport *curpad; + char tmp[20]; + AVFilterContext *filt; + + if (graph_load_from_desc2(ctx, desc) < 0) + goto fail; + /* export all input pads */ for(curpad = desc->inputs; curpad; curpad = curpad->next) { snprintf(tmp, 20, "%d", curpad->filter); @@ -560,6 +575,49 @@ fail: return -1; } +int graph_load_from_desc3(AVFilterContext *ctx, AVFilterGraphDesc *desc, AVFilterContext *in, int inpad, AVFilterContext *out, int outpad) +{ + AVFilterGraphDescExport *curpad; + char tmp[20]; + AVFilterContext *filt; + + if (graph_load_from_desc2(ctx, desc) < 0) + goto fail; + + /* export all input pads */ + for(curpad = desc->inputs; curpad; curpad = curpad->next) { + snprintf(tmp, 20, "%d", curpad->filter); + if(!(filt = avfilter_graph_get_filter(ctx, tmp))) { + av_log(ctx, AV_LOG_ERROR, "filter owning exported pad does not exist\n"); + goto fail; + } + if(avfilter_link(in, inpad, filt, curpad->pad)) { + av_log(ctx, AV_LOG_ERROR, "cannot create link between source and destination filters\n"); + goto fail; + } + } + + /* export all output pads */ + for(curpad = desc->outputs; curpad; curpad = curpad->next) { + snprintf(tmp, 20, "%d", curpad->filter); + if(!(filt = avfilter_graph_get_filter(ctx, tmp))) { + av_log(ctx, AV_LOG_ERROR, "filter owning exported pad does not exist\n"); + goto fail; + } + + if(avfilter_link(filt, curpad->pad, out, outpad)) { + av_log(ctx, AV_LOG_ERROR, "cannot create link between source and destination filters\n"); + goto fail; + } + } + + return 0; + +fail: + uninit(ctx); + return -1; +} + static int init(AVFilterContext *ctx, const char *args, void *opaque) { GraphContext *gctx = ctx->priv; diff --git a/libavfilter/avfiltergraph.h b/libavfilter/avfiltergraph.h index 5fc60dcef1..185ef31cfd 100644 --- a/libavfilter/avfiltergraph.h +++ b/libavfilter/avfiltergraph.h @@ -119,4 +119,9 @@ int avfilter_graph_config_formats(AVFilterContext *graphctx); */ int avfilter_graph_config_links(AVFilterContext *graphctx); + +int graph_load_from_desc3(AVFilterContext *ctx, AVFilterGraphDesc *desc, + AVFilterContext *in, int inpad, + AVFilterContext *out, int outpad); + #endif /* FFMPEG_AVFILTERGRAPH_H */