From 9bfc6e02bae9de354fb9ba09a8a140e83eeadf7d Mon Sep 17 00:00:00 2001 From: Anton Khirnov <anton@khirnov.net> Date: Tue, 16 Apr 2013 21:53:56 +0200 Subject: [PATCH] afifo: fix request_samples on the last frame in certain cases The current code can fail to return the last frame if it contains exactly the requested number of samples. Fixes the join filter test, which previously did not include the last 408 samples in most cases. CC:libav-stable@libav.org Signed-off-by: Diego Biurrun <diego@biurrun.de> --- libavfilter/fifo.c | 36 +++++++++++++++++++----------------- tests/fate/filter-audio.mak | 2 +- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/libavfilter/fifo.c b/libavfilter/fifo.c index ae464036c6e..8d981cef965 100644 --- a/libavfilter/fifo.c +++ b/libavfilter/fifo.c @@ -183,8 +183,25 @@ static int return_audio_frame(AVFilterContext *ctx) } while (s->out->nb_samples < s->allocated_samples) { - int len = FFMIN(s->allocated_samples - s->out->nb_samples, - head->nb_samples); + int len; + + if (!s->root.next) { + ret = ff_request_frame(ctx->inputs[0]); + if (ret == AVERROR_EOF) { + av_samples_set_silence(s->out->extended_data, + s->out->nb_samples, + s->allocated_samples - + s->out->nb_samples, + nb_channels, link->format); + s->out->nb_samples = s->allocated_samples; + break; + } else if (ret < 0) + return ret; + } + head = s->root.next->frame; + + len = FFMIN(s->allocated_samples - s->out->nb_samples, + head->nb_samples); av_samples_copy(s->out->extended_data, head->extended_data, s->out->nb_samples, 0, len, nb_channels, @@ -194,21 +211,6 @@ static int return_audio_frame(AVFilterContext *ctx) if (len == head->nb_samples) { av_frame_free(&head); queue_pop(s); - - if (!s->root.next && - (ret = ff_request_frame(ctx->inputs[0])) < 0) { - if (ret == AVERROR_EOF) { - av_samples_set_silence(s->out->extended_data, - s->out->nb_samples, - s->allocated_samples - - s->out->nb_samples, - nb_channels, link->format); - s->out->nb_samples = s->allocated_samples; - break; - } - return ret; - } - head = s->root.next->frame; } else { buffer_offset(link, head, len); } diff --git a/tests/fate/filter-audio.mak b/tests/fate/filter-audio.mak index 63293d97b2a..7f1a056f9a1 100644 --- a/tests/fate/filter-audio.mak +++ b/tests/fate/filter-audio.mak @@ -45,7 +45,7 @@ fate-filter-join: SRC2 = $(TARGET_PATH)/tests/data/asynth-44100-3.wav fate-filter-join: tests/data/asynth-44100-2.wav tests/data/asynth-44100-3.wav fate-filter-join: CMD = md5 -i $(SRC1) -i $(SRC2) -filter_complex join=channel_layout=5 -f s16le fate-filter-join: CMP = oneline -fate-filter-join: REF = 38fa1b18b0c46d77df6f17bfc4f078dd +fate-filter-join: REF = 409e66fc5ece4ddea4aa16bc47026bb0 FATE_AFILTER-$(call FILTERDEMDECENCMUX, VOLUME, WAV, PCM_S16LE, PCM_S16LE, PCM_S16LE) += fate-filter-volume fate-filter-volume: SRC = $(TARGET_PATH)/tests/data/asynth-44100-2.wav -- GitLab