Chris Robinson : quartz:
Hold a reference on a filter while sending data to it.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Mar 19 08:17:39 CDT 2007
Module: wine
Branch: master
Commit: 52529c923d8e0712fa42a2ca340d5e8f46a57035
URL: http://source.winehq.org/git/wine.git/?a=commit;h=52529c923d8e0712fa42a2ca340d5e8f46a57035
Author: Chris Robinson <chris.kcat at gmail.com>
Date: Wed Mar 14 06:39:58 2007 -0700
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);
}
More information about the wine-cvs
mailing list