[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