mirror of https://git.ffmpeg.org/ffmpeg.git
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:
parent
f3f42a3c51
commit
095ae1bcb7
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue