From e05591ef5947a039183b42c1d6d3be945e5475ab Mon Sep 17 00:00:00 2001 From: ferreum <code@ferreum.de> Date: Sun, 13 Aug 2023 15:12:41 +0200 Subject: [PATCH] af_scaletempo2: truncate final packet to expected length Avoid generating too much audio after EOF. Note: This often has no effect, because less audio is produced than required. Usually this comes to effect with the userspeed filter at high speed (4x) and going back to 1x speed to remove the filter. --- audio/filter/af_scaletempo2.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/audio/filter/af_scaletempo2.c b/audio/filter/af_scaletempo2.c index 5258fe3204..ea4b63975e 100644 --- a/audio/filter/af_scaletempo2.c +++ b/audio/filter/af_scaletempo2.c @@ -111,6 +111,20 @@ static void process(struct mp_filter *f) double frame_delay = mp_scaletempo2_get_latency(&p->data, p->speed) + out_samples * p->speed; mp_aframe_set_pts(out, pts - frame_delay / mp_aframe_get_effective_rate(out)); + + if (p->sent_final) { + double remain_pts = pts - mp_aframe_get_pts(out); + double rate = mp_aframe_get_effective_rate(out) / p->speed; + int max_samples = MPMAX(0, (int) (remain_pts * rate)); + // truncate final packet to expected length + if (out_samples >= max_samples) { + out_samples = max_samples; + + // reset the filter to ensure it stops generating audio + // and mp_scaletempo2_frames_available returns false + mp_scaletempo2_reset(&p->data); + } + } } mp_aframe_set_size(out, out_samples);