From e363730c015e2c58e6fd9d1016441d1c09efd5bf Mon Sep 17 00:00:00 2001 From: Vitor Sessak Date: Fri, 15 Feb 2008 22:00:03 +0000 Subject: [PATCH] Rewrite colorspace negotiation. Commited in SoC by Bobby Bingham on 2007-12-20 19:36:26 Originally committed as revision 12072 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavfilter/defaults.c | 43 +++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/libavfilter/defaults.c b/libavfilter/defaults.c index 4736c96d5c..ae85b5bf2b 100644 --- a/libavfilter/defaults.c +++ b/libavfilter/defaults.c @@ -115,15 +115,40 @@ int avfilter_default_config_input_link(AVFilterLink *link) } /** - * default query_formats() implementation for output video links to simplify - * the implementation of one input one output video filters */ -int *avfilter_default_query_output_formats(AVFilterLink *link) + * A helper for query_formats() which sets all links to the same list of + * formats. If there are no links hooked to this filter, the list of formats is + * freed. + * + * FIXME: this will need changed for filters with a mix of pad types + * (video + audio, etc) + */ +void avfilter_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats) { - if(link->src->input_count && link->src->inputs[0]) - return avfilter_make_format_list(1, link->src->inputs[0]->format); - else - /* XXX: any non-simple filter which would cause this branch to be taken - * really should implement its own query_formats() for this link */ - return avfilter_make_format_list(0); + int count = 0, i; + + for(i = 0; i < ctx->input_count; i ++) { + if(ctx->inputs[i]) { + avfilter_formats_ref(formats, &ctx->inputs[i]->out_formats); + count ++; + } + } + for(i = 0; i < ctx->output_count; i ++) { + if(ctx->outputs[i]) { + avfilter_formats_ref(formats, &ctx->outputs[i]->in_formats); + count ++; + } + } + + if(!count) { + av_free(formats->formats); + av_free(formats->refs); + av_free(formats); + } +} + +int avfilter_default_query_formats(AVFilterContext *ctx) +{ + avfilter_set_common_formats(ctx, avfilter_all_colorspaces()); + return 0; }