From 3b64e3ea45c580c5e158c086f2eb7c65635fc33b Mon Sep 17 00:00:00 2001 From: Nicolas George Date: Sat, 24 Dec 2016 10:33:33 +0100 Subject: [PATCH] lavf/framesync: detect EOF immediately. Fix an infinite loop in forward_status_change(). --- libavfilter/framesync.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/libavfilter/framesync.c b/libavfilter/framesync.c index 7920cdb379..eb05d66a86 100644 --- a/libavfilter/framesync.c +++ b/libavfilter/framesync.c @@ -18,6 +18,9 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#define FF_INTERNAL_FIELDS 1 +#include "framequeue.h" + #include "libavutil/avassert.h" #include "avfilter.h" #include "bufferqueue.h" @@ -314,7 +317,7 @@ int ff_framesync_filter_frame(FFFrameSync *fs, AVFilterLink *inlink, int ff_framesync_request_frame(FFFrameSync *fs, AVFilterLink *outlink) { AVFilterContext *ctx = outlink->src; - int input, ret; + int input, ret, i; if ((ret = ff_framesync_process_frame(fs, 0)) < 0) return ret; @@ -323,6 +326,11 @@ int ff_framesync_request_frame(FFFrameSync *fs, AVFilterLink *outlink) if (fs->eof) return AVERROR_EOF; input = fs->in_request; + /* Detect status change early */ + for (i = 0; i < fs->nb_in; i++) + if (!ff_framequeue_queued_frames(&ctx->inputs[i]->fifo) && + ctx->inputs[i]->status_in && !ctx->inputs[i]->status_out) + input = i; ret = ff_request_frame(ctx->inputs[input]); if (ret == AVERROR_EOF) { if ((ret = ff_framesync_add_frame(fs, input, NULL)) < 0)