[FFmpeg-devel] [PATCH 2/4] avfilter/f_loop: fix length of aloop leftover buffer

Marton Balint cus at passwd.hu
Mon Nov 4 22:30:21 EET 2024


If the audio loop stops inside an audio frame, the leftover buffer contains the
end of the frame, which is not looped. The length supposed to be the part which
was not written to the loop buffer, so we need to drain exactly that number of
bytes from the leftover buffer.

Signed-off-by: Marton Balint <cus at passwd.hu>
---
 libavfilter/f_loop.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/libavfilter/f_loop.c b/libavfilter/f_loop.c
index 9b01a85405..3372c77fee 100644
--- a/libavfilter/f_loop.c
+++ b/libavfilter/f_loop.c
@@ -170,14 +170,13 @@ static int afilter_frame(AVFilterLink *inlink, AVFrame *frame)
                 s->pts += av_rescale_q(s->start - s->ignored_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base);
             }
             s->nb_samples += ret - drain;
-            drain = frame->nb_samples - written;
-            if (s->nb_samples == s->size && drain > 0) {
+            if (s->nb_samples == s->size && frame->nb_samples > written) {
                 int ret2;
 
                 ret2 = av_audio_fifo_write(s->left, (void **)frame->extended_data, frame->nb_samples);
                 if (ret2 < 0)
                    return ret2;
-                av_audio_fifo_drain(s->left, drain);
+                av_audio_fifo_drain(s->left, written);
             }
             frame->nb_samples = ret;
             s->pts += av_rescale_q(ret, (AVRational){1, outlink->sample_rate}, outlink->time_base);
-- 
2.43.0



More information about the ffmpeg-devel mailing list