[libcamera-devel] [PATCH 06/10] libcamera: camera_sensor: Parse camera properties
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Wed Dec 4 17:05:06 CET 2019
Hi Jacopo,
Thank you for the patch.
On Wed, Dec 04, 2019 at 02:21:02PM +0100, Jacopo Mondi wrote:
> Parse and collect camera sensor properties by inspecting the associated
> v4l2 controls.
>
> Augment the CameraSensor class with an operation to retrieve the
> collected properties.
>
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
> src/libcamera/camera_sensor.cpp | 46 ++++++++++++++++++++++++++-
> src/libcamera/include/camera_sensor.h | 6 +++-
> 2 files changed, 50 insertions(+), 2 deletions(-)
>
> diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
> index 86f0c772861b..af1e218fbd27 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,42 @@ 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.defaultValue().get<int32_t>();
> + switch (v4l2Location) {
> + case V4L2_LOCATION_EXTERNAL:
> + propertyValue = CAMERA_LOCATION_EXTERNAL;
> + break;
> + case V4L2_LOCATION_FRONT:
> + propertyValue = CAMERA_LOCATION_FRONT;
> + break;
> + case V4L2_LOCATION_BACK:
> + propertyValue = CAMERA_LOCATION_BACK;
> + break;
> + default:
> + LOG(CameraSensor, Error)
> + << "Unsupported camera location: " << v4l2Location;
> + return -EINVAL;
> + }
> + } else {
> + propertyValue = CAMERA_LOCATION_FRONT;
> + }
> + properties_.set(properties::Location, propertyValue);
> +
> + /* Camera Rotation: default is 0 degrees. */
> + propertyValue = 0;
> + const auto &rotationControl = controls.find(V4L2_CID_CAMERA_SENSOR_ROTATION);
> + if (rotationControl != controls.end())
> + propertyValue = rotationControl->second.defaultValue().get<int32_t>();
> + properties_.set(properties::Rotation, propertyValue);
> +
> /* Enumerate and cache media bus codes and sizes. */
> const ImageFormats formats = subdev_->formats(0);
> if (formats.isEmpty()) {
> @@ -284,6 +322,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
Maybe we'll want to expand this later, but for now this should be fine.
> + */
> +
> /**
> * \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..68bfd1a4b8d6 100644
> --- a/src/libcamera/include/camera_sensor.h
> +++ b/src/libcamera/include/camera_sensor.h
> @@ -10,6 +10,7 @@
> #include <string>
> #include <vector>
>
> +#include <libcamera/controls.h>
> #include <libcamera/geometry.h>
>
> #include "log.h"
> @@ -17,7 +18,6 @@
> namespace libcamera {
>
> class ControlInfoMap;
You can remove this line too.
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> -class ControlList;
> class MediaEntity;
> class V4L2Subdevice;
>
> @@ -47,6 +47,8 @@ public:
> int getControls(ControlList *ctrls);
> int setControls(ControlList *ctrls);
>
> + const ControlList &properties() const { return properties_; }
> +
> protected:
> std::string logPrefix() const;
>
> @@ -56,6 +58,8 @@ private:
>
> std::vector<unsigned int> mbusCodes_;
> std::vector<Size> sizes_;
> +
> + ControlList properties_;
> };
>
> } /* namespace libcamera */
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list