Commit dae86f1e authored by Zebediah Figura's avatar Zebediah Figura Committed by Alexandre Julliard

qcap/vfwcapture: Share pin and filter reference counts.

parent 6f7d1065
...@@ -97,6 +97,11 @@ typedef struct VfwPinImpl ...@@ -97,6 +97,11 @@ typedef struct VfwPinImpl
VfwCapture *parent; VfwCapture *parent;
} VfwPinImpl; } VfwPinImpl;
static inline VfwPinImpl *impl_from_IPin(IPin *iface)
{
return CONTAINING_RECORD(iface, VfwPinImpl, pin.pin.IPin_iface);
}
static IPin *vfw_capture_get_pin(BaseFilter *iface, unsigned int index) static IPin *vfw_capture_get_pin(BaseFilter *iface, unsigned int index)
{ {
VfwCapture *This = impl_from_BaseFilter(iface); VfwCapture *This = impl_from_BaseFilter(iface);
...@@ -125,7 +130,7 @@ static void vfw_capture_destroy(BaseFilter *iface) ...@@ -125,7 +130,7 @@ static void vfw_capture_destroy(BaseFilter *iface)
IPin_Disconnect(filter->pOutputPin); IPin_Disconnect(filter->pOutputPin);
IPin_Release(peer); IPin_Release(peer);
} }
IPin_Release(filter->pOutputPin); BaseOutputPin_Destroy(&impl_from_IPin(filter->pOutputPin)->pin);
strmbase_filter_cleanup(&filter->filter); strmbase_filter_cleanup(&filter->filter);
CoTaskMemFree(filter); CoTaskMemFree(filter);
ObjectRefCount(FALSE); ObjectRefCount(FALSE);
...@@ -648,11 +653,6 @@ VfwPin_Construct( IBaseFilter * pBaseFilter, LPCRITICAL_SECTION pCritSec, ...@@ -648,11 +653,6 @@ VfwPin_Construct( IBaseFilter * pBaseFilter, LPCRITICAL_SECTION pCritSec,
return hr; return hr;
} }
static inline VfwPinImpl *impl_from_IPin(IPin *iface)
{
return CONTAINING_RECORD(iface, VfwPinImpl, pin.pin.IPin_iface);
}
static HRESULT WINAPI VfwPin_QueryInterface(IPin * iface, REFIID riid, LPVOID * ppv) static HRESULT WINAPI VfwPin_QueryInterface(IPin * iface, REFIID riid, LPVOID * ppv)
{ {
VfwPinImpl *This = impl_from_IPin(iface); VfwPinImpl *This = impl_from_IPin(iface);
...@@ -677,20 +677,17 @@ static HRESULT WINAPI VfwPin_QueryInterface(IPin * iface, REFIID riid, LPVOID * ...@@ -677,20 +677,17 @@ static HRESULT WINAPI VfwPin_QueryInterface(IPin * iface, REFIID riid, LPVOID *
return E_NOINTERFACE; return E_NOINTERFACE;
} }
static ULONG WINAPI VfwPin_AddRef(IPin *iface)
{
VfwPinImpl *pin = impl_from_IPin(iface);
return IBaseFilter_AddRef(pin->pin.pin.pinInfo.pFilter);
}
static ULONG WINAPI static ULONG WINAPI
VfwPin_Release(IPin * iface) VfwPin_Release(IPin * iface)
{ {
VfwPinImpl *This = impl_from_IPin(iface); VfwPinImpl *pin = impl_from_IPin(iface);
ULONG refCount = InterlockedDecrement(&This->pin.pin.refCount); return IBaseFilter_Release(pin->pin.pin.pinInfo.pFilter);
TRACE("() -> new refcount: %u\n", refCount);
if (!refCount)
{
BaseOutputPin_Destroy(&This->pin);
ObjectRefCount(FALSE);
}
return refCount;
} }
static HRESULT WINAPI static HRESULT WINAPI
...@@ -719,7 +716,7 @@ VfwPin_QueryInternalConnections(IPin * iface, IPin ** apPin, ULONG * cPin) ...@@ -719,7 +716,7 @@ VfwPin_QueryInternalConnections(IPin * iface, IPin ** apPin, ULONG * cPin)
static const IPinVtbl VfwPin_Vtbl = static const IPinVtbl VfwPin_Vtbl =
{ {
VfwPin_QueryInterface, VfwPin_QueryInterface,
BasePinImpl_AddRef, VfwPin_AddRef,
VfwPin_Release, VfwPin_Release,
BaseOutputPinImpl_Connect, BaseOutputPinImpl_Connect,
BaseOutputPinImpl_ReceiveConnection, BaseOutputPinImpl_ReceiveConnection,
......
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