[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