[libcamera-devel] [PATCH v4 6/7] libcamera: camera_sensor: Add method to get sensor info

Jacopo Mondi jacopo at jmondi.org
Mon Apr 27 23:32:35 CEST 2020


Add method to retrieve the CameraSensorInfo to the CameraSensor class.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 src/libcamera/camera_sensor.cpp       | 83 +++++++++++++++++++++++++++
 src/libcamera/include/camera_sensor.h |  1 +
 2 files changed, 84 insertions(+)

diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
index 4fd1ee84eb47..8b37f63dc04e 100644
--- a/src/libcamera/camera_sensor.cpp
+++ b/src/libcamera/camera_sensor.cpp
@@ -440,6 +440,89 @@ int CameraSensor::setControls(ControlList *ctrls)
 	return subdev_->setControls(ctrls);
 }
 
+/**
+ * \brief Assemble and return the camera sensor info
+ * \param[out] info The camera sensor info that reports the sensor information
+ *
+ * The CameraSensorInfo content is assembled by inspecting the currently
+ * applied sensor configuration and the sensor static properties.
+ *
+ * \return 0 on success, a negative error code otherwise
+ */
+int CameraSensor::sensorInfo(CameraSensorInfo *info) const
+{
+	/*
+	 * Construct the camera sensor name using the media entity name.
+	 *
+	 * \todo There is no standardized naming scheme for sensor entities
+	 * in the Linux kernel at the moment. The most common naming scheme
+	 * is the one obtained by associating the sensor name and its I2C
+	 * device and bus addresses in the form of: "devname i2c-adapt:i2c-addr"
+	 * Assume this is the standard naming scheme and parse the first part
+	 * of the entity name to obtain "devname".
+	 */
+	std::string entityName = subdev_->entity()->name();
+	info->model = entityName.substr(0, entityName.find(' '));
+
+	/*
+	 * Get the active area size from the ActiveAreas property. Do
+	 * not use the content of properties::ActiveAreas but fetch it from the
+	 * subdevice as the property registration is optional, but it's
+	 * mandatory to construct the CameraSensorInfo.
+	 *
+	 * \todo The ActiveAreas property aims to describe multiple
+	 * active area rectangles. At the moment only a single active
+	 * area rectangle is exposed by the subdevice API. Use that single
+	 * rectangle width and height to construct the ActiveAreaSize.
+	 */
+	Rectangle rect = {};
+	int ret = subdev_->getSelection(0, V4L2_SEL_TGT_CROP_DEFAULT, &rect);
+	if (ret) {
+		LOG(CameraSensor, Error)
+			<< "Failed to construct camera sensor info: "
+			<< "the camera sensor does not report the active area";
+
+		return ret;
+	}
+	info->activeAreaSize = { rect.width, rect.height };
+
+	/* It's mandatory for the subdevice to report its crop rectangle. */
+	ret = subdev_->getSelection(0, V4L2_SEL_TGT_CROP, &info->analogCrop);
+	if (ret) {
+		LOG(CameraSensor, Error)
+			<< "Failed to construct camera sensor info: "
+			<< "the camera sensor does not report the crop rectangle";
+		return ret;
+	}
+
+	/* The bit-depth and image size depend on the currently applied format. */
+	V4L2SubdeviceFormat format{};
+	ret = subdev_->getFormat(0, &format);
+	if (ret)
+		return ret;
+	info->bitsPerPixel = format.bitsPerPixel();
+	info->outputSize = format.size;
+
+	/*
+	 * Retrieve the pixel rate and the line length through V4L2 controls.
+	 * Support for the V4L2_CID_PIXEL_RATE and V4L2_CID_HBLANK controls is
+	 * mandatory.
+	 */
+	ControlList ctrls = subdev_->getControls({ V4L2_CID_PIXEL_RATE,
+						   V4L2_CID_HBLANK });
+	if (ctrls.empty()) {
+		LOG(CameraSensor, Error)
+			<< "Failed to retrieve camera info controls";
+		return -EINVAL;
+	}
+
+	int32_t hblank = ctrls.get(V4L2_CID_HBLANK).get<int32_t>();
+	info->lineLength = info->outputSize.width + hblank;
+	info->pixelRate = ctrls.get(V4L2_CID_PIXEL_RATE).get<int64_t>();
+
+	return 0;
+}
+
 std::string CameraSensor::logPrefix() const
 {
 	return "'" + subdev_->entity()->name() + "'";
diff --git a/src/libcamera/include/camera_sensor.h b/src/libcamera/include/camera_sensor.h
index 28ebfaa30c22..91d270552d3f 100644
--- a/src/libcamera/include/camera_sensor.h
+++ b/src/libcamera/include/camera_sensor.h
@@ -60,6 +60,7 @@ public:
 	int setControls(ControlList *ctrls);
 
 	const ControlList &properties() const { return properties_; }
+	int sensorInfo(CameraSensorInfo *info) const;
 
 protected:
 	std::string logPrefix() const;
-- 
2.26.1



More information about the libcamera-devel mailing list