[PATCH 2/4] qedit: COM cleanup for the IPin iface (SampleGrabber)
Michael Stefaniuc
mstefani at redhat.de
Tue Jun 26 16:52:22 CDT 2012
---
dlls/qedit/samplegrabber.c | 98 +++++++++++++++++++++++++------------------
1 files changed, 57 insertions(+), 41 deletions(-)
diff --git a/dlls/qedit/samplegrabber.c b/dlls/qedit/samplegrabber.c
index 0261dd6..6080b6e 100644
--- a/dlls/qedit/samplegrabber.c
+++ b/dlls/qedit/samplegrabber.c
@@ -351,13 +351,18 @@ static IEnumMediaTypes *mediaenum_create(const AM_MEDIA_TYPE *mtype)
/* Sample Grabber pin implementation */
typedef struct _SG_Pin {
- const IPinVtbl* lpVtbl;
+ IPin IPin_iface;
PIN_DIRECTION dir;
WCHAR const *name;
struct _SG_Impl *sg;
IPin *pair;
} SG_Pin;
+static inline SG_Pin *impl_from_IPin(IPin *iface)
+{
+ return CONTAINING_RECORD(iface, SG_Pin, IPin_iface);
+}
+
/* Sample Grabber filter implementation */
typedef struct _SG_Impl {
IBaseFilter IBaseFilter_iface;
@@ -661,8 +666,8 @@ SampleGrabber_IBaseFilter_EnumPins(IBaseFilter *iface, IEnumPins **pins)
TRACE("(%p)->(%p)\n", This, pins);
if (!pins)
return E_POINTER;
- pin[0] = (IPin*)&This->pin_in.lpVtbl;
- pin[1] = (IPin*)&This->pin_out.lpVtbl;
+ pin[0] = &This->pin_in.IPin_iface;
+ pin[1] = &This->pin_out.IPin_iface;
*pins = pinsenum_create(iface, pin, 2);
return *pins ? S_OK : E_OUTOFMEMORY;
}
@@ -677,14 +682,14 @@ SampleGrabber_IBaseFilter_FindPin(IBaseFilter *iface, LPCWSTR id, IPin **pin)
return E_POINTER;
if (!lstrcmpiW(id,pin_in_name))
{
- SampleGrabber_addref(This);
- *pin = (IPin*)&(This->pin_in.lpVtbl);
+ *pin = &This->pin_in.IPin_iface;
+ IPin_AddRef(*pin);
return S_OK;
}
else if (!lstrcmpiW(id,pin_out_name))
{
- SampleGrabber_addref(This);
- *pin = (IPin*)&(This->pin_out.lpVtbl);
+ *pin = &This->pin_out.IPin_iface;
+ IPin_AddRef(*pin);
return S_OK;
}
*pin = NULL;
@@ -1003,37 +1008,37 @@ SampleGrabber_IMemInputPin_ReceiveCanBlock(IMemInputPin *iface)
static ULONG WINAPI
SampleGrabber_IPin_AddRef(IPin *iface)
{
- return SampleGrabber_addref(((SG_Pin *)iface)->sg);
+ SG_Pin *This = impl_from_IPin(iface);
+ return ISampleGrabber_AddRef(&This->sg->ISampleGrabber_iface);
}
/* IUnknown */
static ULONG WINAPI
SampleGrabber_IPin_Release(IPin *iface)
{
- return SampleGrabber_release(((SG_Pin *)iface)->sg);
+ SG_Pin *This = impl_from_IPin(iface);
+ return ISampleGrabber_Release(&This->sg->ISampleGrabber_iface);
}
/* IUnknown */
static HRESULT WINAPI
-SampleGrabber_IPin_QueryInterface(IPin *iface, REFIID riid, void **ppvObject)
+SampleGrabber_IPin_QueryInterface(IPin *iface, REFIID riid, void **ppv)
{
- SG_Pin *This = (SG_Pin *)iface;
- TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
+ SG_Pin *This = impl_from_IPin(iface);
+ TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
- if (IsEqualIID(riid, &IID_IUnknown) ||
- IsEqualIID(riid, &IID_IPin)) {
- SampleGrabber_addref(This->sg);
- *ppvObject = This;
- return S_OK;
- }
- else if (IsEqualIID(riid, &IID_IMemInputPin)) {
- SampleGrabber_addref(This->sg);
- *ppvObject = &This->sg->IMemInputPin_iface;
- return S_OK;
+ *ppv = NULL;
+ if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IPin))
+ *ppv = iface;
+ else if (IsEqualIID(riid, &IID_IMemInputPin))
+ *ppv = &This->sg->IMemInputPin_iface;
+ else {
+ WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppv);
+ return E_NOINTERFACE;
}
- *ppvObject = NULL;
- WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppvObject);
- return E_NOINTERFACE;
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
}
/* IPin - input pin */
@@ -1048,8 +1053,9 @@ SampleGrabber_In_IPin_Connect(IPin *iface, IPin *receiver, const AM_MEDIA_TYPE *
static HRESULT WINAPI
SampleGrabber_Out_IPin_Connect(IPin *iface, IPin *receiver, const AM_MEDIA_TYPE *type)
{
- SG_Pin *This = (SG_Pin *)iface;
+ SG_Pin *This = impl_from_IPin(iface);
HRESULT hr;
+
TRACE("(%p)->(%p, %p)\n", This, receiver, type);
if (!receiver)
return E_POINTER;
@@ -1079,7 +1085,7 @@ SampleGrabber_Out_IPin_Connect(IPin *iface, IPin *receiver, const AM_MEDIA_TYPE
!IsEqualGUID(&type->formattype, &GUID_NULL) &&
!type->pbFormat)
return VFW_E_TYPE_NOT_ACCEPTED;
- hr = IPin_ReceiveConnection(receiver,(IPin*)&This->lpVtbl,type);
+ hr = IPin_ReceiveConnection(receiver, &This->IPin_iface, type);
if (FAILED(hr))
return hr;
This->pair = receiver;
@@ -1096,7 +1102,8 @@ SampleGrabber_Out_IPin_Connect(IPin *iface, IPin *receiver, const AM_MEDIA_TYPE
static HRESULT WINAPI
SampleGrabber_In_IPin_ReceiveConnection(IPin *iface, IPin *connector, const AM_MEDIA_TYPE *type)
{
- SG_Pin *This = (SG_Pin *)iface;
+ SG_Pin *This = impl_from_IPin(iface);
+
TRACE("(%p)->(%p, %p)\n", This, connector, type);
if (!connector)
return E_POINTER;
@@ -1151,7 +1158,8 @@ SampleGrabber_Out_IPin_ReceiveConnection(IPin *iface, IPin *connector, const AM_
static HRESULT WINAPI
SampleGrabber_In_IPin_Disconnect(IPin *iface)
{
- SG_Pin *This = (SG_Pin *)iface;
+ SG_Pin *This = impl_from_IPin(iface);
+
TRACE("(%p)->() pair = %p\n", This, This->pair);
if (This->sg->state != State_Stopped)
return VFW_E_NOT_STOPPED;
@@ -1166,7 +1174,8 @@ SampleGrabber_In_IPin_Disconnect(IPin *iface)
static HRESULT WINAPI
SampleGrabber_Out_IPin_Disconnect(IPin *iface)
{
- SG_Pin *This = (SG_Pin *)iface;
+ SG_Pin *This = impl_from_IPin(iface);
+
TRACE("(%p)->() pair = %p\n", This, This->pair);
if (This->sg->state != State_Stopped)
return VFW_E_NOT_STOPPED;
@@ -1185,7 +1194,8 @@ SampleGrabber_Out_IPin_Disconnect(IPin *iface)
static HRESULT WINAPI
SampleGrabber_IPin_ConnectedTo(IPin *iface, IPin **pin)
{
- SG_Pin *This = (SG_Pin *)iface;
+ SG_Pin *This = impl_from_IPin(iface);
+
TRACE("(%p)->(%p) pair = %p\n", This, pin, This->pair);
if (!pin)
return E_POINTER;
@@ -1201,7 +1211,8 @@ SampleGrabber_IPin_ConnectedTo(IPin *iface, IPin **pin)
static HRESULT WINAPI
SampleGrabber_IPin_ConnectionMediaType(IPin *iface, AM_MEDIA_TYPE *mtype)
{
- SG_Pin *This = (SG_Pin *)iface;
+ SG_Pin *This = impl_from_IPin(iface);
+
TRACE("(%p)->(%p)\n", This, mtype);
if (!mtype)
return E_POINTER;
@@ -1219,7 +1230,8 @@ SampleGrabber_IPin_ConnectionMediaType(IPin *iface, AM_MEDIA_TYPE *mtype)
static HRESULT WINAPI
SampleGrabber_IPin_QueryPinInfo(IPin *iface, PIN_INFO *info)
{
- SG_Pin *This = (SG_Pin *)iface;
+ SG_Pin *This = impl_from_IPin(iface);
+
TRACE("(%p)->(%p)\n", This, info);
if (!info)
return E_POINTER;
@@ -1234,7 +1246,8 @@ SampleGrabber_IPin_QueryPinInfo(IPin *iface, PIN_INFO *info)
static HRESULT WINAPI
SampleGrabber_IPin_QueryDirection(IPin *iface, PIN_DIRECTION *dir)
{
- SG_Pin *This = (SG_Pin *)iface;
+ SG_Pin *This = impl_from_IPin(iface);
+
TRACE("(%p)->(%p)\n", This, dir);
if (!dir)
return E_POINTER;
@@ -1246,7 +1259,8 @@ SampleGrabber_IPin_QueryDirection(IPin *iface, PIN_DIRECTION *dir)
static HRESULT WINAPI
SampleGrabber_IPin_QueryId(IPin *iface, LPWSTR *id)
{
- SG_Pin *This = (SG_Pin *)iface;
+ SG_Pin *This = impl_from_IPin(iface);
+
int len;
TRACE("(%p)->(%p)\n", This, id);
if (!id)
@@ -1269,7 +1283,8 @@ SampleGrabber_IPin_QueryAccept(IPin *iface, const AM_MEDIA_TYPE *mtype)
static HRESULT WINAPI
SampleGrabber_IPin_EnumMediaTypes(IPin *iface, IEnumMediaTypes **mtypes)
{
- SG_Pin *This = (SG_Pin *)iface;
+ SG_Pin *This = impl_from_IPin(iface);
+
TRACE("(%p)->(%p)\n", This, mtypes);
if (!mtypes)
return E_POINTER;
@@ -1281,15 +1296,16 @@ SampleGrabber_IPin_EnumMediaTypes(IPin *iface, IEnumMediaTypes **mtypes)
static HRESULT WINAPI
SampleGrabber_In_IPin_QueryInternalConnections(IPin *iface, IPin **pins, ULONG *nPins)
{
- SG_Pin *This = (SG_Pin *)iface;
+ SG_Pin *This = impl_from_IPin(iface);
+
TRACE("(%p)->(%p, %p) size = %u\n", This, pins, nPins, (nPins ? *nPins : 0));
if (!nPins)
return E_POINTER;
if (*nPins) {
if (!pins)
return E_POINTER;
- IPin_AddRef((IPin*)&This->sg->pin_out.lpVtbl);
- *pins = (IPin*)&This->sg->pin_out.lpVtbl;
+ IPin_AddRef(&This->sg->pin_out.IPin_iface);
+ *pins = &This->sg->pin_out.IPin_iface;
*nPins = 1;
return S_OK;
}
@@ -1452,12 +1468,12 @@ HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppv)
obj->IBaseFilter_iface.lpVtbl = &IBaseFilter_VTable;
obj->ISampleGrabber_iface.lpVtbl = &ISampleGrabber_VTable;
obj->IMemInputPin_iface.lpVtbl = &IMemInputPin_VTable;
- obj->pin_in.lpVtbl = &IPin_In_VTable;
+ obj->pin_in.IPin_iface.lpVtbl = &IPin_In_VTable;
obj->pin_in.dir = PINDIR_INPUT;
obj->pin_in.name = pin_in_name;
obj->pin_in.sg = obj;
obj->pin_in.pair = NULL;
- obj->pin_out.lpVtbl = &IPin_Out_VTable;
+ obj->pin_out.IPin_iface.lpVtbl = &IPin_Out_VTable;
obj->pin_out.dir = PINDIR_OUTPUT;
obj->pin_out.name = pin_out_name;
obj->pin_out.sg = obj;
--
1.7.6.5
More information about the wine-patches
mailing list