aboutsummaryrefslogtreecommitdiffstats
path: root/libavfilter/avfilter.c
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2025-06-21 08:21:40 +0200
committerMarton Balint <cus@passwd.hu>2025-07-03 21:41:53 +0200
commita736ac72bb2e457484724f0589fd11a2b2b5f852 (patch)
treef083daf87d0103e773f60495eefe03b56740f452 /libavfilter/avfilter.c
parent29e696c9c010778b4750efb42c3e89544d56ec4e (diff)
downloadffmpeg-a736ac72bb2e457484724f0589fd11a2b2b5f852.tar.gz
avfilter/avfilter: fix forwarding EOF for simple API filters in filter_activate_default
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. Signed-off-by: Marton Balint <cus@passwd.hu>
Diffstat (limited to 'libavfilter/avfilter.c')
-rw-r--r--libavfilter/avfilter.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
index 56f635a413..dd12533208 100644
--- a/libavfilter/avfilter.c
+++ b/libavfilter/avfilter.c
@@ -1253,16 +1253,14 @@ static int forward_status_change(AVFilterContext *filter, FilterLinkInternal *li
static int filter_activate_default(AVFilterContext *filter)
{
unsigned i;
+ int nb_eofs = 0;
- for (i = 0; i < filter->nb_outputs; i++) {
- FilterLinkInternal *li = ff_link_internal(filter->outputs[i]);
- int ret = li->status_in;
-
- if (ret) {
- for (int j = 0; j < filter->nb_inputs; j++)
- ff_inlink_set_status(filter->inputs[j], ret);
- return 0;
- }
+ for (i = 0; i < filter->nb_outputs; i++)
+ nb_eofs += ff_outlink_get_status(filter->outputs[i]) == AVERROR_EOF;
+ if (filter->nb_outputs && nb_eofs == filter->nb_outputs) {
+ for (int j = 0; j < filter->nb_inputs; j++)
+ ff_inlink_set_status(filter->inputs[j], AVERROR_EOF);
+ return 0;
}
for (i = 0; i < filter->nb_inputs; i++) {