[libcamera-devel] [PATCH v2 08/11] libcamera: pipeline: ipu3: Migrate to Camera::Private

Laurent Pinchart laurent.pinchart at ideasonboard.com
Wed Aug 11 19:14:57 CEST 2021


Hi Jacopo,

On Tue, Aug 10, 2021 at 03:53:55PM +0200, Jacopo Mondi wrote:
> On Thu, Aug 05, 2021 at 08:58:45PM +0300, Laurent Pinchart wrote:
> > As part of the effort to remove the CameraData class, migrate the
> > pipeline handler-specific camera data from CameraData to the
> > Camera::Private class.
> >
> > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> > ---
> >  src/libcamera/pipeline/ipu3/ipu3.cpp | 38 +++++++++++++---------------
> >  1 file changed, 18 insertions(+), 20 deletions(-)
> >
> > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> > index 15d6cca609ff..6d097ac91d2e 100644
> > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> > @@ -53,11 +53,11 @@ static const ControlInfoMap::Map IPU3Controls = {
> >  	{ &controls::draft::PipelineDepth, ControlInfo(2, 3) },
> >  };
> >
> > -class IPU3CameraData : public CameraData
> > +class IPU3CameraData : public Camera::Private
> >  {
> >  public:
> >  	IPU3CameraData(PipelineHandler *pipe)
> > -		: CameraData(pipe), exposureTime_(0), supportsFlips_(false)
> > +		: Camera::Private(pipe), exposureTime_(0), supportsFlips_(false)
> >  	{
> >  	}
> >
> > @@ -146,10 +146,9 @@ public:
> >  	bool match(DeviceEnumerator *enumerator) override;
> >
> >  private:
> > -	IPU3CameraData *cameraData(const Camera *camera)
> > +	IPU3CameraData *cameraData(Camera *camera)
> >  	{
> > -		return static_cast<IPU3CameraData *>(
> > -			PipelineHandler::cameraData(camera));
> > +		return static_cast<IPU3CameraData *>(camera->_d());
> >  	}
> >
> >  	int initControls(IPU3CameraData *data);
> > @@ -800,10 +799,10 @@ void IPU3CameraData::cancelPendingRequests()
> >  		for (auto it : request->buffers()) {
> >  			FrameBuffer *buffer = it.second;
> >  			buffer->cancel();
> > -			pipe_->completeBuffer(request, buffer);
> > +			pipe()->completeBuffer(request, buffer);
> 
> I wonder, being the Private class only visible internally, do we need
> to keep Camera::Private::pipe_ private ?

Making it private makes it impossible to inadvertently modify the
pointer in the derived class. This brings a bit of additional safety.

> Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
> 
> >  		}
> >
> > -		pipe_->completeRequest(request);
> > +		pipe()->completeRequest(request);
> >  		pendingRequests_.pop();
> >  	}
> >  }
> > @@ -1184,12 +1183,11 @@ int PipelineHandlerIPU3::registerCameras()
> >  					&IPU3CameraData::statBufferReady);
> >
> >  		/* Create and register the Camera instance. */
> > -		std::string cameraId = cio2->sensor()->id();
> > +		const std::string &cameraId = cio2->sensor()->id();
> >  		std::shared_ptr<Camera> camera =
> > -			Camera::create(new Camera::Private(this), cameraId,
> > -				       streams);
> > +			Camera::create(data.release(), cameraId, streams);
> >
> > -		registerCamera(std::move(camera), std::move(data));
> > +		registerCamera(std::move(camera), nullptr);
> >
> >  		LOG(IPU3, Info)
> >  			<< "Registered Camera[" << numCameras << "] \""
> > @@ -1204,7 +1202,7 @@ int PipelineHandlerIPU3::registerCameras()
> >
> >  int IPU3CameraData::loadIPA()
> >  {
> > -	ipa_ = IPAManager::createIPA<ipa::ipu3::IPAProxyIPU3>(pipe_, 1, 1);
> > +	ipa_ = IPAManager::createIPA<ipa::ipu3::IPAProxyIPU3>(pipe(), 1, 1);
> >  	if (!ipa_)
> >  		return -ENOENT;
> >
> > @@ -1261,7 +1259,7 @@ void IPU3CameraData::queueFrameAction(unsigned int id,
> >
> >  		info->metadataProcessed = true;
> >  		if (frameInfos_.tryComplete(info))
> > -			pipe_->completeRequest(request);
> > +			pipe()->completeRequest(request);
> >
> >  		break;
> >  	}
> > @@ -1289,7 +1287,7 @@ void IPU3CameraData::imguOutputBufferReady(FrameBuffer *buffer)
> >
> >  	Request *request = info->request;
> >
> > -	pipe_->completeBuffer(request, buffer);
> > +	pipe()->completeBuffer(request, buffer);
> >
> >  	request->metadata().set(controls::draft::PipelineDepth, 3);
> >  	/* \todo Move the ExposureTime control to the IPA. */
> > @@ -1300,7 +1298,7 @@ void IPU3CameraData::imguOutputBufferReady(FrameBuffer *buffer)
> >  	request->metadata().set(controls::ScalerCrop, cropRegion_);
> >
> >  	if (frameInfos_.tryComplete(info))
> > -		pipe_->completeRequest(request);
> > +		pipe()->completeRequest(request);
> >  }
> >
> >  /**
> > @@ -1332,16 +1330,16 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer)
> >  		for (auto it : request->buffers()) {
> >  			FrameBuffer *b = it.second;
> >  			b->cancel();
> > -			pipe_->completeBuffer(request, b);
> > +			pipe()->completeBuffer(request, b);
> >  		}
> >
> >  		frameInfos_.remove(info);
> > -		pipe_->completeRequest(request);
> > +		pipe()->completeRequest(request);
> >  		return;
> >  	}
> >
> >  	if (request->findBuffer(&rawStream_))
> > -		pipe_->completeBuffer(request, buffer);
> > +		pipe()->completeBuffer(request, buffer);
> >
> >  	ipa::ipu3::IPU3Event ev;
> >  	ev.op = ipa::ipu3::EventFillParams;
> > @@ -1367,7 +1365,7 @@ void IPU3CameraData::paramBufferReady(FrameBuffer *buffer)
> >  	Request *request = info->request;
> >
> >  	if (frameInfos_.tryComplete(info))
> > -		pipe_->completeRequest(request);
> > +		pipe()->completeRequest(request);
> >  }
> >
> >  void IPU3CameraData::statBufferReady(FrameBuffer *buffer)
> > @@ -1386,7 +1384,7 @@ void IPU3CameraData::statBufferReady(FrameBuffer *buffer)
> >  		 * In that event, we must have obtained the Request before hand.
> >  		 */
> >  		if (frameInfos_.tryComplete(info))
> > -			pipe_->completeRequest(request);
> > +			pipe()->completeRequest(request);
> >
> >  		return;
> >  	}

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list