From 8d791562133469554dbd6f9fe9aee04fd024dc40 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Wed, 17 Jun 2020 14:59:34 +0300 Subject: [PATCH] evr: Add IMFVideoDeviceID to default mixer. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/evr/mixer.c | 66 ++++++++++++++++++++++++++++++++++++++++---- dlls/evr/tests/evr.c | 16 ++++++++--- 2 files changed, 73 insertions(+), 9 deletions(-) diff --git a/dlls/evr/mixer.c b/dlls/evr/mixer.c index 41d63c8aab5..97eaf976fc8 100644 --- a/dlls/evr/mixer.c +++ b/dlls/evr/mixer.c @@ -29,6 +29,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(evr); struct video_mixer { IMFTransform IMFTransform_iface; + IMFVideoDeviceID IMFVideoDeviceID_iface; LONG refcount; }; @@ -37,19 +38,35 @@ static struct video_mixer *impl_from_IMFTransform(IMFTransform *iface) return CONTAINING_RECORD(iface, struct video_mixer, IMFTransform_iface); } +static struct video_mixer *impl_from_IMFVideoDeviceID(IMFVideoDeviceID *iface) +{ + return CONTAINING_RECORD(iface, struct video_mixer, IMFVideoDeviceID_iface); +} + static HRESULT WINAPI video_mixer_transform_QueryInterface(IMFTransform *iface, REFIID riid, void **obj) { + struct video_mixer *mixer = impl_from_IMFTransform(iface); + + TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj); + if (IsEqualIID(riid, &IID_IMFTransform) || IsEqualIID(riid, &IID_IUnknown)) { *obj = iface; - IMFTransform_AddRef(iface); - return S_OK; + } + else if (IsEqualIID(riid, &IID_IMFVideoDeviceID)) + { + *obj = &mixer->IMFVideoDeviceID_iface; + } + else + { + WARN("Unsupported interface %s.\n", debugstr_guid(riid)); + *obj = NULL; + return E_NOINTERFACE; } - WARN("Unsupported interface %s.\n", debugstr_guid(riid)); - *obj = NULL; - return E_NOINTERFACE; + IUnknown_AddRef((IUnknown *)*obj); + return S_OK; } static ULONG WINAPI video_mixer_transform_AddRef(IMFTransform *iface) @@ -273,6 +290,44 @@ static const IMFTransformVtbl video_mixer_transform_vtbl = video_mixer_transform_ProcessOutput, }; +static HRESULT WINAPI video_mixer_device_id_QueryInterface(IMFVideoDeviceID *iface, REFIID riid, void **obj) +{ + struct video_mixer *mixer = impl_from_IMFVideoDeviceID(iface); + return IMFTransform_QueryInterface(&mixer->IMFTransform_iface, riid, obj); +} + +static ULONG WINAPI video_mixer_device_id_AddRef(IMFVideoDeviceID *iface) +{ + struct video_mixer *mixer = impl_from_IMFVideoDeviceID(iface); + return IMFTransform_AddRef(&mixer->IMFTransform_iface); +} + +static ULONG WINAPI video_mixer_device_id_Release(IMFVideoDeviceID *iface) +{ + struct video_mixer *mixer = impl_from_IMFVideoDeviceID(iface); + return IMFTransform_Release(&mixer->IMFTransform_iface); +} + +static HRESULT WINAPI video_mixer_device_id_GetDeviceID(IMFVideoDeviceID *iface, IID *device_id) +{ + TRACE("%p, %p.\n", iface, device_id); + + if (!device_id) + return E_POINTER; + + memcpy(device_id, &IID_IDirect3DDevice9, sizeof(*device_id)); + + return S_OK; +} + +static const IMFVideoDeviceIDVtbl video_mixer_device_id_vtbl = +{ + video_mixer_device_id_QueryInterface, + video_mixer_device_id_AddRef, + video_mixer_device_id_Release, + video_mixer_device_id_GetDeviceID, +}; + HRESULT WINAPI MFCreateVideoMixer(IUnknown *owner, REFIID riid_device, REFIID riid, void **obj) { TRACE("%p, %s, %s, %p.\n", owner, debugstr_guid(riid_device), debugstr_guid(riid), obj); @@ -296,6 +351,7 @@ HRESULT evr_mixer_create(IUnknown *outer, void **out) return E_OUTOFMEMORY; object->IMFTransform_iface.lpVtbl = &video_mixer_transform_vtbl; + object->IMFVideoDeviceID_iface.lpVtbl = &video_mixer_device_id_vtbl; object->refcount = 1; *out = &object->IMFTransform_iface; diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c index c4b1a561576..7fa6136b0e9 100644 --- a/dlls/evr/tests/evr.c +++ b/dlls/evr/tests/evr.c @@ -340,9 +340,11 @@ static void test_pin_info(void) static void test_default_mixer(void) { + IMFVideoDeviceID *deviceid; IMFTransform *transform; IUnknown *unk; HRESULT hr; + IID iid; hr = MFCreateVideoMixer(NULL, &IID_IDirect3DDevice9, &IID_IMFTransform, (void **)&transform); ok(hr == S_OK, "Failed to create default mixer, hr %#x.\n", hr); @@ -353,11 +355,17 @@ todo_wine if (SUCCEEDED(hr)) IUnknown_Release(unk); - hr = IMFTransform_QueryInterface(transform, &IID_IMFVideoDeviceID, (void **)&unk); -todo_wine + hr = IMFTransform_QueryInterface(transform, &IID_IMFVideoDeviceID, (void **)&deviceid); ok(hr == S_OK, "Unexpected hr %#x.\n", hr); - if (SUCCEEDED(hr)) - IUnknown_Release(unk); + + hr = IMFVideoDeviceID_GetDeviceID(deviceid, NULL); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); + + hr = IMFVideoDeviceID_GetDeviceID(deviceid, &iid); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(IsEqualIID(&iid, &IID_IDirect3DDevice9), "Unexpected id %s.\n", wine_dbgstr_guid(&iid)); + + IMFVideoDeviceID_Release(deviceid); IMFTransform_Release(transform);