Commit d8dc9fb3 authored by Chris Robinson's avatar Chris Robinson Committed by Alexandre Julliard

quartz: Release objects when pins fail to connect.

parent 52529c92
...@@ -79,31 +79,40 @@ static HRESULT OutputPin_ConnectSpecific(IPin * iface, IPin * pReceivePin, const ...@@ -79,31 +79,40 @@ static HRESULT OutputPin_ConnectSpecific(IPin * iface, IPin * pReceivePin, const
* connected pin */ * connected pin */
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
This->pMemInputPin = NULL;
hr = IPin_QueryInterface(pReceivePin, &IID_IMemInputPin, (LPVOID)&This->pMemInputPin); hr = IPin_QueryInterface(pReceivePin, &IID_IMemInputPin, (LPVOID)&This->pMemInputPin);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
hr = IMemInputPin_GetAllocator(This->pMemInputPin, &pMemAlloc);
if (hr == VFW_E_NO_ALLOCATOR)
{ {
/* Input pin provides no allocator, use standard memory allocator */ hr = IMemInputPin_GetAllocator(This->pMemInputPin, &pMemAlloc);
hr = CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC_SERVER, &IID_IMemAllocator, (LPVOID*)&pMemAlloc);
if (SUCCEEDED(hr)) if (hr == VFW_E_NO_ALLOCATOR)
{ {
hr = IMemInputPin_NotifyAllocator(This->pMemInputPin, pMemAlloc, FALSE); /* Input pin provides no allocator, use standard memory allocator */
hr = CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC_SERVER, &IID_IMemAllocator, (LPVOID*)&pMemAlloc);
if (SUCCEEDED(hr))
{
hr = IMemInputPin_NotifyAllocator(This->pMemInputPin, pMemAlloc, FALSE);
}
} }
}
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
hr = IMemAllocator_SetProperties(pMemAlloc, &This->allocProps, &actual); hr = IMemAllocator_SetProperties(pMemAlloc, &This->allocProps, &actual);
if (pMemAlloc) if (pMemAlloc)
IMemAllocator_Release(pMemAlloc); IMemAllocator_Release(pMemAlloc);
}
/* break connection if we couldn't get the allocator */ /* break connection if we couldn't get the allocator */
if (FAILED(hr)) if (FAILED(hr))
{
if (This->pMemInputPin)
IMemInputPin_Release(This->pMemInputPin);
This->pMemInputPin = NULL;
IPin_Disconnect(pReceivePin); IPin_Disconnect(pReceivePin);
}
} }
if (FAILED(hr)) if (FAILED(hr))
...@@ -1069,6 +1078,8 @@ HRESULT WINAPI PullPin_ReceiveConnection(IPin * iface, IPin * pReceivePin, const ...@@ -1069,6 +1078,8 @@ HRESULT WINAPI PullPin_ReceiveConnection(IPin * iface, IPin * pReceivePin, const
} }
} }
This->pReader = NULL;
This->pAlloc = NULL;
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
hr = IPin_QueryInterface(pReceivePin, &IID_IAsyncReader, (LPVOID *)&This->pReader); hr = IPin_QueryInterface(pReceivePin, &IID_IAsyncReader, (LPVOID *)&This->pReader);
...@@ -1095,6 +1106,15 @@ HRESULT WINAPI PullPin_ReceiveConnection(IPin * iface, IPin * pReceivePin, const ...@@ -1095,6 +1106,15 @@ HRESULT WINAPI PullPin_ReceiveConnection(IPin * iface, IPin * pReceivePin, const
This->pin.pConnectedTo = pReceivePin; This->pin.pConnectedTo = pReceivePin;
IPin_AddRef(pReceivePin); IPin_AddRef(pReceivePin);
} }
else
{
if (This->pReader)
IAsyncReader_Release(This->pReader);
This->pReader = NULL;
if (This->pAlloc)
IMemAllocator_Release(This->pAlloc);
This->pAlloc = NULL;
}
} }
LeaveCriticalSection(This->pin.pCritSec); LeaveCriticalSection(This->pin.pCritSec);
return hr; return hr;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment