[libcamera-devel] [PATCH 01/11] pipeline: ipu3: Check if sensor supports test pattern control

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sun Mar 19 14:57:26 CET 2023


Hi Dan,

Thank you for the patch.

On Sat, Mar 18, 2023 at 11:40:04PM +0000, Daniel Scally via libcamera-devel wrote:
> The IPU3 pipeline calls CameraSensor::setTestPatternMode() in ::start().
> That control is not a libcamera mandatory control and so might not be
> present for a sensor. Check for its presence before trying to set the
> control to avoid uneccessary failures.
> 
> Fixes: acf8d028e ("libcamera: pipeline: ipu3: Apply a requested test pattern mode")
> Signed-off-by: Daniel Scally <dan.scally at ideasonboard.com>
> ---
> I'll patch this control into the ov7251 driver upstream as the sensor does have
> a test pattern mode, but still - it's not mandatory!
> 
>  src/libcamera/pipeline/ipu3/ipu3.cpp | 12 ++++++++----
>  1 file changed, 8 insertions(+), 4 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index 355cb0cb..d0d55651 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -722,10 +722,14 @@ int PipelineHandlerIPU3::start(Camera *camera, [[maybe_unused]] const ControlLis
>  	int ret;
>  
>  	/* Disable test pattern mode on the sensor, if any. */
> -	ret = cio2->sensor()->setTestPatternMode(
> -		controls::draft::TestPatternModeEnum::TestPatternModeOff);
> -	if (ret)
> -		return ret;
> +	const ControlInfoMap &sensorControls = cio2->sensor()->controls();
> +
> +	if (sensorControls.find(&controls::draft::TestPatternMode) != sensorControls.end()) {
> +		ret = cio2->sensor()->setTestPatternMode(
> +			controls::draft::TestPatternModeEnum::TestPatternModeOff);

CameraSensor::setTestPatternMode() starts with

	if (testPatternMode_ == mode)
		return 0;

which was meant to make the function a no-op if the sensor doesn't
support test patterns. It seems the CameraSensor class may be missing
initialization of the testPatternMode_ member, which may explain why you
get an error. Initializing it in the constructor would be a better fix.

> +		if (ret)
> +			return ret;
> +	}
>  
>  	/* Allocate buffers for internal pipeline usage. */
>  	ret = allocateBuffers(camera);

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list