The old code had two bugs: For audio filters, the format was not set. For video filters, if several links reference the same format list, the same format must be selected in the end. This is done by setting formats->format_count to 1: the other links sharing the reference will therefore have only one choice. If the heuristic does not pick the first format, the selected format must also be moved to the first position.
Showing the changes to libavfilter/avfiltergraph.c (1 of 1 file). Show all
Unified · Split
| @@ -269,12 +269,12 @@ static void pick_format(AVFilterLink *link, AVFilterLink *ref) · 268 unmodified lines | |||
| 269 | enum PixelFormat p = link->in_formats->formats[i]; | 269 | enum PixelFormat p = link->in_formats->formats[i]; |
| 270 | best= avcodec_find_best_pix_fmt2(best, p, ref->format, has_alpha, NULL); | 270 | best= avcodec_find_best_pix_fmt2(best, p, ref->format, has_alpha, NULL); |
| 271 | } | 271 | } |
| 272 | link->format = best; | 272 | link->in_formats->formats[0] = best; |
| 273 | }else | 273 | } |
| 274 | link->format = link->in_formats->formats[0]; | ||
| 275 | } | 274 | } |
| 276 | 275 | ||
| 277 | link->in_formats->format_count = 1; | 276 | link->in_formats->format_count = 1; |
| 277 | link->format = link->in_formats->formats[0]; | ||
| 278 | avfilter_formats_unref(&link->in_formats); | 278 | avfilter_formats_unref(&link->in_formats); |
| 279 | avfilter_formats_unref(&link->out_formats); | 279 | avfilter_formats_unref(&link->out_formats); |
| 280 | 280 | ||