summaryrefslogtreecommitdiff
path: root/src/libcamera/camera_manager.cpp
diff options
context:
space:
mode:
authorNiklas Söderlund <niklas.soderlund@ragnatech.se>2019-01-22 16:31:39 +0100
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-01-24 22:24:11 +0200
commit5b02e03199b79165086135236d8fb9b2c673aae1 (patch)
tree84fe12868edf1c9a50d19a96455138975cb751af /src/libcamera/camera_manager.cpp
parenta29b7fc7d5b3cca3738728961cb2f5c9600cc960 (diff)
libcamera: camera: Associate cameras with their pipeline handler
The PipelineHandler which creates a Camera is responsible for serving any operation requested by the user. In order forward the public API calls, the camera needs to store a reference to its pipeline handler. Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> --- Changes since v1: - Create pipeline handlers is shared pointers, make them inherit from std::enable_shared_from_this<> and stored them in shared pointers.
Diffstat (limited to 'src/libcamera/camera_manager.cpp')
-rw-r--r--src/libcamera/camera_manager.cpp17
1 files changed, 9 insertions, 8 deletions
diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
index 14410d4d..3eccf20c 100644
--- a/src/libcamera/camera_manager.cpp
+++ b/src/libcamera/camera_manager.cpp
@@ -98,16 +98,14 @@ int CameraManager::start()
* all pipelines it can provide.
*/
while (1) {
- PipelineHandler *pipe = factory->create(this);
- if (!pipe->match(enumerator_.get())) {
- delete pipe;
+ std::shared_ptr<PipelineHandler> pipe = factory->create(this);
+ if (!pipe->match(enumerator_.get()))
break;
- }
LOG(Camera, Debug)
<< "Pipeline handler \"" << factory->name()
<< "\" matched";
- pipes_.push_back(pipe);
+ pipes_.push_back(std::move(pipe));
}
}
@@ -130,10 +128,13 @@ void CameraManager::stop()
{
/* TODO: unregister hot-plug callback here */
- for (PipelineHandler *pipe : pipes_)
- delete pipe;
-
+ /*
+ * Release all references to cameras and pipeline handlers to ensure
+ * they all get destroyed before the device enumerator deletes the
+ * media devices.
+ */
pipes_.clear();
+ cameras_.clear();
enumerator_.reset(nullptr);
}