[libcamera-devel] [PATCH 06/23] libcamera: camera_sensor: Parse camera properties

Jacopo Mondi jacopo at jmondi.org
Mon Jan 13 17:42:28 CET 2020


Parse and collect camera sensor properties by inspecting the associated
v4l2 controls.

Augment the CameraSensor class with an operation to retrieve the
collected properties.

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 src/libcamera/camera_sensor.cpp       | 49 ++++++++++++++++++++++++++-
 src/libcamera/include/camera_sensor.h |  7 ++--
 2 files changed, 53 insertions(+), 3 deletions(-)

diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
index 86f0c772861b..2219a4307436 100644
--- a/src/libcamera/camera_sensor.cpp
+++ b/src/libcamera/camera_sensor.cpp
@@ -13,6 +13,8 @@
 #include <limits.h>
 #include <math.h>
 
+#include <libcamera/property_ids.h>
+
 #include "formats.h"
 #include "utils.h"
 #include "v4l2_subdevice.h"
@@ -47,7 +49,7 @@ LOG_DEFINE_CATEGORY(CameraSensor);
  * Once constructed the instance must be initialized with init().
  */
 CameraSensor::CameraSensor(const MediaEntity *entity)
-	: entity_(entity)
+	: entity_(entity), properties_(properties::properties)
 {
 	subdev_ = new V4L2Subdevice(entity);
 }
@@ -89,6 +91,45 @@ int CameraSensor::init()
 	if (ret < 0)
 		return ret;
 
+	/* Retrieve and store the camera sensor properties. */
+	const ControlInfoMap &controls = subdev_->controls();
+	int32_t propertyValue;
+
+	/* Camera Location: default is front location. */
+	const auto &locationControl = controls.find(V4L2_CID_CAMERA_SENSOR_LOCATION);
+	if (locationControl != controls.end()) {
+		int32_t v4l2Location =
+			locationControl->second.def().get<int32_t>();
+
+		switch (v4l2Location) {
+		default:
+			LOG(CameraSensor, Warning)
+				<< "Unsupported camera location "
+				<< v4l2Location << ", setting to Front";
+			/* Fall-through */
+		case V4L2_LOCATION_FRONT:
+			propertyValue = properties::CameraLocationFront;
+			break;
+		case V4L2_LOCATION_BACK:
+			propertyValue = properties::CameraLocationBack;
+			break;
+		case V4L2_LOCATION_EXTERNAL:
+			propertyValue = properties::CameraLocationExternal;
+			break;
+		}
+	} else {
+		propertyValue = properties::CameraLocationFront;
+	}
+	properties_.set(properties::Location, propertyValue);
+
+	/* Camera Rotation: default is 0 degrees. */
+	const auto &rotationControl = controls.find(V4L2_CID_CAMERA_SENSOR_ROTATION);
+	if (rotationControl != controls.end())
+		propertyValue = rotationControl->second.def().get<int32_t>();
+	else
+		propertyValue = 0;
+	properties_.set(properties::Rotation, propertyValue);
+
 	/* Enumerate and cache media bus codes and sizes. */
 	const ImageFormats formats = subdev_->formats(0);
 	if (formats.isEmpty()) {
@@ -284,6 +325,12 @@ int CameraSensor::getControls(ControlList *ctrls)
 	return subdev_->getControls(ctrls);
 }
 
+/**
+ * \fn CameraSensor::properties()
+ * \brief Retrieve the camera sensor properties
+ * \return The list of camera sensor properties
+ */
+
 /**
  * \brief Write controls to the sensor
  * \param[in] ctrls The list of controls to write
diff --git a/src/libcamera/include/camera_sensor.h b/src/libcamera/include/camera_sensor.h
index 1fb36a4f4951..99cff98128dc 100644
--- a/src/libcamera/include/camera_sensor.h
+++ b/src/libcamera/include/camera_sensor.h
@@ -10,14 +10,13 @@
 #include <string>
 #include <vector>
 
+#include <libcamera/controls.h>
 #include <libcamera/geometry.h>
 
 #include "log.h"
 
 namespace libcamera {
 
-class ControlInfoMap;
-class ControlList;
 class MediaEntity;
 class V4L2Subdevice;
 
@@ -47,6 +46,8 @@ public:
 	int getControls(ControlList *ctrls);
 	int setControls(ControlList *ctrls);
 
+	const ControlList &properties() const { return properties_; }
+
 protected:
 	std::string logPrefix() const;
 
@@ -56,6 +57,8 @@ private:
 
 	std::vector<unsigned int> mbusCodes_;
 	std::vector<Size> sizes_;
+
+	ControlList properties_;
 };
 
 } /* namespace libcamera */
-- 
2.24.0



More information about the libcamera-devel mailing list