[libcamera-devel] [PATCH v3 5/7] libcamera: camera_sensor: Break out properties initialization
Jacopo Mondi
jacopo at jmondi.org
Tue Feb 18 12:27:50 CET 2020
Refactor the CameraSensor properties initialization to a dedicated virtual
function that derived classes could subclass to register sensor-specific
properties values.
While at it, move documentation of the properties() method to match the
declaration order in the class definition and make the properties_ and
subdev_ fields protected to allow subclasses access.
Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
src/libcamera/camera_sensor.cpp | 115 +++++++++++++++-----------
src/libcamera/include/camera_sensor.h | 7 +-
2 files changed, 73 insertions(+), 49 deletions(-)
diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
index fa577c62b97a..cc1a05bc029f 100644
--- a/src/libcamera/camera_sensor.cpp
+++ b/src/libcamera/camera_sensor.cpp
@@ -51,7 +51,7 @@ LOG_DEFINE_CATEGORY(CameraSensor);
* Once constructed the instance must be initialized with init().
*/
CameraSensor::CameraSensor(const MediaEntity *entity)
- : entity_(entity), properties_(properties::properties)
+ : properties_(properties::properties), entity_(entity)
{
subdev_ = new V4L2Subdevice(entity);
}
@@ -93,45 +93,6 @@ 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()) {
@@ -162,6 +123,58 @@ int CameraSensor::init()
std::sort(mbusCodes_.begin(), mbusCodes_.end());
std::sort(sizes_.begin(), sizes_.end());
+ return initProperties();
+}
+
+/**
+ * \brief Initialize the camera sensor properties
+ *
+ * This method initializes the camera sensor properties, by inspecting the
+ * control information reported by the sensor subdevice.
+ *
+ * Derived classes may override this method to register sensor-specific
+ * properties if needed. If they do so, they shall call the base
+ * initProperties() method to register standard properties.
+ *
+ * \return 0 on success, a negative error code otherwise
+ */
+int CameraSensor::initProperties()
+{
+ const ControlInfoMap &controlMap = subdev_->controls();
+ int32_t propertyValue;
+
+ /* Camera Location: default is front location. */
+ const auto &locationControl = controlMap.find(V4L2_CID_CAMERA_SENSOR_LOCATION);
+ if (locationControl != controlMap.end()) {
+ int32_t v4l2Location =
+ locationControl->second.def().get<int32_t>();
+ switch (v4l2Location) {
+ case V4L2_LOCATION_EXTERNAL:
+ propertyValue = properties::CameraLocationExternal;
+ break;
+ case V4L2_LOCATION_FRONT:
+ propertyValue = properties::CameraLocationFront;
+ break;
+ case V4L2_LOCATION_BACK:
+ propertyValue = properties::CameraLocationBack;
+ break;
+ default:
+ LOG(CameraSensor, Error)
+ << "Unsupported camera location: " << v4l2Location;
+ return -EINVAL;
+ }
+ } else {
+ propertyValue = properties::CameraLocationFront;
+ }
+ properties_.set(properties::Location, propertyValue);
+
+ /* Camera Rotation: default is 0 degrees. */
+ propertyValue = 0;
+ const auto &rotationControl = controlMap.find(V4L2_CID_CAMERA_SENSOR_ROTATION);
+ if (rotationControl != controlMap.end())
+ propertyValue = rotationControl->second.def().get<int32_t>();
+ properties_.set(properties::Rotation, propertyValue);
+
return 0;
}
@@ -327,12 +340,6 @@ 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
@@ -363,11 +370,27 @@ int CameraSensor::setControls(ControlList *ctrls)
return subdev_->setControls(ctrls);
}
+/**
+ * \fn CameraSensor::properties()
+ * \brief Retrieve the camera sensor properties
+ * \return The list of camera sensor properties
+ */
+
std::string CameraSensor::logPrefix() const
{
return "'" + subdev_->entity()->name() + "'";
}
+/**
+ * \var CameraSensor::properties_
+ * \brief The list of camera sensor properties
+ */
+
+/**
+ * \var CameraSensor::subdev_
+ * \brief The camera sensor V4L2 subdevice
+ */
+
/**
* \class CameraSensorFactory
* \brief Factory of camera sensors
diff --git a/src/libcamera/include/camera_sensor.h b/src/libcamera/include/camera_sensor.h
index 633955591b36..747c37e8b2e4 100644
--- a/src/libcamera/include/camera_sensor.h
+++ b/src/libcamera/include/camera_sensor.h
@@ -34,6 +34,7 @@ public:
CameraSensor &operator=(const CameraSensor &) = delete;
int init();
+ virtual int initProperties();
const MediaEntity *entity() const { return entity_; }
const std::vector<unsigned int> &mbusCodes() const { return mbusCodes_; }
@@ -53,14 +54,14 @@ public:
protected:
std::string logPrefix() const;
+ ControlList properties_;
+ V4L2Subdevice *subdev_;
+
private:
const MediaEntity *entity_;
- V4L2Subdevice *subdev_;
std::vector<unsigned int> mbusCodes_;
std::vector<Size> sizes_;
-
- ControlList properties_;
};
class CameraSensorFactory
--
2.25.0
More information about the libcamera-devel
mailing list