[libcamera-devel,v2,06/10] libcamera: camera_sensor: Parse camera properties

Message ID 20191205204350.28196-7-jacopo@jmondi.org
State Superseded
Headers show
Series
  • Introduce camera properties
Related show

Commit Message

Jacopo Mondi Dec. 5, 2019, 8:43 p.m. UTC
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>
---
 src/libcamera/camera_sensor.cpp       | 46 ++++++++++++++++++++++++++-
 src/libcamera/include/camera_sensor.h |  7 ++--
 2 files changed, 50 insertions(+), 3 deletions(-)

Comments

Niklas Söderlund Dec. 6, 2019, 10:22 p.m. UTC | #1
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
Niklas Söderlund Dec. 6, 2019, 10:46 p.m. UTC | #2
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

Patch

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 */