summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Dyomin <artem.dyomin@qt.io>2023-01-23 15:04:38 +0100
committerArtem Dyomin <artem.dyomin@qt.io>2023-01-24 14:12:26 +0100
commit54830b12f0b2ccba5054564f60340271d3110f77 (patch)
treefe653bc43bc9165043622d6be88e0e4391190581
parent92b16eea294e77731d326b768e4ebe3ae1fac157 (diff)
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 CI Bot <qt_ci_bot@qt-project.org>
-rw-r--r--src/multimedia/platform/windows/player/mfplayersession.cpp9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/multimedia/platform/windows/player/mfplayersession.cpp b/src/multimedia/platform/windows/player/mfplayersession.cpp
index 4a42ad5fb..758596812 100644
--- a/src/multimedia/platform/windows/player/mfplayersession.cpp
+++ b/src/multimedia/platform/windows/player/mfplayersession.cpp
@@ -111,7 +111,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()
@@ -1593,8 +1593,13 @@ ULONG MFPlayerSession::AddRef(void)
ULONG MFPlayerSession::Release(void)
{
LONG cRef = InterlockedDecrement(&m_cRef);
- if (cRef == 0)
+ if (cRef == 0) {
this->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;
}