Module: wine Branch: master Commit: 52529c923d8e0712fa42a2ca340d5e8f46a57035 URL: http://source.winehq.org/git/wine.git/?a=commit;h=52529c923d8e0712fa42a2ca34...
Author: Chris Robinson chris.kcat@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); }