[PATCH 2/5] qcap/vfwcapture: Share pin and filter reference counts.
Zebediah Figura
z.figura12 at gmail.com
Mon Jun 17 20:41:56 CDT 2019
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/qcap/vfwcapture.c | 33 +++++++++++++++------------------
1 file changed, 15 insertions(+), 18 deletions(-)
diff --git a/dlls/qcap/vfwcapture.c b/dlls/qcap/vfwcapture.c
index 0bf8c45d9c0..2cb1f7dece5 100644
--- a/dlls/qcap/vfwcapture.c
+++ b/dlls/qcap/vfwcapture.c
@@ -97,6 +97,11 @@ typedef struct VfwPinImpl
VfwCapture *parent;
} 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)
{
VfwCapture *This = impl_from_BaseFilter(iface);
@@ -125,7 +130,7 @@ static void vfw_capture_destroy(BaseFilter *iface)
IPin_Disconnect(filter->pOutputPin);
IPin_Release(peer);
}
- IPin_Release(filter->pOutputPin);
+ BaseOutputPin_Destroy(&impl_from_IPin(filter->pOutputPin)->pin);
strmbase_filter_cleanup(&filter->filter);
CoTaskMemFree(filter);
ObjectRefCount(FALSE);
@@ -648,11 +653,6 @@ VfwPin_Construct( IBaseFilter * pBaseFilter, LPCRITICAL_SECTION pCritSec,
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)
{
VfwPinImpl *This = impl_from_IPin(iface);
@@ -677,20 +677,17 @@ static HRESULT WINAPI VfwPin_QueryInterface(IPin * iface, REFIID riid, LPVOID *
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
VfwPin_Release(IPin * iface)
{
- VfwPinImpl *This = impl_from_IPin(iface);
- ULONG refCount = InterlockedDecrement(&This->pin.pin.refCount);
-
- TRACE("() -> new refcount: %u\n", refCount);
-
- if (!refCount)
- {
- BaseOutputPin_Destroy(&This->pin);
- ObjectRefCount(FALSE);
- }
- return refCount;
+ VfwPinImpl *pin = impl_from_IPin(iface);
+ return IBaseFilter_Release(pin->pin.pin.pinInfo.pFilter);
}
static HRESULT WINAPI
@@ -719,7 +716,7 @@ VfwPin_QueryInternalConnections(IPin * iface, IPin ** apPin, ULONG * cPin)
static const IPinVtbl VfwPin_Vtbl =
{
VfwPin_QueryInterface,
- BasePinImpl_AddRef,
+ VfwPin_AddRef,
VfwPin_Release,
BaseOutputPinImpl_Connect,
BaseOutputPinImpl_ReceiveConnection,
--
2.21.0
More information about the wine-devel
mailing list