diff options
author | Anton Khirnov <anton@khirnov.net> | 2013-04-16 21:53:56 +0200 |
---|---|---|
committer | Diego Biurrun <diego@biurrun.de> | 2013-04-22 02:29:56 +0200 |
commit | 9bfc6e02bae9de354fb9ba09a8a140e83eeadf7d (patch) | |
tree | 126d6b564f74ea63eaf472ed2a2cc4c69df52c8d /libavfilter | |
parent | b845f5e97b655de0a191f736594777fec9754cf5 (diff) | |
download | ffmpeg-9bfc6e02bae9de354fb9ba09a8a140e83eeadf7d.tar.gz |
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>
Diffstat (limited to 'libavfilter')
-rw-r--r-- | libavfilter/fifo.c | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/libavfilter/fifo.c b/libavfilter/fifo.c index ae464036c6..8d981cef96 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); } |