[libcamera-devel] [PATCH] libcamera: ipu3: Always use sensor full frame size

Kieran Bingham kieran.bingham at ideasonboard.com
Fri Sep 18 15:44:21 CEST 2020


Hi Jacopo, Laurent,

On 18/09/2020 14:33, Laurent Pinchart wrote:
> Hi Kieran,
> 
> On Fri, Sep 18, 2020 at 09:24:51AM +0100, Kieran Bingham wrote:
>> On 18/09/2020 03:57, Laurent Pinchart wrote:
>>> On Thu, Sep 17, 2020 at 01:28:39PM +0200, Jacopo Mondi wrote:
>>>> When calculating the pipeline configuration for the IPU3 platform,
>>>> libcamera tries to be smart and select the smallest sensor frame
>>>> resolution larger enough to accommodate the stream sizes
>>>
>>> s/larger/large/
>>>
>>>> requested by the application.
>>>>
>>>> While this seems to make a lot of sense, in practice optimizing the
>>>
>>> s/seems to make/makes/
>>>
>>>> selected sensor resolution makes the pipeline configuration calculation
>>>> process fail in multiple occasions, or results in stalls during capture.
>>>>
>>>> As a trivial example, capturing with cam with the following command
>>>> line results in a stall:
>>>> $ cam -swidth=1280,height=720 -swidth=640,height=480 -c1 -C
>>>>
>>>> Likewise, the Android HAL supported format enumeration fails in
>>>> reporting smaller resolutions as supported when used with the OV5670
>>>> sensor.
>>>>
>>>> 320x240:
>>>> DEBUG IPU3 ipu3.cpp:192 CIO2 configuration: 648x486-SGRBG10_IPU3
>>>> ERROR IPU3 imgu.cpp:408 Failed to calculate pipe configuration
>>>> ERROR IPU3 ipu3.cpp:299 Failed to calculate pipe configuration: unsupported resolutions.
>>>>
>>>> 640x480:
>>>> DEBUG IPU3 ipu3.cpp:192 CIO2 configuration: 320x240-SGRBG10_IPU3
>>>> ERROR IPU3 imgu.cpp:408 Failed to calculate pipe configuration
>>>> ERROR IPU3 ipu3.cpp:299 Failed to calculate pipe configuration: unsupported resolutions.
>>>>
>>>> Furthermore the reference xml files used for the IPU3 camera
>>>> configuration on the ChromeOS platform restricts the number of sensor
>>>> resolution to be used for the OV5670 sensor to 2 from the 6 supported by
>>>> the driver [1].
>>>>
>>>> The selection criteria of the correct CIO2 mode are not specified, and
>>>> for the time being, always use the sensor maximum resolution at the
>>>> expense of frame rate and bus bandwidth to allow the pipeline to successfully
>>>> support smaller modes for the OV5670 sensor and solves pipeline stalls
>>>
>>> s/solves/solve/
>>>
>>>> when capturing with both sensors.
>>>
>>> I would make it clearer this is a temporary workaround. Maybe "For the
>>> time being, as a workaround, ..." ?
>>>
>>>>
>>>> [1] See the <sensor_modes> enumeration in:
>>>> https://chromium.googlesource.com/chromiumos/overlays/board-overlays/+/master/baseboard-poppy/media-libs/cros-camera-hal-configs-poppy/files/gcss/graph_settings_ov5670.xml
>>>>
>>>> Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
>>>> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
>>>> ---
>>>> RFC->v1:
>>>> - Add Niklas' tag
>>>> - Expand the \todo comment and remove the existing comment block
>>>>
>>>> Just have a look at the \todo block wording, if no big questions I'll push this
>>>> one soon.
>>>>
>>>> Thanks
>>>>   j
>>>> ---
>>>>  src/libcamera/pipeline/ipu3/ipu3.cpp | 31 ++++++++++++----------------
>>>>  1 file changed, 13 insertions(+), 18 deletions(-)
>>>>
>>>> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
>>>> index 2d881fe28f98..2ba00a2ca211 100644
>>>> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
>>>> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
>>>> @@ -144,25 +144,16 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()
>>>>  		status = Adjusted;
>>>>  	}
>>>>
>>>> -	/*
>>>> -	 * Validate the requested stream configuration and select the sensor
>>>> -	 * format by collecting the maximum RAW stream width and height and
>>>> -	 * picking the closest larger match, as the IPU3 can downscale only. If
>>>> -	 * no resolution is requested for the RAW stream, use the one from the
>>>> -	 * largest YUV stream, plus margins pixels for the IF and BDS to scale.
>>>> -	 * If no resolution is requested for any stream, pick the largest one.
>>>> -	 */
>>>> +	/* Validate the requested stream configuration */
>>>>  	unsigned int rawCount = 0;
>>>>  	unsigned int yuvCount = 0;
>>>>  	Size maxYuvSize;
>>>> -	Size maxRawSize;
>>>>
>>>>  	for (const StreamConfiguration &cfg : config_) {
>>>>  		const PixelFormatInfo &info = PixelFormatInfo::info(cfg.pixelFormat);
>>>>
>>>>  		if (info.colourEncoding == PixelFormatInfo::ColourEncodingRAW) {
>>>>  			rawCount++;
>>>> -			maxRawSize.expandTo(cfg.size);
>>>>  		} else {
>>>>  			yuvCount++;
>>>>  			maxYuvSize.expandTo(cfg.size);
>>>> @@ -174,18 +165,22 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()
>>>>  		return Invalid;
>>>>  	}
>>>>
>>>> -	if (maxRawSize.isNull())
>>>> -		maxRawSize = maxYuvSize.alignedUpTo(IMGU_OUTPUT_WIDTH_MARGIN,
>>>> -						    IMGU_OUTPUT_HEIGHT_MARGIN)
>>>> -				       .boundedTo(data_->cio2_.sensor()->resolution());
>>>> -
>>>>  	/*
>>>>  	 * Generate raw configuration from CIO2.
>>>>  	 *
>>>> -	 * The output YUV streams will be limited in size to the maximum
>>>> -	 * frame size requested for the RAW stream.
>>>> +	 * \todo The image sensor frame size should be calculated as the
>>>> +	 * smallest possible resolution larger enough to accommodate the
>>>> +	 * requested stream sizes. However such a selection makes the pipeline
>>>
>>> Smallest possible size may not always be the best, we haven't really
>>> thought about this. I would write "The image sensor output size should
>>> be selected to optimize operation based on the sizes of the requested
>>> streams.".
>>
>> Indeed, we really need to think about how we present this as an option
>> to the users/applications as well.
>>
>> This is /use case/ dependant.
>>
>> A mobile platform wants to reduce power for instance, and might want the
>> lowest reasonable sensor size to capture the required results, but other
>> use-cases (perhaps a digital microscope) would want to use as high a
>> resolution as possible from the sensor to capture as much light
>> information as is possible, and deal with any size constraints at the
>> rescaler.
> 
> It's actually the other way around, you'll get a better SNR if you scale
> on the sensor with binning.


I expressed myself badly. (And also erroneously referenced using the
scaler).

Reducing SNR is essentially what I was trying to state. (or rather what
I was thinking of)


>> And of course it can also depend on how the resolution selection affects
>> the field of view ...
> 
> That's a separate issue, scaling doesn't affect the field of view, and
> cropping shouldn't be applied behind the scenes to lower the resolution.


Yes, scaling doesn't - but changing the sensor resolution does - doesn't it?

Are all sensor modes implemented through binning?
or are they also represented as crops?

--
Kieran

>>>> +	 * configuration procedure fail for small resolution (in example:
>>
>> s/resolution/resolutions/
>>
>>> s/in example/for example/
>>>
>>>> +	 * 640x480 with OV5670) and causes the capture operations to stall for
>>>> +	 * some streams size combinations (see the commit message of the patch
>>>
>>> s/streams/stream/
>>>
>>>> +	 * that introduced this comment for more failure examples).
>>>> +	 *
>>>> +	 * Until the sensor frame size calculation criteria are not clarified,
>>>
>>> s/are not clarified/are clarified/
>>>
>>> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>>>
>>>> +	 * always use the largest possible one which guarantees better results
>>>> +	 * at the expense of the frame rate and CSI-2 bus bandwidth.
>>
>> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>>
>>>>  	 */
>>>> -	cio2Configuration_ = data_->cio2_.generateConfiguration(maxRawSize);
>>>> +	cio2Configuration_ = data_->cio2_.generateConfiguration({});
>>>>  	if (!cio2Configuration_.pixelFormat.isValid())
>>>>  		return Invalid;

-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list