From patchwork Fri Oct 23 10:58:27 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 28589 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 4C6F6C324C for ; Fri, 23 Oct 2026 11:00:30 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 1829868FE0; Fri, 23 Oct 2026 13:00:30 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="A4U2Wk/s"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id B08EC68FD7 for ; Fri, 23 Oct 2026 13:00:28 +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 7EC4F1212; Fri, 23 Oct 2026 12:58:19 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1792753099; bh=VSuxURlzYQNd4HhNqD5AfTC9F9T7Rq7BQs+zlJKCM7M=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=A4U2Wk/sTI8Ad/K9u7am6XVzBRAsNUdL1l/6TMCF9BqfHQ2UESz+huAosDowGJea5 q/Ek4sl05e0/jF5ygF5oGcx5vvTAXkLumE0YI2EnyeWUSZYWuhRoMYE6vrzESmPkDI 2iGp1L8ZpQKv+Bxl0RwoQqL8yVyE8kqeM6qxH0m8= From: Jai Luthra Date: Fri, 23 Oct 2026 16:28:27 +0530 Subject: [PATCH WIP RFC 19/26] libcamera: camera_sensor: Add helpers for isRaw() and isMono() MIME-Version: 1.0 Message-Id: <20261023-b4-raw-model-v1-19-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=3303; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=VSuxURlzYQNd4HhNqD5AfTC9F9T7Rq7BQs+zlJKCM7M=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBq2z3VgpE14qGmA/SnL8dAL+krnQDZu5rIOWj+j f1aVA/XgK2JAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCats91QAKCRBD3pH5JJpx RQvJD/47u8tDu4ptvQ/s5qdpjOgnUB+k671DPGfwOVwd5a3JExm7VzGhWsz5hzM7pfaehZm/vsZ T491sRnHD9uqxED0JyBGG46SCn6/uA2KesHYodqDkxVpYjmHf5xwrICMChOwj3mZkKp5+BHDy7l N+KJWD7HCL9TbjRZi1AGyEPdc3zReNqYumqQZoXR7NKD2YlKvpyCsb3tZnn8WECQEeE0cf2skCI Xq+4b9/5fEnV8AdyzNNc7uyKC827iTxhWT0rzzON5hxp3vmxGcN0w3KmZkqx7WT1yxouJy1ZJfl 3kIoDDWO/WOdK1cDW7zFS5PGHHyCp9A/gU52yFvh9YSGLWzE6GkgfDmC+yKs7AlzuU0ZgRp/p3O wXdM9EbCChSYUPsJIMrGSAgszqnBaziQpgNsL7jsmff2aah/Idw7cw+o1ZVh1nGBRTcXoLrHqF4 +ThYj9VjLe2CbHHALsdBLt4n0ivEdo9Hcc0KdtYshW98DfmING17lZP3v3e8PbzIV9nEoGzgbuW O36ycTm0DRa60uNHm+6ZdnhhQsYeqp4edLYyJGF7qVwoBY3uFLcFYCgKo+Qa0hoPJbfG43aEwnU XXR0rLZZ3CyQR9kV+Yv6E0XFIhP3YjHoIFC1dld4relqy5pomOIt3eP61PG9SeILgWcdufveFK+ 1elYE3/WFMA8WKA== 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" Pipeline handlers often want to check if a sensor is monochrome, or gives a processed RGB/YUV image instead of a RAW one, as it may require special handling or skipping the ISP block altogether. Add helpers for it in CameraSensor to make their life easier. Signed-off-by: Jai Luthra --- include/libcamera/internal/camera_sensor.h | 2 ++ src/libcamera/sensor/camera_sensor_legacy.cpp | 8 +++++--- src/libcamera/sensor/camera_sensor_raw.cpp | 2 ++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h index a0f27ac11735..948e0523ab64 100644 --- a/include/libcamera/internal/camera_sensor.h +++ b/include/libcamera/internal/camera_sensor.h @@ -74,6 +74,8 @@ public: virtual Transform computeTransform(Orientation *orientation) const = 0; virtual ColorFilterArray bayerOrder(Transform t) const = 0; virtual Orientation mountingOrientation() const = 0; + virtual bool isMono() const = 0; + virtual bool isRaw() const = 0; virtual const ControlInfoMap &controls() const = 0; virtual ControlList getControls(std::span ids) = 0; diff --git a/src/libcamera/sensor/camera_sensor_legacy.cpp b/src/libcamera/sensor/camera_sensor_legacy.cpp index 8f47b77dc7c4..d1bfcd020c64 100644 --- a/src/libcamera/sensor/camera_sensor_legacy.cpp +++ b/src/libcamera/sensor/camera_sensor_legacy.cpp @@ -91,6 +91,8 @@ public: Transform computeTransform(Orientation *orientation) const override; ColorFilterArray bayerOrder(Transform t) const override; Orientation mountingOrientation() const override { return mountingOrientation_; } + bool isMono() const override { return cfa_ && cfa_ == ColorFilterArray::MONO; } + bool isRaw() const override { return cfa_.has_value(); } const ControlInfoMap &controls() const override; ControlList getControls(std::span ids) override; @@ -882,7 +884,7 @@ V4L2Subdevice::Stream CameraSensorLegacy::imageStream() const int CameraSensorLegacy::sensorInfo(IPACameraSensorInfo *info) const { - if (!cfa_) + if (!isRaw()) return -EINVAL; info->model = model(); @@ -986,8 +988,8 @@ Transform CameraSensorLegacy::computeTransform(Orientation *orientation) const ColorFilterArray CameraSensorLegacy::bayerOrder(Transform t) const { /* Return a defined by meaningless value for non-Bayer sensors. */ - if (!cfa_) - return ColorFilterArray::BGGR; + if (!isRaw()) + return ColorFilterArray::MONO; if (!flipsAlterBayerOrder_) return *cfa_; diff --git a/src/libcamera/sensor/camera_sensor_raw.cpp b/src/libcamera/sensor/camera_sensor_raw.cpp index c703db31d658..e45f2225b779 100644 --- a/src/libcamera/sensor/camera_sensor_raw.cpp +++ b/src/libcamera/sensor/camera_sensor_raw.cpp @@ -104,6 +104,8 @@ public: testPatternModes() const override { return testPatternModes_; } int setTestPatternMode(controls::draft::TestPatternModeEnum mode) override; const CameraSensorProperties::SensorDelays &sensorDelays() override; + bool isMono() const override { return cfa_ == ColorFilterArray::MONO; } + bool isRaw() const override { return true; } protected: std::string logPrefix() const override;