From: Sebastian Lackner Subject: [1/2] qcap: Distinguish interface and implementation pointer for VfwCapture output pin. Message-Id: <5590E0D6.8030700@fds-team.de> Date: Mon, 29 Jun 2015 08:08:22 +0200 --- dlls/qcap/vfwcapture.c | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/dlls/qcap/vfwcapture.c b/dlls/qcap/vfwcapture.c index 7804a3d..31620c0 100644 --- a/dlls/qcap/vfwcapture.c +++ b/dlls/qcap/vfwcapture.c @@ -102,6 +102,16 @@ typedef struct VfwPinImpl const IKsPropertySetVtbl * KSP_VT; } VfwPinImpl; +static inline VfwPinImpl *impl_from_BasePin(BasePin *iface) +{ + return CONTAINING_RECORD(iface, VfwPinImpl, pin); +} + +static inline VfwPinImpl *impl_from_IPin(IPin *iface) +{ + return CONTAINING_RECORD(iface, VfwPinImpl, pin.pin.IPin_iface); +} + static IPin* WINAPI VfwCapture_GetPin(BaseFilter *iface, int pos) { VfwCapture *This = impl_from_BaseFilter(iface); @@ -217,7 +227,7 @@ static ULONG WINAPI VfwCapture_Release(IBaseFilter * iface) if (!refCount) { - BasePin *pin; + VfwPinImpl *pin; TRACE("destroying everything\n"); if (This->init) @@ -226,10 +236,10 @@ static ULONG WINAPI VfwCapture_Release(IBaseFilter * iface) qcap_driver_stop(This->driver_info, &This->filter.state); qcap_driver_destroy(This->driver_info); } - pin = (BasePin*) This->pOutputPin; - if (pin->pConnectedTo != NULL) + pin = impl_from_IPin(This->pOutputPin); + if (pin->pin.pin.pConnectedTo != NULL) { - IPin_Disconnect(pin->pConnectedTo); + IPin_Disconnect(pin->pin.pin.pConnectedTo); IPin_Disconnect(This->pOutputPin); } IPin_Release(This->pOutputPin); @@ -332,7 +342,7 @@ AMStreamConfig_SetFormat(IAMStreamConfig *iface, AM_MEDIA_TYPE *pmt) { HRESULT hr; VfwCapture *This = impl_from_IAMStreamConfig(iface); - BasePin *pin; + VfwPinImpl *pin; TRACE("(%p): %p->%p\n", iface, pmt, pmt ? pmt->pbFormat : NULL); @@ -350,17 +360,17 @@ AMStreamConfig_SetFormat(IAMStreamConfig *iface, AM_MEDIA_TYPE *pmt) dump_AM_MEDIA_TYPE(pmt); - pin = (BasePin *)This->pOutputPin; - if (pin->pConnectedTo != NULL) + pin = impl_from_IPin(This->pOutputPin); + if (pin->pin.pin.pConnectedTo != NULL) { - hr = IPin_QueryAccept(pin->pConnectedTo, pmt); + hr = IPin_QueryAccept(pin->pin.pin.pConnectedTo, pmt); TRACE("Would accept: %d\n", hr); if (hr == S_FALSE) return VFW_E_INVALIDMEDIATYPE; } hr = qcap_driver_set_format(This->driver_info, pmt); - if (SUCCEEDED(hr) && This->filter.filterInfo.pGraph && pin->pConnectedTo ) + if (SUCCEEDED(hr) && This->filter.filterInfo.pGraph && pin->pin.pin.pConnectedTo) { hr = IFilterGraph_Reconnect(This->filter.filterInfo.pGraph, This->pOutputPin); if (SUCCEEDED(hr)) @@ -557,7 +567,7 @@ PPB_Load( IPersistPropertyBag * iface, IPropertyBag *pPropBag, var.__VARIANT_NAME_1.__VARIANT_NAME_2.__VARIANT_NAME_3.ulVal ); if (This->driver_info) { - pin = (VfwPinImpl *)This->pOutputPin; + pin = impl_from_IPin(This->pOutputPin); pin->driver_info = This->driver_info; pin->parent = This; This->init = TRUE; @@ -678,7 +688,7 @@ static const IKsPropertySetVtbl KSP_VTable = static HRESULT WINAPI VfwPin_GetMediaType(BasePin *iface, int iPosition, AM_MEDIA_TYPE *pmt) { - VfwPinImpl *This = (VfwPinImpl *)iface; + VfwPinImpl *This = impl_from_BasePin(iface); AM_MEDIA_TYPE *vfw_pmt; HRESULT hr; @@ -746,7 +756,7 @@ VfwPin_Construct( IBaseFilter * pBaseFilter, LPCRITICAL_SECTION pCritSec, if (SUCCEEDED(hr)) { - VfwPinImpl *pPinImpl = (VfwPinImpl*)*ppPin; + VfwPinImpl *pPinImpl = impl_from_IPin(*ppPin); pPinImpl->KSP_VT = &KSP_VTable; ObjectRefCount(TRUE); } @@ -756,13 +766,13 @@ VfwPin_Construct( IBaseFilter * pBaseFilter, LPCRITICAL_SECTION pCritSec, static HRESULT WINAPI VfwPin_QueryInterface(IPin * iface, REFIID riid, LPVOID * ppv) { - VfwPinImpl *This = (VfwPinImpl *)iface; + VfwPinImpl *This = impl_from_IPin(iface); TRACE("%s %p\n", debugstr_guid(riid), ppv); *ppv = NULL; if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IPin)) - *ppv = This; + *ppv = &This->pin.pin.IPin_iface; else if (IsEqualIID(riid, &IID_IKsPropertySet)) *ppv = &(This->KSP_VT); else if (IsEqualIID(riid, &IID_IAMStreamConfig)) @@ -781,7 +791,7 @@ static HRESULT WINAPI VfwPin_QueryInterface(IPin * iface, REFIID riid, LPVOID * static ULONG WINAPI VfwPin_Release(IPin * iface) { - VfwPinImpl *This = (VfwPinImpl *)iface; + VfwPinImpl *This = impl_from_IPin(iface); ULONG refCount = InterlockedDecrement(&This->pin.pin.refCount); TRACE("() -> new refcount: %u\n", refCount); @@ -800,7 +810,7 @@ VfwPin_EnumMediaTypes(IPin * iface, IEnumMediaTypes ** ppEnum) AM_MEDIA_TYPE *pmt; HRESULT hr; - VfwPinImpl *This = (VfwPinImpl *)iface; + VfwPinImpl *This = impl_from_IPin(iface); hr = qcap_driver_get_format(This->driver_info, &pmt); if (SUCCEEDED(hr)) { hr = BasePinImpl_EnumMediaTypes(iface, ppEnum); -- 2.4.4