[libcamera-devel] [PATCH 1/3] libcamera: camera: create a association with the responsible pipeline handler

Niklas Söderlund niklas.soderlund at ragnatech.se
Wed Jan 23 10:10:44 CET 2019


Hi Jacopo,

Thanks for your feedback.

On 2019-01-23 09:56:35 +0100, Jacopo Mondi wrote:
> Hi Niklas,
>    thanks for this, very welcome
> 
> On Wed, Jan 23, 2019 at 12:29:53AM +0100, Niklas Söderlund wrote:
> > The PipelineHandler which creates a Camera is responsible for serving
> > any operation requested by the user. In order to do so the Camera needs
> > to store a reference to its creator.
> >
> > Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> > ---
> >  include/libcamera/camera.h           |  8 ++++++--
> >  src/libcamera/camera.cpp             | 15 +++++++++------
> >  src/libcamera/pipeline/ipu3/ipu3.cpp |  3 ++-
> >  src/libcamera/pipeline/uvcvideo.cpp  |  2 +-
> >  src/libcamera/pipeline/vimc.cpp      | 10 ++--------
> >  5 files changed, 20 insertions(+), 18 deletions(-)
> >
> > diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
> > index 2ea1a6883311cf9f..d3bae4cbee1e0cea 100644
> > --- a/include/libcamera/camera.h
> > +++ b/include/libcamera/camera.h
> > @@ -12,10 +12,13 @@
> >
> >  namespace libcamera {
> >
> > +class PipelineHandler;
> > +
> >  class Camera final
> >  {
> >  public:
> > -	static std::shared_ptr<Camera> create(const std::string &name);
> > +	static std::shared_ptr<Camera> create(const std::string &name,
> > +					      class PipelineHandler *pipe);
> >
> >  	Camera(const Camera &) = delete;
> >  	void operator=(const Camera &) = delete;
> > @@ -23,10 +26,11 @@ public:
> >  	const std::string &name() const;
> >
> >  private:
> > -	explicit Camera(const std::string &name);
> > +	explicit Camera(const std::string &name, class PipelineHandler *pipe);
> 
> You can drop the 'explicit' here, as it avoid copy-construction and
> conversion-contruction, which can't happen with 2 parameters (if I got
> this right :)

Thanks, did not know that will fix.

> 
> I'm fine with rest, with the minor thing that I feel more natural to
> have 'this' passed as first parameter of the Camera constructor.

I agree, I will swap the arguments around!

> 
> Thanks
>   j
> 
> >  	~Camera();
> >
> >  	std::string name_;
> > +	class PipelineHandler *pipe_;
> >  };
> >
> >  } /* namespace libcamera */
> > diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
> > index acf912bee95cbec4..f198eb4978b12239 100644
> > --- a/src/libcamera/camera.cpp
> > +++ b/src/libcamera/camera.cpp
> > @@ -52,17 +52,20 @@ namespace libcamera {
> >  /**
> >   * \brief Create a camera instance
> >   * \param[in] name The name of the camera device
> > + * \param[in] pipe The pipeline handler responsible for the camera device
> >   *
> >   * The caller is responsible for guaranteeing unicity of the camera name.
> >   *
> >   * \return A shared pointer to the newly created camera object
> >   */
> > -std::shared_ptr<Camera> Camera::create(const std::string &name)
> > +std::shared_ptr<Camera> Camera::create(const std::string &name,
> > +				       class PipelineHandler *pipe)
> >  {
> >  	struct Allocator : std::allocator<Camera> {
> > -		void construct(void *p, const std::string &name)
> > +		void construct(void *p, const std::string &name,
> > +			       class PipelineHandler *pipe)
> >  		{
> > -			::new(p) Camera(name);
> > +			::new(p) Camera(name, pipe);
> >  		}
> >  		void destroy(Camera *p)
> >  		{
> > @@ -70,7 +73,7 @@ std::shared_ptr<Camera> Camera::create(const std::string &name)
> >  		}
> >  	};
> >
> > -	return std::allocate_shared<Camera>(Allocator(), name);
> > +	return std::allocate_shared<Camera>(Allocator(), name, pipe);
> >  }
> >
> >  /**
> > @@ -83,8 +86,8 @@ const std::string &Camera::name() const
> >  	return name_;
> >  }
> >
> > -Camera::Camera(const std::string &name)
> > -	: name_(name)
> > +Camera::Camera(const std::string &name, class PipelineHandler *pipe)
> > +	: name_(name), pipe_(pipe)
> >  {
> >  }
> >
> > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> > index 8cbc10acfbb571fd..48d028f7e6cd9b4d 100644
> > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> > @@ -171,7 +171,8 @@ void PipelineHandlerIPU3::registerCameras(CameraManager *manager)
> >  			continue;
> >
> >  		std::string cameraName = sensor->name() + " " + std::to_string(id);
> > -		std::shared_ptr<Camera> camera = Camera::create(cameraName);
> > +		std::shared_ptr<Camera> camera = Camera::create(cameraName,
> > +								this);
> >  		manager->addCamera(std::move(camera));
> >
> >  		LOG(IPU3, Info)
> > diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp
> > index 3ba69da8b77586e3..3651250b683e7810 100644
> > --- a/src/libcamera/pipeline/uvcvideo.cpp
> > +++ b/src/libcamera/pipeline/uvcvideo.cpp
> > @@ -48,7 +48,7 @@ bool PipelineHandlerUVC::match(CameraManager *manager, DeviceEnumerator *enumera
> >
> >  	dev_->acquire();
> >
> > -	std::shared_ptr<Camera> camera = Camera::create(dev_->model());
> > +	std::shared_ptr<Camera> camera = Camera::create(dev_->model(), this);
> >  	manager->addCamera(std::move(camera));
> >
> >  	return true;
> > diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp
> > index 82b9237a3d7d93e5..81d8319eb88e06d2 100644
> > --- a/src/libcamera/pipeline/vimc.cpp
> > +++ b/src/libcamera/pipeline/vimc.cpp
> > @@ -57,14 +57,8 @@ bool PipeHandlerVimc::match(CameraManager *manager, DeviceEnumerator *enumerator
> >
> >  	dev_->acquire();
> >
> > -	/*
> > -	 * NOTE: A more complete Camera implementation could
> > -	 * be passed the MediaDevice(s) it controls here or
> > -	 * a reference to the PipelineHandler. Which method
> > -	 * will be chosen depends on how the Camera
> > -	 * object is modeled.
> > -	 */
> > -	std::shared_ptr<Camera> camera = Camera::create("Dummy VIMC Camera");
> > +	std::shared_ptr<Camera> camera = Camera::create("Dummy VIMC Camera",
> > +							this);
> >  	manager->addCamera(std::move(camera));
> >
> >  	return true;
> > --
> > 2.20.1
> >
> > _______________________________________________
> > libcamera-devel mailing list
> > libcamera-devel at lists.libcamera.org
> > https://lists.libcamera.org/listinfo/libcamera-devel



-- 
Regards,
Niklas Söderlund


More information about the libcamera-devel mailing list