[libcamera-devel] [PATCH v3 4/6] libcamera: camera_sensor: Break out properties initialization
Kieran Bingham
kieran.bingham at ideasonboard.com
Tue Mar 24 18:50:16 CET 2020
Hi Jacopo,
On 09/03/2020 18:04, Jacopo Mondi wrote:
> Refactor the CameraSensor properties initialization to a dedicated virtual
> function that derived classes could override to register sensor-specific
> properties values.
/properties/property/
>
> 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.
>
Seems fine to me,
I fear how big initProperties() could get depending on what properties
we can obtain from V4L2 controls, but I don't think it's too much of a
worry - and we can factor as we grow.
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> 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 8bfe02c9e8ff..354f4704299f 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 standard properties
> + *
> + * This method initializes the camera sensor standard 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
>
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list