[v1,1/3] gstreamer: allocator: Ensure camera manager stay alive
diff mbox series

Message ID 20240227175336.560009-2-nicolas@ndufresne.ca
State Superseded
Headers show
Series
  • gstreamer: Fix a crash when memory outlives the pipeline
Related show

Commit Message

Nicolas Dufresne Feb. 27, 2024, 5:53 p.m. UTC
From: Nicolas Dufresne <nicolas.dufresne@collabora.com>

With the camera manager, it is not possible to cleanly delete the
FrameBufferAllocator object. Keep the camera manager alive until all the
memory object have been released.

Fixes: Bugzilla issue 211
Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
---
 src/gstreamer/gstlibcameraallocator.cpp | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

Patch
diff mbox series

diff --git a/src/gstreamer/gstlibcameraallocator.cpp b/src/gstreamer/gstlibcameraallocator.cpp
index c740b8fc..844bdb17 100644
--- a/src/gstreamer/gstlibcameraallocator.cpp
+++ b/src/gstreamer/gstlibcameraallocator.cpp
@@ -100,6 +100,11 @@  struct _GstLibcameraAllocator {
 	 * FrameWrap.
 	 */
 	GHashTable *pools;
+	/*
+	 * The camera manager represent that library, which needs to be kept alive
+	 * until all the memory have been released.
+	 */
+	std::shared_ptr<CameraManager> *cm_ptr;
 };
 
 G_DEFINE_TYPE(GstLibcameraAllocator, gst_libcamera_allocator,
@@ -173,6 +178,9 @@  gst_libcamera_allocator_finalize(GObject *object)
 
 	delete self->fb_allocator;
 
+	/* keep last */
+	delete self->cm_ptr;
+
 	G_OBJECT_CLASS(gst_libcamera_allocator_parent_class)->finalize(object);
 }
 
@@ -193,11 +201,17 @@  gst_libcamera_allocator_new(std::shared_ptr<Camera> camera,
 {
 	auto *self = GST_LIBCAMERA_ALLOCATOR(g_object_new(GST_TYPE_LIBCAMERA_ALLOCATOR,
 							  nullptr));
+	gint ret;
+
+	self->cm_ptr = new std::shared_ptr<CameraManager>(gst_libcamera_get_camera_manager(ret));
+	if (ret) {
+		g_object_unref(self);
+		return nullptr;
+	}
 
 	self->fb_allocator = new FrameBufferAllocator(camera);
 	for (StreamConfiguration &streamCfg : *config_) {
 		Stream *stream = streamCfg.stream();
-		gint ret;
 
 		ret = self->fb_allocator->allocate(stream);
 		if (ret == 0)