From patchwork Wed Mar 6 11:03:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 46841 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:d90e:b0:19e:cdac:8cce with SMTP id jd14csp313539pzb; Wed, 6 Mar 2024 03:06:42 -0800 (PST) X-Forwarded-Encrypted: i=2; AJvYcCX3hmRBog/8EP2VFAzJiAVzoJLMEY77HqXHZPqe7s9OdBy8HEBHytnbMOk+g46e+rftxCdxPK4CqjVkmB19y+wON2nDQ0Go8IGxDg== X-Google-Smtp-Source: AGHT+IF7wsC8eLBVf0+nNsSrEoaOb/weDSpMB9aacgxzVGit3bdmBpQ+o+F5/nTHL5D0CGKOOQLm X-Received: by 2002:a17:906:b310:b0:a3e:feee:3a5b with SMTP id n16-20020a170906b31000b00a3efeee3a5bmr5510768ejz.3.1709723202344; Wed, 06 Mar 2024 03:06:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1709723202; cv=none; d=google.com; s=arc-20160816; b=KVhD2xhSdp5bWnLvPWkW2dDBJ7GgcK5mjFeVS72xqvTIrj23XMbJpHCmUNSlBsDBp7 YDRGt6w+hk1PTeZFK6iu8yUDLwMC8vfz8krxvYpPw9c58pkdoNoRsAq9GyjzPfdvxlyD O3+ejLWlUt5heOy8LslJZTf0TRVlpl9iyXqkyJRleT79/0uCXG0BtUod2x66i5SCGo+S 7VX2YvRLv7Qc6LCE0ef9vkTAQ01dOpuxp9Z2089YoAh4fn8qYdWAbX2VSeQbWoYo65gB jXplEmMBgo+tbpXmKze3rt0YrmP0HeqPDrIpz5a682VgJiHw27KSnMMtbl6n3h2wLe3o +fWA== 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:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=/W51fy6YQlPMkx6+OsDGXIApFvzuTbdUpvxZ7QYnI1s=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=cK+LHrpn0FfBm39AbzkkdiUiwGd8lDZesJdCXzQerbI14oZHtjNZp3vSDWRgmJAi2w hxhU3L9CS1KYdgwcP50c1qrJkcAId853bGYo7b9elXWldEmkz8vsDS+RsDUoajb68axX oD4ZLRId9S1xVPyfyHoE+DvupLoxa0iYxQAgX6e3xnLiKYfgflawl+GhMrwnV/jg5NlB 4QqTXLr7U3jf7BMO+p4HKVVu2dVGdq7H/JDMv6IfsA7crI1IMkP3roBcAa4jZ2YE4bhq DKxqY57hoxZkZ8Qxp2BM8XhpAA6njCOLeJBB2V/E6qAipbcsLE7tVml1Q09z6lEZRlp+ 6dQw==; 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=LaIf6RCy; 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 v8-20020a170906180800b00a458231643esi2054704eje.828.2024.03.06.03.06.41; Wed, 06 Mar 2024 03:06:42 -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=@khirnov.net header.s=mail header.b=LaIf6RCy; 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 99A7E68CDD1; Wed, 6 Mar 2024 13:05:37 +0200 (EET) 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 7BA9A68C462 for ; Wed, 6 Mar 2024 13:05:25 +0200 (EET) 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=LaIf6RCy; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 222C94D41 for ; Wed, 6 Mar 2024 12:05:25 +0100 (CET) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id bQ48W-Uptfw2 for ; Wed, 6 Mar 2024 12:05:24 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1709723122; bh=hpUj2lSbqQ2eUdycZrkCW6AKmmAhNKRuhXicOOBwumo=; h=From:To:Subject:Date:In-Reply-To:References:From; b=LaIf6RCydsDIAAYO7ZiLWmHe83dIq3MLiVc0hbjN3CUaIYxuYE8+v3Vmi3jiy1H5o 89F1MQmKZowLLVKoS4Aug1IZo+SHZwXGe0e9GZpxjHU4urfn/0hUO8B/+SzJKvGYxa cDkolY6Y/Amw3j4yP1X5KIgyYHk0cxdzeoH6yaAbk4UrptW/CeoW31vQTwG/HREXYh mafKJn/8/B51n/2eqVqgej6ltQG/ANYxEdukL1JcrDtWSOOvlbwf7ccOMZ3gg3kVWW utGMUL1d4CUiFh81/ZgnpofvKLLhlkZUIMKhjWIUPEWzCx3YaE8pzgBXr/uEr5Zv7u /xZ0sNhy3+nlA== 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 D34334D49 for ; Wed, 6 Mar 2024 12:05:22 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id B9D143A0C79 for ; Wed, 6 Mar 2024 12:05:22 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Wed, 6 Mar 2024 12:03:07 +0100 Message-ID: <20240306110319.17339-6-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240306110319.17339-1-anton@khirnov.net> References: <20240306110319.17339-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 06/18] fftools/ffmpeg_opt: merge init_complex_filters() and check_filter_outputs() 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: gye0zvZHdngU The first of these binds inputs of complex filtergraphs to demuxer streams (with a misleading comment claiming it *creates* complex filtergraphs). The second ensures that all filtergraph outputs are connected to an encoder. Merge them into a single function, which simplifies the ffmpeg_filter API, is shorter, and will also be useful in following commits. Also, rename misleadingly-named init_input_filter() to fg_complex_bind_input(). --- fftools/ffmpeg.h | 3 +-- fftools/ffmpeg_filter.c | 38 ++++++++++++++++++-------------------- fftools/ffmpeg_opt.c | 32 +++++++++----------------------- 3 files changed, 28 insertions(+), 45 deletions(-) diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index 6b049e329b..d3e03543ac 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -671,12 +671,11 @@ int find_codec(void *logctx, const char *name, enum AVMediaType type, int encoder, const AVCodec **codec); int parse_and_set_vsync(const char *arg, int *vsync_var, int file_idx, int st_idx, int is_global); -int check_filter_outputs(void); int filtergraph_is_simple(const FilterGraph *fg); int init_simple_filtergraph(InputStream *ist, OutputStream *ost, char *graph_desc, Scheduler *sch, unsigned sch_idx_enc); -int init_complex_filtergraph(FilterGraph *fg); +int fg_finalise_bindings(FilterGraph *fg); /** * Get our axiliary frame data attached to the frame, allocating it diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c index 37705297fb..7425e3d2ed 100644 --- a/fftools/ffmpeg_filter.c +++ b/fftools/ffmpeg_filter.c @@ -1096,7 +1096,7 @@ int init_simple_filtergraph(InputStream *ist, OutputStream *ost, return 0; } -static int init_input_filter(FilterGraph *fg, InputFilter *ifilter) +static int fg_complex_bind_input(FilterGraph *fg, InputFilter *ifilter) { FilterGraphPriv *fgp = fgp_from_fg(fg); InputFilterPriv *ifp = ifp_from_ifilter(ifilter); @@ -1162,14 +1162,29 @@ static int init_input_filter(FilterGraph *fg, InputFilter *ifilter) return 0; } -int init_complex_filtergraph(FilterGraph *fg) +int fg_finalise_bindings(FilterGraph *fg) { // bind filtergraph inputs to input streams for (int i = 0; i < fg->nb_inputs; i++) { - int ret = init_input_filter(fg, fg->inputs[i]); + InputFilterPriv *ifp = ifp_from_ifilter(fg->inputs[i]); + int ret; + + if (ifp->bound) + continue; + + ret = fg_complex_bind_input(fg, &ifp->ifilter); if (ret < 0) return ret; } + + for (int i = 0; i < fg->nb_outputs; i++) { + OutputFilter *output = fg->outputs[i]; + if (!output->ost) { + av_log(filtergraphs[i], AV_LOG_FATAL, + "Filter %s has an unconnected output\n", output->name); + return AVERROR(EINVAL); + } + } return 0; } @@ -1436,23 +1451,6 @@ static int configure_output_filter(FilterGraph *fg, AVFilterGraph *graph, } } -int check_filter_outputs(void) -{ - for (int i = 0; i < nb_filtergraphs; i++) { - int n; - for (n = 0; n < filtergraphs[i]->nb_outputs; n++) { - OutputFilter *output = filtergraphs[i]->outputs[n]; - if (!output->ost) { - av_log(filtergraphs[i], AV_LOG_FATAL, - "Filter %s has an unconnected output\n", output->name); - return AVERROR(EINVAL); - } - } - } - - return 0; -} - static void sub2video_prepare(InputFilterPriv *ifp) { ifp->sub2video.last_pts = INT64_MIN; diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index a9a785a0ac..b550382b4c 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -674,18 +674,6 @@ static int opt_streamid(void *optctx, const char *opt, const char *arg) return av_dict_set(&o->streamid, idx_str, p, 0); } -static int init_complex_filters(void) -{ - int i, ret = 0; - - for (i = 0; i < nb_filtergraphs; i++) { - ret = init_complex_filtergraph(filtergraphs[i]); - if (ret < 0) - return ret; - } - return 0; -} - static int opt_target(void *optctx, const char *opt, const char *arg) { OptionsContext *o = optctx; @@ -1264,13 +1252,6 @@ int ffmpeg_parse_options(int argc, char **argv, Scheduler *sch) goto fail; } - /* create the complex filtergraphs */ - ret = init_complex_filters(); - if (ret < 0) { - errmsg = "initializing complex filters"; - goto fail; - } - /* open output files */ ret = open_files(&octx.groups[GROUP_OUTFILE], "output", sch, of_open); if (ret < 0) { @@ -1278,16 +1259,21 @@ int ffmpeg_parse_options(int argc, char **argv, Scheduler *sch) goto fail; } + // bind unbound filtegraph inputs/outputs and check consistency + for (int i = 0; i < nb_filtergraphs; i++) { + ret = fg_finalise_bindings(filtergraphs[i]); + if (ret < 0) { + errmsg = "binding filtergraph inputs/outputs"; + goto fail; + } + } + correct_input_start_times(); ret = apply_sync_offsets(); if (ret < 0) goto fail; - ret = check_filter_outputs(); - if (ret < 0) - goto fail; - fail: uninit_parse_context(&octx); if (ret < 0 && ret != AVERROR_EXIT) {