Nikolay Sivov : evr: Add IMFVideoDeviceID to default mixer.
Alexandre Julliard
julliard at winehq.org
Wed Jun 17 15:54:02 CDT 2020
Module: wine
Branch: master
Commit: 8d791562133469554dbd6f9fe9aee04fd024dc40
URL: https://source.winehq.org/git/wine.git/?a=commit;h=8d791562133469554dbd6f9fe9aee04fd024dc40
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Wed Jun 17 14:59:34 2020 +0300
evr: Add IMFVideoDeviceID to default mixer.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
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 41d63c8aab..97eaf976fc 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 c4b1a56157..7fa6136b0e 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);
More information about the wine-cvs
mailing list