[PATCH 6/6] evr: Use strmbase filter aggregation support.
Zebediah Figura
zfigura at codeweavers.com
Tue Jun 4 17:54:28 CDT 2019
From: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/evr/evr.c | 173 +++++++--------------------------------------------
dlls/evr/tests/evr.c | 3 +-
2 files changed, 22 insertions(+), 154 deletions(-)
diff --git a/dlls/evr/evr.c b/dlls/evr/evr.c
index 21a4af0..b64b046 100644
--- a/dlls/evr/evr.c
+++ b/dlls/evr/evr.c
@@ -35,148 +35,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(evr);
typedef struct
{
BaseFilter filter;
-
- IUnknown IUnknown_inner;
} evr_filter;
-static inline evr_filter *impl_from_inner_IUnknown(IUnknown *iface)
-{
- return CONTAINING_RECORD(iface, evr_filter, IUnknown_inner);
-}
-
-static HRESULT WINAPI inner_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
-{
- evr_filter *This = impl_from_inner_IUnknown(iface);
- TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppv);
-
- *ppv = NULL;
-
- if (IsEqualIID(riid, &IID_IUnknown))
- *ppv = &This->IUnknown_inner;
-
- else if (IsEqualIID(riid, &IID_IAMCertifiedOutputProtection))
- FIXME("No interface for IID_IAMCertifiedOutputProtection\n");
- else if (IsEqualIID(riid, &IID_IAMFilterMiscFlags))
- FIXME("No interface for IID_IAMFilterMiscFlags\n");
- else if (IsEqualIID(riid, &IID_IBaseFilter))
- *ppv =&This->filter.IBaseFilter_iface;
- else if (IsEqualIID(riid, &IID_IMediaFilter))
- *ppv =&This->filter.IBaseFilter_iface;
- else if (IsEqualIID(riid, &IID_IPersist))
- *ppv =&This->filter.IBaseFilter_iface;
- else if (IsEqualIID(riid, &IID_IKsPropertySet))
- FIXME("No interface for IID_IKsPropertySet\n");
- else if (IsEqualIID(riid, &IID_IMediaEventSink))
- FIXME("No interface for IID_IMediaEventSink\n");
- else if (IsEqualIID(riid, &IID_IMediaSeeking))
- FIXME("No interface for IID_IMediaSeeking\n");
- else if (IsEqualIID(riid, &IID_IQualityControl))
- FIXME("No interface for IID_IQualityControl\n");
- else if (IsEqualIID(riid, &IID_IQualProp))
- FIXME("No interface for IID_IQualProp\n");
-
- else if (IsEqualIID(riid, &IID_IEVRFilterConfig))
- FIXME("No interface for IID_IEVRFilterConfig\n");
- else if (IsEqualIID(riid, &IID_IMFGetService))
- FIXME("No interface for IID_IMFGetService\n");
- else if (IsEqualIID(riid, &IID_IMFVideoPositionMapper))
- FIXME("No interface for IID_IMFVideoPositionMapper\n");
- else if (IsEqualIID(riid, &IID_IMFVideoRenderer))
- FIXME("No interface for IID_IMFVideoRenderer\n");
-
- else if (IsEqualIID(riid, &IID_IMemInputPin))
- FIXME("No interface for IID_IMemInputPin\n");
- else if (IsEqualIID(riid, &IID_IPin))
- FIXME("No interface for IID_IPin\n");
- else if (IsEqualIID(riid, &IID_IQualityControl))
- FIXME("No interface for IID_IQualityControl\n");
-
- else if (IsEqualIID(riid, &IID_IDirectXVideoMemoryConfiguration))
- FIXME("No interface for IID_IDirectXVideoMemoryConfiguration\n");
-
- if (*ppv)
- {
- IUnknown_AddRef((IUnknown *)(*ppv));
- return S_OK;
- }
-
- FIXME("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppv);
- return E_NOINTERFACE;
-}
-
-static ULONG WINAPI inner_AddRef(IUnknown *iface)
-{
- evr_filter *This = impl_from_inner_IUnknown(iface);
- ULONG ref = BaseFilterImpl_AddRef(&This->filter.IBaseFilter_iface);
-
- TRACE("(%p, %p)->(): new ref %d\n", iface, This, ref);
-
- return ref;
-}
-
-static ULONG WINAPI inner_Release(IUnknown *iface)
-{
- evr_filter *This = impl_from_inner_IUnknown(iface);
- ULONG ref = InterlockedDecrement(&This->filter.refcount);
-
- TRACE("(%p, %p)->(): new ref %d\n", iface, This, ref);
-
- if (!ref)
- {
- strmbase_filter_cleanup(&This->filter);
- CoTaskMemFree(This);
- }
-
- return ref;
-}
-
-static const IUnknownVtbl evr_inner_vtbl =
-{
- inner_QueryInterface,
- inner_AddRef,
- inner_Release
-};
-
-static inline evr_filter *impl_from_IBaseFilter(IBaseFilter *iface)
-{
- return CONTAINING_RECORD(iface, evr_filter, filter);
-}
-
-static HRESULT WINAPI filter_QueryInterface(IBaseFilter *iface, REFIID riid, void **ppv)
-{
- evr_filter *This = impl_from_IBaseFilter(iface);
- return IUnknown_QueryInterface(&This->IUnknown_inner, riid, ppv);
-}
-
-static ULONG WINAPI filter_AddRef(IBaseFilter *iface)
-{
- evr_filter *This = impl_from_IBaseFilter(iface);
- LONG ret;
-
- ret = IUnknown_AddRef(&This->IUnknown_inner);
-
- TRACE("(%p)->AddRef from %d\n", iface, ret - 1);
-
- return ret;
-}
-
-static ULONG WINAPI filter_Release(IBaseFilter *iface)
-{
- evr_filter *This = impl_from_IBaseFilter(iface);
- LONG ret;
-
- ret = IUnknown_Release(&This->IUnknown_inner);
-
- TRACE("(%p)->Release from %d\n", iface, ret + 1);
-
- return ret;
-}
-
static const IBaseFilterVtbl basefilter_vtbl =
{
- filter_QueryInterface,
- filter_AddRef,
- filter_Release,
+ BaseFilterImpl_QueryInterface,
+ BaseFilterImpl_AddRef,
+ BaseFilterImpl_Release,
BaseFilterImpl_GetClassID,
BaseRendererImpl_Stop,
BaseRendererImpl_Pause,
@@ -191,41 +56,45 @@ static const IBaseFilterVtbl basefilter_vtbl =
BaseFilterImpl_QueryVendorInfo
};
+static inline evr_filter *impl_from_BaseFilter(BaseFilter *iface)
+{
+ return CONTAINING_RECORD(iface, evr_filter, filter);
+}
+
static IPin *evr_get_pin(BaseFilter *iface, unsigned int index)
{
FIXME("iface %p, index %u, stub!\n", iface, index);
return NULL;
}
+static void evr_destroy(BaseFilter *iface)
+{
+ evr_filter *filter = impl_from_BaseFilter(iface);
+
+ strmbase_filter_cleanup(&filter->filter);
+ CoTaskMemFree(filter);
+}
+
static const BaseFilterFuncTable basefilter_functable =
{
.filter_get_pin = evr_get_pin,
+ .filter_destroy = evr_destroy,
};
-HRESULT evr_filter_create(IUnknown *outer_unk, void **ppv)
+HRESULT evr_filter_create(IUnknown *outer, void **out)
{
evr_filter *object;
- TRACE("(%p, %p)\n", outer_unk, ppv);
-
- *ppv = NULL;
-
- if(outer_unk != NULL)
- {
- FIXME("Aggregation yet unsupported!\n");
- return E_NOINTERFACE;
- }
+ *out = NULL;
object = CoTaskMemAlloc(sizeof(evr_filter));
if (!object)
return E_OUTOFMEMORY;
- strmbase_filter_init(&object->filter, &basefilter_vtbl, NULL, &CLSID_EnhancedVideoRenderer,
+ strmbase_filter_init(&object->filter, &basefilter_vtbl, outer, &CLSID_EnhancedVideoRenderer,
(DWORD_PTR)(__FILE__ ": EVR.csFilter"), &basefilter_functable);
- object->IUnknown_inner.lpVtbl = &evr_inner_vtbl;
-
- *ppv = &object->IUnknown_inner;
+ *out = &object->filter.IUnknown_inner;
return S_OK;
}
diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c
index 34db51c..cd88ec1 100644
--- a/dlls/evr/tests/evr.c
+++ b/dlls/evr/tests/evr.c
@@ -91,8 +91,7 @@ static void test_aggregation(void)
hr = CoCreateInstance(&CLSID_EnhancedVideoRenderer, &test_outer, CLSCTX_INPROC_SERVER,
&IID_IUnknown, (void **)&unk);
- todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
- if (FAILED(hr)) return;
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref);
ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n");
ref = get_refcount(unk);
--
2.7.4
More information about the wine-devel
mailing list