diff options
author | Artem Dyomin <artem.dyomin@qt.io> | 2023-01-23 15:04:38 +0100 |
---|---|---|
committer | Artem Dyomin <artem.dyomin@qt.io> | 2023-01-24 14:12:26 +0100 |
commit | 54830b12f0b2ccba5054564f60340271d3110f77 (patch) | |
tree | fe653bc43bc9165043622d6be88e0e4391190581 | |
parent | 92b16eea294e77731d326b768e4ebe3ae1fac157 (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.cpp | 9 |
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; } |