summaryrefslogtreecommitdiff
path: root/libavfilter/avfilter.c
diff options
context:
space:
mode:
authorVitor Sessak <vitor1001@gmail.com>2008-02-15 21:39:41 +0000
committerVitor Sessak <vitor1001@gmail.com>2008-02-15 21:39:41 +0000
commit698181056d5ef207a69faeda547e7909d740d0e2 (patch)
tree284e192439fdde6f2b700e11273ccbc4ac33331b /libavfilter/avfilter.c
parentc35a047373be425427c8b08d42d4b7db7824d2cb (diff)
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 12031 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavfilter/avfilter.c')
-rw-r--r--libavfilter/avfilter.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
index 2e44dce2c9..315afe2f1c 100644
--- a/libavfilter/avfilter.c
+++ b/libavfilter/avfilter.c
@@ -125,23 +125,41 @@ int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt,
return 0;
}
-int avfilter_config_link(AVFilterLink *link)
+int avfilter_config_links(AVFilterContext *filter)
{
int (*config_link)(AVFilterLink *);
+ unsigned i;
- if(!link)
- return 0;
+ for(i = 0; i < filter->input_count; i ++) {
+ AVFilterLink *link;
+
+ if(!(link = filter->inputs[i])) continue;
+
+ switch(link->init_state) {
+ case AVLINK_INIT:
+ continue;
+ case AVLINK_STARTINIT:
+ av_log(filter, AV_LOG_ERROR, "circular filter chain detected\n");
+ return -1;
+ case AVLINK_UNINIT:
+ link->init_state = AVLINK_STARTINIT;
+
+ if(avfilter_config_links(link->src))
+ return -1;
if(!(config_link = link_spad(link).config_props))
config_link = avfilter_default_config_output_link;
if(config_link(link))
return -1;
- if(!(config_link = link_dpad(link).config_props))
- config_link = avfilter_default_config_input_link;
+ if((config_link = link_dpad(link).config_props))
if(config_link(link))
return -1;
+ link->init_state = AVLINK_INIT;
+ }
+ }
+
return 0;
}