libcamera: pipeline_handler: Add CameraData

Add class definition and methods to associate a Camera with specific data
in the pipeline_handler base class.

Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
Jacopo Mondi 2019-01-24 09:39:46 +01:00
parent 987bd370b0
commit a6c8f58d96
2 changed files with 88 additions and 1 deletions

View file

@ -18,6 +18,20 @@ class CameraManager;
class DeviceEnumerator;
class MediaDevice;
class Camera;
class CameraData
{
public:
virtual ~CameraData() {}
protected:
CameraData() {}
private:
CameraData(const CameraData &) = delete;
void operator=(const CameraData &) = delete;
};
class PipelineHandler : public std::enable_shared_from_this<PipelineHandler>
{
public:
@ -32,11 +46,15 @@ protected:
void registerCamera(std::shared_ptr<Camera> camera);
void hotplugMediaDevice(MediaDevice *media);
CameraData *cameraData(const Camera *camera);
void setCameraData(const Camera *camera, std::unique_ptr<CameraData> data);
private:
virtual void disconnect();
void mediaDeviceDisconnected(MediaDevice *media);
std::vector<std::weak_ptr<Camera>> cameras_;
std::map<const Camera *, std::unique_ptr<CameraData>> cameraData_;
};
class PipelineHandlerFactory

View file

@ -12,6 +12,8 @@
#include "media_device.h"
#include "pipeline_handler.h"
#include <libcamera/camera.h>
/**
* \file pipeline_handler.h
* \brief Create pipelines and cameras from a set of media devices
@ -30,6 +32,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
@ -57,9 +73,16 @@ PipelineHandler::PipelineHandler(CameraManager *manager)
{
}
/**
* \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();
};
/**
* \fn PipelineHandler::match(DeviceEnumerator *enumerator)
@ -168,6 +191,52 @@ void PipelineHandler::mediaDeviceDisconnected(MediaDevice *media)
disconnect();
}
/**
* \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