Nikolay Sivov : mfmediaengine: Handle realtime mode flag.

Alexandre Julliard julliard at winehq.org
Fri Feb 18 15:14:58 CST 2022


Module: wine
Branch: master
Commit: 40c992398249c039358b2bf1dcf16c075ac9ae63
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=40c992398249c039358b2bf1dcf16c075ac9ae63

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Feb 18 10:47:41 2022 +0300

mfmediaengine: Handle realtime mode flag.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mfmediaengine/main.c                | 31 ++++++++++++++++++++++----
 dlls/mfmediaengine/tests/mfmediaengine.c | 38 +++++++++++++++++++++++++++++++-
 2 files changed, 64 insertions(+), 5 deletions(-)

diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c
index a78cc130657..01ce8cd6437 100644
--- a/dlls/mfmediaengine/main.c
+++ b/dlls/mfmediaengine/main.c
@@ -1169,6 +1169,9 @@ static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMedi
         IMFTopologyNode *sar_node = NULL, *audio_src = NULL;
         IMFTopologyNode *grabber_node = NULL, *video_src = NULL;
 
+        if (engine->flags & MF_MEDIA_ENGINE_REAL_TIME_MODE)
+            IMFTopology_SetUINT32(topology, &MF_LOW_LATENCY, TRUE);
+
         if (sd_audio)
         {
             if (FAILED(hr = media_engine_create_source_node(source, pd, sd_audio, &audio_src)))
@@ -2695,16 +2698,36 @@ static HRESULT WINAPI media_engine_SetAudioEndpointRole(IMFMediaEngineEx *iface,
 
 static HRESULT WINAPI media_engine_GetRealTimeMode(IMFMediaEngineEx *iface, BOOL *enabled)
 {
-    FIXME("%p, %p stub.\n", iface, enabled);
+    struct media_engine *engine = impl_from_IMFMediaEngineEx(iface);
+    HRESULT hr = S_OK;
 
-    return E_NOTIMPL;
+    TRACE("%p, %p.\n", iface, enabled);
+
+    EnterCriticalSection(&engine->cs);
+    if (engine->flags & FLAGS_ENGINE_SHUT_DOWN)
+        hr = MF_E_SHUTDOWN;
+    else
+        *enabled = !!(engine->flags & MF_MEDIA_ENGINE_REAL_TIME_MODE);
+    LeaveCriticalSection(&engine->cs);
+
+    return hr;
 }
 
 static HRESULT WINAPI media_engine_SetRealTimeMode(IMFMediaEngineEx *iface, BOOL enable)
 {
-    FIXME("%p, %d stub.\n", iface, enable);
+    struct media_engine *engine = impl_from_IMFMediaEngineEx(iface);
+    HRESULT hr = S_OK;
 
-    return E_NOTIMPL;
+    TRACE("%p, %d.\n", iface, enable);
+
+    EnterCriticalSection(&engine->cs);
+    if (engine->flags & FLAGS_ENGINE_SHUT_DOWN)
+        hr = MF_E_SHUTDOWN;
+    else
+        media_engine_set_flag(engine, MF_MEDIA_ENGINE_REAL_TIME_MODE, enable);
+    LeaveCriticalSection(&engine->cs);
+
+    return hr;
 }
 
 static HRESULT WINAPI media_engine_SetCurrentTimeEx(IMFMediaEngineEx *iface, double seektime, MF_MEDIA_ENGINE_SEEK_MODE mode)
diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c
index f05f24b7172..e4d9d752f20 100644
--- a/dlls/mfmediaengine/tests/mfmediaengine.c
+++ b/dlls/mfmediaengine/tests/mfmediaengine.c
@@ -240,12 +240,14 @@ static void test_factory(void)
 static void test_CreateInstance(void)
 {
     struct media_engine_notify *notify;
+    IMFMediaEngineEx *media_engine_ex;
     IMFDXGIDeviceManager *manager;
     IMFMediaEngine *media_engine;
     IMFAttributes *attributes;
     IUnknown *unk;
     UINT token;
     HRESULT hr;
+    BOOL ret;
 
     notify = create_callback();
 
@@ -273,7 +275,8 @@ static void test_CreateInstance(void)
     hr = IMFAttributes_SetUINT32(attributes, &MF_MEDIA_ENGINE_VIDEO_OUTPUT_FORMAT, DXGI_FORMAT_UNKNOWN);
     ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
 
-    hr = IMFMediaEngineClassFactory_CreateInstance(factory, MF_MEDIA_ENGINE_WAITFORSTABLE_STATE, attributes, &media_engine);
+    hr = IMFMediaEngineClassFactory_CreateInstance(factory, MF_MEDIA_ENGINE_REAL_TIME_MODE
+            | MF_MEDIA_ENGINE_WAITFORSTABLE_STATE, attributes, &media_engine);
     ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
 
     check_interface(media_engine, &IID_IMFMediaEngine, TRUE);
@@ -283,6 +286,29 @@ static void test_CreateInstance(void)
     if (SUCCEEDED(hr))
         IUnknown_Release(unk);
 
+    if (SUCCEEDED(IMFMediaEngine_QueryInterface(media_engine, &IID_IMFMediaEngineEx, (void **)&media_engine_ex)))
+    {
+        hr = IMFMediaEngineEx_GetRealTimeMode(media_engine_ex, &ret);
+        ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+        ok(ret, "Unexpected value.\n");
+
+        hr = IMFMediaEngineEx_SetRealTimeMode(media_engine_ex, FALSE);
+        ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+
+        hr = IMFMediaEngineEx_GetRealTimeMode(media_engine_ex, &ret);
+        ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+        ok(!ret, "Unexpected value.\n");
+
+        hr = IMFMediaEngineEx_SetRealTimeMode(media_engine_ex, TRUE);
+        ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+
+        hr = IMFMediaEngineEx_GetRealTimeMode(media_engine_ex, &ret);
+        ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+        ok(ret, "Unexpected value.\n");
+
+        IMFMediaEngineEx_Release(media_engine_ex);
+    }
+
     IMFMediaEngine_Release(media_engine);
     IMFAttributes_Release(attributes);
     IMFDXGIDeviceManager_Release(manager);
@@ -301,6 +327,7 @@ static void test_Shutdown(void)
     double val;
     HRESULT hr;
     BSTR str;
+    BOOL ret;
 
     notify = create_callback();
 
@@ -457,6 +484,15 @@ static void test_Shutdown(void)
         hr = IMFMediaEngineEx_GetResourceCharacteristics(media_engine_ex, &flags);
         ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr);
 
+        hr = IMFMediaEngineEx_GetRealTimeMode(media_engine_ex, NULL);
+        ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr);
+
+        hr = IMFMediaEngineEx_GetRealTimeMode(media_engine_ex, &ret);
+        ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr);
+
+        hr = IMFMediaEngineEx_SetRealTimeMode(media_engine_ex, TRUE);
+        ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr);
+
         IMFMediaEngineEx_Release(media_engine_ex);
     }
 




More information about the wine-cvs mailing list