quartz: Hold a reference on a filter while sending data to it.
This commit is contained in:
parent
4b4518532a
commit
52529c923d
|
@ -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);
|
||||
|
@ -1194,11 +1201,16 @@ static void CALLBACK PullPin_Thread_Process(ULONG_PTR iface)
|
|||
if (SUCCEEDED(hr))
|
||||
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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue