avfiltergraph: improve pick_format()
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 9 May 2012 23:32:51 +0000 (01:32 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 10 May 2012 00:25:48 +0000 (02:25 +0200)
without this the recent changes to format/sink handling would cause a regression in fate

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavfilter/avfiltergraph.c

index 9d7b956..6e803d6 100644 (file)
@@ -337,19 +337,42 @@ static void reduce_formats(AVFilterGraph *graph)
 static void pick_formats(AVFilterGraph *graph)
 {
     int i, j;
-
-    for (i = 0; i < graph->filter_count; i++) {
-        AVFilterContext *filter = graph->filters[i];
-        if (filter->input_count && filter->output_count) {
-            for (j = 0; j < filter->input_count; j++)
-                pick_format(filter->inputs[j], NULL);
-            for (j = 0; j < filter->output_count; j++)
-                pick_format(filter->outputs[j], filter->inputs[0]);
+    int change;
+
+    do{
+        change = 0;
+        for (i = 0; i < graph->filter_count; i++) {
+            AVFilterContext *filter = graph->filters[i];
+            if (filter->input_count){
+                for (j = 0; j < filter->input_count; j++){
+                    if(filter->inputs[j]->in_formats && filter->inputs[j]->in_formats->format_count == 1) {
+                        pick_format(filter->inputs[j], NULL);
+                        change = 1;
+                    }
+                }
+            }
+            if (filter->output_count){
+                for (j = 0; j < filter->output_count; j++){
+                    if(filter->outputs[j]->in_formats && filter->outputs[j]->in_formats->format_count == 1) {
+                        pick_format(filter->outputs[j], NULL);
+                        change = 1;
+                    }
+                }
+            }
+            if (filter->input_count && filter->output_count && filter->inputs[0]->format>=0) {
+                for (j = 0; j < filter->output_count; j++) {
+                    if(filter->outputs[j]->format<0) {
+                        pick_format(filter->outputs[j], filter->inputs[0]);
+                        change = 1;
+                    }
+                }
+            }
         }
-    }
+    }while(change);
+
     for (i = 0; i < graph->filter_count; i++) {
         AVFilterContext *filter = graph->filters[i];
-        if (!(filter->input_count && filter->output_count)) {
+        if (1) {
             for (j = 0; j < filter->input_count; j++)
                 pick_format(filter->inputs[j], NULL);
             for (j = 0; j < filter->output_count; j++)