diff options
author | Artem Dyomin <artem.dyomin@qt.io> | 2023-01-25 14:39:21 +0100 |
---|---|---|
committer | Artem Dyomin <artem.dyomin@qt.io> | 2023-01-31 13:43:34 +0000 |
commit | 365ef2fcc34ae3a269dd019b232e3dc9c9550f60 (patch) | |
tree | 2da6ada88e93e330ce8ef4078f009f3fe7c9c690 /src/plugins | |
parent | 2fd190a23e1d24a26de1196d96d926df7358beb2 (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
Pick-to: 6.5 6.4
Change-Id: I0c974b1faa6f0a434e95781f22984b532671daa4
Reviewed-by: Lars Knoll <lars@knoll.priv.no>
Diffstat (limited to 'src/plugins')
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 09b7acc2d..3944ba7b6 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> @@ -48,7 +49,7 @@ private Q_SLOTS: private: void clear(); - QVideoSink *m_sink = nullptr; + QPointer<QVideoSink> m_sink; IMFActivate *m_currentActivate = nullptr; IMFSampleGrabberSinkCallback *m_callback = nullptr; |