{"id":23208,"url":"https://patchwork.libcamera.org/api/patches/23208/?format=json","web_url":"https://patchwork.libcamera.org/patch/23208/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20250422142010.13064-5-jaslo@ziska.de>","date":"2025-04-22T14:11:01","name":"[4/4] gstreamer: Split metadata controls into new member","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"8c145bd4f5eb07e3ccb5d0488a1c974ece326821","submitter":{"id":173,"url":"https://patchwork.libcamera.org/api/people/173/?format=json","name":"Jaslo Ziska","email":"jaslo@ziska.de"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/23208/mbox/","series":[],"comments":"https://patchwork.libcamera.org/api/patches/23208/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/23208/checks/","tags":{},"headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 1A5FCC331F\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 22 Apr 2025 14:21:10 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 346FB68B2F;\n\tTue, 22 Apr 2025 16:21:10 +0200 (CEST)","from mo4-p00-ob.smtp.rzone.de (mo4-p00-ob.smtp.rzone.de\n\t[81.169.146.217])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8C77968ADA\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 22 Apr 2025 16:21:02 +0200 (CEST)","from archlinux.fritz.box by smtp.strato.de (RZmta 51.3.0 AUTH)\n\twith ESMTPSA id z34f8113MEL1RI5\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256 bits))\n\t(Client did not present a certificate);\n\tTue, 22 Apr 2025 16:21:01 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=ziska.de header.i=@ziska.de header.b=\"au+I1wu8\";\n\tdkim=permerror (0-bit key) header.d=ziska.de header.i=@ziska.de\n\theader.b=\"xURACEbD\"; dkim-atps=neutral","ARC-Seal":"i=1; a=rsa-sha256; t=1745331661; cv=none;\n\td=strato.com; s=strato-dkim-0002;\n\tb=dMlKEMGnYC/BBVCKJXK6dgYfw7E4F8a5KyYTMxWt0bKdh7afzw8evOVT6bnM2i9zWD\n\t90CC3V/ZzgcPSuNuQujQTszZ4qHoF0jy2ca9aAadhNidHuhdtB8tDUZ438DYE3fUDCaN\n\t8iLSt6a5PkWOFn8Nem4zdg+USSVSnNVuKQxia1KwzeCMYqWMrLasuyNsBWadMN47M3Ry\n\tYwim7ye5c5b0QJTKtSh8njlfnhAzJFzizpxe5QaLFIuO0q1PYoKmjnaOnEq7yKXDW6qI\n\t4JoGK//Li9mxQoC62RagJsvKkVpHdIkZtPu0VYGcSXdsHMnYnheslKzOeBe/J2a5XU5K\n\tj0PA==","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; t=1745331661;\n\ts=strato-dkim-0002; d=strato.com;\n\th=References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Cc:Date:\n\tFrom:Subject:Sender;\n\tbh=40hkTnkJj6E5LUvC9jfAJHLwiM4iq11ygGr3KvF1wfs=;\n\tb=XFQ0OKEYqo0AkPGzTvqbRUmFTgIRO5NiFdc7FOz6fEbNg5I6VGjN17Trf56y1Kx/HA\n\tB3nSH8KSpfZB4c72NwAY4eL8RnQ90/HyIJQF/L7gtlZkf4bRqKVnbQY1Stggnbz8xBDC\n\tURtJ1tDBF3GRCCz4I42FyE761L4NM+M26lWKfRzpJAwUFpEJ11VCOG48CH6NXJfLqi2O\n\tq9KkCPg9ADavZlNNqPF7uzfqYDSO6c6xPqtaA5sgQRteTajyWTiqahvl7YfEXeFgLA0k\n\t5a3WR0WhsOulzpkxsgmmYDTrWVNh3pzU+lLTdSz+xstkDOlexBcxxt8wxvmU9paNTxLD\n\tvj8w==","ARC-Authentication-Results":"i=1; strato.com;\n    arc=none;\n    dkim=none","X-RZG-CLASS-ID":"mo00","DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; t=1745331661;\n\ts=strato-dkim-0002; d=ziska.de;\n\th=References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Cc:Date:\n\tFrom:Subject:Sender;\n\tbh=40hkTnkJj6E5LUvC9jfAJHLwiM4iq11ygGr3KvF1wfs=;\n\tb=au+I1wu8OtEB6pZOqMXcSKEjGATnt7hDtdKnMJHpqzATeL6wwjvcDsFnE5yMazHBYh\n\thnInPgUKTRFCfqiRiyUwYEOi+miF7Fk8zYneJzm1s13War7k1qBFBHT24WFcl8to5rfj\n\tn7YAIKtEjmK1CMJV2L4Nie17gFt4SkDh/jVChQJfxXjg7jQ1Yc5KoLeCQGPloArWf8KN\n\t51ESI5p5hrJIonL2zfv/+zpRXomOCCpuSOP8vm7XI5wJTgKVAbPVvfTiZomGfqWAEYDd\n\tUdVRzYdEo+h4bihQOyEDDWKh6ZEbrIqX1ea/51QoqRwIfbQXScqhvRdSRnHyz1eL9NTI\n\tPQ9Q==","v=1; a=ed25519-sha256; c=relaxed/relaxed; t=1745331661;\n\ts=strato-dkim-0003; d=ziska.de;\n\th=References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Cc:Date:\n\tFrom:Subject:Sender;\n\tbh=40hkTnkJj6E5LUvC9jfAJHLwiM4iq11ygGr3KvF1wfs=;\n\tb=xURACEbDj3xGcxXcjv895RxPcqxJmTLP+MqQi+iIJQmly+HtM1PfeYRsLFUmxbfLR9\n\tgzrUlufrD+wZwv92/DDQ=="],"X-RZG-AUTH":"\":Jm0XeU+IYfb0x77LHmrjN5Wlb7TBwusDqIM6Hizy8VdfzvKi4yoFC9cCgYrrBvJaIR9ymoISrfhsHWODCRPggeTRCTeK\"","From":"Jaslo Ziska <jaslo@ziska.de>","To":"libcamera-devel@lists.libcamera.org","Cc":"Jaslo Ziska <jaslo@ziska.de>","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","Content-Transfer-Encoding":"8bit","Content-Type":"text/plain; charset=\"us-ascii\"","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"},"content":"When the libcamerasrc element is stopped and started again, the\nGstCameraControls::setCamera() function is called, but now it is\npopulated with metadata returned by the previous requests. Because\nGstCameraControls::setCamera() filters the controls, this would cause\nwarnings to be emitted, as the returned metadata are not valid controls\nwhich can be set.\n\nThis is fixed by introducing a new member which only holds the metadata\nreturned by the requests, so that the controls and the metadata are now\ncompletely independent from each other.\n\nSigned-off-by: Jaslo Ziska <jaslo@ziska.de>\n---\n src/gstreamer/gstlibcamera-controls.cpp.in | 22 ++++++++++++++++------\n src/gstreamer/gstlibcamera-controls.h      |  4 +++-\n 2 files changed, 19 insertions(+), 7 deletions(-)","diff":"diff --git a/src/gstreamer/gstlibcamera-controls.cpp.in b/src/gstreamer/gstlibcamera-controls.cpp.in\nindex 89c530da..490e835e 100644\n--- a/src/gstreamer/gstlibcamera-controls.cpp.in\n+++ b/src/gstreamer/gstlibcamera-controls.cpp.in\n@@ -153,20 +153,24 @@ g_param_spec_{{ ctrl.gtype }}(\n bool GstCameraControls::getProperty(guint propId, GValue *value,\n \t\t\t\t    [[maybe_unused]] GParamSpec *pspec)\n {\n-\tif (!controls_acc_.contains(propId)) {\n+\tconst ControlValue *cv;\n+\tif (controls_acc_.contains(propId)) {\n+\t\tcv = &controls_acc_.get(propId);\n+\t} else if (metadata_.contains(propId)) {\n+\t\tcv = &metadata_.get(propId);\n+\t} else {\n \t\tGST_WARNING(\"Control '%s' is not available, default value will \"\n \t\t\t    \"be returned\",\n \t\t\t    controls::controls.at(propId)->name().c_str());\n \t\treturn true;\n \t}\n-\tconst ControlValue &cv = controls_acc_.get(propId);\n \n \tswitch (propId) {\n {%- for vendor, ctrls in controls %}\n {%- for ctrl in ctrls %}\n \n \tcase controls::{{ ctrl.namespace }}{{ ctrl.name|snake_case|upper }}: {\n-\t\tauto control = cv.get<{{ ctrl.type }}>();\n+\t\tauto control = cv->get<{{ ctrl.type }}>();\n \n {%- if ctrl.is_array %}\n \t\tfor (size_t i = 0; i < control.size(); ++i) {\n@@ -309,9 +313,14 @@ void GstCameraControls::setCamera(const std::shared_ptr<libcamera::Camera> &cam)\n \t\t\t\t    \"camera and will be ignored\",\n \t\t\t\t    cid->name().c_str());\n \t}\n-\n \tcontrols_acc_ = new_controls;\n \tcontrols_ = new_controls;\n+\n+\t/*\n+\t * Clear metadata as this might already be populated if the element has\n+\t * been running before.\n+\t */\n+\tmetadata_.clear();\n }\n \n void GstCameraControls::applyControls(std::unique_ptr<libcamera::Request> &request)\n@@ -322,6 +331,7 @@ void GstCameraControls::applyControls(std::unique_ptr<libcamera::Request> &reque\n \n void GstCameraControls::readMetadata(libcamera::Request *request)\n {\n-\tcontrols_acc_.merge(request->metadata(),\n-\t\t\t    ControlList::MergePolicy::OverwriteExisting);\n+\tmetadata_.merge(request->metadata(),\n+\t\t\tControlList::MergePolicy::OverwriteExisting);\n+\n }\ndiff --git a/src/gstreamer/gstlibcamera-controls.h b/src/gstreamer/gstlibcamera-controls.h\nindex 749220b5..ee97e61e 100644\n--- a/src/gstreamer/gstlibcamera-controls.h\n+++ b/src/gstreamer/gstlibcamera-controls.h\n@@ -36,8 +36,10 @@ private:\n \tControlInfoMap capabilities_;\n \t/* Set of user modified controls. */\n \tControlList controls_;\n-\t/* Accumulator of all controls ever set and metadata returned by camera */\n+\t/* Accumulator of all controls ever */\n \tControlList controls_acc_;\n+\t/* Metadata returned by requests */\n+\tControlList metadata_;\n };\n \n } /* namespace libcamera */\n","prefixes":["4/4"]}