diff options
author | Anton Khirnov <anton@khirnov.net> | 2012-07-04 18:46:17 +0400 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2012-07-09 10:21:15 +0400 |
commit | 6f834293d3023153ec5d09c232ac49c3afc57baa (patch) | |
tree | 6eb27f7cfc0f9ca3fe7c699fdd6d8f6a07a5773c /libavfilter/af_asyncts.c | |
parent | 0dd283faca34f25bc96bfe75392b75b8efb7de8d (diff) |
af_asyncts: fix request_frame() behavior.
Make sure that an output frame has really been produced before returning
0.
Diffstat (limited to 'libavfilter/af_asyncts.c')
-rw-r--r-- | libavfilter/af_asyncts.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/libavfilter/af_asyncts.c b/libavfilter/af_asyncts.c index 8402b2670e..097bc6045f 100644 --- a/libavfilter/af_asyncts.c +++ b/libavfilter/af_asyncts.c @@ -37,6 +37,9 @@ typedef struct ASyncContext { int resample; float min_delta_sec; int max_comp; + + /* set by filter_samples() to signal an output frame to request_frame() */ + int got_output; } ASyncContext; #define OFFSET(x) offsetof(ASyncContext, x) @@ -117,9 +120,13 @@ static int request_frame(AVFilterLink *link) { AVFilterContext *ctx = link->src; ASyncContext *s = ctx->priv; - int ret = ff_request_frame(ctx->inputs[0]); + int ret = 0; int nb_samples; + s->got_output = 0; + while (ret >= 0 && !s->got_output) + ret = ff_request_frame(ctx->inputs[0]); + /* flush the fifo */ if (ret == AVERROR_EOF && (nb_samples = avresample_get_delay(s->avr))) { AVFilterBufferRef *buf = ff_get_audio_buffer(link, AV_PERM_WRITE, @@ -206,6 +213,7 @@ static void filter_samples(AVFilterLink *inlink, AVFilterBufferRef *buf) delta, nb_channels, buf->format); } ff_filter_samples(outlink, buf_out); + s->got_output = 1; } else { av_log(ctx, AV_LOG_WARNING, "Non-monotonous timestamps, dropping " "whole buffer.\n"); |