[PATCH 2/7] mfmediaengine: Use presentation clock interface from the session.

Nikolay Sivov nsivov at codeweavers.com
Fri Jan 29 06:09:57 CST 2021


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mfmediaengine/main.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c
index 6f6811ff9ea..2bf7cf45da1 100644
--- a/dlls/mfmediaengine/main.c
+++ b/dlls/mfmediaengine/main.c
@@ -126,7 +126,7 @@ struct media_engine
     MF_MEDIA_ENGINE_READY ready_state;
     MF_MEDIA_ENGINE_PRELOAD preload;
     IMFMediaSession *session;
-    IMFClock *clock;
+    IMFPresentationClock *clock;
     IMFSourceResolver *resolver;
     BSTR current_source;
     struct video_frame video_frame;
@@ -982,7 +982,7 @@ static void free_media_engine(struct media_engine *engine)
     if (engine->callback)
         IMFMediaEngineNotify_Release(engine->callback);
     if (engine->clock)
-        IMFClock_Release(engine->clock);
+        IMFPresentationClock_Release(engine->clock);
     if (engine->session)
         IMFMediaSession_Release(engine->session);
     if (engine->attributes)
@@ -1208,16 +1208,14 @@ static BOOL WINAPI media_engine_IsSeeking(IMFMediaEngine *iface)
 static double WINAPI media_engine_GetCurrentTime(IMFMediaEngine *iface)
 {
     struct media_engine *engine = impl_from_IMFMediaEngine(iface);
-    LONGLONG clocktime;
     double ret = 0.0;
-    MFTIME systime;
+    MFTIME clocktime;
 
     TRACE("%p.\n", iface);
 
     EnterCriticalSection(&engine->cs);
-    if (SUCCEEDED(IMFClock_GetCorrelatedTime(engine->clock, 0, &clocktime, &systime)))
+    if (SUCCEEDED(IMFPresentationClock_GetTime(engine->clock, &clocktime)))
     {
-        /* Assume 100ns clock. */
         ret = (double)clocktime / 10000000.0;
     }
     LeaveCriticalSection(&engine->cs);
@@ -1854,6 +1852,7 @@ static HRESULT init_media_engine(DWORD flags, IMFAttributes *attributes, struct
 {
     DXGI_FORMAT output_format;
     UINT64 playback_hwnd;
+    IMFClock *clock;
     HRESULT hr;
 
     engine->IMFMediaEngine_iface.lpVtbl = &media_engine_vtbl;
@@ -1877,7 +1876,12 @@ static HRESULT init_media_engine(DWORD flags, IMFAttributes *attributes, struct
     if (FAILED(hr = MFCreateMediaSession(NULL, &engine->session)))
         return hr;
 
-    if (FAILED(hr = IMFMediaSession_GetClock(engine->session, &engine->clock)))
+    if (FAILED(hr = IMFMediaSession_GetClock(engine->session, &clock)))
+        return hr;
+
+    hr = IMFClock_QueryInterface(clock, &IID_IMFPresentationClock, (void **)&engine->clock);
+    IMFClock_Release(clock);
+    if (FAILED(hr))
         return hr;
 
     if (FAILED(hr = IMFMediaSession_BeginGetEvent(engine->session, &engine->session_events, NULL)))
-- 
2.29.2




More information about the wine-devel mailing list