qedit: Use the generic IEnumPin implementation for SampleGrabber.
Michael Stefaniuc
mstefani at redhat.de
Thu Feb 20 14:30:48 CST 2014
---
Didn't feel like COM cleaning this one up...
dlls/qedit/samplegrabber.c | 205 ++++++++-------------------------------------
1 file changed, 33 insertions(+), 172 deletions(-)
diff --git a/dlls/qedit/samplegrabber.c b/dlls/qedit/samplegrabber.c
index 81eb9ec..537e22c 100644
--- a/dlls/qedit/samplegrabber.c
+++ b/dlls/qedit/samplegrabber.c
@@ -37,163 +37,8 @@ static const WCHAR vendor_name[] = { 'W', 'i', 'n', 'e', 0 };
static const WCHAR pin_in_name[] = { 'I', 'n', 0 };
static const WCHAR pin_out_name[] = { 'O', 'u', 't', 0 };
-static IEnumPins *pinsenum_create(IBaseFilter *filter, IPin **pins, ULONG pinCount);
static IEnumMediaTypes *mediaenum_create(const AM_MEDIA_TYPE *mtype);
-/* Fixed pins enumerator, holds filter referenced */
-typedef struct _PE_Impl {
- IEnumPins pe;
- IBaseFilter *filter;
- LONG refCount;
- ULONG numPins;
- ULONG index;
- IPin *pins[1];
-} PE_Impl;
-
-
-/* IEnumPins interface implementation */
-
-/* IUnknown */
-static ULONG WINAPI
-Fixed_IEnumPins_AddRef(IEnumPins *iface)
-{
- PE_Impl *This = (PE_Impl *)iface;
- ULONG refCount = InterlockedIncrement(&This->refCount);
- TRACE("(%p) new ref = %u\n", This, refCount);
- return refCount;
-}
-
-/* IUnknown */
-static ULONG WINAPI
-Fixed_IEnumPins_Release(IEnumPins *iface)
-{
- PE_Impl *This = (PE_Impl *)iface;
- ULONG refCount = InterlockedDecrement(&This->refCount);
- TRACE("(%p) new ref = %u\n", This, refCount);
- if (refCount == 0)
- {
- IBaseFilter_Release(This->filter);
- CoTaskMemFree(This);
- return 0;
- }
- return refCount;
-}
-
-/* IUnknown */
-static HRESULT WINAPI Fixed_IEnumPins_QueryInterface(IEnumPins *iface, REFIID riid,
- void **ret_iface)
-{
- TRACE("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ret_iface);
-
- if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IEnumPins)) {
- IEnumPins_AddRef(iface);
- *ret_iface = iface;
- return S_OK;
- }
- *ret_iface = NULL;
- WARN("(%p, %s, %p): not found\n", iface, debugstr_guid(riid), ret_iface);
- return E_NOINTERFACE;
-}
-
-/* IEnumPins */
-static HRESULT WINAPI
-Fixed_IEnumPins_Next(IEnumPins *iface, ULONG nPins, IPin **pins, ULONG *fetched)
-{
- PE_Impl *This = (PE_Impl *)iface;
- ULONG count = 0;
- TRACE("(%p)->(%u, %p, %p) index = %u\n", This, nPins, pins, fetched, This->index);
- if (!nPins)
- return E_INVALIDARG;
- if (!pins || ((nPins != 1) && !fetched))
- return E_POINTER;
- while ((count < nPins) && (This->index < This->numPins)) {
- IPin *pin = This->pins[This->index++];
- IPin_AddRef(pin);
- pins[count++] = pin;
- }
- if (fetched)
- *fetched = count;
- return (count == nPins) ? S_OK : S_FALSE;
-}
-
-/* IEnumPins */
-static HRESULT WINAPI
-Fixed_IEnumPins_Skip(IEnumPins *iface, ULONG nPins)
-{
- PE_Impl *This = (PE_Impl *)iface;
- TRACE("(%p)->(%u) index = %u\n", This, nPins, This->index);
- nPins += This->index;
- if (nPins >= This->numPins) {
- This->index = This->numPins;
- return S_FALSE;
- }
- This->index = nPins;
- return S_OK;
-}
-
-/* IEnumPins */
-static HRESULT WINAPI
-Fixed_IEnumPins_Reset(IEnumPins *iface)
-{
- PE_Impl *This = (PE_Impl *)iface;
- TRACE("(%p)->() index = %u\n", This, This->index);
- This->index = 0;
- return S_OK;
-}
-
-/* IEnumPins */
-static HRESULT WINAPI
-Fixed_IEnumPins_Clone(IEnumPins *iface, IEnumPins **pins)
-{
- PE_Impl *This = (PE_Impl *)iface;
- TRACE("(%p)->(%p) index = %u\n", This, pins, This->index);
- if (!pins)
- return E_POINTER;
- *pins = pinsenum_create(This->filter, This->pins, This->numPins);
- if (!*pins)
- return E_OUTOFMEMORY;
- ((PE_Impl *)*pins)->index = This->index;
- return S_OK;
-}
-
-
-/* Virtual tables and constructor */
-
-static const IEnumPinsVtbl IEnumPins_VTable =
-{
- Fixed_IEnumPins_QueryInterface,
- Fixed_IEnumPins_AddRef,
- Fixed_IEnumPins_Release,
- Fixed_IEnumPins_Next,
- Fixed_IEnumPins_Skip,
- Fixed_IEnumPins_Reset,
- Fixed_IEnumPins_Clone,
-};
-
-static IEnumPins *pinsenum_create(IBaseFilter *filter, IPin **pins, ULONG pinCount)
-{
- PE_Impl *obj;
- ULONG len = offsetof(PE_Impl, pins[pinCount]);
- ULONG i;
-
- obj = CoTaskMemAlloc(len);
- if (!obj)
- return NULL;
-
- ZeroMemory(obj, len);
- obj->pe.lpVtbl = &IEnumPins_VTable;
- obj->refCount = 1;
- obj->filter = filter;
- obj->numPins = pinCount;
- obj->index = 0;
- for (i = 0; i < pinCount; i++)
- obj->pins[i] = pins[i];
- IBaseFilter_AddRef(filter);
-
- return &obj->pe;
-}
-
-
/* Single media type enumerator */
typedef struct _ME_Impl {
IEnumMediaTypes me;
@@ -398,6 +243,11 @@ static inline SG_Impl *impl_from_IUnknown(IUnknown *iface)
return CONTAINING_RECORD(iface, SG_Impl, IUnknown_inner);
}
+static inline SG_Impl *impl_from_BaseFilter(BaseFilter *iface)
+{
+ return CONTAINING_RECORD(iface, SG_Impl, filter);
+}
+
static inline SG_Impl *impl_from_IBaseFilter(IBaseFilter *iface)
{
return CONTAINING_RECORD(iface, SG_Impl, filter.IBaseFilter_iface);
@@ -496,6 +346,32 @@ static const IUnknownVtbl samplegrabber_vtbl =
SampleGrabber_Release,
};
+static IPin *WINAPI SampleGrabber_GetPin(BaseFilter *iface, int pos)
+{
+ SG_Impl *This = impl_from_BaseFilter(iface);
+ IPin *pin;
+
+ if (pos == 0)
+ pin = &This->pin_in.IPin_iface;
+ else if (pos == 1)
+ pin = &This->pin_out.IPin_iface;
+ else
+ return NULL;
+
+ IPin_AddRef(pin);
+ return pin;
+}
+
+static LONG WINAPI SampleGrabber_GetPinCount(BaseFilter *iface)
+{
+ return 2;
+}
+
+static const BaseFilterFuncTable basefunc_vtbl = {
+ SampleGrabber_GetPin,
+ SampleGrabber_GetPinCount
+};
+
/* Helper that buffers data and/or calls installed sample callbacks */
static void SampleGrabber_callback(SG_Impl *This, IMediaSample *sample)
{
@@ -614,21 +490,6 @@ SampleGrabber_IBaseFilter_Run(IBaseFilter *iface, REFERENCE_TIME tStart)
/* IBaseFilter */
static HRESULT WINAPI
-SampleGrabber_IBaseFilter_EnumPins(IBaseFilter *iface, IEnumPins **pins)
-{
- SG_Impl *This = impl_from_IBaseFilter(iface);
- IPin *pin[2];
- TRACE("(%p)->(%p)\n", This, pins);
- if (!pins)
- return E_POINTER;
- 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;
-}
-
-/* IBaseFilter */
-static HRESULT WINAPI
SampleGrabber_IBaseFilter_FindPin(IBaseFilter *iface, LPCWSTR id, IPin **pin)
{
SG_Impl *This = impl_from_IBaseFilter(iface);
@@ -1316,7 +1177,7 @@ static const IBaseFilterVtbl IBaseFilter_VTable =
BaseFilterImpl_GetState,
BaseFilterImpl_SetSyncSource,
BaseFilterImpl_GetSyncSource,
- SampleGrabber_IBaseFilter_EnumPins,
+ BaseFilterImpl_EnumPins,
SampleGrabber_IBaseFilter_FindPin,
BaseFilterImpl_QueryFilterInfo,
SampleGrabber_IBaseFilter_JoinFilterGraph,
@@ -1410,7 +1271,7 @@ HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppv)
ZeroMemory(obj, sizeof(SG_Impl));
BaseFilter_Init(&obj->filter, &IBaseFilter_VTable, &CLSID_SampleGrabber,
- (DWORD_PTR)(__FILE__ ": SG_Impl.csFilter"), NULL);
+ (DWORD_PTR)(__FILE__ ": SG_Impl.csFilter"), &basefunc_vtbl);
obj->IUnknown_inner.lpVtbl = &samplegrabber_vtbl;
obj->ISampleGrabber_iface.lpVtbl = &ISampleGrabber_VTable;
obj->IMemInputPin_iface.lpVtbl = &IMemInputPin_VTable;
--
1.8.3.1
More information about the wine-patches
mailing list