[PATCH v2 7/7] evr: Implement IBaseFilter in EVR filter
Fabian Maurer
dark.shadow4 at web.de
Sun Sep 10 10:16:09 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