[PATCH 1/2] evr/mixer: Implement GetAvailableVideoProcessorModes().

Nikolay Sivov nsivov at codeweavers.com
Mon Apr 11 03:23:12 CDT 2022


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/evr/mixer.c     | 22 ++++++++++++++++++++--
 dlls/evr/tests/evr.c | 16 ++++++++--------
 2 files changed, 28 insertions(+), 10 deletions(-)

diff --git a/dlls/evr/mixer.c b/dlls/evr/mixer.c
index 0b957e7b6bd..c7e3033f2d1 100644
--- a/dlls/evr/mixer.c
+++ b/dlls/evr/mixer.c
@@ -1930,9 +1930,27 @@ static ULONG WINAPI video_mixer_processor_Release(IMFVideoProcessor *iface)
 static HRESULT WINAPI video_mixer_processor_GetAvailableVideoProcessorModes(IMFVideoProcessor *iface, UINT *count,
         GUID **modes)
 {
-    FIXME("%p, %p, %p.\n", iface, count, modes);
+    struct video_mixer *mixer = impl_from_IMFVideoProcessor(iface);
+    IDirectXVideoProcessorService *service;
+    DXVA2_VideoDesc video_desc;
+    HRESULT hr;
 
-    return E_NOTIMPL;
+    TRACE("%p, %p, %p.\n", iface, count, modes);
+
+    EnterCriticalSection(&mixer->cs);
+
+    if (!mixer->inputs[0].media_type || !mixer->output.media_type)
+        hr = MF_E_TRANSFORM_TYPE_NOT_SET;
+    else if (SUCCEEDED(hr = video_mixer_get_processor_service(mixer, &service)))
+    {
+        video_mixer_init_dxva_videodesc(mixer->inputs[0].media_type, &video_desc);
+        hr = IDirectXVideoProcessorService_GetVideoProcessorDeviceGuids(service, &video_desc, count, modes);
+        IDirectXVideoProcessorService_Release(service);
+    }
+
+    LeaveCriticalSection(&mixer->cs);
+
+    return hr;
 }
 
 static HRESULT WINAPI video_mixer_processor_GetVideoProcessorCaps(IMFVideoProcessor *iface, GUID *mode,
diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c
index ea67ff5b584..bd280836046 100644
--- a/dlls/evr/tests/evr.c
+++ b/dlls/evr/tests/evr.c
@@ -654,7 +654,6 @@ static void test_default_mixer(void)
     ok(hr == MF_E_TRANSFORM_TYPE_NOT_SET, "Unexpected hr %#lx.\n", hr);
 
     hr = IMFVideoProcessor_GetAvailableVideoProcessorModes(processor, &count, &guids);
-    todo_wine
     ok(hr == MF_E_TRANSFORM_TYPE_NOT_SET, "Unexpected hr %#lx.\n", hr);
 
     IMFVideoProcessor_Release(processor);
@@ -1071,6 +1070,9 @@ static void test_default_mixer_type_negotiation(void)
     hr = MFCreateVideoMixer(NULL, &IID_IDirect3DDevice9, &IID_IMFTransform, (void **)&transform);
     ok(hr == S_OK, "Failed to create default mixer, hr %#lx.\n", hr);
 
+    hr = IMFTransform_QueryInterface(transform, &IID_IMFVideoProcessor, (void **)&processor);
+    ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+
     hr = IMFTransform_GetInputAvailableType(transform, 0, 0, &media_type);
     ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr);
 
@@ -1095,6 +1097,9 @@ static void test_default_mixer_type_negotiation(void)
     hr = IMFTransform_SetInputType(transform, 0, media_type, MFT_SET_TYPE_TEST_ONLY);
     ok(hr == MF_E_NOT_INITIALIZED, "Unexpected hr %#lx.\n", hr);
 
+    hr = IMFVideoProcessor_GetAvailableVideoProcessorModes(processor, &count, &guids);
+    ok(hr == MF_E_TRANSFORM_TYPE_NOT_SET, "Unexpected hr %#lx.\n", hr);
+
     /* Now try with device manager. */
 
     window = create_window();
@@ -1282,9 +1287,6 @@ static void test_default_mixer_type_negotiation(void)
     IMFMediaType_Release(media_type2);
     IMFMediaType_Release(media_type);
 
-    hr = IMFTransform_QueryInterface(transform, &IID_IMFVideoProcessor, (void **)&processor);
-    ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
-
     hr = IMFVideoProcessor_GetVideoProcessorMode(processor, &guid);
     todo_wine
     ok(hr == MF_E_TRANSFORM_TYPE_NOT_SET, "Unexpected hr %#lx.\n", hr);
@@ -1302,7 +1304,6 @@ static void test_default_mixer_type_negotiation(void)
     IMFMediaType_Release(media_type);
 
     hr = IMFVideoProcessor_GetAvailableVideoProcessorModes(processor, &count, &guids);
-    todo_wine
     ok(hr == MF_E_TRANSFORM_TYPE_NOT_SET, "Unexpected hr %#lx.\n", hr);
 
     hr = IMFTransform_GetOutputAvailableType(transform, 0, 0, &media_type);
@@ -1319,10 +1320,9 @@ static void test_default_mixer_type_negotiation(void)
     ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
 
     hr = IMFVideoProcessor_GetAvailableVideoProcessorModes(processor, &count, &guids);
-    todo_wine
     ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
-    if (SUCCEEDED(hr))
-        CoTaskMemFree(guids);
+    ok(count > 0 && !!guids, "Unexpected modes data.\n");
+    CoTaskMemFree(guids);
 
     hr = IMFTransform_GetOutputCurrentType(transform, 0, &media_type2);
     ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
-- 
2.35.1




More information about the wine-devel mailing list