diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c index ea8df43a9851d80ad7b6448bc05f7dc9fd7770e9..cb6be057cf11a368ca5f73eaf25b292224f48246 100644 --- a/libavfilter/avfilter.c +++ b/libavfilter/avfilter.c @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include #include #include @@ -91,6 +92,7 @@ int avfilter_link(AVFilterContext *src, unsigned srcpad, AVFilterContext *dst, unsigned dstpad) { AVFilterLink *link; + int *fmts[2], i, j; if(src->outputs[srcpad] || dst->inputs[dstpad]) return -1; @@ -104,7 +106,29 @@ int avfilter_link(AVFilterContext *src, unsigned srcpad, link->dstpad = dstpad; link->cur_pic = NULL; - src->filter->outputs[dstpad].set_video_props(link); + /* find a format both filters support - TODO: auto-insert conversion filter */ + fmts[0] = src->filter->outputs[srcpad].query_formats(link); + fmts[1] = dst->filter->inputs[dstpad].query_formats(link); + for(i = 0; fmts[0][i] != -1; i ++) + for(j = 0; fmts[1][j] != -1; j ++) + if(fmts[0][i] == fmts[1][j]) { + link->format = fmts[0][i]; + goto format_done; + } + +format_done: + av_free(fmts[0]); + av_free(fmts[1]); + if(link->format == -1) { + /* failed to find a format. fail at creating the link */ + av_free(link); + src->outputs[srcpad] = NULL; + dst->inputs[dstpad] = NULL; + return -1; + } + + src->filter->outputs[srcpad].config_props(link); + dst->filter->inputs[dstpad].config_props(link); return 0; } @@ -263,9 +287,21 @@ int avfilter_init_filter(AVFilterContext *filter, const char *args) if(filter->filter->init) if((ret = filter->filter->init(filter, args))) return ret; - for(i = 0; i < pad_count(filter->filter->outputs); i ++) - if(filter->outputs[i]) - filter->filter->outputs[i].set_video_props(filter->outputs[i]); return 0; } +int *avfilter_make_format_list(int len, ...) +{ + int *ret, i; + va_list vl; + + ret = av_malloc(sizeof(int) * (len + 1)); + va_start(vl, len); + for(i = 0; i < len; i ++) + ret[i] = va_arg(vl, int); + va_end(vl); + ret[len] = -1; + + return ret; +} +