[libcamera-devel] [PATCH 1/2] libcamera: pipeline_handler: Add CameraData

Niklas Söderlund niklas.soderlund at ragnatech.se
Thu Jan 24 19:54:49 CET 2019


Hi Jacopo,

Nice work!

On 2019-01-24 12:30:19 +0100, Jacopo Mondi wrote:
> Add class definition and methods to associate a Camera with specific data
>  in the pipeline_handler base class.
> 
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>

Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>

> ---
>  src/libcamera/include/pipeline_handler.h | 24 +++++++-
>  src/libcamera/pipeline_handler.cpp       | 73 ++++++++++++++++++++++++
>  2 files changed, 96 insertions(+), 1 deletion(-)
> 
> diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h
> index b03217d..41699a5 100644
> --- a/src/libcamera/include/pipeline_handler.h
> +++ b/src/libcamera/include/pipeline_handler.h
> @@ -11,17 +11,39 @@
>  #include <string>
>  #include <vector>
>  
> +#include <libcamera/camera.h>
> +
>  namespace libcamera {
>  
>  class CameraManager;
>  class DeviceEnumerator;
>  
> +class CameraData
> +{
> +public:
> +	virtual ~CameraData() {}
> +
> +protected:
> +	CameraData() {}
> +
> +private:
> +	CameraData(const CameraData &) = delete;
> +	void operator=(const CameraData &) = delete;
> +};
> +
>  class PipelineHandler
>  {
>  public:
> -	virtual ~PipelineHandler() { };
> +	virtual ~PipelineHandler();
>  
>  	virtual bool match(CameraManager *manager, DeviceEnumerator *enumerator) = 0;
> +
> +protected:
> +	CameraData *cameraData(const Camera *camera);
> +	void setCameraData(const Camera *camera, std::unique_ptr<CameraData> data);
> +
> +private:
> +	std::map<const Camera *, std::unique_ptr<CameraData>> cameraData_;
>  };
>  
>  class PipelineHandlerFactory
> diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
> index c24feea..fb49fde 100644
> --- a/src/libcamera/pipeline_handler.cpp
> +++ b/src/libcamera/pipeline_handler.cpp
> @@ -8,6 +8,8 @@
>  #include "log.h"
>  #include "pipeline_handler.h"
>  
> +#include <libcamera/camera.h>
> +
>  /**
>   * \file pipeline_handler.h
>   * \brief Create pipelines and cameras from a set of media devices
> @@ -26,6 +28,20 @@ namespace libcamera {
>  
>  LOG_DEFINE_CATEGORY(Pipeline)
>  
> +/**
> + * \class CameraData
> + * \brief Base class for platform-specific data associated with a camera
> + *
> + * The CameraData base abstract class represents platform specific-data
> + * a pipeline handler might want to associate with a Camera to access them
> + * at a later time.
> + *
> + * Pipeline handlers are expected to extend this base class with platform
> + * specific implementation, associate instances of the derived classes
> + * using the setCameraData() method, and access them at a later time
> + * with cameraData().
> + */
> +
>  /**
>   * \class PipelineHandler
>   * \brief Create and manage cameras based on a set of media devices
> @@ -66,6 +82,63 @@ LOG_DEFINE_CATEGORY(Pipeline)
>   * created, or false otherwise
>   */
>  
> +/**
> + * \brief Delete the pipeline handler
> + *
> + * Release the cameraData_ map, causing all data there referenced to be
> + * deleted, as they are stored as unique_ptr<CameraData>
> + */
> +PipelineHandler::~PipelineHandler()
> +{
> +	cameraData_.clear();
> +};
> +
> +/**
> + * \brief Retrieve the pipeline-specific data associated with a Camera
> + * \param camera The camera data is associate with
> + *
> + * \return A pointer to the pipeline-specific data set with setCameraData().
> + * The returned pointer lifetime is associated with the one of the pipeline
> + * handler, and caller of this function shall never release it manually.
> + */
> +CameraData *PipelineHandler::cameraData(const Camera *camera)
> +{
> +	if (!cameraData_.count(camera)) {
> +		LOG(Pipeline, Error)
> +			<< "Cannot get data associated with camera "
> +			<< camera->name();
> +		return nullptr;
> +	}
> +
> +	return cameraData_[camera].get();
> +}
> +
> +/**
> + * \brief Set pipeline-specific data in the camera
> + * \param camera The camera to associate data to
> + * \param data The pipeline-specific data
> + *
> + * This method allows pipeline handlers to associate pipeline-specific
> + * information with \a camera. The \a data lifetime gets associated with
> + * the pipeline handler one, and gets released at deletion time.
> + *
> + * If pipeline-specific data has already been associated with the camera by a
> + * previous call to this method, is it replaced by \a data and the previous data
> + * are deleted, rendering all references to them invalid.
> + *
> + * The data can be retrieved by pipeline handlers using the cameraData() method.
> + */
> +void PipelineHandler::setCameraData(const Camera *camera,
> +				    std::unique_ptr<CameraData> data)
> +{
> +	if (cameraData_.count(camera))
> +		LOG(Pipeline, Debug)
> +			<< "Replacing data associated with "
> +			<< camera->name();
> +
> +	cameraData_[camera] = std::move(data);
> +}
> +
>  /**
>   * \class PipelineHandlerFactory
>   * \brief Registration of PipelineHandler classes and creation of instances
> -- 
> 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