From patchwork Fri Oct 23 10:58:16 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 28578 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 07E59C324C for ; Fri, 23 Oct 2026 10:59:27 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id B869168FBE; Fri, 23 Oct 2026 12:59:26 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="cqoWcd/v"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id B15D968FA6 for ; Fri, 23 Oct 2026 12:59:25 +0200 (CEST) Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c30:59f6:be2b:2877:6bc4:392]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 8EAEC145C; Fri, 23 Oct 2026 12:57:16 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1792753036; bh=+Wbyz6pnmyBhob5XYnzX12XAHv1+JiQ5ucmBujm3cIk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=cqoWcd/vF2NKcY+fCMSHivtvmLZS0gcqvec3m7NGIn7P8fvuMT2Wbaob6SJ084BxA qTiBQ8gxxAtyzMdlq7VrrID/XspGavd6Ah1wV12CnE4Q4d2tQwMBaRMux+/FIiSasc k5fgoqhEAGGdrD+vOVWlb1eyYdYV1IFjz4/txFSA= From: Jai Luthra Date: Fri, 23 Oct 2026 16:28:16 +0530 Subject: [PATCH WIP RFC 08/26] libcamera: camera_sensor_raw: Read the new CFA_PATTERN control MIME-Version: 1.0 Message-Id: <20261023-b4-raw-model-v1-8-eadb9948901b@ideasonboard.com> References: <20261023-b4-raw-model-v1-0-eadb9948901b@ideasonboard.com> In-Reply-To: <20261023-b4-raw-model-v1-0-eadb9948901b@ideasonboard.com> To: libcamera-devel@lists.libcamera.org Cc: Laurent Pinchart , Kieran Bingham , Sakari Ailus , Naushir Patuck , Jai Luthra X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3509; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=+Wbyz6pnmyBhob5XYnzX12XAHv1+JiQ5ucmBujm3cIk=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBq2z3KBW44slN1/gv0w2I7JOPtxHELE7bZRIai6 yF+O4yCcDKJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCats9ygAKCRBD3pH5JJpx RTlxEACJt27OZ00KxKOKECBpe9oGfwzVy578kemDjP0fYW0K3P7OnN5VPhNAZTezkZ9uOINYMpl 7vjklbE0F0bhF3tiH1kokxlzZuT6Aei3PtdglK4RD7AOd7z3KOaJZuJSmrlSnA7KOfar1rTq1rt PwzjQZPklk4nCcmuPl2lvQUzxECtvIB50LyzNavM8XnXWK81ZlaYfZqm7NUuKMp+ClM5MHrl7mP hW58a4UBLq7st404/Gu+NRL/1c5682ZoKy8r+rezcY3hs48ikREkUS2C8tGAIGi97S9q4ed8vC1 sUNJl4DdYmwg5QzHWciIKos2hkwMyJl6bKaE/iEMv0rU85HbmddVLizJkEzuGssdYPO+AZy6dlV caxgnebCn+NrG3OvBtyhP9HsVks6PNgjys8cpsEzsWjqcClGFymCL/k7HShsPED+ehGwLSbSLZL fDwzUIXS2mTf3PhwYTmxwNW4WOZ4aSLBuTAkwelPkpTvTHSm6ITNDXlZr9Fv5mR0jL/UmrJ5YTF AaxuqXKdoG74G7f7hOVkDoZqUxKlndA10LRZObswor3Vb1kLDqKyV4+LuH3I5OhvEbZsMWr7Ru2 rvlAwDVfiBFncRQf2L7D/LnX6HhPPZQ7Ck7P9Nf9xrIz0NUcZ+wzprOx48W5r1rNldh5LfNOKme O/S3bAdUbRyo4VA== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 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" The raw sensor model now supports generic media bus codes, and new V4L2 controls on the sensor subdevice for querying the color filter array order and if flips affect the readout order. Make sure both controls are present, and use them instead. TODO: Use the CFA_PATTERN_FLIP control instead of reading the MODIFY_LAYOUT flag of H/VFLIP controls. Signed-off-by: Jai Luthra --- src/libcamera/sensor/camera_sensor_raw.cpp | 58 ++++++++++++++++++------------ 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/src/libcamera/sensor/camera_sensor_raw.cpp b/src/libcamera/sensor/camera_sensor_raw.cpp index 59799a1c150c..b7ac9d90f523 100644 --- a/src/libcamera/sensor/camera_sensor_raw.cpp +++ b/src/libcamera/sensor/camera_sensor_raw.cpp @@ -346,29 +346,6 @@ std::optional CameraSensorRaw::init() * array order for the image stream. */ - /* - * Get the native sensor CFA pattern. It is simpler to retrieve it from - * the internal image sink pad as it is guaranteed to expose a single - * format, and is not affected by flips. - */ - V4L2Subdevice::Formats formats = subdev_->formats(streams_.image.sink); - if (formats.size() != 1) { - LOG(CameraSensor, Error) - << "Image pad has " << formats.size() - << " formats, expected 1"; - return { -EINVAL }; - } - - uint32_t nativeFormat = formats.cbegin()->first; - const BayerFormat &bayerFormat = BayerFormat::fromMbusCode(nativeFormat); - if (!bayerFormat.isValid()) { - LOG(CameraSensor, Error) - << "Invalid native format " << nativeFormat; - return { 0 }; - } - - cfaPattern_ = bayerFormat.order; - /* * Retrieve and cache the media bus codes and sizes on the source image * stream. @@ -454,6 +431,8 @@ std::optional CameraSensorRaw::init() static constexpr uint32_t mandatoryControls[] = { V4L2_CID_ANALOGUE_GAIN, V4L2_CID_CAMERA_ORIENTATION, + V4L2_CID_CFA_PATTERN, + V4L2_CID_CFA_PATTERN_FLIP, V4L2_CID_EXPOSURE, V4L2_CID_HBLANK, V4L2_CID_PIXEL_RATE, @@ -479,6 +458,38 @@ std::optional CameraSensorRaw::init() return { ret }; } + /* + * Get the native sensor CFA pattern. + */ + ControlList ctrls = subdev_->getControls({ { V4L2_CID_CFA_PATTERN } }); + if (ctrls.empty()) { + LOG(CameraSensor, Error) + << "Failed to retrieve CFA_PATTERN control"; + return -EINVAL; + } + + int cfaPattern = ctrls.get(V4L2_CID_CFA_PATTERN).get(); + + switch (cfaPattern) { + case V4L2_CFA_PATTERN_GRBG: + cfaPattern_ = BayerFormat::GRBG; + break; + case V4L2_CFA_PATTERN_RGGB: + cfaPattern_ = BayerFormat::RGGB; + break; + case V4L2_CFA_PATTERN_BGGR: + cfaPattern_ = BayerFormat::BGGR; + break; + case V4L2_CFA_PATTERN_GBRG: + cfaPattern_ = BayerFormat::GBRG; + break; + default: + LOG(CameraSensor, Error) + << "Unsupported CFA pattern " + << cfaPattern; + return -EINVAL; + } + /* Verify if sensor supports horizontal/vertical flips. */ auto queryFlip = [&](uint32_t id, const char *name) -> std::pair { const struct v4l2_query_ext_ctrl *flipInfo = subdev_->controlInfo(id); @@ -491,6 +502,7 @@ std::optional CameraSensorRaw::init() return { true, flipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT }; }; + /* FIXME: Replace with query to V4L2_CID_CFA_PATTERN_FLIP */ auto hflip = queryFlip(V4L2_CID_HFLIP, "horizontal"); auto vflip = queryFlip(V4L2_CID_VFLIP, "vertical");