From d930dff4a860455fef775409586e4406df5d1efa Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Thu, 30 May 2019 22:59:36 -0500 Subject: [PATCH] strmbase/renderer: Add a QueryInterface() callback. Signed-off-by: Zebediah Figura Signed-off-by: Alexandre Julliard --- dlls/strmbase/renderer.c | 24 +++++++++++++++++++++++- include/wine/strmbase.h | 1 + 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c index 7a69d98367c..5308cd39ec5 100644 --- a/dlls/strmbase/renderer.c +++ b/dlls/strmbase/renderer.c @@ -200,10 +200,32 @@ static void renderer_destroy(BaseFilter *iface) filter->pFuncsTable->renderer_destroy(filter); } -static const BaseFilterFuncTable RendererBaseFilterFuncTable = +static HRESULT renderer_query_interface(BaseFilter *iface, REFIID iid, void **out) { + BaseRenderer *filter = impl_from_BaseFilter(iface); + HRESULT hr; + + if (filter->pFuncsTable->renderer_query_interface + && SUCCEEDED(hr = filter->pFuncsTable->renderer_query_interface(filter, iid, out))) + { + return hr; + } + + if (IsEqualIID(iid, &IID_IMediaSeeking) || IsEqualIID(iid, &IID_IMediaPosition)) + return IUnknown_QueryInterface(filter->pPosition, iid, out); + else if (IsEqualIID(iid, &IID_IQualityControl)) + { + *out = &filter->qcimpl->IQualityControl_iface; + IUnknown_AddRef((IUnknown *)*out); + return S_OK; + } + return E_NOINTERFACE; +} + +static const BaseFilterFuncTable RendererBaseFilterFuncTable = { .filter_get_pin = renderer_get_pin, .filter_destroy = renderer_destroy, + .filter_query_interface = renderer_query_interface, }; static HRESULT WINAPI BaseRenderer_Input_CheckMediaType(BasePin *pin, const AM_MEDIA_TYPE * pmt) diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h index 1d36f133d3d..e192e98b56d 100644 --- a/include/wine/strmbase.h +++ b/include/wine/strmbase.h @@ -606,6 +606,7 @@ typedef struct BaseRendererFuncTable { BaseRenderer_BeginFlush pfnBeginFlush; BaseRenderer_EndFlush pfnEndFlush; void (*renderer_destroy)(BaseRenderer *iface); + HRESULT (*renderer_query_interface)(BaseRenderer *iface, REFIID iid, void **out); } BaseRendererFuncTable; HRESULT WINAPI BaseRendererImpl_QueryInterface(IBaseFilter * iface, REFIID riid, LPVOID * ppv);