summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Blechmann <tim@klingt.org>2024-05-02 17:05:08 +0800
committerTim Blechmann <tim@klingt.org>2024-05-03 12:19:30 +0800
commit2e61fc8abc225153a968fe630cd33e40118eb6a0 (patch)
tree6b7a58f6ad7b4b88b43392b89f3e9dad4cf5039d
parentf7c6a582ac9714de7e460fecde9869d473e98dee (diff)
GStreamer: QGstreamerCamera - fix crash when unplugging camera
When unplugging a camera we can get into a situation where there is no `GstDevice` for the camera we want to open. Adding a nullptr check and emitting an error when running into this situation. Pick-to: 6.5 6.7 Change-Id: Ib38c1ef4642541456ce3d395559a3e5e2ddda24f Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
-rw-r--r--src/plugins/multimedia/gstreamer/mediacapture/qgstreamercamera.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamercamera.cpp b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamercamera.cpp
index 8d3cd6baf..887f74b12 100644
--- a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamercamera.cpp
+++ b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamercamera.cpp
@@ -80,6 +80,8 @@ void QGstreamerCamera::setActive(bool active)
void QGstreamerCamera::setCamera(const QCameraDevice &camera)
{
+ using namespace Qt::Literals;
+
if (m_cameraDevice == camera)
return;
@@ -90,7 +92,15 @@ void QGstreamerCamera::setCamera(const QCameraDevice &camera)
gstNewCamera = QGstElement::createFromFactory("videotestsrc");
} else {
auto *integration = static_cast<QGstreamerIntegration *>(QGstreamerIntegration::instance());
- auto *device = integration->videoDevice(camera.id());
+ GstDevice *device = integration->videoDevice(camera.id());
+
+ if (!device) {
+ emit error(QCamera::Error::CameraError,
+ u"Failed to create GstDevice for camera: "_s
+ + QString::fromUtf8(camera.id()));
+ return;
+ }
+
gstNewCamera = QGstElement::createFromDevice(device, "camerasrc");
if (QGstStructure properties = gst_device_get_properties(device); !properties.isNull()) {
if (properties.name() == "v4l2deviceprovider")