From patchwork Sat Jun 3 10:00:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 41965 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c51c:b0:10c:5e6f:955f with SMTP id gm28csp1838006pzb; Sat, 3 Jun 2023 03:00:30 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ5TmC8qv4iUOweCks9l2gkW+tYPKAYOHDnASvZhWOITUTIBW1PrgZ1f/SSadT0qqR7CumAI X-Received: by 2002:a17:907:c1f:b0:975:942e:81f1 with SMTP id ga31-20020a1709070c1f00b00975942e81f1mr929820ejc.4.1685786430299; Sat, 03 Jun 2023 03:00:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685786430; cv=none; d=google.com; s=arc-20160816; b=VYLExdMtygx2Zsfhy60cZLPLi0go5PKslWWVFgOjWisV8w/moLWRex0ozGyHyPz1XW cqjttgU3meWUz0b235TqvwqFo5UsHCvtZh4hLN/scDA6k0HQmGObqHObt/LtnTJyo7Ok G4nB4q59RrAqk5S4qSoKnSZ4sdsY++JqnBFAj0GZCvekpaAkGc9wDVNgndN2BJhzkkfg rhevqir3zpX4BNg3hl8bvrTOWBNv9FW9Pvg+MCmtkrFVgaXw563hv4Om/B+sPdJQPLhx VWi5/r4BaP/lQF+OnMnGB5+4Hfo4rg5jRrivfhUNRA26B3VkVKN9xTcY95vFJoBcRccm gAzw== 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 :delivered-to; bh=6L1ALFz71czvsCmvIeTC7jgn+c88gIaa4QBucMK9+Mg=; b=gUSHlpAzSPQ/uiycJL8Lt8R3KHpWjrgzgsrH6qKWIHGwBcc1Tdkfqk1xDxD7Lcy4w2 EhN+z/W22bQ8R+9Ib53ZXgSZfN0NcdY5BNtGGm6yVxsEIUT1WbdxJ3/H4z+JeeyZrXnN nXgxehisAQf5Z0GkuvVkCMPoWp1I+XkMy56crByva4PWiq3+EcP63wnXkCV0mExfAkiS jaVj/2mfbY0Begt1n57M+CkBikyZVTJh1/lZGKTum3AalJtFVvVMJaW8N9vVpAXFLAqr DN9nV87ve6ckdsQ2faXBQmaCmiBbOCt2zSDFF4hcer/ToGeM+5Z83tnIQAtNlL/Dp08N /XXA== ARC-Authentication-Results: i=1; mx.google.com; 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 s20-20020a1709064d9400b00974fb749c2bsi1870945eju.947.2023.06.03.03.00.29; Sat, 03 Jun 2023 03:00:30 -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; 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 53A1B68C2F5; Sat, 3 Jun 2023 13:00:25 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8B4DB68BFD5 for ; Sat, 3 Jun 2023 13:00:18 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 844942404EC for ; Sat, 3 Jun 2023 12:00:17 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id Vihoc3SJhfJv for ; Sat, 3 Jun 2023 12:00:17 +0200 (CEST) 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 mail0.khirnov.net (Postfix) with ESMTPS id EDC96240177 for ; Sat, 3 Jun 2023 12:00:16 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id D06643A01C0 for ; Sat, 3 Jun 2023 12:00:09 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sat, 3 Jun 2023 12:00:02 +0200 Message-Id: <20230603100002.28358-1-anton@khirnov.net> X-Mailer: git-send-email 2.40.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] lavfi/graphparser: be more verbose when filtergraph parsing fails 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: nxXDzsdJhEVp When an option could not be found, print its name and value. Note that this is not done while applying the options in avfilter_graph_segment_apply_opts() to give the caller the option of handling the missing options in some other way. --- libavfilter/graphparser.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/libavfilter/graphparser.c b/libavfilter/graphparser.c index 9f8acea2ac..96ef6b15bf 100644 --- a/libavfilter/graphparser.c +++ b/libavfilter/graphparser.c @@ -851,6 +851,32 @@ fail: return ret; } +// print an error message if some options were not found +static void log_unknown_opt(const AVFilterGraphSegment *seg) +{ + for (size_t i = 0; i < seg->nb_chains; i++) { + const AVFilterChain *ch = seg->chains[i]; + + for (size_t j = 0; j < ch->nb_filters; j++) { + const AVFilterParams *p = ch->filters[j]; + const AVDictionaryEntry *e; + + if (!p->filter) + continue; + + e = av_dict_iterate(p->opts, NULL); + + if (e) { + av_log(p->filter, AV_LOG_ERROR, + "Could not set non-existent option '%s' to value '%s'\n", + e->key, e->value); + return; + } + } + } + +} + int avfilter_graph_segment_apply(AVFilterGraphSegment *seg, int flags, AVFilterInOut **inputs, AVFilterInOut **outputs) @@ -868,6 +894,8 @@ int avfilter_graph_segment_apply(AVFilterGraphSegment *seg, int flags, ret = avfilter_graph_segment_apply_opts(seg, 0); if (ret < 0) { + if (ret == AVERROR_OPTION_NOT_FOUND) + log_unknown_opt(seg); av_log(seg->graph, AV_LOG_ERROR, "Error applying filter options\n"); return ret; } @@ -909,8 +937,11 @@ int avfilter_graph_parse_ptr(AVFilterGraph *graph, const char *filters, goto end; ret = avfilter_graph_segment_apply_opts(seg, 0); - if (ret < 0) + if (ret < 0) { + if (ret == AVERROR_OPTION_NOT_FOUND) + log_unknown_opt(seg); goto end; + } ret = avfilter_graph_segment_init(seg, 0); if (ret < 0) @@ -988,6 +1019,9 @@ end: avfilter_graph_segment_free(&seg); if (ret < 0) { + av_log(graph, AV_LOG_ERROR, "Error processing filtergraph: %s\n", + av_err2str(ret)); + while (graph->nb_filters) avfilter_free(graph->filters[0]); av_freep(&graph->filters);