[libcamera-devel] [PATCH v2 06/10] libcamera: camera_sensor: Parse camera properties
Niklas Söderlund
niklas.soderlund at ragnatech.se
Fri Dec 6 23:46:03 CET 2019
On 2019-12-06 23:22:45 +0100, Niklas Söderlund wrote:
> Hi Jacopo,
>
> Thanks for your patch.
>
> On 2019-12-05 21:43:46 +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.
> >
> > Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
>
> Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
>
> > ---
> > src/libcamera/camera_sensor.cpp | 46 ++++++++++++++++++++++++++-
> > src/libcamera/include/camera_sensor.h | 7 ++--
> > 2 files changed, 50 insertions(+), 3 deletions(-)
> >
> > diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
> > index 86f0c772861b..5c7a73ab0c4e 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.def().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.def().get<int32_t>();
> > + properties_.set(properties::Rotation, propertyValue);
Reading 9/10 I wonder if we should not enforce a bound here instead of
in the Android HAL component.
> > +
> > /* 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
> > + */
> > +
> > /**
> > * \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.23.0
> >
> > _______________________________________________
> > libcamera-devel mailing list
> > libcamera-devel at lists.libcamera.org
> > https://lists.libcamera.org/listinfo/libcamera-devel
>
> --
> Regards,
> Niklas Söderlund
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list