EOF only need to be forwarded back if all outputs have reached EOF. Fixes infinte loop with ffprobe -f lavfi -i "smptebars=d=1,select=n=2:e=1[out0][out1]" Regression since d9e41ead82263e96ebd14d4d88d6e7f858dd944c. Fixes ticket #10959. Fixes ticket #11366.
Showing the changes to libavfilter/avfilter.c (1 of 1 file). Show all
Unified · Split
| @@ -1253,16 +1253,14 @@ static int forward_status_change(AVFilterContext *filter, FilterLinkInternal *li · 1252 unmodified lines | ||
| 1253 | 1253 | static int filter_activate_default(AVFilterContext *filter) |
| 1254 | 1254 | { |
| 1255 | 1255 | unsigned i; |
| 1256 | + int nb_eofs = 0; | |
| 1256 | 1257 | |
| 1257 | − for (i = 0; i < filter->nb_outputs; i++) { | |
| 1258 | − FilterLinkInternal *li = ff_link_internal(filter->outputs[i]); | |
| 1259 | − int ret = li->status_in; | |
| 1260 | − | |
| 1261 | − if (ret) { | |
| 1262 | − for (int j = 0; j < filter->nb_inputs; j++) | |
| 1263 | − ff_inlink_set_status(filter->inputs[j], ret); | |
| 1264 | − return 0; | |
| 1265 | − } | |
| 1258 | + for (i = 0; i < filter->nb_outputs; i++) | |
| 1259 | + nb_eofs += ff_outlink_get_status(filter->outputs[i]) == AVERROR_EOF; | |
| 1260 | + if (filter->nb_outputs && nb_eofs == filter->nb_outputs) { | |
| 1261 | + for (int j = 0; j < filter->nb_inputs; j++) | |
| 1262 | + ff_inlink_set_status(filter->inputs[j], AVERROR_EOF); | |
| 1263 | + return 0; | |
| 1266 | 1264 | } |
| 1267 | 1265 | |
| 1268 | 1266 | for (i = 0; i < filter->nb_inputs; i++) { |