From patchwork Mon Oct 7 10:50:16 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 52088 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:938f:0:b0:48e:c0f8:d0de with SMTP id z15csp1836661vqg; Mon, 7 Oct 2024 04:01:07 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCW79vw6/pnRc5ax8Ihm2nZxIGhA+bdyEWflDcJJ4Zv0hJCitZ6ybtrtcHoTIyupkkRyUFBArG+OQ6cVpt2OahHJ@gmail.com X-Google-Smtp-Source: AGHT+IETGIHRhIOM2bV6qx5fLUvg6dLxrg+ukXZ2rZSG7mmNqapkXI1RE9U6tkVpHpF7RtxcxO1u X-Received: by 2002:a05:6512:2345:b0:52f:c398:8780 with SMTP id 2adb3069b0e04-539ac15a96dmr3249875e87.18.1728298866775; Mon, 07 Oct 2024 04:01:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1728298866; cv=none; d=google.com; s=arc-20240605; b=F+QAFu2IzgoC86SIFya2rJIB6nBlx6XugxROP0/z1BoD0jR8aCbuQBuEdEq/+ze6gd hM0bDXxQ+j8UYXw9A48on+Sh3l2EDoLsVXOcEvHIft8qLK9Kx+CBsG6OmAkNrLdPiASi CGp4EuNTH0R12GegG5DF6gFm/OBoQeyU8DdgzBacWGEz+Pt5+JpuaqpW+vlcdxUqRHME aaQlrapWMuQhYYivJ6zhnAtTiz/SRRwyjsgg6/ai9kHN7V1plHsco9XOWbAFOXoRQXNG cDsKwMAbMf1oU52qwMQHiWOLod03ldSEnB617ihRV8z1owM+BGJAO9sfdce20GuCvC57 +nMg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; 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:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=GTw6W27ZyyykG7/3cpnKkVI6Dow5qNarI132VvtlQLk=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=I82Lb7gE4GdL6ctaJkkSPXEkpJshby/YgEXEM23xPhfBuG4Ya+DlET5g0Gn44aumna nsrNEXgGFWuh6fdC39gVtNwTLUFPg7wvTA7UapDDtA5WdPnN6rZv/O8rP5psLpu0neZy VVBDejZxLPc7oi/F+Qmpk7KBshaW6lD9ndz7phxnQRxUUo5EUWO2svek8LnVrkqR6u5C 7aLaT55+SuqtmfagPr7F8TYeIv+bDgGe1CJfHv4alzGOOgZZofVsfDWYh6xCgXZsDNwK v9t2bK2CSEat5/xzL/HjiyoQclSQhKnae8Ic1B5IPS0DWvsI77FoLzerUyEEr5sEhzQI DqHA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=IAGuUwi+; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 2adb3069b0e04-539b001ffd4si1691803e87.575.2024.10.07.04.01.06; Mon, 07 Oct 2024 04:01:06 -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=@khirnov.net header.s=mail header.b=IAGuUwi+; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BC72368D9E9; Mon, 7 Oct 2024 13:50:46 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D769568DA05 for ; Mon, 7 Oct 2024 13:50:38 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=IAGuUwi+; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id DEA924E19 for ; Mon, 7 Oct 2024 12:50:37 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id kQ1-SFLuVpJU for ; Mon, 7 Oct 2024 12:50:36 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1728298236; bh=licT51CD8xa0pzj6UHta8kaOGfZpSkcGePHv4ZqKTg8=; h=From:To:Subject:Date:In-Reply-To:References:From; b=IAGuUwi+F72Zfan0pIg+8x9NkduuegxBW0/pJZyUFSFYhGt2r+qzTo/BqJKUWR8PE tTIcY+ioWbhgRti2YSAPgdkzts7xykTJMAYjaAxW0FVuHr7yUqtW1+3++XWS5Pb7d4 OPIH8PQQ9Huef9x9SUobfMH9XodngFyifLfiyqm9YsZfRpnMP14zyeBgWMKRniSBhn KZsSN7X2QxsAMO8RS7laNYV3wq97pbJzFiObZMvLg6KuBOwrmVBnreRTvI9ZZwORR2 1eARk6FlSsGXW8w8TK+7eQfoLundQQuXtP7R5KlvBRpCN0judXMGKm7A/2l7rQo9Sk AtKDnh5lTpGzQ== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id CD9E84E05 for ; Mon, 7 Oct 2024 12:50:36 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 8D37B3A1A81 for ; Mon, 07 Oct 2024 12:50:30 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Mon, 7 Oct 2024 12:50:16 +0200 Message-ID: <20241007105016.1597-5-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241007105016.1597-1-anton@khirnov.net> References: <20241007105016.1597-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 5/5] fftools/ffmpeg: supply hw device context to probe-filtergraphs 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: dZBT5oGMIhns I.e. those that are only used to figure out input/output counts, since some filters might expect a valid hw device in init and refuse to initalize otherwise. This requires complex filtergraphs to be created in a separate step after parsing global options, after all hw devices are guaranteed to exist. --- fftools/ffmpeg_filter.c | 3 ++- fftools/ffmpeg_opt.c | 43 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c index 4d444c161f..4524a3e535 100644 --- a/fftools/ffmpeg_filter.c +++ b/fftools/ffmpeg_filter.c @@ -1097,7 +1097,8 @@ int fg_create(FilterGraph **pfg, char *graph_desc, Scheduler *sch) return AVERROR(ENOMEM);; graph->nb_threads = 1; - ret = graph_parse(graph, fgp->graph_desc, &inputs, &outputs, NULL); + ret = graph_parse(graph, fgp->graph_desc, &inputs, &outputs, + hw_device_for_filter()); if (ret < 0) goto fail; diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index 052e68e943..9bf0c4f0c4 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -90,6 +90,9 @@ int recast_media = 0; // to func_arg() for global options typedef struct GlobalOptionsContext { Scheduler *sch; + + char **filtergraphs; + int nb_filtergraphs; } GlobalOptionsContext; static void uninit_options(OptionsContext *o) @@ -1157,25 +1160,45 @@ static int opt_audio_qscale(void *optctx, const char *opt, const char *arg) static int opt_filter_complex(void *optctx, const char *opt, const char *arg) { GlobalOptionsContext *go = optctx; - char *graph_desc = av_strdup(arg); + char *graph_desc; + int ret; + + graph_desc = av_strdup(arg); if (!graph_desc) return AVERROR(ENOMEM); - return fg_create(NULL, graph_desc, go->sch); + ret = GROW_ARRAY(go->filtergraphs, go->nb_filtergraphs); + if (ret < 0) { + av_freep(&graph_desc); + return ret; + } + go->filtergraphs[go->nb_filtergraphs - 1] = graph_desc; + + return 0; } #if FFMPEG_OPT_FILTER_SCRIPT static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg) { GlobalOptionsContext *go = optctx; - char *graph_desc = file_read(arg); + char *graph_desc; + int ret; + + graph_desc = file_read(arg); if (!graph_desc) return AVERROR(EINVAL); av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -/filter_complex %s instead\n", opt, arg); - return fg_create(NULL, graph_desc, go->sch); + ret = GROW_ARRAY(go->filtergraphs, go->nb_filtergraphs); + if (ret < 0) { + av_freep(&graph_desc); + return ret; + } + go->filtergraphs[go->nb_filtergraphs - 1] = graph_desc; + + return 0; } #endif @@ -1377,6 +1400,14 @@ int ffmpeg_parse_options(int argc, char **argv, Scheduler *sch) /* configure terminal and setup signal handlers */ term_init(); + /* create complex filtergraphs */ + for (int i = 0; i < go.nb_filtergraphs; i++) { + ret = fg_create(NULL, go.filtergraphs[i], sch); + go.filtergraphs[i] = NULL; + if (ret < 0) + goto fail; + } + /* open input files */ ret = open_files(&octx.groups[GROUP_INFILE], "input", sch, ifile_open); if (ret < 0) { @@ -1412,6 +1443,10 @@ int ffmpeg_parse_options(int argc, char **argv, Scheduler *sch) goto fail; fail: + for (int i = 0; i < go.nb_filtergraphs; i++) + av_freep(&go.filtergraphs[i]); + av_freep(&go.filtergraphs); + uninit_parse_context(&octx); if (ret < 0 && ret != AVERROR_EXIT) { av_log(NULL, AV_LOG_FATAL, "Error %s: %s\n",