summaryrefslogtreecommitdiff
path: root/src/libcamera/pipeline_handler.cpp
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo@jmondi.org>2019-01-24 09:39:46 +0100
committerJacopo Mondi <jacopo@jmondi.org>2019-01-25 14:22:08 +0100
commita6c8f58d9641e8c89cf5e80dc2605842da04e913 (patch)
tree84e010c6d06deea5a03316b20388d6c009b00b17 /src/libcamera/pipeline_handler.cpp
parent987bd370b0aa1778271fdac39a04ab35adfffb3a (diff)
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>
Diffstat (limited to 'src/libcamera/pipeline_handler.cpp')
-rw-r--r--src/libcamera/pipeline_handler.cpp71
1 files changed, 70 insertions, 1 deletions
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
*