From patchwork Sat Sep 28 14:28:29 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 51914 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:d8ca:0:b0:48e:c0f8:d0de with SMTP id dy10csp1014364vqb; Sat, 28 Sep 2024 07:29:19 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWEvvKce69Oe+0bcMD1KQHjHLzWqJSaYo090ZOepwhDb0yPdyammAGs4qNxcxFzFgI74BT62mLSlrtttrMWMEJx@gmail.com X-Google-Smtp-Source: AGHT+IF136/Wf3hkJpIFDHFFj+1t3Qgdu12mp9Jiz0zeqH4P0yKbiJuM6e01J60ovqnP6+Pkw26M X-Received: by 2002:a05:6402:905:b0:5c3:d2bc:2f64 with SMTP id 4fb4d7f45d1cf-5c882615fbamr5184625a12.35.1727533758958; Sat, 28 Sep 2024 07:29:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1727533758; cv=none; d=google.com; s=arc-20240605; b=fs3VyWNTLJ8HEXKLtsNrRw+pkVw0IG59eI3XrxqY36npe9ajcpByDf3HMLRZxDhtzs G+APjkjPQOlSZbW1fQNU2moEKqd4+03S44v5lsO7bj8S0Tld0l66iNYH1u2SjIakvEi3 6tNAgi4PVB31cWxrrxK+4GO8k/bMkH0sY0iMgqqsUEdZea0MC6KEQYcCg+g9eKijVHFw XEKR2XxzwtUZJX+IFJXeubXrARcMX2O/YzpH50QLmCS98gnKPMRdu8NGsNXDgD99ckXk GnCIh3uZpK1WBIZXJ6SgS4ATo0w82FOx6QNzTD4yiupqfDLy92fxr55zt+yKvHe7F+GR KOEw== 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=d0x+vIg8lvjWGC0sgbzHdv5eQC+tj2cgmdhxyNGDIbM=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=Y9BXAOLQCXiGjX9Vg+xk/n64cS6VzJhhYxPmf7tqrFE+hejsyrkqWeP0A5kvN9HQwe 4iabQ0cXDJtRlpn5Kp9qpJu7uWWjwzeUHnswOW1r28RgG4OIJowops1eN+tLqMitrXbu icfyJ39ygaeJfz2KGUV6VOgVN9bSN0HqSaUaDKsg8GnWRot8aAttmGtLkmHXZ1Jzrabt qi3C9jD848sMOd7el9m1fZfwi7tq33sYy3sXm3nWEQJ56prAGsgePWJb4o+Y1wMTQTcK itnMLNGR/+6n67LfkPSJ1azpowxb5+yFja1R4DnOJ7v6x21R+0QsZURV7j7GtBTD0fK9 NOQw==; 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=bdqRnpnJ; 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 4fb4d7f45d1cf-5c8824078desi3126089a12.126.2024.09.28.07.29.18; Sat, 28 Sep 2024 07:29:18 -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=bdqRnpnJ; 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 1718E68D9EA; Sat, 28 Sep 2024 17:28:45 +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 0CCC568D950 for ; Sat, 28 Sep 2024 17:28:35 +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=bdqRnpnJ; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 52E554D9D for ; Sat, 28 Sep 2024 16:28:34 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id USYwG884y0n9 for ; Sat, 28 Sep 2024 16:28:34 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1727533712; bh=p6AcBPL7POZiT4g4QH2dkbVWwRvwhpLfMuYxL1btQj8=; h=From:To:Subject:Date:In-Reply-To:References:From; b=bdqRnpnJjw2Kptn9z+1+NgNmHArB48xwsMYhQLo21NEyxOaFdSxjtTO7yHWqq88oZ 5C3eYUM9HRzbi/mUzbJbfWgxJ37aBuyPXwVj4UIgh/TR00Fni56boYvApH62TQLXOw SN3kRcKSMfo4+9ATdsjxtfOb8E0RLaJpzQXGRAb56LUV84R6TfmgU+FUcbWkjVVA6G 3gTl/EnmjhEDqW3QI+g9iuWTtoKJfgKl0p1PBMO51b+F+ooYb5XIx3npSLQ17F8gw6 KkWXAtQD1LnMGnJrIEVD8JMw8LtLJisFNJrWTC8aLZO5eQVAsIJTUGidMCx9Q5zUQm 0WmSvZ3hjus6w== 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 A8C604DEE for ; Sat, 28 Sep 2024 16:28:32 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 91C9A3A0F02 for ; Sat, 28 Sep 2024 16:28:32 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sat, 28 Sep 2024 16:28:29 +0200 Message-ID: <20240928142830.961-4-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240928142830.961-1-anton@khirnov.net> References: <20240928142830.961-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/5] lavu/log, opt: detect setting non-runtime options post-init 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: EEAOO2K/c7g4 Add a mechanism to AVClass to allow objects to signal their state to generic code. When an object flags itself with the 'initialized' state, print an error (and fail, after the next major bump) if the caller attempts to set non-runtime options. --- doc/APIchanges | 3 +++ libavutil/log.h | 18 ++++++++++++++++++ libavutil/opt.c | 33 +++++++++++++++++++++++++++++++++ libavutil/version.h | 2 +- 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/doc/APIchanges b/doc/APIchanges index ddd4e6c9e0..9974a5ede2 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -2,6 +2,9 @@ The last version increases of all libraries were on 2024-03-07 API changes, most recent first: +2024-10-xx - xxxxxxxxxx - lavu 59.41.100 - log.h + Add AVClass.state_flags_offset and AV_CLASS_STATE_INITIALIZED. + -------- 8< --------- FFmpeg 7.1 was cut here -------- 8< --------- 2024-09-23 - 6940a6de2f0 - lavu 59.38.100 - frame.h diff --git a/libavutil/log.h b/libavutil/log.h index c6b47cc054..63b3283223 100644 --- a/libavutil/log.h +++ b/libavutil/log.h @@ -46,6 +46,15 @@ typedef enum { AV_CLASS_CATEGORY_NB ///< not part of ABI/API }AVClassCategory; +enum AVClassStateFlags { + /** + * Object initialization has finished and it is now in the 'runtime' stage. + * This affects e.g. what options can be set on the object (only + * AV_OPT_FLAG_RUNTIME_PARAM options can be set on initialized objects). + */ + AV_CLASS_STATE_INITIALIZED = (1 << 0), +}; + #define AV_IS_INPUT_DEVICE(category) \ (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT) || \ ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT) || \ @@ -155,6 +164,15 @@ typedef struct AVClass { * instance of this class. */ const struct AVClass* (*child_class_iterate)(void **iter); + + /** + * When non-zero, offset in the object to an unsigned int holding object + * state flags, a combination of AVClassStateFlags values. The flags are + * updated by the object to signal its state to the generic code. + * + * Added in version 59.41.100. + */ + int state_flags_offset; } AVClass; /** diff --git a/libavutil/opt.c b/libavutil/opt.c index 81cb4b10f4..b85af68eff 100644 --- a/libavutil/opt.c +++ b/libavutil/opt.c @@ -185,6 +185,39 @@ static int opt_set_init(void *obj, const char *name, int search_flags, return AVERROR(EINVAL); } + if (!(o->flags & AV_OPT_FLAG_RUNTIME_PARAM)) { + unsigned *state_flags = NULL; + const AVClass *class; + + // try state flags first from the target (child), then from its parent + class = *(const AVClass**)tgt; + if ( +#if LIBAVUTIL_VERSION_MAJOR < 60 + class->version >= AV_VERSION_INT(59, 41, 100) && +#endif + class->state_flags_offset) + state_flags = (unsigned*)((uint8_t*)tgt + class->state_flags_offset); + + if (!state_flags && obj != tgt) { + class = *(const AVClass**)obj; + if ( +#if LIBAVUTIL_VERSION_MAJOR < 60 + class->version >= AV_VERSION_INT(59, 41, 100) && +#endif + class->state_flags_offset) + state_flags = (unsigned*)((uint8_t*)obj + class->state_flags_offset); + } + + if (state_flags && (*state_flags & AV_CLASS_STATE_INITIALIZED)) { + av_log(obj, AV_LOG_ERROR, "Option '%s' is not a runtime option and " + "so cannot be set after the object has been initialized\n", + o->name); +#if LIBAVUTIL_VERSION_MAJOR >= 60 + return AVERROR(EINVAL); +#endif + } + } + if (o->flags & AV_OPT_FLAG_DEPRECATED) av_log(obj, AV_LOG_WARNING, "The \"%s\" option is deprecated: %s\n", name, o->help); diff --git a/libavutil/version.h b/libavutil/version.h index 1ae3f4ef87..f08a42f3d1 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -79,7 +79,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 59 -#define LIBAVUTIL_VERSION_MINOR 40 +#define LIBAVUTIL_VERSION_MINOR 41 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \