From patchwork Tue Apr 22 14:11:01 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jaslo Ziska X-Patchwork-Id: 23208 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 1A5FCC331F for ; Tue, 22 Apr 2025 14:21:10 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 346FB68B2F; Tue, 22 Apr 2025 16:21:10 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=ziska.de header.i=@ziska.de header.b="au+I1wu8"; dkim=permerror (0-bit key) header.d=ziska.de header.i=@ziska.de header.b="xURACEbD"; dkim-atps=neutral Received: from mo4-p00-ob.smtp.rzone.de (mo4-p00-ob.smtp.rzone.de [81.169.146.217]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 8C77968ADA for ; Tue, 22 Apr 2025 16:21:02 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; t=1745331661; cv=none; d=strato.com; s=strato-dkim-0002; b=dMlKEMGnYC/BBVCKJXK6dgYfw7E4F8a5KyYTMxWt0bKdh7afzw8evOVT6bnM2i9zWD 90CC3V/ZzgcPSuNuQujQTszZ4qHoF0jy2ca9aAadhNidHuhdtB8tDUZ438DYE3fUDCaN 8iLSt6a5PkWOFn8Nem4zdg+USSVSnNVuKQxia1KwzeCMYqWMrLasuyNsBWadMN47M3Ry Ywim7ye5c5b0QJTKtSh8njlfnhAzJFzizpxe5QaLFIuO0q1PYoKmjnaOnEq7yKXDW6qI 4JoGK//Li9mxQoC62RagJsvKkVpHdIkZtPu0VYGcSXdsHMnYnheslKzOeBe/J2a5XU5K j0PA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; t=1745331661; s=strato-dkim-0002; d=strato.com; h=References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Cc:Date: From:Subject:Sender; bh=40hkTnkJj6E5LUvC9jfAJHLwiM4iq11ygGr3KvF1wfs=; b=XFQ0OKEYqo0AkPGzTvqbRUmFTgIRO5NiFdc7FOz6fEbNg5I6VGjN17Trf56y1Kx/HA B3nSH8KSpfZB4c72NwAY4eL8RnQ90/HyIJQF/L7gtlZkf4bRqKVnbQY1Stggnbz8xBDC URtJ1tDBF3GRCCz4I42FyE761L4NM+M26lWKfRzpJAwUFpEJ11VCOG48CH6NXJfLqi2O q9KkCPg9ADavZlNNqPF7uzfqYDSO6c6xPqtaA5sgQRteTajyWTiqahvl7YfEXeFgLA0k 5a3WR0WhsOulzpkxsgmmYDTrWVNh3pzU+lLTdSz+xstkDOlexBcxxt8wxvmU9paNTxLD vj8w== ARC-Authentication-Results: i=1; strato.com; arc=none; dkim=none X-RZG-CLASS-ID: mo00 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1745331661; s=strato-dkim-0002; d=ziska.de; h=References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Cc:Date: From:Subject:Sender; bh=40hkTnkJj6E5LUvC9jfAJHLwiM4iq11ygGr3KvF1wfs=; b=au+I1wu8OtEB6pZOqMXcSKEjGATnt7hDtdKnMJHpqzATeL6wwjvcDsFnE5yMazHBYh hnInPgUKTRFCfqiRiyUwYEOi+miF7Fk8zYneJzm1s13War7k1qBFBHT24WFcl8to5rfj n7YAIKtEjmK1CMJV2L4Nie17gFt4SkDh/jVChQJfxXjg7jQ1Yc5KoLeCQGPloArWf8KN 51ESI5p5hrJIonL2zfv/+zpRXomOCCpuSOP8vm7XI5wJTgKVAbPVvfTiZomGfqWAEYDd UdVRzYdEo+h4bihQOyEDDWKh6ZEbrIqX1ea/51QoqRwIfbQXScqhvRdSRnHyz1eL9NTI PQ9Q== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; t=1745331661; s=strato-dkim-0003; d=ziska.de; h=References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Cc:Date: From:Subject:Sender; bh=40hkTnkJj6E5LUvC9jfAJHLwiM4iq11ygGr3KvF1wfs=; b=xURACEbDj3xGcxXcjv895RxPcqxJmTLP+MqQi+iIJQmly+HtM1PfeYRsLFUmxbfLR9 gzrUlufrD+wZwv92/DDQ== X-RZG-AUTH: ":Jm0XeU+IYfb0x77LHmrjN5Wlb7TBwusDqIM6Hizy8VdfzvKi4yoFC9cCgYrrBvJaIR9ymoISrfhsHWODCRPggeTRCTeK" Received: from archlinux.fritz.box by smtp.strato.de (RZmta 51.3.0 AUTH) with ESMTPSA id z34f8113MEL1RI5 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256 bits)) (Client did not present a certificate); Tue, 22 Apr 2025 16:21:01 +0200 (CEST) From: Jaslo Ziska To: libcamera-devel@lists.libcamera.org Cc: Jaslo Ziska Subject: [PATCH 4/4] gstreamer: Split metadata controls into new member Date: Tue, 22 Apr 2025 16:11:01 +0200 Message-ID: <20250422142010.13064-5-jaslo@ziska.de> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250422142010.13064-1-jaslo@ziska.de> References: <20250422142010.13064-1-jaslo@ziska.de> MIME-Version: 1.0 X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" When the libcamerasrc element is stopped and started again, the GstCameraControls::setCamera() function is called, but now it is populated with metadata returned by the previous requests. Because GstCameraControls::setCamera() filters the controls, this would cause warnings to be emitted, as the returned metadata are not valid controls which can be set. This is fixed by introducing a new member which only holds the metadata returned by the requests, so that the controls and the metadata are now completely independent from each other. Signed-off-by: Jaslo Ziska --- src/gstreamer/gstlibcamera-controls.cpp.in | 22 ++++++++++++++++------ src/gstreamer/gstlibcamera-controls.h | 4 +++- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/gstreamer/gstlibcamera-controls.cpp.in b/src/gstreamer/gstlibcamera-controls.cpp.in index 89c530da..490e835e 100644 --- a/src/gstreamer/gstlibcamera-controls.cpp.in +++ b/src/gstreamer/gstlibcamera-controls.cpp.in @@ -153,20 +153,24 @@ g_param_spec_{{ ctrl.gtype }}( bool GstCameraControls::getProperty(guint propId, GValue *value, [[maybe_unused]] GParamSpec *pspec) { - if (!controls_acc_.contains(propId)) { + const ControlValue *cv; + if (controls_acc_.contains(propId)) { + cv = &controls_acc_.get(propId); + } else if (metadata_.contains(propId)) { + cv = &metadata_.get(propId); + } else { GST_WARNING("Control '%s' is not available, default value will " "be returned", controls::controls.at(propId)->name().c_str()); return true; } - const ControlValue &cv = controls_acc_.get(propId); switch (propId) { {%- for vendor, ctrls in controls %} {%- for ctrl in ctrls %} case controls::{{ ctrl.namespace }}{{ ctrl.name|snake_case|upper }}: { - auto control = cv.get<{{ ctrl.type }}>(); + auto control = cv->get<{{ ctrl.type }}>(); {%- if ctrl.is_array %} for (size_t i = 0; i < control.size(); ++i) { @@ -309,9 +313,14 @@ void GstCameraControls::setCamera(const std::shared_ptr &cam) "camera and will be ignored", cid->name().c_str()); } - controls_acc_ = new_controls; controls_ = new_controls; + + /* + * Clear metadata as this might already be populated if the element has + * been running before. + */ + metadata_.clear(); } void GstCameraControls::applyControls(std::unique_ptr &request) @@ -322,6 +331,7 @@ void GstCameraControls::applyControls(std::unique_ptr &reque void GstCameraControls::readMetadata(libcamera::Request *request) { - controls_acc_.merge(request->metadata(), - ControlList::MergePolicy::OverwriteExisting); + metadata_.merge(request->metadata(), + ControlList::MergePolicy::OverwriteExisting); + } diff --git a/src/gstreamer/gstlibcamera-controls.h b/src/gstreamer/gstlibcamera-controls.h index 749220b5..ee97e61e 100644 --- a/src/gstreamer/gstlibcamera-controls.h +++ b/src/gstreamer/gstlibcamera-controls.h @@ -36,8 +36,10 @@ private: ControlInfoMap capabilities_; /* Set of user modified controls. */ ControlList controls_; - /* Accumulator of all controls ever set and metadata returned by camera */ + /* Accumulator of all controls ever */ ControlList controls_acc_; + /* Metadata returned by requests */ + ControlList metadata_; }; } /* namespace libcamera */