diff options
author | Vitor Sessak <vitor1001@gmail.com> | 2008-04-04 20:07:59 +0000 |
---|---|---|
committer | Vitor Sessak <vitor1001@gmail.com> | 2008-04-04 20:07:59 +0000 |
commit | 095ae1bcb7ba73c8410fe5bf37c61b3c05c0e5eb (patch) | |
tree | f453ea94321c44fe3406deac4db193591849400d | |
parent | f3f42a3c5111bb88103b67703798551b192950f5 (diff) | |
download | ffmpeg-095ae1bcb7ba73c8410fe5bf37c61b3c05c0e5eb.tar.gz |
Rework link property configuration system.
This can now handle filters which are added to graphs out of order,
including auto-inserted scale filters. As an added bonus, it can
now detect circular filter chains which wouldn't work anyway.
Commited in SoC by Bobby Bingham on 2007-12-24 03:22:10
Originally committed as revision 12717 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavfilter/avfiltergraph.c | 51 |
1 files changed, 14 insertions, 37 deletions
diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c index 271d3db970..c9a30c60d9 100644 --- a/libavfilter/avfiltergraph.c +++ b/libavfilter/avfiltergraph.c @@ -101,7 +101,6 @@ static inline AVFilterLink *get_extern_output_link(AVFilterLink *link) static int link_out_config_props(AVFilterLink *link) { AVFilterLink *link2 = get_extern_output_link(link); - int (*config_props)(AVFilterLink *); if(!link2) return 0; @@ -109,9 +108,7 @@ static int link_out_config_props(AVFilterLink *link) link2->w = link->w; link2->h = link->h; - if(!(config_props = link2->dst->input_pads[link2->dstpad].config_props)) - config_props = avfilter_default_config_input_link; - return config_props(link2); + return 0; } static void link_out_start_frame(AVFilterLink *link, AVFilterPicRef *picref) @@ -203,6 +200,7 @@ static int graph_in_config_props(AVFilterLink *link) { AVFilterLink *link2 = get_intern_input_link(link); int (*config_props)(AVFilterLink *); + int ret; if(!link2) return -1; @@ -215,7 +213,12 @@ static int graph_in_config_props(AVFilterLink *link) if(!(config_props = link2->dst->input_pads[link2->dstpad].config_props)) return 0; /* FIXME? */ //config_props = avfilter_default_config_input_link; - return config_props(link2); + if(!(ret = config_props(link2))) + link2->init_state = AVLINK_INIT; + else + link2->init_state = AVLINK_STARTINIT; + + return ret; } static AVFilterLink *get_intern_output_link(AVFilterLink *link) @@ -235,26 +238,21 @@ static int graph_out_request_frame(AVFilterLink *link) static int graph_out_config_props(AVFilterLink *link) { - AVFilterLink *link2 = get_intern_output_link(link); - int (*config_props)(AVFilterLink *); + GraphContext *graph = link->src->priv; + AVFilterLink *link2 = graph->link_filter_out->inputs[link->srcpad]; int ret; + if((ret = avfilter_config_links(graph->link_filter_out))) + return ret; + if(!link2) return 0; - link2->w = link->w; - link2->h = link->h; - link2->format = link->format; - - if(!(config_props = link2->src->output_pads[link2->srcpad].config_props)) - config_props = avfilter_default_config_output_link; - ret = config_props(link2); - link->w = link2->w; link->h = link2->h; link->format = link2->format; - return ret; + return 0; } static int add_graph_input(AVFilterContext *gctx, AVFilterContext *filt, unsigned idx, @@ -477,27 +475,6 @@ int avfilter_graph_config_formats(AVFilterContext *graphctx) return 0; } -int avfilter_graph_config_links(AVFilterContext *graphctx) -{ - GraphContext *graph = graphctx->priv; - int i, j; - - for(i = 0; i < graph->filter_count; i ++) { - for(j = 0; j < graph->filters[i]->input_count; j ++) { - /* ensure that graphs contained within graphs are configured */ - if((graph->filters[i]->filter == &avfilter_vf_graph || - graph->filters[i]->filter == &avfilter_vf_graphfile || - graph->filters[i]->filter == &avfilter_vf_graphdesc) && - avfilter_graph_config_links(graph->filters[i])) - return -1; - if(avfilter_config_link(graph->filters[i]->inputs[j])) - return -1; - } - } - - return 0; -} - static int graph_load_from_desc(AVFilterContext *ctx, AVFilterGraphDesc *desc) { AVFilterGraphDescFilter *curfilt; |