[libcamera-devel] [PATCH v2 1/1] libcamera: camera_sensor: Reset HBLANK when setting the format

Jacopo Mondi jacopo at jmondi.org
Thu Nov 24 15:15:44 CET 2022


Hi David

On Wed, Nov 23, 2022 at 11:36:44AM +0000, David Plowman via libcamera-devel wrote:
> We no longer reset the HBLANK in init because we may not own the
> camera and the operation may fail. Instead, we reset it when we set
> the camera format so that all pipeline handlers, even ones that do not
> control HBLANK themselves, will have a well-defined value.
>
> Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
> ---
>  src/libcamera/camera_sensor.cpp | 53 ++++++++++++++++-----------------
>  1 file changed, 26 insertions(+), 27 deletions(-)
>
> diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
> index 572a313a..ec7bb0e7 100644
> --- a/src/libcamera/camera_sensor.cpp
> +++ b/src/libcamera/camera_sensor.cpp
> @@ -176,32 +176,6 @@ int CameraSensor::init()
>  	if (ret)
>  		return ret;
>
> -	/*
> -	 * Set HBLANK to the minimum to start with a well-defined line length,
> -	 * allowing IPA modules that do not modify HBLANK to use the sensor
> -	 * minimum line length in their calculations.
> -	 *
> -	 * At present, there is no way of knowing if a control is read-only.
> -	 * As a workaround, assume that if the minimum and maximum values of
> -	 * the V4L2_CID_HBLANK control are the same, it implies the control
> -	 * is read-only.
> -	 *
> -	 * \todo The control API ought to have a flag to specify if a control
> -	 * is read-only which could be used below.
> -	 */
> -	const ControlInfo hblank = ctrls.infoMap()->at(V4L2_CID_HBLANK);
> -	const int32_t hblankMin = hblank.min().get<int32_t>();
> -	const int32_t hblankMax = hblank.max().get<int32_t>();
> -
> -	if (hblankMin != hblankMax) {
> -		ControlList ctrl(subdev_->controls());
> -
> -		ctrl.set(V4L2_CID_HBLANK, hblankMin);
> -		ret = subdev_->setControls(&ctrl);
> -		if (ret)
> -			return ret;
> -	}
> -
>  	return applyTestPatternMode(controls::draft::TestPatternModeEnum::TestPatternModeOff);
>  }
>
> @@ -748,7 +722,32 @@ int CameraSensor::setFormat(V4L2SubdeviceFormat *format)
>  		return ret;
>
>  	updateControlInfo();

I would do that -before- updating the controls info.

> -	return 0;
> +
> +	/*
> +	 * Set HBLANK to the minimum to start with a well-defined line length,
> +	 * allowing IPA modules that do not modify HBLANK to use the sensor
> +	 * minimum line length in their calculations.
> +	 *
> +	 * At present, there is no way of knowing if a control is read-only.

I know it was already like this, but can't we use

const struct v4l2_query_ext_ctrl *V4L2Device::controlInfo(uint32_t id) const

and inspect the flags ?

> +	 * As a workaround, assume that if the minimum and maximum values of
> +	 * the V4L2_CID_HBLANK control are the same, it implies the control
> +	 * is read-only.
> +	 *
> +	 * \todo The control API ought to have a flag to specify if a control
> +	 * is read-only which could be used below.
> +	 */
> +	const ControlInfo hblank = controls().at(V4L2_CID_HBLANK);
> +	const int32_t hblankMin = hblank.min().get<int32_t>();
> +	const int32_t hblankMax = hblank.max().get<int32_t>();
> +
> +	if (hblankMin != hblankMax) {
> +		ControlList ctrl(subdev_->controls());
> +
> +		ctrl.set(V4L2_CID_HBLANK, hblankMin);
> +		ret = subdev_->setControls(&ctrl);
> +	}
> +
> +	return ret;
>  }

I could take this one on top of the flip series maybe, if you agree
with the above changes ?

Thanks
  j

>
>  /**
> --
> 2.30.2
>


More information about the libcamera-devel mailing list