[1/2] qcap: Distinguish interface and implementation pointer for VfwCapture output pin.
Sebastian Lackner
sebastian at fds-team.de
Mon Jun 29 01:08:22 CDT 2015
---
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
More information about the wine-patches
mailing list