From patchwork Tue Mar 1 13:27:20 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 34566 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6838:d078:0:0:0:0 with SMTP id x24csp3669862nkx; Tue, 1 Mar 2022 05:25:52 -0800 (PST) X-Google-Smtp-Source: ABdhPJwUBbCWlFMD1BDIks/upwcKjgDQFXmq52IS2yFhLtbuJEK7V1SKFe/8artXoLE7sLaez4Es X-Received: by 2002:a17:907:7f0d:b0:6d6:f910:5136 with SMTP id qf13-20020a1709077f0d00b006d6f9105136mr1425732ejc.736.1646141152494; Tue, 01 Mar 2022 05:25:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1646141152; cv=none; d=google.com; s=arc-20160816; b=rBepsr5Gxf8op3YdFEqqkq78OgEW/+yVaPiISbcOE82sdCPVu4gGhktiJi0ZYLCtp9 oi9BarsFnOcM2y/Vzrnja8fXr/xx76Uvlq7NI8rdGFTo5Od8c5PKu7gtynrSrxPyc7HF 4dUmkhjOtFFOzun4Yc7oo8eMp7uQFYMu5+wQmI9ziVSjB4lnNC5xx1FqmNevY/k0YMOF BOKlJARFC5OZaViM48apM7EW8SIEzaPgxMxPBIGqdLPjAdsrnOJAcp2tf99Jq0hfX/NR uQ6shwCgTII7ifIfBHwNdUoiz971Bw5ceitzXshJK8j3LXfKWrNjvPIvGsDV4CuYZ+IM pGVg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=PyXnw/YvEVCoWSv4itIwmSEnA7RZgTDitucEWSTtl/Y=; b=THRKWoxu0t10ufRyqLH6vhJnHMeRbDs8RvsO7Dni5+SjH5QB86PAk8R2WO9Ky01ZLX DnMk8eVj5QGvN6VfwneNEYXMATy19J1og83C4lwjNX3/VMs+oCNqReFDKvWGayJc8esv PrxFY9qBJg62Px0iqhdXG9wREhEt+jUeVYOSPJ3aK15naeY+nOWTobKo0rYcvZpq0qte YUV4ZsfHQXA+nSTYHjKdOEF7LwSq1RY2/u63H+lri6qhz4oAhIHoj6EsUnURPAP99+wz VGVmlfrxVwvtTITvz0Gb8jXDD7ZGFjXEnyI+4L2+rjOBowszd02ECTPspobk/6jkshwi n/2A== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=WNauvQVB; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id j13-20020a056402238d00b0041339aabc33si9257782eda.194.2022.03.01.05.25.51; Tue, 01 Mar 2022 05:25:52 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=WNauvQVB; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CAF8D68B09D; Tue, 1 Mar 2022 15:25:47 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org 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-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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: IBcR2y9rlzr3 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,