WMF: fix memory leaks.
authorNodir Temirkhodjaev <nodir.temir@gmail.com>
Fri, 5 Sep 2014 11:29:41 +0000 (16:29 +0500)
committerNodir Temirkhodjaev <nodir.temir@gmail.com>
Thu, 11 Sep 2014 08:17:40 +0000 (10:17 +0200)
Release requested interfaces.

Task-number: QTBUG-32481
Change-Id: I846981f6a7a7ea77588b9322fc41e05e583bdb15
Reviewed-by: Wouter Huysentruit <wouter_huysentruit@hotmail.com>
Reviewed-by: Alex Blasche <alexander.blasche@digia.com>
Reviewed-by: Jeff Tranter <jtranter@ics.com>
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@digia.com>
src/plugins/wmf/decoder/mfaudiodecodercontrol.cpp
src/plugins/wmf/player/mfplayersession.cpp

index 22eb1a0..d9122e5 100644 (file)
@@ -244,7 +244,6 @@ void MFAudioDecoderControl::handleMediaSourceReady()
     }
 
     if (m_sourceResolver->mediaSource()) {
-        IMFPresentationDescriptor *pd = 0;
         if (mediaType && m_resampler) {
             HRESULT hr = S_OK;
             hr = m_resampler->SetInputType(m_mfInputStreamID, mediaType, 0);
@@ -254,9 +253,11 @@ void MFAudioDecoderControl::handleMediaSourceReady()
                 qWarning() << "MFAudioDecoderControl: failed to SetInputType of resampler" << hr;
             }
         }
+        IMFPresentationDescriptor *pd;
         if (SUCCEEDED(m_sourceResolver->mediaSource()->CreatePresentationDescriptor(&pd))) {
             UINT64 duration = 0;
             pd->GetUINT64(MF_PD_DURATION, &duration);
+            pd->Release();
             duration /= 10000;
             if (m_duration != qint64(duration)) {
                 m_duration = qint64(duration);
index 09c5a8c..4b83e72 100644 (file)
@@ -266,6 +266,7 @@ void MFPlayerSession::handleMediaSourceReady()
         //convert from 100 nanosecond to milisecond
         emit durationUpdate(qint64(m_duration / 10000));
         setupPlaybackTopology(mediaSource, sourcePD);
+        sourcePD->Release();
     } else {
         changeStatus(QMediaPlayer::InvalidMedia);
         emit error(QMediaPlayer::ResourceError, tr("Cannot create presentation descriptor."), true);
@@ -423,12 +424,15 @@ IMFTopologyNode* MFPlayerSession::addOutputNode(IMFStreamDescriptor *streamDesc,
                 if (SUCCEEDED(hr)) {
                     hr = node->SetUINT32(MF_TOPONODE_STREAMID, sinkID);
                     if (SUCCEEDED(hr)) {
-                        if (SUCCEEDED(topology->AddNode(node)))
+                        if (SUCCEEDED(topology->AddNode(node))) {
+                            handler->Release();
                             return node;
+                        }
                     }
                 }
             }
         }
+        handler->Release();
     }
     node->Release();
     return NULL;
@@ -617,42 +621,39 @@ HRESULT BindOutputNode(IMFTopologyNode *pNode)
 // Sets the IMFStreamSink pointers on all of the output nodes in a topology.
 HRESULT BindOutputNodes(IMFTopology *pTopology)
 {
-    DWORD cNodes = 0;
-
-    IMFCollection *collection = NULL;
-    IUnknown *element = NULL;
-    IMFTopologyNode *node = NULL;
+    IMFCollection *collection;
 
     // Get the collection of output nodes.
     HRESULT hr = pTopology->GetOutputNodeCollection(&collection);
 
     // Enumerate all of the nodes in the collection.
-    if (SUCCEEDED(hr))
+    if (SUCCEEDED(hr)) {
+        DWORD cNodes;
         hr = collection->GetElementCount(&cNodes);
 
-    if (SUCCEEDED(hr)) {
-        for (DWORD i = 0; i < cNodes; i++) {
-            hr = collection->GetElement(i, &element);
-            if (FAILED(hr))
-                break;
+        if (SUCCEEDED(hr)) {
+            for (DWORD i = 0; i < cNodes; i++) {
+                IUnknown *element;
+                hr = collection->GetElement(i, &element);
+                if (FAILED(hr))
+                    break;
 
-            hr = element->QueryInterface(IID_IMFTopologyNode, (void**)&node);
-            if (FAILED(hr))
-                break;
+                IMFTopologyNode *node;
+                hr = element->QueryInterface(IID_IMFTopologyNode, (void**)&node);
+                element->Release();
+                if (FAILED(hr))
+                    break;
 
-            // Bind this node.
-            hr = BindOutputNode(node);
-            if (FAILED(hr))
-                break;
+                // Bind this node.
+                hr = BindOutputNode(node);
+                node->Release();
+                if (FAILED(hr))
+                    break;
+            }
         }
+        collection->Release();
     }
 
-    if (collection)
-        collection->Release();
-    if (element)
-        element->Release();
-    if (node)
-        node->Release();
     return hr;
 }
 
@@ -1510,8 +1511,11 @@ HRESULT MFPlayerSession::Invoke(IMFAsyncResult *pResult)
         }
     }
 
-    if (!m_closing)
+    if (!m_closing) {
         emit sessionEvent(pEvent);
+    } else {
+        pEvent->Release();
+    }
     return S_OK;
 }