From: Zhiyi Zhang zzhang@codeweavers.com
Needed by Underworld Island (Steam ID: 2150830) to skip videos properly. --- dlls/mfmediaengine/main.c | 20 ++++++++++++-- dlls/mfmediaengine/tests/mfmediaengine.c | 34 +++++++++--------------- 2 files changed, 31 insertions(+), 23 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index 2ef1cb8413a..e69e70fccf6 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -1899,14 +1899,30 @@ static HRESULT WINAPI media_engine_GetPlayed(IMFMediaEngineEx *iface, IMFMediaTi static HRESULT WINAPI media_engine_GetSeekable(IMFMediaEngineEx *iface, IMFMediaTimeRange **seekable) { struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); - HRESULT hr = E_NOTIMPL; + DWORD flags; + HRESULT hr;
- FIXME("(%p, %p): stub.\n", iface, seekable); + TRACE("%p, %p.\n", iface, seekable);
EnterCriticalSection(&engine->cs);
if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) + { hr = MF_E_SHUTDOWN; + LeaveCriticalSection(&engine->cs); + return hr; + } + + hr = create_time_range(seekable); + if (SUCCEEDED(hr) && !isnan(engine->duration) && engine->presentation.source) + { + hr = IMFMediaSource_GetCharacteristics(engine->presentation.source, &flags); + if (SUCCEEDED(hr) && (flags & MFBYTESTREAM_IS_SEEKABLE)) + hr = IMFMediaTimeRange_AddRange(*seekable, 0.0, engine->duration); + + if (FAILED(hr)) + IMFMediaTimeRange_Release(*seekable); + }
LeaveCriticalSection(&engine->cs);
diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c index 36e109d5ad0..e72d99db0de 100644 --- a/dlls/mfmediaengine/tests/mfmediaengine.c +++ b/dlls/mfmediaengine/tests/mfmediaengine.c @@ -2284,14 +2284,10 @@ static void test_GetSeekable(void)
/* Media engine is not ready */ hr = IMFMediaEngineEx_GetSeekable(media_engine, &time_range); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (SUCCEEDED(hr)) - { - count = IMFMediaTimeRange_GetLength(time_range); - ok(!count, "Unexpected count %lu.\n", count); - IMFMediaTimeRange_Release(time_range); - } + count = IMFMediaTimeRange_GetLength(time_range); + ok(!count, "Unexpected count %lu.\n", count); + IMFMediaTimeRange_Release(time_range);
hr = IMFMediaEngineEx_Play(media_engine); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -2305,21 +2301,17 @@ static void test_GetSeekable(void)
/* Media engine is ready */ hr = IMFMediaEngineEx_GetSeekable(media_engine, &time_range); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (SUCCEEDED(hr)) - { - count = IMFMediaTimeRange_GetLength(time_range); - ok(count == 1, "Unexpected count %lu.\n", count); - hr = IMFMediaTimeRange_GetStart(time_range, 0, &start); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(start == 0, "Unexpected start %lf.\n", start); - hr = IMFMediaTimeRange_GetEnd(time_range, 0, &end); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - duration = IMFMediaEngineEx_GetDuration(media_engine); - ok(end == duration, "Unexpected end %lf.\n", end); - IMFMediaTimeRange_Release(time_range); - } + count = IMFMediaTimeRange_GetLength(time_range); + ok(count == 1, "Unexpected count %lu.\n", count); + hr = IMFMediaTimeRange_GetStart(time_range, 0, &start); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(start == 0, "Unexpected start %lf.\n", start); + hr = IMFMediaTimeRange_GetEnd(time_range, 0, &end); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + duration = IMFMediaEngineEx_GetDuration(media_engine); + ok(end == duration, "Unexpected end %lf.\n", end); + IMFMediaTimeRange_Release(time_range);
/* Media engine is shut down */ IMFMediaEngineEx_Shutdown(media_engine);