summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libcamera/include/pipeline_handler.h18
-rw-r--r--src/libcamera/pipeline_handler.cpp71
2 files changed, 88 insertions, 1 deletions
diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h
index 804cce48..0db84217 100644
--- a/src/libcamera/include/pipeline_handler.h
+++ b/src/libcamera/include/pipeline_handler.h
@@ -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
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
index 23631314..4d534498 100644
--- a/src/libcamera/pipeline_handler.cpp
+++ b/src/libcamera/pipeline_handler.cpp
@@ -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
@@ -31,6 +33,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)
@@ -169,6 +192,52 @@ void PipelineHandler::mediaDeviceDisconnected(MediaDevice *media)
}
/**
+ * \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
*