[FFmpeg-cvslog] avfiltergraph: improve pick_format()

Michael Niedermayer git at videolan.org
Thu May 10 02:33:22 CEST 2012


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Thu May 10 01:32:51 2012 +0200| [7610dee87bd901972b92de014d5cb1e5319a4a14] | committer: Michael Niedermayer

avfiltergraph: improve pick_format()

without this the recent changes to format/sink handling would cause a regression in fate

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=7610dee87bd901972b92de014d5cb1e5319a4a14
---

 libavfilter/avfiltergraph.c |   43 +++++++++++++++++++++++++++++++++----------
 1 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c
index 9d7b956..6e803d6 100644
--- a/libavfilter/avfiltergraph.c
+++ b/libavfilter/avfiltergraph.c
@@ -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++)



More information about the ffmpeg-cvslog mailing list