diff options
author | Tim Blechmann <tim@klingt.org> | 2024-05-02 17:05:08 +0800 |
---|---|---|
committer | Tim Blechmann <tim@klingt.org> | 2024-05-03 12:19:30 +0800 |
commit | 2e61fc8abc225153a968fe630cd33e40118eb6a0 (patch) | |
tree | 6b7a58f6ad7b4b88b43392b89f3e9dad4cf5039d | |
parent | f7c6a582ac9714de7e460fecde9869d473e98dee (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.cpp | 12 |
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") |