From 81ba62654573ba624c394b2ed3559d022f9a7003 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Tue, 17 Nov 2020 13:41:38 +0300 Subject: [PATCH] evr/presenter: Add IDirect3DDeviceManager9 as a supported interface. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/evr/presenter.c | 90 ++++++++++++++++++++++++++++++++++++++++++++ dlls/evr/tests/evr.c | 19 +++++++++- 2 files changed, 108 insertions(+), 1 deletion(-) diff --git a/dlls/evr/presenter.c b/dlls/evr/presenter.c index 51792cdc2cd..ac81634f7ca 100644 --- a/dlls/evr/presenter.c +++ b/dlls/evr/presenter.c @@ -68,6 +68,7 @@ struct video_presenter IMFVideoPositionMapper IMFVideoPositionMapper_iface; IQualProp IQualProp_iface; IMFQualityAdvise IMFQualityAdvise_iface; + IDirect3DDeviceManager9 IDirect3DDeviceManager9_iface; IMFVideoSampleAllocatorNotify allocator_cb; IUnknown IUnknown_inner; IUnknown *outer_unk; @@ -152,6 +153,11 @@ static struct video_presenter *impl_from_IMFQualityAdvise(IMFQualityAdvise *ifac return CONTAINING_RECORD(iface, struct video_presenter, IMFQualityAdvise_iface); } +static struct video_presenter *impl_from_IDirect3DDeviceManager9(IDirect3DDeviceManager9 *iface) +{ + return CONTAINING_RECORD(iface, struct video_presenter, IDirect3DDeviceManager9_iface); +} + static void video_presenter_notify_renderer(struct video_presenter *presenter, LONG event, LONG_PTR param1, LONG_PTR param2) { @@ -480,6 +486,10 @@ static HRESULT WINAPI video_presenter_inner_QueryInterface(IUnknown *iface, REFI { *obj = &presenter->IMFQualityAdvise_iface; } + else if (IsEqualIID(riid, &IID_IDirect3DDeviceManager9)) + { + *obj = &presenter->IDirect3DDeviceManager9_iface; + } else { WARN("Unimplemented interface %s.\n", debugstr_guid(riid)); @@ -1486,6 +1496,85 @@ static const IMFQualityAdviseVtbl video_presenter_quality_advise_vtbl = video_presenter_quality_advise_DropTime, }; +static HRESULT WINAPI video_presenter_device_manager_QueryInterface(IDirect3DDeviceManager9 *iface, + REFIID riid, void **obj) +{ + struct video_presenter *presenter = impl_from_IDirect3DDeviceManager9(iface); + return IMFVideoPresenter_QueryInterface(&presenter->IMFVideoPresenter_iface, riid, obj); +} + +static ULONG WINAPI video_presenter_device_manager_AddRef(IDirect3DDeviceManager9 *iface) +{ + struct video_presenter *presenter = impl_from_IDirect3DDeviceManager9(iface); + return IMFVideoPresenter_AddRef(&presenter->IMFVideoPresenter_iface); +} + +static ULONG WINAPI video_presenter_device_manager_Release(IDirect3DDeviceManager9 *iface) +{ + struct video_presenter *presenter = impl_from_IDirect3DDeviceManager9(iface); + return IMFVideoPresenter_Release(&presenter->IMFVideoPresenter_iface); +} + +static HRESULT WINAPI video_presenter_device_manager_ResetDevice(IDirect3DDeviceManager9 *iface, + IDirect3DDevice9 *device, UINT token) +{ + struct video_presenter *presenter = impl_from_IDirect3DDeviceManager9(iface); + return IDirect3DDeviceManager9_ResetDevice(presenter->device_manager, device, token); +} + +static HRESULT WINAPI video_presenter_device_manager_OpenDeviceHandle(IDirect3DDeviceManager9 *iface, HANDLE *hdevice) +{ + struct video_presenter *presenter = impl_from_IDirect3DDeviceManager9(iface); + return IDirect3DDeviceManager9_OpenDeviceHandle(presenter->device_manager, hdevice); +} + +static HRESULT WINAPI video_presenter_device_manager_CloseDeviceHandle(IDirect3DDeviceManager9 *iface, HANDLE hdevice) +{ + struct video_presenter *presenter = impl_from_IDirect3DDeviceManager9(iface); + return IDirect3DDeviceManager9_CloseDeviceHandle(presenter->device_manager, hdevice); +} + +static HRESULT WINAPI video_presenter_device_manager_TestDevice(IDirect3DDeviceManager9 *iface, HANDLE hdevice) +{ + struct video_presenter *presenter = impl_from_IDirect3DDeviceManager9(iface); + return IDirect3DDeviceManager9_TestDevice(presenter->device_manager, hdevice); +} + +static HRESULT WINAPI video_presenter_device_manager_LockDevice(IDirect3DDeviceManager9 *iface, HANDLE hdevice, + IDirect3DDevice9 **device, BOOL block) +{ + struct video_presenter *presenter = impl_from_IDirect3DDeviceManager9(iface); + return IDirect3DDeviceManager9_LockDevice(presenter->device_manager, hdevice, device, block); +} + +static HRESULT WINAPI video_presenter_device_manager_UnlockDevice(IDirect3DDeviceManager9 *iface, HANDLE hdevice, + BOOL savestate) +{ + struct video_presenter *presenter = impl_from_IDirect3DDeviceManager9(iface); + return IDirect3DDeviceManager9_UnlockDevice(presenter->device_manager, hdevice, savestate); +} + +static HRESULT WINAPI video_presenter_device_manager_GetVideoService(IDirect3DDeviceManager9 *iface, HANDLE hdevice, + REFIID riid, void **service) +{ + struct video_presenter *presenter = impl_from_IDirect3DDeviceManager9(iface); + return IDirect3DDeviceManager9_GetVideoService(presenter->device_manager, hdevice, riid, service); +} + +static const IDirect3DDeviceManager9Vtbl video_presenter_device_manager_vtbl = +{ + video_presenter_device_manager_QueryInterface, + video_presenter_device_manager_AddRef, + video_presenter_device_manager_Release, + video_presenter_device_manager_ResetDevice, + video_presenter_device_manager_OpenDeviceHandle, + video_presenter_device_manager_CloseDeviceHandle, + video_presenter_device_manager_TestDevice, + video_presenter_device_manager_LockDevice, + video_presenter_device_manager_UnlockDevice, + video_presenter_device_manager_GetVideoService, +}; + HRESULT WINAPI MFCreateVideoPresenter(IUnknown *owner, REFIID riid_device, REFIID riid, void **obj) { TRACE("%p, %s, %s, %p.\n", owner, debugstr_guid(riid_device), debugstr_guid(riid), obj); @@ -1558,6 +1647,7 @@ HRESULT evr_presenter_create(IUnknown *outer, void **out) object->IMFQualityAdvise_iface.lpVtbl = &video_presenter_quality_advise_vtbl; object->allocator_cb.lpVtbl = &video_presenter_allocator_cb_vtbl; object->IUnknown_inner.lpVtbl = &video_presenter_inner_vtbl; + object->IDirect3DDeviceManager9_iface.lpVtbl = &video_presenter_device_manager_vtbl; object->outer_unk = outer ? outer : &object->IUnknown_inner; object->refcount = 1; object->src_rect.right = object->src_rect.bottom = 1.0f; diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c index 55986414a70..34a69559b65 100644 --- a/dlls/evr/tests/evr.c +++ b/dlls/evr/tests/evr.c @@ -1128,8 +1128,8 @@ static void test_default_presenter(void) IMFRateSupport *rate_support; IDirect3DDeviceManager9 *dm; IMFVideoDeviceID *deviceid; + IUnknown *unk, *unk2; HWND hwnd, hwnd2; - IUnknown *unk; DWORD flags; float rate; HRESULT hr; @@ -1153,6 +1153,7 @@ static void test_default_presenter(void) check_interface(presenter, &IID_IMFVideoPresenter, TRUE); check_interface(presenter, &IID_IMFVideoDeviceID, TRUE); check_interface(presenter, &IID_IMFQualityAdvise, TRUE); + check_interface(presenter, &IID_IDirect3DDeviceManager9, TRUE); check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFVideoPositionMapper, TRUE); check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFVideoDisplayControl, TRUE); check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFVideoPresenter, TRUE); @@ -1164,8 +1165,24 @@ static void test_default_presenter(void) check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFVideoDeviceID, TRUE); check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFQualityAdvise, TRUE); check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFTransform, FALSE); + check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IDirect3DDeviceManager9, TRUE); check_service_interface(presenter, &MR_VIDEO_ACCELERATION_SERVICE, &IID_IDirect3DDeviceManager9, TRUE); + /* Query arbitrary supported interface back from device manager wrapper. */ + hr = IMFVideoPresenter_QueryInterface(presenter, &IID_IDirect3DDeviceManager9, (void **)&dm); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + hr = IDirect3DDeviceManager9_QueryInterface(dm, &IID_IQualProp, (void **)&unk); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + IUnknown_Release(unk); + hr = IDirect3DDeviceManager9_QueryInterface(dm, &IID_IUnknown, (void **)&unk); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + hr = IMFVideoPresenter_QueryInterface(presenter, &IID_IUnknown, (void **)&unk2); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(unk == unk2, "Unexpected interface.\n"); + IUnknown_Release(unk2); + IUnknown_Release(unk); + IDirect3DDeviceManager9_Release(dm); + hr = MFGetService((IUnknown *)presenter, &MR_VIDEO_MIXER_SERVICE, &IID_IUnknown, (void **)&unk); ok(hr == MF_E_UNSUPPORTED_SERVICE, "Unexpected hr %#x.\n", hr);