summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Dyomin <artem.dyomin@qt.io>2023-01-25 14:39:21 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-01-31 17:14:49 +0000
commitc3909341657eaae1cf88a970ee8015320832114b (patch)
tree9cfa24d7d99183770dc3216369b2760379bbb294
parenta016c0fa326790c1b6026e8ba9423cc729fe19e5 (diff)
Fix random crash with windows backend
It's not clear how to reproduce the crash, but we have crash reports. The assumption is the crash is a side effect of used deleteLater for a few objects in the windows backend design. In theory, objects can have enqueued events that are handled between deleteLater() and delete, at this time QAudioSink is already deleted. As a result, I propose using qpointer in order to check if the object exists. Task-number: QTBUG-108693 Change-Id: I0c974b1faa6f0a434e95781f22984b532671daa4 Reviewed-by: Lars Knoll <lars@knoll.priv.no> (cherry picked from commit 365ef2fcc34ae3a269dd019b232e3dc9c9550f60) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/plugins/multimedia/windows/evr/evrcustompresenter_p.h3
-rw-r--r--src/plugins/multimedia/windows/evr/evrd3dpresentengine_p.h3
-rw-r--r--src/plugins/multimedia/windows/player/mfvideorenderercontrol_p.h5
3 files changed, 7 insertions, 4 deletions
diff --git a/src/plugins/multimedia/windows/evr/evrcustompresenter_p.h b/src/plugins/multimedia/windows/evr/evrcustompresenter_p.h
index 590285be5..5d49c1db9 100644
--- a/src/plugins/multimedia/windows/evr/evrcustompresenter_p.h
+++ b/src/plugins/multimedia/windows/evr/evrcustompresenter_p.h
@@ -22,6 +22,7 @@
#include <qrect.h>
#include <qvideoframeformat.h>
#include <qvideosink.h>
+#include <qpointer.h>
#include <d3d9.h>
#include <dxva2api.h>
@@ -347,7 +348,7 @@ private:
IMediaEventSink *m_mediaEventSink; // The EVR's event-sink interface.
IMFMediaType *m_mediaType; // Output media type
- QVideoSink *m_videoSink;
+ QPointer<QVideoSink> m_videoSink;
bool m_canRenderToSurface;
qint64 m_positionOffset; // Seek position in microseconds.
QRect m_cropRect; // Video crop rectangle
diff --git a/src/plugins/multimedia/windows/evr/evrd3dpresentengine_p.h b/src/plugins/multimedia/windows/evr/evrd3dpresentengine_p.h
index c9ad5e9c1..b3be7f560 100644
--- a/src/plugins/multimedia/windows/evr/evrd3dpresentengine_p.h
+++ b/src/plugins/multimedia/windows/evr/evrd3dpresentengine_p.h
@@ -19,6 +19,7 @@
#include <QSize>
#include <QVideoFrameFormat>
#include <private/qwindowsiupointer_p.h>
+#include <qpointer.h>
#include <d3d9.h>
@@ -130,7 +131,7 @@ private:
QVideoFrameFormat m_surfaceFormat;
- class QVideoSink *m_sink = nullptr;
+ QPointer<QVideoSink> m_sink;
bool m_useTextureRendering = false;
#if QT_CONFIG(opengl)
WglNvDxInterop m_wglNvDxInterop;
diff --git a/src/plugins/multimedia/windows/player/mfvideorenderercontrol_p.h b/src/plugins/multimedia/windows/player/mfvideorenderercontrol_p.h
index 588768eee..325219073 100644
--- a/src/plugins/multimedia/windows/player/mfvideorenderercontrol_p.h
+++ b/src/plugins/multimedia/windows/player/mfvideorenderercontrol_p.h
@@ -15,7 +15,8 @@
// We mean it.
//
-#include "qobject.h"
+#include <qobject.h>
+#include <qpointer.h>
#include <qrect.h>
#include <mfapi.h>
#include <mfidl.h>
@@ -52,7 +53,7 @@ private Q_SLOTS:
private:
void clear();
- QVideoSink *m_sink = nullptr;
+ QPointer<QVideoSink> m_sink;
IMFActivate *m_currentActivate = nullptr;
IMFSampleGrabberSinkCallback *m_callback = nullptr;