[PATCH 2/2] mfmediaengine: Return full presentation range in GetBuffered().

Nikolay Sivov nsivov at codeweavers.com
Wed Jan 27 08:37:01 CST 2021


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mfmediaengine/main.c                | 17 ++++++++++++++---
 dlls/mfmediaengine/tests/mfmediaengine.c | 14 ++++++++++++++
 2 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c
index 0573ea844c1..6f6811ff9ea 100644
--- a/dlls/mfmediaengine/main.c
+++ b/dlls/mfmediaengine/main.c
@@ -1152,11 +1152,22 @@ static HRESULT WINAPI media_engine_SetPreload(IMFMediaEngine *iface, MF_MEDIA_EN
     return S_OK;
 }
 
-static HRESULT WINAPI media_engine_GetBuffered(IMFMediaEngine *iface, IMFMediaTimeRange **buffered)
+static HRESULT WINAPI media_engine_GetBuffered(IMFMediaEngine *iface, IMFMediaTimeRange **range)
 {
-    FIXME("(%p, %p): stub.\n", iface, buffered);
+    struct media_engine *engine = impl_from_IMFMediaEngine(iface);
+    HRESULT hr;
 
-    return E_NOTIMPL;
+    TRACE("%p, %p.\n", iface, range);
+
+    if (FAILED(hr = create_time_range(range)))
+        return hr;
+
+    EnterCriticalSection(&engine->cs);
+    if (!isnan(engine->duration))
+        hr = IMFMediaTimeRange_AddRange(*range, 0.0, engine->duration);
+    LeaveCriticalSection(&engine->cs);
+
+    return hr;
 }
 
 static HRESULT WINAPI media_engine_Load(IMFMediaEngine *iface)
diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c
index 1cc88420568..66984595d3b 100644
--- a/dlls/mfmediaengine/tests/mfmediaengine.c
+++ b/dlls/mfmediaengine/tests/mfmediaengine.c
@@ -391,13 +391,27 @@ static void test_Play(void)
 {
     struct media_engine_notify notify_impl = {{&media_engine_notify_vtbl}, 1};
     IMFMediaEngineNotify *callback = &notify_impl.IMFMediaEngineNotify_iface;
+    IMFMediaTimeRange *range, *range1;
     IMFMediaEngine *media_engine;
     LONGLONG pts;
+    DWORD count;
     HRESULT hr;
     BOOL ret;
 
     media_engine = create_media_engine(callback);
 
+    hr = IMFMediaEngine_GetBuffered(media_engine, &range);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    hr = IMFMediaEngine_GetBuffered(media_engine, &range1);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(range != range1, "Unexpected pointer.\n");
+
+    count = IMFMediaTimeRange_GetLength(range);
+    ok(!count, "Unexpected count %u.\n", count);
+
+    IMFMediaTimeRange_Release(range);
+    IMFMediaTimeRange_Release(range1);
+
     ret = IMFMediaEngine_IsPaused(media_engine);
     ok(ret, "Unexpected state %d.\n", ret);
 
-- 
2.29.2




More information about the wine-devel mailing list