Message ID | 20191205204350.28196-7-jacopo@jmondi.org |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
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@ideasonboard.com> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Niklas Söderlund <niklas.soderlund@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); > + > /* 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@lists.libcamera.org > https://lists.libcamera.org/listinfo/libcamera-devel
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@ideasonboard.com> > > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> > > Reviewed-by: Niklas Söderlund <niklas.soderlund@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@lists.libcamera.org > > https://lists.libcamera.org/listinfo/libcamera-devel > > -- > Regards, > Niklas Söderlund
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); + /* 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 */