aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVitor Sessak <vitor1001@gmail.com>2008-04-04 20:07:59 +0000
committerVitor Sessak <vitor1001@gmail.com>2008-04-04 20:07:59 +0000
commit095ae1bcb7ba73c8410fe5bf37c61b3c05c0e5eb (patch)
treef453ea94321c44fe3406deac4db193591849400d
parentf3f42a3c5111bb88103b67703798551b192950f5 (diff)
downloadffmpeg-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.c51
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;