WMF: release video controls before releasing the session
authorYoann Lopes <yoann.lopes@digia.com>
Tue, 18 Dec 2012 21:16:13 +0000 (22:16 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Mon, 7 Jan 2013 08:34:43 +0000 (09:34 +0100)
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>
src/plugins/wmf/player/evr9videowindowcontrol.cpp
src/plugins/wmf/player/evr9videowindowcontrol.h
src/plugins/wmf/player/mfplayersession.cpp
src/plugins/wmf/player/mfvideorenderercontrol.cpp
src/plugins/wmf/player/mfvideorenderercontrol.h

index 7f1c713..b15eef1 100644 (file)
@@ -85,6 +85,11 @@ void Evr9VideoWindowControl::clear()
     m_currentActivate = NULL;
 }
 
+void Evr9VideoWindowControl::releaseActivate()
+{
+    clear();
+}
+
 WId Evr9VideoWindowControl::winId() const
 {
     return m_windowId;
index ea4bae5..01a9c42 100644 (file)
@@ -86,6 +86,7 @@ public:
     void setSaturation(int saturation);
 
     IMFActivate* createActivate();
+    void releaseActivate();
 
     void setProcAmpValues();
 
index c4a5612..7c73202 100644 (file)
@@ -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();
index c9b364f..28fcb5b 100644 (file)
@@ -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;
 }
index ba04e73..0829e73 100644 (file)
@@ -59,6 +59,7 @@ public:
     void setSurface(QAbstractVideoSurface *surface);
 
     IMFActivate* createActivate();
+    void releaseActivate();
 
 protected:
     void customEvent(QEvent *event);