af_asyncts: fix request_frame() behavior.
authorAnton Khirnov <anton@khirnov.net>
Wed, 4 Jul 2012 14:46:17 +0000 (16:46 +0200)
committerAnton Khirnov <anton@khirnov.net>
Mon, 9 Jul 2012 06:21:15 +0000 (08:21 +0200)
Make sure that an output frame has really been produced before returning
0.

libavfilter/af_asyncts.c

index 8402b26..097bc60 100644 (file)
@@ -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");