[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