[PATCH v7 01/18] libcamera: pipeline: simple: fix size adjustment in validate()

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sun Apr 14 22:53:15 CEST 2024


Hi Milan,

On Mon, Apr 08, 2024 at 10:36:09AM +0200, Milan Zamazal wrote:
> Laurent Pinchart <laurent.pinchart at ideasonboard.com> writes:
> > On Thu, Apr 04, 2024 at 10:46:38AM +0200, Milan Zamazal wrote:
> >> From: Andrey Konovalov <andrey.konovalov at linaro.org>
> >> 
> >> SimpleCameraConfiguration::validate() adjusts the configuration of its
> >> streams (if the size is not in the outputSizes) to the captureSize. But
> >> the captureSize itself can be not in the outputSizes, and then the
> >> adjusted configuration won't be valid resulting in camera configuration
> >> failure.
> >> 
> >> Tested-by: Bryan O'Donoghue <bryan.odonoghue at linaro.org> # sc8280xp Lenovo x13s
> >> Tested-by: Pavel Machek <pavel at ucw.cz>
> >> Reviewed-by: Milan Zamazal <mzamazal at redhat.com>
> >> Reviewed-by: Pavel Machek <pavel at ucw.cz>
> >> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> >> Signed-off-by: Andrey Konovalov <andrey.konovalov at linaro.org>
> >> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> >> ---
> >>  src/libcamera/pipeline/simple/simple.cpp | 40 ++++++++++++++++++++++--
> >>  1 file changed, 38 insertions(+), 2 deletions(-)
> >> 
> >> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
> >> index 01f2a977..d2b88795 100644
> >> --- a/src/libcamera/pipeline/simple/simple.cpp
> >> +++ b/src/libcamera/pipeline/simple/simple.cpp
> >> @@ -882,6 +882,33 @@ SimpleCameraConfiguration::SimpleCameraConfiguration(Camera *camera,
> >>  {
> >>  }
> >>  
> >> +namespace {
> >> +
> >> +static Size adjustSize(const Size &requestedSize, const SizeRange &supportedSizes)
> >> +{
> >> +	ASSERT(supportedSizes.min <= supportedSizes.max);
> >> +
> >> +	if (supportedSizes.min == supportedSizes.max)
> >> +		return supportedSizes.max;
> >> +
> >> +	unsigned int hStep = supportedSizes.hStep;
> >> +	unsigned int vStep = supportedSizes.vStep;
> >> +
> >> +	if (hStep == 0)
> >> +		hStep = supportedSizes.max.width - supportedSizes.min.width;
> >> +	if (vStep == 0)
> >> +		vStep = supportedSizes.max.height - supportedSizes.min.height;
> >> +
> >> +	Size adjusted = requestedSize.boundedTo(supportedSizes.max)
> >> +				.expandedTo(supportedSizes.min);
> >> +
> >> +	return adjusted.shrunkBy(supportedSizes.min)
> >> +		.alignedDownTo(hStep, vStep)
> >> +		.grownBy(supportedSizes.min);
> >
> > Nitpicking, I think this would be more readable aligning the dots:
> 
> I agree, but LSP has different opinion (seems to prefer tab alignment).
> I outsource formatting to LSP, which usually matches libcamera formatting very
> well, and live with its recommendations, unless it suggests something clearly
> wrong.

Our checkstyle.py uses clang-format, maybe this is something we should
file as an enhancement request. We consider the clang-format output as
informative and depart from it when needed.

> It could look better with line breaks after requestedSize and `adjusted' but if
> anybody uses a more sane tab width than 8 then it doesn't matter much anyway.

A tab is 8 spaces, anything else is insane :-)

> > 	Size adjusted = requestedSize.boundedTo(supportedSizes.max)
> > 				     .expandedTo(supportedSizes.min);
> >
> > 	return adjusted.shrunkBy(supportedSizes.min)
> > 		       .alignedDownTo(hStep, vStep)
> > 		       .grownBy(supportedSizes.min);
> >
> > No need to resubmit just for that.
> >
> >> +}
> >> +
> >> +} /* namespace */
> >> +
> >>  CameraConfiguration::Status SimpleCameraConfiguration::validate()
> >>  {
> >>  	const CameraSensor *sensor = data_->sensor_.get();
> >> @@ -998,10 +1025,19 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()
> >>  		}
> >>  
> >>  		if (!pipeConfig_->outputSizes.contains(cfg.size)) {
> >> +			Size adjustedSize = pipeConfig_->captureSize;
> >> +			/*
> >> +			 * The converter (when present) may not be able to output
> >> +			 * a size identical to its input size. The capture size is thus
> >> +			 * not guaranteed to be a valid output size. In such cases, use
> >> +			 * the smaller valid output size closest to the requested.
> >> +			 */
> >> +			if (!pipeConfig_->outputSizes.contains(adjustedSize))
> >> +				adjustedSize = adjustSize(cfg.size, pipeConfig_->outputSizes);
> >>  			LOG(SimplePipeline, Debug)
> >>  				<< "Adjusting size from " << cfg.size
> >> -				<< " to " << pipeConfig_->captureSize;
> >> -			cfg.size = pipeConfig_->captureSize;
> >> +				<< " to " << adjustedSize;
> >> +			cfg.size = adjustedSize;
> >>  			status = Adjusted;
> >>  		}
> >>  

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list