summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArtem Dyomin <artem.dyomin@qt.io>2023-01-23 15:04:38 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-01-23 17:15:26 +0000
commitf334da2d33a4a3dfeb017e002845a16dce87243f (patch)
tree99b50d2ed14164febb8ce4ba242aa150e9ffe677
parent43c3ca4786c1ca14ec0225003908cde73a6ab638 (diff)
downloadqtmultimedia-f334da2d33a4a3dfeb017e002845a16dce87243f.tar.gz
Fix memory leak and random crash in windows playback backend
The leak is trivial, just not deleted object. The crash is not trivial for reproducing; the fix is based on the assumption that some events can be enqueued for an object between deleteLater and real deleting. Task-number: QTBUG-109149 Change-Id: I256f29a03e7f01d27923b183b63d9a6b6a4f21b9 Reviewed-by: Lars Knoll <lars@knoll.priv.no> (cherry picked from commit de266fd951d56dd937d63e79c6adf1702fbe0ec9) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/plugins/multimedia/windows/player/mfplayersession.cpp11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/plugins/multimedia/windows/player/mfplayersession.cpp b/src/plugins/multimedia/windows/player/mfplayersession.cpp
index 3a8b3eb1a..7e2c6f9ec 100644
--- a/src/plugins/multimedia/windows/player/mfplayersession.cpp
+++ b/src/plugins/multimedia/windows/player/mfplayersession.cpp
@@ -76,7 +76,7 @@ MFPlayerSession::MFPlayerSession(MFPlayerControl *playerControl)
m_request.rate = 1.0f;
m_audioSampleGrabber = new AudioSampleGrabberCallback;
- m_videoRendererControl = new MFVideoRendererControl;
+ m_videoRendererControl = new MFVideoRendererControl(this);
}
void MFPlayerSession::timeout()
@@ -1514,8 +1514,13 @@ ULONG MFPlayerSession::AddRef(void)
ULONG MFPlayerSession::Release(void)
{
LONG cRef = InterlockedDecrement(&m_cRef);
- if (cRef == 0)
- this->deleteLater();
+ if (cRef == 0) {
+ deleteLater();
+
+ // In rare cases the session has queued events to be run between deleteLater and deleting,
+ // so we set the parent control to nullptr in order to prevent crashes in the cases.
+ m_playerControl = nullptr;
+ }
return cRef;
}