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