[1/2] quartz: Hold a reference on a filter while sending data to it

Chris Robinson chris.kcat at gmail.com
Wed Mar 14 08:47:41 CDT 2007


-------------- next part --------------
From 80ec159e9b9e7734dbca8126796afc58ce1a0be4 Mon Sep 17 00:00:00 2001
From: Chris Robinson <chris.kcat at gmail.com>
Date: Wed, 14 Mar 2007 06:39:58 -0700
Subject: [PATCH] quartz: Hold a reference on a filter while sending data to it

---
 dlls/quartz/pin.c |   20 ++++++++++++++++----
 1 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/dlls/quartz/pin.c b/dlls/quartz/pin.c
index 9cc05da..28d461a 100644
--- a/dlls/quartz/pin.c
+++ b/dlls/quartz/pin.c
@@ -880,6 +880,7 @@ HRESULT OutputPin_SendSample(OutputPin * This, IMediaSample * pSample)
 {
     HRESULT hr = S_OK;
     IMemInputPin * pMemConnected = NULL;
+    PIN_INFO pinInfo;
 
     EnterCriticalSection(This->pin.pCritSec);
     {
@@ -889,9 +890,10 @@ HRESULT OutputPin_SendSample(OutputPin * This, IMediaSample * pSample)
         {
             /* we don't have the lock held when using This->pMemInputPin,
              * so we need to AddRef it to stop it being deleted while we are
-             * using it. */
+             * using it. Same with its filter. */
             pMemConnected = This->pMemInputPin;
             IMemInputPin_AddRef(pMemConnected);
+            hr = IPin_QueryPinInfo(This->pin.pConnectedTo, &pinInfo);
         }
     }
     LeaveCriticalSection(This->pin.pCritSec);
@@ -902,9 +904,11 @@ HRESULT OutputPin_SendSample(OutputPin * This, IMediaSample * pSample)
          * then it causes some problems (most notably with the native Video
          * Renderer) if we are re-entered for whatever reason */
         hr = IMemInputPin_Receive(pMemConnected, pSample);
-        IMemInputPin_Release(pMemConnected);
+        IBaseFilter_Release(pinInfo.pFilter);
     }
-    
+    if (pMemConnected)
+        IMemInputPin_Release(pMemConnected);
+
     return hr;
 }
 
@@ -1155,6 +1159,7 @@ static void CALLBACK PullPin_Thread_Process(ULONG_PTR iface)
 
     REFERENCE_TIME rtCurrent;
     ALLOCATOR_PROPERTIES allocProps;
+    PIN_INFO pinInfo;
 
     CoInitializeEx(NULL, COINIT_MULTITHREADED);
     
@@ -1175,6 +1180,8 @@ static void CALLBACK PullPin_Thread_Process(ULONG_PTR iface)
         REFERENCE_TIME rtSampleStop;
         DWORD_PTR dwUser;
 
+        pinInfo.pFilter = NULL;
+
         TRACE("Process sample\n");
 
         hr = IMemAllocator_GetBuffer(This->pAlloc, &pSample, NULL, NULL, 0);
@@ -1195,10 +1202,15 @@ static void CALLBACK PullPin_Thread_Process(ULONG_PTR iface)
             hr = IAsyncReader_WaitForNext(This->pReader, 10000, &pSample, &dwUser);
 
         if (SUCCEEDED(hr))
+            hr = IPin_QueryPinInfo((IPin*)&This->pin, &pinInfo);
+
+        if (SUCCEEDED(hr))
             hr = This->fnSampleProc(This->pin.pUserData, pSample);
         else
             ERR("Processing error: %x\n", hr);
-        
+
+        if (pinInfo.pFilter)
+            IBaseFilter_Release(pinInfo.pFilter);
         if (pSample)
             IMediaSample_Release(pSample);
     }
-- 
1.4.4.4



More information about the wine-patches mailing list