[libcamera-devel] [PATCH v1 5/9] libcamera: pipeline: raspberrypi: Move configureIPA() to RPiCameraData

Laurent Pinchart laurent.pinchart at ideasonboard.com
Thu Jul 2 23:07:11 CEST 2020


Hi Jacopo,

On Tue, Jun 30, 2020 at 12:38:37PM +0200, Jacopo Mondi wrote:
> On Mon, Jun 29, 2020 at 02:19:30AM +0300, Laurent Pinchart wrote:
> > The PipelineHandlerRPi::configureIPA() function accesses plenty of
> > member data from the RPiCameraData class and no member from the
> > PipelineHandlerRPi class. Move it to RPiCameraData where it logically
> > belongs.
> >
> > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > ---
> >  .../pipeline/raspberrypi/raspberrypi.cpp      | 117 +++++++++---------
> >  1 file changed, 58 insertions(+), 59 deletions(-)
> >
> > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> > index 3b5cdf1e1849..0f9237a7f346 100644
> > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> > @@ -311,6 +311,8 @@ public:
> >  	void frameStarted(uint32_t sequence);
> >
> >  	int loadIPA();
> > +	int configureIPA();
> > +
> >  	void queueFrameAction(unsigned int frame, const IPAOperationData &action);
> >
> >  	/* bufferComplete signal handlers. */
> > @@ -396,8 +398,6 @@ private:
> >  		return static_cast<RPiCameraData *>(PipelineHandler::cameraData(camera));
> >  	}
> >
> > -	int configureIPA(Camera *camera);
> > -
> >  	int queueAllBuffers(Camera *camera);
> >  	int prepareBuffers(Camera *camera);
> >  	void freeBuffers(Camera *camera);
> > @@ -752,7 +752,7 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)
> >  	crop.y = (sensorFormat.size.height - crop.height) >> 1;
> >  	data->isp_[Isp::Input].dev()->setSelection(V4L2_SEL_TGT_CROP, &crop);
> >
> > -	ret = configureIPA(camera);
> > +	ret = data->configureIPA();
> >  	if (ret)
> >  		LOG(RPI, Error) << "Failed to configure the IPA: " << ret;
> >
> > @@ -968,62 +968,6 @@ bool PipelineHandlerRPi::match(DeviceEnumerator *enumerator)
> >  	return true;
> >  }
> >
> > -int PipelineHandlerRPi::configureIPA(Camera *camera)
> > -{
> > -	std::map<unsigned int, IPAStream> streamConfig;
> > -	std::map<unsigned int, const ControlInfoMap &> entityControls;
> > -	RPiCameraData *data = cameraData(camera);
> > -
> > -	/* Get the device format to pass to the IPA. */
> > -	V4L2DeviceFormat sensorFormat;
> > -	data->unicam_[Unicam::Image].dev()->getFormat(&sensorFormat);
> > -	/* Inform IPA of stream configuration and sensor controls. */
> > -	unsigned int i = 0;
> > -	for (auto const &stream : data->isp_) {
> > -		if (stream.isExternal()) {
> > -			streamConfig[i] = {
> > -				.pixelFormat = stream.configuration().pixelFormat,
> > -				.size = stream.configuration().size
> > -			};
> > -		}
> > -	}
> > -	entityControls.emplace(0, data->unicam_[Unicam::Image].dev()->controls());
> > -	entityControls.emplace(1, data->isp_[Isp::Input].dev()->controls());
> > -
> > -	/* Allocate the lens shading table via vcsm and pass to the IPA. */
> > -	if (!data->lsTable_) {
> > -		data->lsTable_ = data->vcsm_.alloc("ls_grid", MAX_LS_GRID_SIZE);
> > -		uintptr_t ptr = reinterpret_cast<uintptr_t>(data->lsTable_);
> > -
> > -		if (!data->lsTable_)
> > -			return -ENOMEM;
> > -
> > -		/*
> > -		 * The vcsm allocation will always be in the memory region
> > -		 * < 32-bits to allow Videocore to access the memory.
> > -		 */
> > -		IPAOperationData op;
> > -		op.operation = RPI_IPA_EVENT_LS_TABLE_ALLOCATION;
> > -		op.data = { static_cast<uint32_t>(ptr & 0xffffffff),
> > -			    data->vcsm_.getVCHandle(data->lsTable_) };
> > -		data->ipa_->processEvent(op);
> > -	}
> > -
> > -	CameraSensorInfo sensorInfo = {};
> > -	int ret = data->sensor_->sensorInfo(&sensorInfo);
> > -	if (ret) {
> > -		LOG(RPI, Error) << "Failed to retrieve camera sensor info";
> > -		return ret;
> > -	}
> > -
> > -	/* Ready the IPA - it must know about the sensor resolution. */
> > -	IPAOperationData ipaConfig;
> > -	data->ipa_->configure(sensorInfo, streamConfig, entityControls,
> > -			      ipaConfig, nullptr);
> > -
> > -	return 0;
> > -}
> > -
> >  int PipelineHandlerRPi::queueAllBuffers(Camera *camera)
> >  {
> >  	RPiCameraData *data = cameraData(camera);
> > @@ -1161,6 +1105,61 @@ int RPiCameraData::loadIPA()
> >  	return ipa_->start();
> >  }
> >
> > +int RPiCameraData::configureIPA()
> > +{
> > +	std::map<unsigned int, IPAStream> streamConfig;
> > +	std::map<unsigned int, const ControlInfoMap &> entityControls;
> > +
> > +	/* Get the device format to pass to the IPA. */
> > +	V4L2DeviceFormat sensorFormat;
> > +	unicam_[Unicam::Image].dev()->getFormat(&sensorFormat);
> > +	/* Inform IPA of stream configuration and sensor controls. */
> > +	unsigned int i = 0;
> > +	for (auto const &stream : isp_) {
> > +		if (stream.isExternal()) {
> > +			streamConfig[i] = {
> > +				.pixelFormat = stream.configuration().pixelFormat,
> > +				.size = stream.configuration().size
> > +			};
> > +		}
> > +	}
> > +	entityControls.emplace(0, unicam_[Unicam::Image].dev()->controls());
> > +	entityControls.emplace(1, isp_[Isp::Input].dev()->controls());
> > +
> > +	/* Allocate the lens shading table via vcsm and pass to the IPA. */
> > +	if (!lsTable_) {
> > +		lsTable_ = vcsm_.alloc("ls_grid", MAX_LS_GRID_SIZE);
> > +		uintptr_t ptr = reinterpret_cast<uintptr_t>(lsTable_);
> > +
> > +		if (!lsTable_)
> > +			return -ENOMEM;
> > +
> > +		/*
> > +		 * The vcsm allocation will always be in the memory region
> > +		 * < 32-bits to allow Videocore to access the memory.
> > +		 */
> > +		IPAOperationData op;
> > +		op.operation = RPI_IPA_EVENT_LS_TABLE_ALLOCATION;
> > +		op.data = { static_cast<uint32_t>(ptr & 0xffffffff),
> > +			    vcsm_.getVCHandle(lsTable_) };
> > +		ipa_->processEvent(op);
> > +	}
> > +
> > +	CameraSensorInfo sensorInfo = {};
> > +	int ret = sensor_->sensorInfo(&sensorInfo);
> > +	if (ret) {
> > +		LOG(RPI, Error) << "Failed to retrieve camera sensor info";
> > +		return ret;
> > +	}
> > +
> > +	/* Ready the IPA - it must know about the sensor resolution. */
> 
> "Ready the IPA" ? I didn't get what you mean :)

I didn't mean anything, this patch only moves code :-) But I think it
means https://en.wiktionary.org/wiki/ready#Verb.

We can update the comment, but I wouldn't do so in this patch.

> nit apart
> Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
> 
> > +	IPAOperationData ipaConfig;
> > +	ipa_->configure(sensorInfo, streamConfig, entityControls, ipaConfig,
> > +			nullptr);
> > +
> > +	return 0;
> > +}
> > +
> >  void RPiCameraData::queueFrameAction(unsigned int frame, const IPAOperationData &action)
> >  {
> >  	/*

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list