[libcamera-devel] gstreamer: libcamerasrc: Delete configuration before stopping camera manager
diff mbox series

Message ID 20201104082719.25190-1-laurent.pinchart@ideasonboard.com
State Accepted
Commit fa63d428aef62bacf0a6ad1622a7965b3ff2ba2f
Headers show
Series
  • [libcamera-devel] gstreamer: libcamerasrc: Delete configuration before stopping camera manager
Related show

Commit Message

Laurent Pinchart Nov. 4, 2020, 8:27 a.m. UTC
When closing the libcamerasrc, the reference to camera is released and
the camera manager is stopped. However, the camera configuration still
exists at that point, and holds a reference to the camera. This leads to
a warning from the device enumerator complaining that the media devices
are still in use:

[1:53:48.792327560] [408] ERROR DeviceEnumerator device_enumerator.cpp:165 Removing media device /dev/media1 while still in use
[1:53:48.792354022] [408] ERROR DeviceEnumerator device_enumerator.cpp:165 Removing media device /dev/media0 while still in use

A crash follows when the libcamerasrc is finalized, as deleting the
camera configuration will then release the last reference to the camera,
which attempts to delete the camera object with deleteLater() without an
event dispatcher.

Fix it by deleting the camera configuration before stopping the camera
manager.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 src/gstreamer/gstlibcamerasrc.cpp | 2 ++
 1 file changed, 2 insertions(+)

Comments

Nicolas Dufresne Nov. 4, 2020, 2:28 p.m. UTC | #1
Le mercredi 04 novembre 2020 à 10:27 +0200, Laurent Pinchart a écrit :
> When closing the libcamerasrc, the reference to camera is released and
> the camera manager is stopped. However, the camera configuration still
> exists at that point, and holds a reference to the camera. This leads to
> a warning from the device enumerator complaining that the media devices
> are still in use:
> 
> [1:53:48.792327560] [408] ERROR DeviceEnumerator device_enumerator.cpp:165 Removing media device /dev/media1 while still in use
> [1:53:48.792354022] [408] ERROR DeviceEnumerator device_enumerator.cpp:165 Removing media device /dev/media0 while still in use
> 
> A crash follows when the libcamerasrc is finalized, as deleting the
> camera configuration will then release the last reference to the camera,
> which attempts to delete the camera object with deleteLater() without an
> event dispatcher.
> 
> Fix it by deleting the camera configuration before stopping the camera
> manager.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>

> ---
>  src/gstreamer/gstlibcamerasrc.cpp | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp
> index a099508c122a..636c14dff64e 100644
> --- a/src/gstreamer/gstlibcamerasrc.cpp
> +++ b/src/gstreamer/gstlibcamerasrc.cpp
> @@ -499,6 +499,8 @@ gst_libcamera_src_close(GstLibcameraSrc *self)
>  
> 
> 
> 
>  	GST_DEBUG_OBJECT(self, "Releasing resources");
>  
> 
> 
> 
> +	state->config_.reset();
> +
>  	ret = state->cam_->release();
>  	if (ret) {
>  		GST_ELEMENT_WARNING(self, RESOURCE, BUSY,

Patch
diff mbox series

diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp
index a099508c122a..636c14dff64e 100644
--- a/src/gstreamer/gstlibcamerasrc.cpp
+++ b/src/gstreamer/gstlibcamerasrc.cpp
@@ -499,6 +499,8 @@  gst_libcamera_src_close(GstLibcameraSrc *self)
 
 	GST_DEBUG_OBJECT(self, "Releasing resources");
 
+	state->config_.reset();
+
 	ret = state->cam_->release();
 	if (ret) {
 		GST_ELEMENT_WARNING(self, RESOURCE, BUSY,