From patchwork Sun Oct 31 11:01:35 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 31263 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5e:a610:0:0:0:0:0 with SMTP id q16csp1526018ioi; Sun, 31 Oct 2021 04:01:23 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxx0QKp2Auyx2VX0FfVFP6zJuYZmA0qSo7t/Y8tD6unePxH+QuxRqqnGoyfb1ErvxKIyXmQ X-Received: by 2002:a17:906:3f95:: with SMTP id b21mr27813343ejj.368.1635678083532; Sun, 31 Oct 2021 04:01:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1635678083; cv=none; d=google.com; s=arc-20160816; b=YN/uujQU+HvfEb7Ybd7rN7/URC2KoW+pvSuQcIi0ATNX9qWrlXqUglxEsj3tiQgikv 1LQhGfO6IfhE8E5loA6AWiDuTcoXcDM7rmKedwLO9X+qp/x1hPvgIo/fNK7HWRsjer6K 0CIsFvSzSu68vvTI/Rs9/H3WX4egN/suTZes/sru5HrIDqF/W9FJB1jPJMw3eyEZToVV jF6+XUi2SSCgc4qHURn6BucPBLIR1oXilCpd/9pXOpmvrhnlWP1BMH6dugAQYML5TaGv Mk2EGdCTxHjNthAzepspgM38Zwovm3cUhIJjn0IcFwEX6VMRKogJsLlkk9r2lC4uh2Yr fViQ== 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=RnEt4tHgUNe3xtZf9QEJQ57w6GCL7e5dJL5XMlNWFDA=; b=fijPcSm/OGaSR9NWYi+G3iMI2MuEf4Og7FKZQjlmbDNUtfi77TAJk8LEJT4A18Elid MEjDAuXMNvIALMUNP2IF2NowNYYfcmsIJ3B3NEjUs/qoprXa+fIYRcKbPUjnybodSvpE DnqpY8B0cqh6ZsmtziUfK36k2xpUjLOCRw+nPh/W7NFjQlmpq6Lc2KWkZ13RsmG1C4sC RiAlJ50HmoXwS9kTAv+KaN31Yd/Dk1L1507FGRnSgF7Fe22PgFzUjYijsk0rjpLpZ1N3 +o5t15ilwv3n/DmLm/ajPacGN9UKcsXmBgPj8zbMvLuqRAJyuWH74uqARDljC0yBHLjV 0c4A== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=VwpEboo8; 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 x1si1396862edd.59.2021.10.31.04.01.22; Sun, 31 Oct 2021 04:01:23 -0700 (PDT) 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=VwpEboo8; 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 B298468A7AD; Sun, 31 Oct 2021 13:01:18 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f43.google.com (mail-ed1-f43.google.com [209.85.208.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id ED95268A5E7 for ; Sun, 31 Oct 2021 13:01:11 +0200 (EET) Received: by mail-ed1-f43.google.com with SMTP id f8so32950269edy.4 for ; Sun, 31 Oct 2021 04:01:11 -0700 (PDT) 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=m6/cqVJSqqDwnkSkB8v5JcMk6AoPycnMTqjm3f6/jtA=; b=VwpEboo8lerFaGw2u6MDJLcNX0H1GtZxRnNt/BAJpgiUFB0tTzrVyX9TKolFNcnUay c05cbGgWtCr1xI7Ws1j0RFztpfn28cffNLft+KRtMBQlxEIsnmFI7vgv8ueoeeIZ4yF8 LlMwMnnQd8radLxSYoOq+2JWuchqS7BpjCa67jpioWAseWO1IWUZwfB/ea+EDL8HeUR2 fWjWr7xoRqk0JXrgbl1mwFuMfZ87Y958KUOIAZI7THzCgnaBdMGUpYL4OafEBK3XCST8 MrX0Weh1qgkyD+Gr3ktpPDRgsB/dorpcT9fYTxrc7zWpSPUuRZ9bqSqjSoRjuXNaZhER 09ZA== 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=m6/cqVJSqqDwnkSkB8v5JcMk6AoPycnMTqjm3f6/jtA=; b=UO8ADeXqbPioQvPWPTRB995kPlN3r1kpjFqGRFZ2sfgQBOWlOnvtG4wMIQlKR8DnDx J4yq8rhNrfZOG8EtMvDjl+MeULuBBLJ+7NlLc2o99f6iCTpOGpbyJGhkNGiELRU2+itT UzJwcyHZzoriHp5VflEDnsk9Q7PRyWuypj/WZ6Xlqwr3Zaktux6fQxcpaauLA0WLCR9P p0DBCOXYF2XgXwTUsdKd8nx2WeBojbSCydaszEWZM3IX7xwrG6/n4v7H1zT1MPRDPfsA hAGWg7Ba9FeMceESVRwEWq9MTQ6NTDfiOLDo3VVSPiZfX+bU7cXvcQIvZviLQvZGWKWN xmnQ== X-Gm-Message-State: AOAM532JsqV+GKdren/df7tcj6kYIDKdW6kjy1srdsr0gH9x3fVzzk8E ExhYPR6XxmWl7sosLm+1t7P0jhHxJQs= X-Received: by 2002:a05:6402:5188:: with SMTP id q8mr31615401edd.332.1635678071309; Sun, 31 Oct 2021 04:01:11 -0700 (PDT) Received: from localhost.localdomain ([95.168.118.28]) by smtp.gmail.com with ESMTPSA id qk32sm5488497ejc.31.2021.10.31.04.01.10 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 31 Oct 2021 04:01:10 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Sun, 31 Oct 2021 12:01:35 +0100 Message-Id: <20211031110135.44658-1-onemda@gmail.com> X-Mailer: git-send-email 2.33.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avfilter: add option to end filtering on first EOF in filter sink 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: XTBi3HHEFwmq Signed-off-by: Paul B Mahol --- fftools/ffmpeg.h | 1 + fftools/ffmpeg_filter.c | 1 + fftools/ffmpeg_opt.c | 3 +++ libavfilter/avfilter.h | 1 + libavfilter/avfiltergraph.c | 7 +++++-- 5 files changed, 11 insertions(+), 2 deletions(-) diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index 545ff1c8e7..f3b003cd6a 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -633,6 +633,7 @@ extern char *videotoolbox_pixfmt; extern char *filter_nbthreads; extern int filter_complex_nbthreads; +extern int filter_shortest; extern int vstats_version; extern int auto_conversion_filters; diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c index b798459946..d67f4d5528 100644 --- a/fftools/ffmpeg_filter.c +++ b/fftools/ffmpeg_filter.c @@ -1028,6 +1028,7 @@ int configure_filtergraph(FilterGraph *fg) av_opt_set(fg->graph, "aresample_swr_opts", args, 0); } else { fg->graph->nb_threads = filter_complex_nbthreads; + fg->graph->shortest = filter_shortest; } if ((ret = avfilter_graph_parse2(fg->graph, graph_desc, &inputs, &outputs)) < 0) diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index 601db2b827..1bc2df37d4 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -171,6 +171,7 @@ int frame_bits_per_raw_sample = 0; float max_error_rate = 2.0/3; char *filter_nbthreads; int filter_complex_nbthreads = 0; +int filter_shortest = 0; int vstats_version = 2; int auto_conversion_filters = 1; int64_t stats_period = 500000; @@ -3638,6 +3639,8 @@ const OptionDef options[] = { "create a complex filtergraph", "graph_description" }, { "filter_complex_threads", HAS_ARG | OPT_INT, { &filter_complex_nbthreads }, "number of threads for -filter_complex" }, + { "filter_shortest", OPT_BOOL | OPT_INT, { &filter_shortest }, + "ends filtering on shortest sink" }, { "lavfi", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex }, "create a complex filtergraph", "graph_description" }, { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script }, diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h index f7208754a7..c00e70774e 100644 --- a/libavfilter/avfilter.h +++ b/libavfilter/avfilter.h @@ -909,6 +909,7 @@ typedef struct AVFilterGraph { int sink_links_count; unsigned disable_auto_convert; + int shortest; } AVFilterGraph; /** diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c index b8b432e98b..3c87d42e49 100644 --- a/libavfilter/avfiltergraph.c +++ b/libavfilter/avfiltergraph.c @@ -57,6 +57,8 @@ static const AVOption filtergraph_options[] = { AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, F|V }, {"aresample_swr_opts" , "default aresample filter options" , OFFSET(aresample_swr_opts) , AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, F|A }, + {"shortest", "ends filtering with shortest sink" , OFFSET(shortest) , + AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, F|V|A }, { NULL }, }; @@ -77,6 +79,7 @@ int ff_graph_thread_init(AVFilterGraph *graph) { graph->thread_type = 0; graph->nb_threads = 1; + graph->shortest = 0; return 0; } #endif @@ -1298,7 +1301,7 @@ int avfilter_graph_request_oldest(AVFilterGraph *graph) } else { r = ff_request_frame(oldest); } - if (r != AVERROR_EOF) + if (r != AVERROR_EOF || graph->shortest) break; av_log(oldest->dst, AV_LOG_DEBUG, "EOF on sink link %s:%s.\n", oldest->dst->name, @@ -1309,7 +1312,7 @@ int avfilter_graph_request_oldest(AVFilterGraph *graph) oldest->age_index); oldest->age_index = -1; } - if (!graph->sink_links_count) + if (!graph->sink_links_count || (r == AVERROR_EOF && graph->shortest)) return AVERROR_EOF; av_assert1(!oldest->dst->filter->activate); av_assert1(oldest->age_index >= 0);