summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Blechmann <tim@klingt.org>2024-04-24 13:45:25 +0800
committerTim Blechmann <tim@klingt.org>2024-05-06 23:18:45 +0800
commitc599e85c50858d57de92ba4316011ea3872b95a3 (patch)
tree4995ae43b9e2eda1ccb843077f681a9c5303ca93
parent4a0388d86b97af68d5106b63ce3222556ec57d4b (diff)
GStreamer: QGstreamerImageCapture - add mutex
`probeBuffer` and `saveBufferToImage` are called from gstreamer threads. We therefore need to guard all members with a mutex that are accessed from both the owning thread and the gstreamer thread. Pick-to: 6.5 6.7 Change-Id: If9ba7fd761c7756b1eb8cc83f757a80c6a4cac8e Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io> Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
-rw-r--r--src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture.cpp15
-rw-r--r--src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture_p.h3
2 files changed, 16 insertions, 2 deletions
diff --git a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture.cpp b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture.cpp
index 5ef797d6e..2f8a1d776 100644
--- a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture.cpp
+++ b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture.cpp
@@ -81,6 +81,7 @@ QGstreamerImageCapture::~QGstreamerImageCapture()
bool QGstreamerImageCapture::isReadyForCapture() const
{
+ QMutexLocker guard(&m_mutex);
return m_session && !passImage && cameraActive;
}
@@ -107,6 +108,7 @@ int QGstreamerImageCapture::doCapture(const QString &fileName)
QMetaObject::invokeMethod(this, std::forward<decltype(fn)>(fn), Qt::QueuedConnection);
};
+ QMutexLocker guard(&m_mutex);
if (!m_session) {
invokeDeferred([this] {
emit error(-1, QImageCapture::ResourceError,
@@ -161,6 +163,8 @@ void QGstreamerImageCapture::setResolution(const QSize &resolution)
bool QGstreamerImageCapture::probeBuffer(GstBuffer *buffer)
{
+ QMutexLocker guard(&m_mutex);
+
if (!passImage)
return false;
qCDebug(qLcImageCaptureGst) << "probe buffer";
@@ -214,6 +218,7 @@ bool QGstreamerImageCapture::probeBuffer(GstBuffer *buffer)
void QGstreamerImageCapture::setCaptureSession(QPlatformMediaCaptureSession *session)
{
+ QMutexLocker guard(&m_mutex);
QGstreamerMediaCapture *captureSession = static_cast<QGstreamerMediaCapture *>(session);
if (m_session == captureSession)
return;
@@ -241,7 +246,10 @@ void QGstreamerImageCapture::setCaptureSession(QPlatformMediaCaptureSession *ses
void QGstreamerImageCapture::setMetaData(const QMediaMetaData &m)
{
- QPlatformImageCapture::setMetaData(m);
+ {
+ QMutexLocker guard(&m_mutex);
+ QPlatformImageCapture::setMetaData(m);
+ }
// ensure taginject injects this metaData
applyMetaDataToTagSetter(m, muxer);
@@ -259,9 +267,11 @@ void QGstreamerImageCapture::cameraActiveChanged(bool active)
void QGstreamerImageCapture::onCameraChanged()
{
+ QMutexLocker guard(&m_mutex);
if (m_session->camera()) {
cameraActiveChanged(m_session->camera()->isActive());
- connect(m_session->camera(), &QPlatformCamera::activeChanged, this, &QGstreamerImageCapture::cameraActiveChanged);
+ connect(m_session->camera(), &QPlatformCamera::activeChanged, this,
+ &QGstreamerImageCapture::cameraActiveChanged);
} else {
cameraActiveChanged(false);
}
@@ -276,6 +286,7 @@ gboolean QGstreamerImageCapture::saveImageFilter(GstElement *, GstBuffer *buffer
void QGstreamerImageCapture::saveBufferToImage(GstBuffer *buffer)
{
+ QMutexLocker guard(&m_mutex);
passImage = false;
if (pendingImages.isEmpty())
diff --git a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture_p.h b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture_p.h
index 7be44a239..4b2220d12 100644
--- a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture_p.h
+++ b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture_p.h
@@ -18,6 +18,7 @@
#include <QtMultimedia/private/qplatformimagecapture_p.h>
#include <QtMultimedia/private/qmultimediautils_p.h>
+#include <QtCore/qmutex.h>
#include <QtCore/qqueue.h>
#include <common/qgst_p.h>
@@ -65,6 +66,8 @@ private:
void saveBufferToImage(GstBuffer *buffer);
+ mutable QRecursiveMutex
+ m_mutex; // guard all elements accessed from probeBuffer/saveBufferToImage
QGstreamerMediaCapture *m_session = nullptr;
int m_lastId = 0;
QImageEncoderSettings m_settings;