summaryrefslogtreecommitdiff
path: root/libavfilter/fifo.c
diff options
context:
space:
mode:
Diffstat (limited to 'libavfilter/fifo.c')
-rw-r--r--libavfilter/fifo.c36
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);
}