diff options
author | Yoann Lopes <yoann.lopes@digia.com> | 2012-12-18 22:16:13 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-01-07 09:34:43 +0100 |
commit | 60eb27dfef8de1a737e4dca99d13cef8a9876af6 (patch) | |
tree | ba09d2f153f587e6ff6374925b2a40fc717e39e8 | |
parent | 6eb192f047123079bcdfb45ca6da8f01cb97b90c (diff) |
WMF: release video controls before releasing the session
For the VideoRendererControl, also stop the video surface at the same
time.
This fixes a crash when changing video.
Change-Id: I49484f8b277c345dafb3e5947cf5d23df15546f3
Reviewed-by: Jason Barron <jason@cutehacks.com>
-rw-r--r-- | src/plugins/wmf/player/evr9videowindowcontrol.cpp | 5 | ||||
-rw-r--r-- | src/plugins/wmf/player/evr9videowindowcontrol.h | 1 | ||||
-rw-r--r-- | src/plugins/wmf/player/mfplayersession.cpp | 7 | ||||
-rw-r--r-- | src/plugins/wmf/player/mfvideorenderercontrol.cpp | 13 | ||||
-rw-r--r-- | src/plugins/wmf/player/mfvideorenderercontrol.h | 1 |
5 files changed, 24 insertions, 3 deletions
diff --git a/src/plugins/wmf/player/evr9videowindowcontrol.cpp b/src/plugins/wmf/player/evr9videowindowcontrol.cpp index 7f1c71332..b15eef15e 100644 --- a/src/plugins/wmf/player/evr9videowindowcontrol.cpp +++ b/src/plugins/wmf/player/evr9videowindowcontrol.cpp @@ -85,6 +85,11 @@ void Evr9VideoWindowControl::clear() m_currentActivate = NULL; } +void Evr9VideoWindowControl::releaseActivate() +{ + clear(); +} + WId Evr9VideoWindowControl::winId() const { return m_windowId; diff --git a/src/plugins/wmf/player/evr9videowindowcontrol.h b/src/plugins/wmf/player/evr9videowindowcontrol.h index ea4bae56d..01a9c42fa 100644 --- a/src/plugins/wmf/player/evr9videowindowcontrol.h +++ b/src/plugins/wmf/player/evr9videowindowcontrol.h @@ -86,6 +86,7 @@ public: void setSaturation(int saturation); IMFActivate* createActivate(); + void releaseActivate(); void setProcAmpValues(); diff --git a/src/plugins/wmf/player/mfplayersession.cpp b/src/plugins/wmf/player/mfplayersession.cpp index c4a561232..7c7320228 100644 --- a/src/plugins/wmf/player/mfplayersession.cpp +++ b/src/plugins/wmf/player/mfplayersession.cpp @@ -476,6 +476,13 @@ void MFPlayerSession::close() m_videoProbeMFT = 0; } + if (m_playerService->videoRendererControl()) { + m_playerService->videoRendererControl()->releaseActivate(); +#ifndef Q_WS_SIMULATOR + } else if (m_playerService->videoWindowControl()) { + m_playerService->videoWindowControl()->releaseActivate(); +#endif + } if (m_session) m_session->Release(); diff --git a/src/plugins/wmf/player/mfvideorenderercontrol.cpp b/src/plugins/wmf/player/mfvideorenderercontrol.cpp index c9b364f65..28fcb5b19 100644 --- a/src/plugins/wmf/player/mfvideorenderercontrol.cpp +++ b/src/plugins/wmf/player/mfvideorenderercontrol.cpp @@ -1781,6 +1781,7 @@ namespace , m_sink(0) , m_rendererControl(rendererControl) , m_attributes(0) + , m_surface(0) { MFCreateAttributes(&m_attributes, 0); m_sink = new MediaSink(rendererControl); @@ -2143,6 +2144,9 @@ MFVideoRendererControl::~MFVideoRendererControl() void MFVideoRendererControl::clear() { + if (m_surface) + m_surface->stop(); + if (m_currentActivate) { m_currentActivate->ShutdownObject(); m_currentActivate->Release(); @@ -2150,6 +2154,11 @@ void MFVideoRendererControl::clear() m_currentActivate = NULL; } +void MFVideoRendererControl::releaseActivate() +{ + clear(); +} + QAbstractVideoSurface *MFVideoRendererControl::surface() const { return m_surface; @@ -2209,10 +2218,8 @@ IMFActivate* MFVideoRendererControl::createActivate() clear(); m_currentActivate = new VideoRendererActivate(this); - if (m_surface) { + if (m_surface) setSurface(m_surface); - supportedFormatsChanged(); - } return m_currentActivate; } diff --git a/src/plugins/wmf/player/mfvideorenderercontrol.h b/src/plugins/wmf/player/mfvideorenderercontrol.h index ba04e73b7..0829e732d 100644 --- a/src/plugins/wmf/player/mfvideorenderercontrol.h +++ b/src/plugins/wmf/player/mfvideorenderercontrol.h @@ -59,6 +59,7 @@ public: void setSurface(QAbstractVideoSurface *surface); IMFActivate* createActivate(); + void releaseActivate(); protected: void customEvent(QEvent *event); |