diff options
author | Vitor Sessak <vitor1001@gmail.com> | 2008-02-15 21:39:41 +0000 |
---|---|---|
committer | Vitor Sessak <vitor1001@gmail.com> | 2008-02-15 21:39:41 +0000 |
commit | 698181056d5ef207a69faeda547e7909d740d0e2 (patch) | |
tree | 284e192439fdde6f2b700e11273ccbc4ac33331b /libavfilter/avfilter.c | |
parent | c35a047373be425427c8b08d42d4b7db7824d2cb (diff) | |
download | ffmpeg-698181056d5ef207a69faeda547e7909d740d0e2.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 12031 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavfilter/avfilter.c')
-rw-r--r-- | libavfilter/avfilter.c | 28 |
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; } |