From 8c055f873f9ec66842c08e157a943ce2c5301f55 Mon Sep 17 00:00:00 2001 From: wm4 Date: Wed, 11 Feb 2015 13:15:37 +0100 Subject: af_rubberband: improve EOF handling In theory it could happen that draining on EOF happens incrementally, and then the unconditional reset could have dropped the remaining buffered audio. --- audio/filter/af_rubberband.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/audio/filter/af_rubberband.c b/audio/filter/af_rubberband.c index 551461d326..754fb39c06 100644 --- a/audio/filter/af_rubberband.c +++ b/audio/filter/af_rubberband.c @@ -97,22 +97,28 @@ static int filter_out(struct af_instance *af) { struct priv *p = af->priv; - if (p->needs_reset) - rubberband_reset(p->rubber); - p->needs_reset = false; - while (!rubberband_available(p->rubber)) { const float *dummy[MP_NUM_CHANNELS] = {0}; const float **in_data = dummy; size_t in_samples = 0; if (p->pending) { if (!p->pending->samples) - return 0; + break; + + // recover from previous EOF + if (p->needs_reset) + rubberband_reset(p->rubber); + p->needs_reset = false; + size_t needs = rubberband_get_samples_required(p->rubber); in_data = (void *)&p->pending->planes; in_samples = MPMIN(p->pending->samples, needs); } + + if (p->needs_reset) + break; // previous EOF p->needs_reset = !p->pending; // EOF + rubberband_process(p->rubber, in_data, in_samples, p->needs_reset); if (!p->pending) break; -- cgit v1.2.3