[FFmpeg-cvslog] avfilter/f_loop: fix length of aloop leftover buffer
Marton Balint
git at videolan.org
Mon Nov 18 00:05:31 EET 2024
ffmpeg | branch: release/6.1 | Marton Balint <cus at passwd.hu> | Sun Nov 3 22:32:51 2024 +0100| [2b6be6ba90adefa0ffdfaf309a4d9d51d430b6f4] | committer: Marton Balint
avfilter/f_loop: fix length of aloop leftover buffer
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>
(cherry picked from commit b33a59416072ad31a5840f33f9975d88acf45add)
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=2b6be6ba90adefa0ffdfaf309a4d9d51d430b6f4
---
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 0b08a2ead3..f2829ecb2b 100644
--- a/libavfilter/f_loop.c
+++ b/libavfilter/f_loop.c
@@ -169,14 +169,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);
More information about the ffmpeg-cvslog
mailing list