From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 26C0442278 for ; Tue, 1 Mar 2022 13:25:49 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8FDAA68B080; Tue, 1 Mar 2022 15:25:47 +0200 (EET) Received: from mail-ej1-f43.google.com (mail-ej1-f43.google.com [209.85.218.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B24C368AE71 for ; Tue, 1 Mar 2022 15:25:40 +0200 (EET) Received: by mail-ej1-f43.google.com with SMTP id p15so31475102ejc.7 for ; Tue, 01 Mar 2022 05:25:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=lEL9vxNyFpDQMUGk3gNiwYVpoemmEq4spiCJMUYjWaY=; b=WNauvQVBsvJyfqoe4RNS5NfIPlaxXyEy7mKnkKr7oRJxQ+OgBi42w9XsoLZ60a4vXB C50A/3IMz7GlpGYH+x7Sln3LR8HuAeapeRJfHHw2nSJnqj3bBwf/pt1vCe+zz99o0Cqx LTKxoDGWMTgiK7TczTAfpzzFFla1prUohgDNjkxRR2yomQBMwEpJKXD9ZW94PcLI1PFj qZWPW6NVXHYJ/I/zdHg2gKd8lJj+w5Hsl+M1HYrvd0lHprl0fkcZwsm/1gEUmFPK+Ycn G6ziAtU7pobtdGjMPsKKISg7viJ84C9czoMIbMM0+Qhe8MlzalroIwpMijX8KdydWqLZ PsaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=lEL9vxNyFpDQMUGk3gNiwYVpoemmEq4spiCJMUYjWaY=; b=j6FcwHeiKwGdPd/Zj8vWEkbquglLkZK0CADYqnsgxRNB+VxK1jaxHTe8JDRct7gGOR G1Pwsoe72t2TNTf78uqVw4dmnBPdl/CUyikfzXmmkzyD6n1QaAa99grMGq89OqS8Tn14 u9QoEoZmdn9H5KP/6Vn3RPRcyGnWu0sLpjHcedn2AzKORR3HxxxZpof3hvgl+uNLaQLT yHC6t1BhWGJjtJch4X6MUSgMa/JvGjbszfamhaMq4TRy5Teom9zRbTU445TPGe8OUcNF M29rO+SlYdcTZ5NqXLIxvqcXeywrbPshQVzwh6yFrxh+SDCer8aQI7UlN5fTK+CBQuqB 9JUQ== X-Gm-Message-State: AOAM532N5zAHh03UqWF3nCWl53cH+bt5YIoEKcw/bkGMhsObu1Q5wY8g Hi9NE1sjjIRixPe0x6OS9gIDoijVdvsLeg== X-Google-Smtp-Source: ABdhPJxQW/qWun9iAHh8wUCiymOiKUogUESoMZ7fLZCRF219UFskUxOoLZj4HFz4mZQZY1skvYqx7Q== X-Received: by 2002:a17:906:d9ce:b0:6ce:6a06:c01 with SMTP id qk14-20020a170906d9ce00b006ce6a060c01mr18833952ejb.666.1646141139774; Tue, 01 Mar 2022 05:25:39 -0800 (PST) Received: from localhost.localdomain ([95.168.118.10]) by smtp.gmail.com with ESMTPSA id v5-20020a056402184500b00412e1a73c7bsm7096289edy.61.2022.03.01.05.25.38 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 01 Mar 2022 05:25:39 -0800 (PST) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Tue, 1 Mar 2022 14:27:20 +0100 Message-Id: <20220301132720.86396-1-onemda@gmail.com> X-Mailer: git-send-email 2.33.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avfilter/split: switch to activate() X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Signed-off-by: Paul B Mahol --- Fix possible hangs if (a)split filter is used in graph and one of outputs ends earlier than others. Then filter may never receive EOF from input provided by (a)split filter. See ticket #9152 for commands how to reproduce issue. --- libavfilter/split.c | 68 +++++++++++++++++++++++++++++++++------------ 1 file changed, 51 insertions(+), 17 deletions(-) diff --git a/libavfilter/split.c b/libavfilter/split.c index 6b9b656708..98b51f976e 100644 --- a/libavfilter/split.c +++ b/libavfilter/split.c @@ -63,28 +63,62 @@ static av_cold int split_init(AVFilterContext *ctx) return 0; } -static int filter_frame(AVFilterLink *inlink, AVFrame *frame) +static int activate(AVFilterContext *ctx) { - AVFilterContext *ctx = inlink->dst; - int i, ret = AVERROR_EOF; + AVFilterLink *inlink = ctx->inputs[0]; + AVFrame *in; + int status, ret; + int64_t pts; - for (i = 0; i < ctx->nb_outputs; i++) { - AVFrame *buf_out; + for (int i = 0; i < ctx->nb_outputs; i++) { + FF_FILTER_FORWARD_STATUS_BACK_ALL(ctx->outputs[i], ctx); + } - if (ff_outlink_get_status(ctx->outputs[i])) - continue; - buf_out = av_frame_clone(frame); - if (!buf_out) { - ret = AVERROR(ENOMEM); - break; + ret = ff_inlink_consume_frame(inlink, &in); + if (ret < 0) + return ret; + if (ret > 0) { + for (int i = 0; i < ctx->nb_outputs; i++) { + AVFrame *buf_out; + + if (ff_outlink_get_status(ctx->outputs[i])) + continue; + buf_out = av_frame_clone(in); + if (!buf_out) { + ret = AVERROR(ENOMEM); + break; + } + + ret = ff_filter_frame(ctx->outputs[i], buf_out); + if (ret < 0) + break; } - ret = ff_filter_frame(ctx->outputs[i], buf_out); + av_frame_free(&in); if (ret < 0) - break; + return ret; + } + + if (ff_inlink_acknowledge_status(inlink, &status, &pts)) { + for (int i = 0; i < ctx->nb_outputs; i++) { + if (ff_outlink_get_status(ctx->outputs[i])) + continue; + ff_outlink_set_status(ctx->outputs[i], status, pts); + } + return 0; } - av_frame_free(&frame); - return ret; + + for (int i = 0; i < ctx->nb_outputs; i++) { + if (ff_outlink_get_status(ctx->outputs[i])) + continue; + + if (ff_outlink_frame_wanted(ctx->outputs[i])) { + ff_inlink_request_frame(inlink); + return 0; + } + } + + return FFERROR_NOT_READY; } #define OFFSET(x) offsetof(SplitContext, x) @@ -100,7 +134,6 @@ static const AVFilterPad avfilter_vf_split_inputs[] = { { .name = "default", .type = AVMEDIA_TYPE_VIDEO, - .filter_frame = filter_frame, }, }; @@ -110,6 +143,7 @@ const AVFilter ff_vf_split = { .priv_size = sizeof(SplitContext), .priv_class = &split_class, .init = split_init, + .activate = activate, FILTER_INPUTS(avfilter_vf_split_inputs), .outputs = NULL, .flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS | AVFILTER_FLAG_METADATA_ONLY, @@ -119,7 +153,6 @@ static const AVFilterPad avfilter_af_asplit_inputs[] = { { .name = "default", .type = AVMEDIA_TYPE_AUDIO, - .filter_frame = filter_frame, }, }; @@ -129,6 +162,7 @@ const AVFilter ff_af_asplit = { .priv_class = &split_class, .priv_size = sizeof(SplitContext), .init = split_init, + .activate = activate, FILTER_INPUTS(avfilter_af_asplit_inputs), .outputs = NULL, .flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS | AVFILTER_FLAG_METADATA_ONLY, -- 2.33.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".