evr/filter: Add IMFTopologyServiceLookup stub.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
This commit is contained in:
Nikolay Sivov 2022-08-29 14:23:10 +03:00 committed by Alexandre Julliard
parent 27972922c7
commit 4d7b3c7861
2 changed files with 80 additions and 0 deletions

View file

@ -24,6 +24,7 @@
#include "evr_private.h"
#include "d3d9.h"
#include "mferror.h"
#include "initguid.h"
#include "dxva2api.h"
@ -38,6 +39,7 @@ struct evr
IMFGetService IMFGetService_iface;
IMFVideoRenderer IMFVideoRenderer_iface;
IMediaEventSink IMediaEventSink_iface;
IMFTopologyServiceLookup IMFTopologyServiceLookup_iface;
IMFTransform *mixer;
IMFVideoPresenter *presenter;
@ -114,6 +116,8 @@ static HRESULT evr_query_interface(struct strmbase_renderer *iface, REFIID iid,
*out = &filter->IMFVideoRenderer_iface;
else if (IsEqualGUID(iid, &IID_IMediaEventSink))
*out = &filter->IMediaEventSink_iface;
else if (IsEqualGUID(iid, &IID_IMFTopologyServiceLookup))
*out = &filter->IMFTopologyServiceLookup_iface;
else
return E_NOINTERFACE;
@ -389,6 +393,46 @@ static const IMediaEventSinkVtbl filter_media_event_sink_vtbl =
filter_media_event_sink_Notify,
};
static struct evr *impl_from_IMFTopologyServiceLookup(IMFTopologyServiceLookup *iface)
{
return CONTAINING_RECORD(iface, struct evr, IMFTopologyServiceLookup_iface);
}
static HRESULT WINAPI filter_service_lookup_QueryInterface(IMFTopologyServiceLookup *iface, REFIID riid, void **obj)
{
struct evr *filter = impl_from_IMFTopologyServiceLookup(iface);
return IUnknown_QueryInterface(filter->renderer.filter.outer_unk, riid, obj);
}
static ULONG WINAPI filter_service_lookup_AddRef(IMFTopologyServiceLookup *iface)
{
struct evr *filter = impl_from_IMFTopologyServiceLookup(iface);
return IUnknown_AddRef(filter->renderer.filter.outer_unk);
}
static ULONG WINAPI filter_service_lookup_Release(IMFTopologyServiceLookup *iface)
{
struct evr *filter = impl_from_IMFTopologyServiceLookup(iface);
return IUnknown_Release(filter->renderer.filter.outer_unk);
}
static HRESULT WINAPI filter_service_lookup_LookupService(IMFTopologyServiceLookup *iface, MF_SERVICE_LOOKUP_TYPE lookup_type,
DWORD index, REFGUID service, REFIID riid, void **objects, DWORD *num_objects)
{
FIXME("iface %p, lookup_type %d, index %lu, service %s, riid %s, objects %p, num_objects %p.\n",
iface, lookup_type, index, debugstr_guid(service), debugstr_guid(riid), objects, num_objects);
return MF_E_NOTACCEPTING;
}
static const IMFTopologyServiceLookupVtbl filter_service_lookup_vtbl =
{
filter_service_lookup_QueryInterface,
filter_service_lookup_AddRef,
filter_service_lookup_Release,
filter_service_lookup_LookupService,
};
HRESULT evr_filter_create(IUnknown *outer, void **out)
{
struct evr *object;
@ -403,6 +447,7 @@ HRESULT evr_filter_create(IUnknown *outer, void **out)
object->IMFGetService_iface.lpVtbl = &filter_get_service_vtbl;
object->IMFVideoRenderer_iface.lpVtbl = &filter_video_renderer_vtbl;
object->IMediaEventSink_iface.lpVtbl = &filter_media_event_sink_vtbl;
object->IMFTopologyServiceLookup_iface.lpVtbl = &filter_service_lookup_vtbl;
TRACE("Created EVR %p.\n", object);
*out = &object->renderer.filter.IUnknown_inner;

View file

@ -603,6 +603,40 @@ static void test_display_control(void)
ok(!ref, "Got outstanding refcount %ld.\n", ref);
}
static void test_service_lookup(void)
{
IBaseFilter *filter = create_evr();
IMFTopologyServiceLookup *service_lookup;
IUnknown *unk;
DWORD count;
HRESULT hr;
ULONG ref;
hr = IBaseFilter_QueryInterface(filter, &IID_IMFTopologyServiceLookup, (void **)&service_lookup);
if (FAILED(hr))
{
win_skip("IMFTopologyServiceLookup is not exposed.\n");
IBaseFilter_Release(filter);
return;
}
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IMFTopologyServiceLookup_QueryInterface(service_lookup, &IID_IBaseFilter, (void **)&unk);
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
ok(unk == (IUnknown *)filter, "Unexpected pointer.\n");
IUnknown_Release(unk);
count = 1;
hr = IMFTopologyServiceLookup_LookupService(service_lookup, MF_SERVICE_LOOKUP_GLOBAL, 0,
&MR_VIDEO_RENDER_SERVICE, &IID_IMediaEventSink, (void **)&unk, &count);
ok(hr == MF_E_NOTACCEPTING, "Unexpected hr %#lx.\n", hr);
IMFTopologyServiceLookup_Release(service_lookup);
ref = IBaseFilter_Release(filter);
ok(!ref, "Got outstanding refcount %ld.\n", ref);
}
static IMFMediaType * create_video_type(const GUID *subtype)
{
IMFMediaType *video_type;
@ -3276,6 +3310,7 @@ START_TEST(evr)
test_unconnected_eos();
test_misc_flags();
test_display_control();
test_service_lookup();
test_default_mixer();
test_default_mixer_type_negotiation();