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
This commit is contained in:
Vitor Sessak 2008-04-04 20:07:59 +00:00
parent f3f42a3c51
commit 095ae1bcb7
1 changed files with 14 additions and 37 deletions

View File

@ -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;