[libcamera-devel] [PATCH v6 2/5] ipa: rkisp1: add FrameDurationLimits control

Jacopo Mondi jacopo at jmondi.org
Fri Nov 4 11:54:23 CET 2022


Hello

On Mon, Oct 31, 2022 at 12:42:33PM +0100, Jacopo Mondi via libcamera-devel wrote:
> Hi Nicholas
>
> On Sun, Oct 30, 2022 at 06:04:57PM -0500, Nicholas Roth via libcamera-devel wrote:

[snip]

>
> To make it more messy, we have this validation in CameraSensor class
>
> 	static constexpr uint32_t mandatoryControls[] = {
> 		V4L2_CID_EXPOSURE,
> 		V4L2_CID_HBLANK,
> 		V4L2_CID_PIXEL_RATE,
> 		V4L2_CID_VBLANK,
> 	};
>
> The optimal path would be:
> 1) Decide how much to validate on the pipeline handler side vs IPA
>    side. If have to validate on IPA side for $reasons:
>    2) Move validateSensorControls() to IPU3 init()
>    3) Copy validateSensorControls in RkISP1
>    4) Call validateSensorControls() in RkISP1::init()
>    5) Drop custom validation code from RkISP1::configure()
>
> As this is more work for you, and we need to finally make a call on
> where sensor control validation should happen, I would be fine merging
> this as it is or, if you feel particularly motived, with a check
> for HBLANK/VBLANK before calling updateControls() in init() as a
> safety measure, with a pinky promise from our side we fix this mess on
> both platforms as soon as these patches go in. (not something I'm
> generally confortable with as accepting technical debt with the
> promise that we'll eventually fix it is usually a recipe for disaster,
> but as we're keeping a close eye on the series and we want to progress
> it as soon as possible, I think we can take the risk here)

I've taken this patch in the "[PATCH 0/4] ipa: Validate controls in
CameraSensor" series to hopefully shorten the list of pending items in
this series.

Thanks
   j
>
>
> > +	uint32_t lineLength = sensorInfo.outputSize.width + hblank;
> > +
> > +	const ControlInfo &v4l2VBlank = sensorControls.find(V4L2_CID_VBLANK)->second;
> > +	std::array<uint32_t, 3> frameHeights{
> > +		v4l2VBlank.min().get<int32_t>() + sensorInfo.outputSize.height,
> > +		v4l2VBlank.max().get<int32_t>() + sensorInfo.outputSize.height,
> > +		v4l2VBlank.def().get<int32_t>() + sensorInfo.outputSize.height,
> > +	};
> > +
> > +	std::array<int64_t, 3> frameDurations;
> > +	for (unsigned int i = 0; i < frameHeights.size(); ++i) {
> > +		uint64_t frameSize = lineLength * frameHeights[i];
> > +		frameDurations[i] = frameSize / (sensorInfo.pixelRate / 1000000U);
> > +	}
> > +
> > +	ctrlMap[&controls::FrameDurationLimits] = ControlInfo(frameDurations[0],
> > +							      frameDurations[1],
> > +							      frameDurations[2]);
> > +
> > +	*ipaControls = ControlInfoMap(std::move(ctrlMap), controls::controls);
> > +}
> > +
> >  void IPARkISP1::setControls(unsigned int frame)
> >  {
> >  	/*
> > diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > index 455ee2a0..dae29a2c 100644
> > --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > @@ -340,15 +340,19 @@ int RkISP1CameraData::loadIPA(unsigned int hwRevision)
> >  		/*
> >  		 * If the tuning file isn't found, fall back to the
> >  		 * 'uncalibrated' configuration file.
> > -		 */
> > +	 */
> >  		if (ipaTuningFile.empty())
> >  			ipaTuningFile = ipa_->configurationFile("uncalibrated.yaml");
> >  	} else {
> >  		ipaTuningFile = std::string(configFromEnv);
> >  	}
> >
> > -	int ret = ipa_->init({ ipaTuningFile, sensor_->model() }, hwRevision,
> > -			     &controlInfo_);
> > +	IPACameraSensorInfo sensorInfo{};
> > +	int ret = sensor_->sensorInfo(&sensorInfo);
> > +	if (ret)
> > +		return ret;
> > +	ret = ipa_->init({ ipaTuningFile, sensor_->model() }, hwRevision,
> > +			 sensorInfo, sensor_->controls(), &controlInfo_);
> >  	if (ret < 0) {
> >  		LOG(RkISP1, Error) << "IPA initialization failure";
> >  		return ret;
> > @@ -725,7 +729,7 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)
> >  	std::map<uint32_t, ControlInfoMap> entityControls;
> >  	entityControls.emplace(0, data->sensor_->controls());
> >
> > -	ret = data->ipa_->configure(sensorInfo, streamConfig, entityControls);
> > +	ret = data->ipa_->configure(sensorInfo, streamConfig, entityControls, &data->controlInfo_);
> >  	if (ret) {
> >  		LOG(RkISP1, Error) << "failed configuring IPA (" << ret << ")";
> >  		return ret;
> > --
> > 2.34.1
> >


More information about the libcamera-devel mailing list