[libcamera-devel] [PATCH v4 6/7] libcamera: camera_sensor: Add method to get sensor info

Niklas Söderlund niklas.soderlund at ragnatech.se
Tue Apr 28 02:28:39 CEST 2020


Hi Jacopo,

Thanks for your work.

On 2020-04-27 23:32:35 +0200, Jacopo Mondi wrote:
> Add method to retrieve the CameraSensorInfo to the CameraSensor class.
> 
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
>  src/libcamera/camera_sensor.cpp       | 83 +++++++++++++++++++++++++++
>  src/libcamera/include/camera_sensor.h |  1 +
>  2 files changed, 84 insertions(+)
> 
> diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
> index 4fd1ee84eb47..8b37f63dc04e 100644
> --- a/src/libcamera/camera_sensor.cpp
> +++ b/src/libcamera/camera_sensor.cpp
> @@ -440,6 +440,89 @@ int CameraSensor::setControls(ControlList *ctrls)
>  	return subdev_->setControls(ctrls);
>  }
>  
> +/**
> + * \brief Assemble and return the camera sensor info
> + * \param[out] info The camera sensor info that reports the sensor information
> + *
> + * The CameraSensorInfo content is assembled by inspecting the currently
> + * applied sensor configuration and the sensor static properties.
> + *
> + * \return 0 on success, a negative error code otherwise
> + */
> +int CameraSensor::sensorInfo(CameraSensorInfo *info) const
> +{
> +	/*
> +	 * Construct the camera sensor name using the media entity name.
> +	 *
> +	 * \todo There is no standardized naming scheme for sensor entities
> +	 * in the Linux kernel at the moment. The most common naming scheme
> +	 * is the one obtained by associating the sensor name and its I2C
> +	 * device and bus addresses in the form of: "devname i2c-adapt:i2c-addr"
> +	 * Assume this is the standard naming scheme and parse the first part
> +	 * of the entity name to obtain "devname".
> +	 */
> +	std::string entityName = subdev_->entity()->name();
> +	info->model = entityName.substr(0, entityName.find(' '));

If we need to keep the model name I like the interface provided by 
CameraSensor::model() from '[PATCH] libcamera: camera_sensor: Add 
model() function'.

As stated in the patch mention above I have comments on the 
documentation and it's implementation.

> +
> +	/*
> +	 * Get the active area size from the ActiveAreas property. Do
> +	 * not use the content of properties::ActiveAreas but fetch it from the
> +	 * subdevice as the property registration is optional, but it's
> +	 * mandatory to construct the CameraSensorInfo.

I'm sorry but this paragraph confuses me.

    Get FOO from property. Do not use the content of properties::FOO.

> +	 *
> +	 * \todo The ActiveAreas property aims to describe multiple
> +	 * active area rectangles. At the moment only a single active
> +	 * area rectangle is exposed by the subdevice API. Use that single
> +	 * rectangle width and height to construct the ActiveAreaSize.
> +	 */
> +	Rectangle rect = {};
> +	int ret = subdev_->getSelection(0, V4L2_SEL_TGT_CROP_DEFAULT, &rect);
> +	if (ret) {
> +		LOG(CameraSensor, Error)

If the target is mandatory for libcamera shall this be a fatal error ?  
Here and bellow.

> +			<< "Failed to construct camera sensor info: "
> +			<< "the camera sensor does not report the active area";
> +
> +		return ret;
> +	}
> +	info->activeAreaSize = { rect.width, rect.height };
> +
> +	/* It's mandatory for the subdevice to report its crop rectangle. */
> +	ret = subdev_->getSelection(0, V4L2_SEL_TGT_CROP, &info->analogCrop);
> +	if (ret) {
> +		LOG(CameraSensor, Error)
> +			<< "Failed to construct camera sensor info: "
> +			<< "the camera sensor does not report the crop rectangle";
> +		return ret;
> +	}
> +
> +	/* The bit-depth and image size depend on the currently applied format. */
> +	V4L2SubdeviceFormat format{};
> +	ret = subdev_->getFormat(0, &format);
> +	if (ret)
> +		return ret;
> +	info->bitsPerPixel = format.bitsPerPixel();
> +	info->outputSize = format.size;
> +
> +	/*
> +	 * Retrieve the pixel rate and the line length through V4L2 controls.
> +	 * Support for the V4L2_CID_PIXEL_RATE and V4L2_CID_HBLANK controls is
> +	 * mandatory.
> +	 */
> +	ControlList ctrls = subdev_->getControls({ V4L2_CID_PIXEL_RATE,
> +						   V4L2_CID_HBLANK });
> +	if (ctrls.empty()) {

What if only one of the controls are implemented by the driver? Would it 
make more sens to check ctrls.size() != 2 ?

> +		LOG(CameraSensor, Error)
> +			<< "Failed to retrieve camera info controls";
> +		return -EINVAL;
> +	}
> +
> +	int32_t hblank = ctrls.get(V4L2_CID_HBLANK).get<int32_t>();
> +	info->lineLength = info->outputSize.width + hblank;
> +	info->pixelRate = ctrls.get(V4L2_CID_PIXEL_RATE).get<int64_t>();
> +
> +	return 0;
> +}
> +
>  std::string CameraSensor::logPrefix() const
>  {
>  	return "'" + subdev_->entity()->name() + "'";
> diff --git a/src/libcamera/include/camera_sensor.h b/src/libcamera/include/camera_sensor.h
> index 28ebfaa30c22..91d270552d3f 100644
> --- a/src/libcamera/include/camera_sensor.h
> +++ b/src/libcamera/include/camera_sensor.h
> @@ -60,6 +60,7 @@ public:
>  	int setControls(ControlList *ctrls);
>  
>  	const ControlList &properties() const { return properties_; }
> +	int sensorInfo(CameraSensorInfo *info) const;
>  
>  protected:
>  	std::string logPrefix() const;
> -- 
> 2.26.1
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

-- 
Regards,
Niklas Söderlund


More information about the libcamera-devel mailing list