[PATCH 7/7] evr: Implement IBaseFilter in EVR filter

Fabian Maurer dark.shadow4 at web.de
Sun Sep 10 09:10:47 CDT 2017


Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
---
 dlls/evr/evr.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 79 insertions(+), 3 deletions(-)

diff --git a/dlls/evr/evr.c b/dlls/evr/evr.c
index f4827284a2..f5df08a17b 100644
--- a/dlls/evr/evr.c
+++ b/dlls/evr/evr.c
@@ -60,11 +60,11 @@ static HRESULT WINAPI impl_inner_QueryInterface(IUnknown *iface, REFIID riid, vo
      else if (IsEqualIID(riid, &IID_IAMFilterMiscFlags))
          FIXME("No interface for IID_IAMFilterMiscFlags\n");
      else if (IsEqualIID(riid, &IID_IBaseFilter))
-         FIXME("No interface for IID_IBaseFilter\n");
+         *ppv =&This->basefilter.IBaseFilter_iface;
      else if (IsEqualIID(riid, &IID_IMediaFilter))
-         FIXME("No interface for IID_IMediaFilter\n");
+         *ppv =&This->basefilter.IBaseFilter_iface;
      else if (IsEqualIID(riid, &IID_IPersist))
-         FIXME("No interface for IID_IPersist\n");
+         *ppv =&This->basefilter.IBaseFilter_iface;
      else if (IsEqualIID(riid, &IID_IKsPropertySet))
          FIXME("No interface for IID_IKsPropertySet\n");
      else if (IsEqualIID(riid, &IID_IMediaEventSink))
@@ -124,6 +124,7 @@ static ULONG WINAPI impl_inner_Release(IUnknown *iface)
 
     if (!ref)
     {
+        BaseFilter_Destroy(&This->basefilter);
         CoTaskMemFree(This);
     }
 
@@ -137,6 +138,78 @@ static const IUnknownVtbl evr_inner_vtbl =
     impl_inner_Release
 };
 
+static inline evr_impl *impl_from_IBaseFilter(IBaseFilter *iface)
+{
+    return CONTAINING_RECORD(iface, evr_impl, basefilter);
+}
+
+static HRESULT WINAPI filter_QueryInterface(IBaseFilter *iface, REFIID riid, void **ppv)
+{
+    evr_impl *This = impl_from_IBaseFilter(iface);
+    return IUnknown_QueryInterface(&This->IUnknown_inner, riid, ppv);
+}
+
+static ULONG WINAPI filter_AddRef(IBaseFilter *iface)
+{
+    evr_impl *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_impl *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_GetClassID,
+    BaseRendererImpl_Stop,
+    BaseRendererImpl_Pause,
+    BaseRendererImpl_Run,
+    BaseRendererImpl_GetState,
+    BaseRendererImpl_SetSyncSource,
+    BaseFilterImpl_GetSyncSource,
+    BaseFilterImpl_EnumPins,
+    BaseRendererImpl_FindPin,
+    BaseFilterImpl_QueryFilterInfo,
+    BaseFilterImpl_JoinFilterGraph,
+    BaseFilterImpl_QueryVendorInfo
+};
+
+static IPin* WINAPI filter_GetPin(BaseFilter *iface, int position)
+{
+    FIXME("(%p, %d): stub!\n", iface, position);
+    return NULL;
+}
+
+static LONG WINAPI filter_GetPinCount(BaseFilter *iface)
+{
+    FIXME("(%p): stub!\n", iface);
+    return 0;
+}
+
+static const BaseFilterFuncTable basefilter_functable =
+{
+    filter_GetPin,
+    filter_GetPinCount,
+};
+
 HRESULT evr_impl_create(IUnknown *outer_unk, void **ppv)
 {
     evr_impl *object;
@@ -155,6 +228,9 @@ HRESULT evr_impl_create(IUnknown *outer_unk, void **ppv)
     if (!object)
         return E_OUTOFMEMORY;
 
+    BaseFilter_Init(&object->basefilter, &basefilter_vtbl, &CLSID_EnhancedVideoRenderer,
+                    (DWORD_PTR)(__FILE__ ": EVR.csFilter"), &basefilter_functable);
+
     object->IUnknown_inner.lpVtbl = &evr_inner_vtbl;
     object->ref = 1;
 
-- 
2.14.1




More information about the wine-patches mailing list