summaryrefslogtreecommitdiff
path: root/libavfilter/af_asyncts.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2012-07-04 16:46:17 +0200
committerAnton Khirnov <anton@khirnov.net>2012-07-09 08:21:15 +0200
commit6f834293d3023153ec5d09c232ac49c3afc57baa (patch)
tree6eb27f7cfc0f9ca3fe7c699fdd6d8f6a07a5773c /libavfilter/af_asyncts.c
parent0dd283faca34f25bc96bfe75392b75b8efb7de8d (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.c10
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");