[FFmpeg-cvslog] afifo: fix request_samples on the last frame in certain cases
Anton Khirnov
git at videolan.org
Mon Apr 22 13:08:14 CEST 2013
ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Tue Apr 16 21:53:56 2013 +0200| [9bfc6e02bae9de354fb9ba09a8a140e83eeadf7d] | committer: Diego Biurrun
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 at libav.org
Signed-off-by: Diego Biurrun <diego at biurrun.de>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=9bfc6e02bae9de354fb9ba09a8a140e83eeadf7d
---
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 ae46403..8d981ce 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 63293d9..7f1a056 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
More information about the ffmpeg-cvslog
mailing list