[libcamera-devel] [PATCH 1/3] libcamera: camera: create a association with the responsible pipeline handler
Jacopo Mondi
jacopo at jmondi.org
Wed Jan 23 09:56:35 CET 2019
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 :)
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.
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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20190123/d6044842/attachment.sig>
More information about the libcamera-devel
mailing list