{"id":24345,"url":"https://patchwork.libcamera.org/api/1.1/patches/24345/?format=json","web_url":"https://patchwork.libcamera.org/patch/24345/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/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":"<20250912-flash_reco-v2-4-d5bb80a2e619@emfend.at>","date":"2025-09-12T07:13:23","name":"[v2,4/5] libcamera: Add flash helpers for pipeline handlers","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"d891e6be281a1ec2e3acc39619b683b37957a95f","submitter":{"id":134,"url":"https://patchwork.libcamera.org/api/1.1/people/134/?format=json","name":"Matthias Fend","email":"matthias.fend@emfend.at"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/24345/mbox/","series":[{"id":5437,"url":"https://patchwork.libcamera.org/api/1.1/series/5437/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=5437","date":"2025-09-12T07:13:19","name":"Support for v4l2 flash devices","version":2,"mbox":"https://patchwork.libcamera.org/series/5437/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/24345/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/24345/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 93B73C324E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 12 Sep 2025 07:13:39 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id F368A6937A;\n\tFri, 12 Sep 2025 09:13:35 +0200 (CEST)","from lx20.hoststar.hosting (lx20.hoststar.hosting [168.119.41.54])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 2C0EC6936A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 12 Sep 2025 09:13:30 +0200 (CEST)","from 194-208-208-245.tele.net ([194.208.208.245]:58477\n\thelo=[127.0.1.1]) by lx20.hoststar.hosting with esmtpsa (TLS1.3) tls\n\tTLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.93)\n\t(envelope-from <matthias.fend@emfend.at>)\n\tid 1uwxyL-008cBW-0k; Fri, 12 Sep 2025 09:13:29 +0200"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=emfend.at header.i=@emfend.at\n\theader.b=\"TKVdzPWY\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=emfend.at;\n\ts=mail;\n\th=Cc:To:In-Reply-To:References:Message-Id:Content-Transfer-Encoding:\n\tContent-Type:MIME-Version:Subject:Date:From:Sender:Reply-To:Content-ID:\n\tContent-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc\n\t:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe:\n\tList-Post:List-Owner:List-Archive;\n\tbh=EwBfnVjs8gwXjhFU4nHGbso0t68zyoBk0zLqJRKLR+E=;\n\tb=TKVdzPWY0hoa+wmFV/7zmkdn8x\n\tEfAn9kyx6Z+3e+78hqJLV7DMXZ1FuZ9iUpSBsNI56fsKck5AGs1nk4p6P9WiNRHQysZ6Y+Og4NntO\n\thkXxEMQHCMMADjWkdvH/Su0YPDd9xbwEj1vKQzCAu1iEqsPeg6X4r3eJjMJNIkI0UClQ=;","From":"Matthias Fend <matthias.fend@emfend.at>","Date":"Fri, 12 Sep 2025 09:13:23 +0200","Subject":"[PATCH v2 4/5] libcamera: Add flash helpers for pipeline handlers","MIME-Version":"1.0","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"7bit","Message-Id":"<20250912-flash_reco-v2-4-d5bb80a2e619@emfend.at>","References":"<20250912-flash_reco-v2-0-d5bb80a2e619@emfend.at>","In-Reply-To":"<20250912-flash_reco-v2-0-d5bb80a2e619@emfend.at>","To":"libcamera-devel@lists.libcamera.org","Cc":"Matthias Fend <matthias.fend@emfend.at>","X-Mailer":"b4 0.14.2","X-Spam-Score":"-0.7","X-Spam-Bar":"/","X-Spam-Report":"Spam detection software,\n\trunning on the system \"lx20.hoststar.hosting\", \n\thas NOT identified this incoming email as spam.  The original\n\tmessage has been attached to this so you can view it or label\n\tsimilar future email.  If you have any questions, see\n\tthe administrator of that system for details.\n\tContent preview: Document the requirements for the v4l2 flash device\n\tdrivers required by libcamera. Signed-off-by: Matthias Fend\n\t<matthias.fend@emfend.at>\n\t--- Documentation/documentation-contents.rst | 1 +\n\tDocumentation/flash_driver_requirements.rst\n\t| 40 +++++++++++++++++++++++++++++ Documentation/i [...] \n\tContent analysis details:   (-0.7 points, 5.0 required)\n\tpts rule name              description\n\t---- ----------------------\n\t--------------------------------------------------\n\t0.0 URIBL_BLOCKED ADMINISTRATOR NOTICE: The query to URIBL was\n\tblocked.  See\n\thttp://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block\n\tfor more information. [URIs: meson.build]\n\t0.0 URIBL_DBL_BLOCKED_OPENDNS ADMINISTRATOR NOTICE: The query to\n\tdbl.spamhaus.org was blocked due to usage\n\tof an open resolver. See https://www.spamhaus.org/returnc/pub/\n\t[URIs: meson.build]\n\t0.0 URIBL_ZEN_BLOCKED_OPENDNS ADMINISTRATOR NOTICE: The query to\n\tzen.spamhaus.org was blocked due to usage\n\tof an open resolver. See https://www.spamhaus.org/returnc/pub/\n\t[URIs: meson.build]\n\t-1.0 ALL_TRUSTED Passed through trusted hosts only via SMTP\n\t0.0 Local_hs1_NotHoststar  Sender is not from hoststar.ch|de|com\n\t0.0 TVD_RCVD_IP            Message was received from an IP address\n\t0.0 KAM_DMARC_STATUS Test Rule for DKIM or SPF Failure with Strict\n\tAlignment\n\t0.2 KAM_LOTSOFHASH         Emails with lots of hash-like gibberish","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":"Add a set of helpers that pipeline handlers can use to deal with camera\nflash devices. This mainly involves mapping controls to the flash device\nand vice versa.\n\nSigned-off-by: Matthias Fend <matthias.fend@emfend.at>\n---\n include/libcamera/internal/flash_control.h |  23 +++++\n src/libcamera/flash_control.cpp            | 148 +++++++++++++++++++++++++++++\n src/libcamera/meson.build                  |   1 +\n 3 files changed, 172 insertions(+)","diff":"diff --git a/include/libcamera/internal/flash_control.h b/include/libcamera/internal/flash_control.h\nnew file mode 100644\nindex 0000000000000000000000000000000000000000..d530dc24fd8ea2d5676d95ab5943a7dacee07617\n--- /dev/null\n+++ b/include/libcamera/internal/flash_control.h\n@@ -0,0 +1,23 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2025, matthias.fend@emfend.at\n+ *\n+ * Flash controls helpers for pipeline handlers\n+ */\n+\n+#pragma once\n+\n+#include <libcamera/controls.h>\n+\n+#include \"libcamera/internal/camera_flash.h\"\n+\n+namespace libcamera {\n+\n+class FlashControl\n+{\n+public:\n+\tstatic void updateFlashControls(CameraFlash *flash, ControlInfoMap::Map &controls);\n+\tstatic void handleFlashControls(CameraFlash *flash, ControlList &controls, ControlList &metadata);\n+};\n+\n+} /* namespace libcamera */\ndiff --git a/src/libcamera/flash_control.cpp b/src/libcamera/flash_control.cpp\nnew file mode 100644\nindex 0000000000000000000000000000000000000000..0a032b5d50c8c04696aea211f05222357432e7ed\n--- /dev/null\n+++ b/src/libcamera/flash_control.cpp\n@@ -0,0 +1,148 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2025, matthias.fend@emfend.at\n+ *\n+ * Flash controls helpers for pipeline handlers\n+ */\n+\n+#include \"libcamera/internal/flash_control.h\"\n+\n+#include <libcamera/control_ids.h>\n+#include <libcamera/controls.h>\n+\n+namespace libcamera {\n+\n+void FlashControl::updateFlashControls(CameraFlash *flash, ControlInfoMap::Map &controls)\n+{\n+\tif (!flash)\n+\t\treturn;\n+\n+\tcontrols[&controls::FlashMode] = ControlInfo(controls::FlashModeValues, controls::FlashModeNone);\n+\tcontrols[&controls::FlashIntensity] = flash->getFlashIntensityInfo();\n+\tcontrols[&controls::FlashTimeout] = flash->getFlashTimeoutInfo();\n+\tcontrols[&controls::FlashStrobeSource] = ControlInfo(controls::FlashStrobeSourceValues, controls::FlashStrobeSourceSoftware);\n+\tcontrols[&controls::FlashStrobe] = ControlInfo(controls::FlashStrobeValues);\n+\tcontrols[&controls::FlashTorchIntensity] = flash->getTorchIntensityInfo();\n+}\n+\n+void FlashControl::handleFlashControls(CameraFlash *flash, ControlList &controls, ControlList &metadata)\n+{\n+\tif (!flash)\n+\t\treturn;\n+\n+\t/* Handle controls */\n+\n+\tconst auto &flashMode = controls.get(controls::FlashMode);\n+\tif (flashMode) {\n+\t\tCameraFlash::Mode mode;\n+\n+\t\tswitch (*flashMode) {\n+\t\tcase controls::FlashModeFlash:\n+\t\t\tmode = CameraFlash::Mode::Flash;\n+\t\t\tbreak;\n+\t\tcase controls::FlashModeTorch:\n+\t\t\tmode = CameraFlash::Mode::Torch;\n+\t\t\tbreak;\n+\t\tcase controls::FlashModeNone:\n+\t\tdefault:\n+\t\t\tmode = CameraFlash::Mode::None;\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tflash->setMode(mode);\n+\t}\n+\n+\tconst auto &flashIntensity = controls.get<int32_t>(controls::FlashIntensity);\n+\tif (flashIntensity)\n+\t\tflash->setFlashIntensity(*flashIntensity);\n+\n+\tconst auto &flashTimeout = controls.get<int32_t>(controls::FlashTimeout);\n+\tif (flashTimeout)\n+\t\tflash->setFlashTimeout(*flashTimeout);\n+\n+\tconst auto &flashStrobeSource = controls.get(controls::FlashStrobeSource);\n+\tif (flashStrobeSource) {\n+\t\tCameraFlash::StrobeSource source;\n+\n+\t\tswitch (*flashStrobeSource) {\n+\t\tcase controls::FlashStrobeSourceExternal:\n+\t\t\tsource = CameraFlash::StrobeSource::External;\n+\t\t\tbreak;\n+\t\tcase controls::FlashStrobeSourceSoftware:\n+\t\tdefault:\n+\t\t\tsource = CameraFlash::StrobeSource::Software;\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tflash->setStrobeSource(source);\n+\t}\n+\n+\tconst auto &flashStrobe = controls.get(controls::FlashStrobe);\n+\tif (flashStrobe) {\n+\t\tswitch (*flashStrobe) {\n+\t\tcase controls::FlashStrobeStart:\n+\t\t\tflash->startStrobe();\n+\t\t\tbreak;\n+\t\tcase controls::FlashStrobeStop:\n+\t\t\tflash->stopStrobe();\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\tconst auto &flashTorchIntensity = controls.get<int32_t>(controls::FlashTorchIntensity);\n+\tif (flashTorchIntensity)\n+\t\tflash->setTorchIntensity(*flashTorchIntensity);\n+\n+\t/* Fill metadata */\n+\n+\tconst auto metaFlashMode = flash->getMode();\n+\tif (metaFlashMode) {\n+\t\tcontrols::FlashModeEnum mode;\n+\n+\t\tswitch (*metaFlashMode) {\n+\t\tcase CameraFlash::Mode::Flash:\n+\t\t\tmode = controls::FlashModeFlash;\n+\t\t\tbreak;\n+\t\tcase CameraFlash::Mode::Torch:\n+\t\t\tmode = controls::FlashModeTorch;\n+\t\t\tbreak;\n+\t\tcase CameraFlash::Mode::None:\n+\t\tdefault:\n+\t\t\tmode = controls::FlashModeNone;\n+\t\t\tbreak;\n+\t\t}\n+\t\tmetadata.set(controls::FlashMode, mode);\n+\t}\n+\n+\tconst auto metaFlashIntensity = flash->getFlashIntensity();\n+\tif (metaFlashIntensity)\n+\t\tmetadata.set(controls::FlashIntensity, *metaFlashIntensity);\n+\n+\tauto metaFlashTimeout = flash->getFlashTimeout();\n+\tif (metaFlashTimeout)\n+\t\tmetadata.set(controls::FlashTimeout, *metaFlashTimeout);\n+\n+\tauto metaStrobeSource = flash->getStrobeSource();\n+\tif (metaStrobeSource) {\n+\t\tcontrols::FlashStrobeSourceEnum source;\n+\n+\t\tswitch (*metaStrobeSource) {\n+\t\tcase CameraFlash::StrobeSource::External:\n+\t\t\tsource = controls::FlashStrobeSourceExternal;\n+\t\t\tbreak;\n+\t\tcase CameraFlash::StrobeSource::Software:\n+\t\tdefault:\n+\t\t\tsource = controls::FlashStrobeSourceSoftware;\n+\t\t\tbreak;\n+\t\t}\n+\t\tmetadata.set(controls::FlashStrobeSource, source);\n+\t}\n+\n+\tauto metaTorchIntensity = flash->getTorchIntensity();\n+\tif (metaTorchIntensity)\n+\t\tmetadata.set(controls::FlashTorchIntensity, *metaTorchIntensity);\n+}\n+\n+} /* namespace libcamera */\ndiff --git a/src/libcamera/meson.build b/src/libcamera/meson.build\nindex 0f125661a51e2431c1febc353cef30a1219f9ce7..a68a49637db12f9e66b5bb38ee859aaac8c2fd1a 100644\n--- a/src/libcamera/meson.build\n+++ b/src/libcamera/meson.build\n@@ -31,6 +31,7 @@ libcamera_internal_sources = files([\n     'device_enumerator.cpp',\n     'device_enumerator_sysfs.cpp',\n     'dma_buf_allocator.cpp',\n+    'flash_control.cpp',\n     'formats.cpp',\n     'ipa_controls.cpp',\n     'ipa_data_serializer.cpp',\n","prefixes":["v2","4/5"]}