From 444c6a16ef2b12d979c9d10816413863cb7e6ef8 Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Tue, 4 Jun 2019 17:54:28 -0500 Subject: [PATCH] evr: Use strmbase filter aggregation support. Signed-off-by: Zebediah Figura Signed-off-by: Alexandre Julliard --- 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 21a4af0dd6e..b64b0468acb 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 34db51c9002..cd88ec12392 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);