[PR] fftools/ffmpeg_sched: avoid premature eof for throttled decoders (PR #24118)

AYOUB NABIL BOUBAGRAT via ffmpeg-devel <[email protected]>
Newsgroups gmane.comp.video.ffmpeg.devel
Message-ID <178657257646.59.14467683403307946819@29965ddac10e>
PR #24118 opened by AYOUB NABIL BOUBAGRAT (ayoubnabil)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24118
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24118.patch

when decoder outputs sharing a demuxer are throttled, the scheduler must
keep accepting packets for the other decoders. the overflow fifo used
the generic auto-grow limit, and reaching it returned ENOSPC.

ffmpeg_dec then treated that scheduler error as EOF, silently truncating
the affected stream while the other streams continued.

a finite packet limit cannot provide a meaningful memory bound, while
applying backpressure would also block the other decoders sharing the
same demuxer.

remove the packet-count limit from the decoder overflow fifo, propagate
scheduler receive errors, and add a regression test that exceeds the old
limit.

this fixes the premature eof reported in #24008 and #23988.

tested with the regression test and the original 600-second sample from
#24008.



>From 6d4c0cef2ef706f0e7c2589a1dcd9107f6acfa91 Mon Sep 17 00:00:00 2001
From: Ayoub Nabil Boubagrat <[email protected]>
Date: Wed, 12 Aug 2026 22:24:35 +0200
Subject: [PATCH 1/3] avutil/container_fifo: add auto-grow limit setter

Signed-off-by: Ayoub Nabil Boubagrat <[email protected]>
---
 doc/APIchanges             | 3 +++
 libavutil/container_fifo.c | 5 +++++
 libavutil/container_fifo.h | 6 ++++++
 libavutil/version.h        | 2 +-
 4 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index 61e0d43735..9489f094b4 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -7,6 +7,9 @@ API changes, most recent first:
   descriptors as bare metadata tag names is now opt-in through this flag,
   only the <tag>-<description>-<lang> tag is exported by default.
 
+2026-08-12 - xxxxxxxxxx - lavu 61.6.100 - container_fifo.h
+  Add av_container_fifo_auto_grow_limit().
+
 2026-07-04 - xxxxxxxxxx - lavc 63.7.100 - codec_id.h
   Add AV_CODEC_ID_PCM_DVDA.
 
diff --git a/libavutil/container_fifo.c b/libavutil/container_fifo.c
index 34a78e7ef3..1e6bde9a4c 100644
--- a/libavutil/container_fifo.c
+++ b/libavutil/container_fifo.c
@@ -98,6 +98,11 @@ fail:
     return NULL;
 }
 
+void av_container_fifo_auto_grow_limit(AVContainerFifo *cf, size_t max_elems)
+{
+    av_fifo_auto_grow_limit(cf->fifo, max_elems);
+}
+
 void av_container_fifo_free(AVContainerFifo **pcf)
 {
     AVContainerFifo *cf;
diff --git a/libavutil/container_fifo.h b/libavutil/container_fifo.h
index ff9249311f..a9a4bb93c3 100644
--- a/libavutil/container_fifo.h
+++ b/libavutil/container_fifo.h
@@ -76,6 +76,12 @@ av_container_fifo_alloc(void *opaque,
  */
 AVContainerFifo *av_container_fifo_alloc_avframe(unsigned flags);
 
+/**
+ * Set the maximum size (in objects) to which the FIFO can be resized
+ * automatically.
+ */
+void av_container_fifo_auto_grow_limit(AVContainerFifo *cf, size_t max_elems);
+
 /**
  * Free a AVContainerFifo and everything in it.
  */
diff --git a/libavutil/version.h b/libavutil/version.h
index d5bf20cf89..94b5e920b9 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -79,7 +79,7 @@
  */
 
 #define LIBAVUTIL_VERSION_MAJOR  61
-#define LIBAVUTIL_VERSION_MINOR   5
+#define LIBAVUTIL_VERSION_MINOR   6
 #define LIBAVUTIL_VERSION_MICRO 100
 
 #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
-- 
2.52.0


>From 7d6a2efcb83f882cf98b0830da720981e5ee6c0e Mon Sep 17 00:00:00 2001
From: Ayoub Nabil Boubagrat <[email protected]>
Date: Wed, 12 Aug 2026 22:24:45 +0200
Subject: [PATCH 2/3] fftools/ffmpeg_sched: remove decoder overflow queue limit

decoders sharing a demuxer must keep accepting packets when one output
is throttled. applying backpressure there would also block packets for
the other decoders.

the generic packet-count limit returned ENOSPC on valid long inputs. it
did not provide a meaningful memory bound because packet sizes vary.

allow the overflow fifo to grow until allocation failure and add a
regression test that exceeds the old limit.

Signed-off-by: Ayoub Nabil Boubagrat <[email protected]>
---
 fftools/ffmpeg_sched.c                 |  6 ++
 tests/fate/ffmpeg.mak                  | 13 ++++
 tests/filtergraphs/decoder-overflow    |  4 ++
 tests/ref/fate/ffmpeg-decoder-overflow | 83 ++++++++++++++++++++++++++
 4 files changed, 106 insertions(+)
 create mode 100644 tests/filtergraphs/decoder-overflow
 create mode 100644 tests/ref/fate/ffmpeg-decoder-overflow

diff --git a/fftools/ffmpeg_sched.c b/fftools/ffmpeg_sched.c
index 88b3bf3177..b751552fa9 100644
--- a/fftools/ffmpeg_sched.c
+++ b/fftools/ffmpeg_sched.c
@@ -821,6 +821,12 @@ int sch_add_dec(Scheduler *sch, SchThreadFunc func, void *ctx, int send_end_ts)
     if (!dec->overflow)
         return AVERROR(ENOMEM);
 
+    // decoders feeding the same demuxer must keep accepting packets when one
+    // of them is throttled. a finite packet limit would reject valid inputs
+    // based on duration and packet rate without providing a meaningful memory
+    // bound, since packet sizes vary. let allocation failure be the limit
+    av_container_fifo_auto_grow_limit(dec->overflow, SIZE_MAX);
+
     ret = waiter_init(&dec->waiter);
     if (ret < 0)
         return ret;
diff --git a/tests/fate/ffmpeg.mak b/tests/fate/ffmpeg.mak
index ad8e5c775f..5104c4f1d6 100644
--- a/tests/fate/ffmpeg.mak
+++ b/tests/fate/ffmpeg.mak
@@ -5,6 +5,19 @@ fate-ffmpeg-filter_complex: CMD = framecrc -filter_complex color=d=1:r=5 -fflags
 FATE_FFMPEG-$(call FILTERFRAMECRC, AEVALSRC ASETNSAMPLES ARESAMPLE, AC3_FIXED_ENCODER) += fate-ffmpeg-filter_complex_audio
 fate-ffmpeg-filter_complex_audio: CMD = framecrc -auto_conversion_filters -filter_complex "aevalsrc=0:d=0.1,asetnsamples=1537" -c ac3_fixed
 
+# 288000 one-sample audio packets exceed the container FIFO's default
+# auto-growth limit on both 32-bit and 64-bit builds.
+FATE_FFMPEG-$(call ALLYES, LAVFI_INDEV TESTSRC2_FILTER SINE_FILTER ASETNSAMPLES_FILTER \
+                           TRIM_FILTER ATRIM_FILTER SETPTS_FILTER ASETPTS_FILTER \
+                           CONCAT_FILTER WRAPPED_AVFRAME_DECODER PCM_S16LE_DECODER \
+                           RAWVIDEO_ENCODER PCM_S16LE_ENCODER FRAMECRC_MUXER PIPE_PROTOCOL) \
+                           += fate-ffmpeg-decoder-overflow
+fate-ffmpeg-decoder-overflow: tests/data/filtergraphs/decoder-overflow
+fate-ffmpeg-decoder-overflow: CMD = ffmpeg -f lavfi \
+    -i "testsrc2=s=16x16:r=1/6:d=6[out0];sine=r=48000:d=6,asetnsamples=n=1[out1]" \
+    -/filter_complex $(TARGET_PATH)/tests/data/filtergraphs/decoder-overflow \
+    -map "[v]" -map "[aout]" -c:v rawvideo -c:a pcm_s16le -f framecrc -
+
 # Ticket 6375, use case of NoX
 FATE_SAMPLES_FFMPEG-$(call FRAMECRC, MOV, PNG ALAC, ARESAMPLE_FILTER) += fate-ffmpeg-attached_pics
 fate-ffmpeg-attached_pics: CMD = threads=2 framecrc -i $(TARGET_SAMPLES)/lossless-audio/inside.m4a -threads 1 -max_muxing_queue_size 16 -af aresample
diff --git a/tests/filtergraphs/decoder-overflow b/tests/filtergraphs/decoder-overflow
new file mode 100644
index 0000000000..7d131d7f54
--- /dev/null
+++ b/tests/filtergraphs/decoder-overflow
@@ -0,0 +1,4 @@
+[0:v]trim=end=6,setpts=PTS-STARTPTS[v0];
+[0:a]atrim=end=6,asetpts=PTS-STARTPTS[a0];
+[v0][a0]concat=n=1:v=1:a=1[v][a];
+[a]asetnsamples=n=4096:p=0[aout]
diff --git a/tests/ref/fate/ffmpeg-decoder-overflow b/tests/ref/fate/ffmpeg-decoder-overflow
new file mode 100644
index 0000000000..7d08cf4c93
--- /dev/null
+++ b/tests/ref/fate/ffmpeg-decoder-overflow
@@ -0,0 +1,83 @@
+#software: Lavf63.6.100
+#tb 0: 6/1
+#media_type 0: video
+#codec_id 0: rawvideo
+#dimensions 0: 16x16
+#sar 0: 1/1
+#tb 1: 1/48000
+#media_type 1: audio
+#codec_id 1: pcm_s16le
+#sample_rate 1: 48000
+#channel_layout_name 1: mono
+0,          0,          0,        1,      384, 0x92e591ca
+1,          0,          0,     4096,     8192, 0xba4ccfdb
+1,       4096,       4096,     4096,     8192, 0x0ea8f228
+1,       8192,       8192,     4096,     8192, 0xf215da72
+1,      12288,      12288,     4096,     8192, 0x2566eba1
+1,      16384,      16384,     4096,     8192, 0x9ac0e286
+1,      20480,      20480,     4096,     8192, 0xff28e21e
+1,      24576,      24576,     4096,     8192, 0x7f18e7a2
+1,      28672,      28672,     4096,     8192, 0xe2a9dd38
+1,      32768,      32768,     4096,     8192, 0x9466f14b
+1,      36864,      36864,     4096,     8192, 0x12edd449
+1,      40960,      40960,     4096,     8192, 0xb176f78e
+1,      45056,      45056,     4096,     8192, 0x49a7d481
+1,      49152,      49152,     4096,     8192, 0xfec9f060
+1,      53248,      53248,     4096,     8192, 0xc0f0da13
+1,      57344,      57344,     4096,     8192, 0x4455eb74
+1,      61440,      61440,     4096,     8192, 0xf0b5e1a8
+1,      65536,      65536,     4096,     8192, 0x0e4be63c
+1,      69632,      69632,     4096,     8192, 0xbc06e533
+1,      73728,      73728,     4096,     8192, 0x7cc6dc3c
+1,      77824,      77824,     4096,     8192, 0xe822f1db
+1,      81920,      81920,     4096,     8192, 0x8635d3d6
+1,      86016,      86016,     4096,     8192, 0x6572f839
+1,      90112,      90112,     4096,     8192, 0x27fad063
+1,      94208,      94208,     4096,     8192, 0x0196f2fc
+1,      98304,      98304,     4096,     8192, 0xa752dcff
+1,     102400,     102400,     4096,     8192, 0xfba6e81c
+1,     106496,     106496,     4096,     8192, 0x76e7e2f9
+1,     110592,     110592,     4096,     8192, 0x4034e306
+1,     114688,     114688,     4096,     8192, 0x42ccec39
+1,     118784,     118784,     4096,     8192, 0x74f4d8d3
+1,     122880,     122880,     4096,     8192, 0x4638f297
+1,     126976,     126976,     4096,     8192, 0x9cfed0b0
+1,     131072,     131072,     4096,     8192, 0x475cf7d1
+1,     135168,     135168,     4096,     8192, 0x5a9fd681
+1,     139264,     139264,     4096,     8192, 0x2cf5eddc
+1,     143360,     143360,     4096,     8192, 0x345bde69
+1,     147456,     147456,     4096,     8192, 0xebcce64f
+1,     151552,     151552,     4096,     8192, 0xd422e4e1
+1,     155648,     155648,     4096,     8192, 0x5fb4e30f
+1,     159744,     159744,     4096,     8192, 0x8ea5e90d
+1,     163840,     163840,     4096,     8192, 0xabd3dcb8
+1,     167936,     167936,     4096,     8192, 0x936ff1ba
+1,     172032,     172032,     4096,     8192, 0x3a02d0bc
+1,     176128,     176128,     4096,     8192, 0xe5bdfa3a
+1,     180224,     180224,     4096,     8192, 0x98e9d318
+1,     184320,     184320,     4096,     8192, 0xea12f0c1
+1,     188416,     188416,     4096,     8192, 0xffa8dd99
+1,     192512,     192512,     4096,     8192, 0x0dd6e4b2
+1,     196608,     196608,     4096,     8192, 0x7cd6e5b0
+1,     200704,     200704,     4096,     8192, 0x93f2e223
+1,     204800,     204800,     4096,     8192, 0xc901ebdf
+1,     208896,     208896,     4096,     8192, 0xf318d7b6
+1,     212992,     212992,     4096,     8192, 0xaf20f65e
+1,     217088,     217088,     4096,     8192, 0x418ecffe
+1,     221184,     221184,     4096,     8192, 0x8b54f77a
+1,     225280,     225280,     4096,     8192, 0x811bd61f
+1,     229376,     229376,     4096,     8192, 0x629aec8a
+1,     233472,     233472,     4096,     8192, 0xc50de3cf
+1,     237568,     237568,     4096,     8192, 0x506be304
+1,     241664,     241664,     4096,     8192, 0x799ee4b0
+1,     245760,     245760,     4096,     8192, 0x09aae1e0
+1,     249856,     249856,     4096,     8192, 0x36e9ec10
+1,     253952,     253952,     4096,     8192, 0x8166d890
+1,     258048,     258048,     4096,     8192, 0x6674f4aa
+1,     262144,     262144,     4096,     8192, 0x5223d05b
+1,     266240,     266240,     4096,     8192, 0xfc57f580
+1,     270336,     270336,     4096,     8192, 0x72d6d7dd
+1,     274432,     274432,     4096,     8192, 0xabaaecdf
+1,     278528,     278528,     4096,     8192, 0x3c1ddf5f
+1,     282624,     282624,     4096,     8192, 0x16b8e7ed
+1,     286720,     286720,     1280,     2560, 0xf55202f4
-- 
2.52.0


>From a75faa7ad40f4afe853b40b33d4c8b537a3ee90f Mon Sep 17 00:00:00 2001
From: Ayoub Nabil Boubagrat <[email protected]>
Date: Wed, 12 Aug 2026 22:24:53 +0200
Subject: [PATCH 3/3] fftools/ffmpeg_dec: propagate scheduler receive errors

Signed-off-by: Ayoub Nabil Boubagrat <[email protected]>
---
 fftools/ffmpeg_dec.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/fftools/ffmpeg_dec.c b/fftools/ffmpeg_dec.c
index 1498afa880..52c41b9137 100644
--- a/fftools/ffmpeg_dec.c
+++ b/fftools/ffmpeg_dec.c
@@ -922,6 +922,14 @@ static int decoder_thread(void *arg)
         int flush_buffers, have_data;
 
         input_status  = sch_dec_receive(dp->sch, dp->sch_idx, dt.pkt);
+        if (input_status < 0 && input_status != AVERROR_EOF) {
+            av_log(dp, AV_LOG_ERROR,
+                   "Error receiving a packet from the scheduler: %s\n",
+                   av_err2str(input_status));
+            ret = input_status;
+            goto finish;
+        }
+
         have_data     = input_status >= 0 &&
             (dt.pkt->buf || dt.pkt->side_data_elems ||
              (intptr_t)dt.pkt->opaque == PKT_OPAQUE_SUB_HEARTBEAT ||
-- 
2.52.0

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.