[PATCH 2/3] mf: Return clock rate as session rate.

Nikolay Sivov nsivov at codeweavers.com
Fri Jul 5 04:40:02 CDT 2019


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mf/session.c  | 15 +++++++++++++--
 dlls/mf/tests/mf.c | 48 +++++++++++++++++++++++++++++++++++++---------
 2 files changed, 52 insertions(+), 11 deletions(-)

diff --git a/dlls/mf/session.c b/dlls/mf/session.c
index c43e6d2838..1a36933883 100644
--- a/dlls/mf/session.c
+++ b/dlls/mf/session.c
@@ -68,6 +68,7 @@ struct media_session
     LONG refcount;
     IMFMediaEventQueue *event_queue;
     IMFPresentationClock *clock;
+    IMFRateControl *clock_rate_control;
     struct list topologies;
     enum session_state state;
     CRITICAL_SECTION cs;
@@ -315,6 +316,8 @@ static ULONG WINAPI mfsession_Release(IMFMediaSession *iface)
             IMFMediaEventQueue_Release(session->event_queue);
         if (session->clock)
             IMFPresentationClock_Release(session->clock);
+        if (session->clock_rate_control)
+            IMFRateControl_Release(session->clock_rate_control);
         DeleteCriticalSection(&session->cs);
         heap_free(session);
     }
@@ -723,9 +726,11 @@ static HRESULT WINAPI session_rate_control_SetRate(IMFRateControl *iface, BOOL t
 
 static HRESULT WINAPI session_rate_control_GetRate(IMFRateControl *iface, BOOL *thin, float *rate)
 {
-    FIXME("%p, %p, %p.\n", iface, thin, rate);
+    struct media_session *session = impl_session_from_IMFRateControl(iface);
 
-    return E_NOTIMPL;
+    TRACE("%p, %p, %p.\n", iface, thin, rate);
+
+    return IMFRateControl_GetRate(session->clock_rate_control, thin, rate);
 }
 
 static const IMFRateControlVtbl session_rate_control_vtbl =
@@ -769,6 +774,12 @@ HRESULT WINAPI MFCreateMediaSession(IMFAttributes *config, IMFMediaSession **ses
     if (FAILED(hr = MFCreatePresentationClock(&object->clock)))
         goto failed;
 
+    if (FAILED(hr = IMFPresentationClock_QueryInterface(object->clock, &IID_IMFRateControl,
+            (void **)&object->clock_rate_control)))
+    {
+        goto failed;
+    }
+
     *session = &object->IMFMediaSession_iface;
 
     return S_OK;
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index 8c1b0c294e..5f848b152f 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -951,14 +951,16 @@ static void test_session_events(IMFMediaSession *session)
 
 static void test_media_session(void)
 {
+    IMFRateControl *rate_control, *rate_control2;
     MFCLOCK_PROPERTIES clock_props;
+    IMFRateSupport *rate_support;
     IMFMediaSession *session;
-    IMFRateControl *rc, *rc2;
-    IMFRateSupport *rs;
     IMFGetService *gs;
     IMFClock *clock;
     IUnknown *unk;
     HRESULT hr;
+    float rate;
+    BOOL thin;
 
     hr = MFStartup(MF_VERSION, MFSTARTUP_FULL);
     ok(hr == S_OK, "Startup failure, hr %#x.\n", hr);
@@ -972,29 +974,57 @@ static void test_media_session(void)
     hr = IMFMediaSession_QueryInterface(session, &IID_IMFGetService, (void **)&gs);
     ok(hr == S_OK, "Failed to get interface, hr %#x.\n", hr);
 
-    hr = IMFGetService_GetService(gs, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateSupport, (void **)&rs);
+    hr = IMFGetService_GetService(gs, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateSupport, (void **)&rate_support);
     ok(hr == S_OK, "Failed to get rate support interface, hr %#x.\n", hr);
 
-    hr = IMFGetService_GetService(gs, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateControl, (void **)&rc);
+    hr = IMFGetService_GetService(gs, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateControl, (void **)&rate_control);
     ok(hr == S_OK, "Failed to get rate control interface, hr %#x.\n", hr);
 
-    hr = IMFRateSupport_QueryInterface(rs, &IID_IMFMediaSession, (void **)&unk);
+    hr = IMFRateSupport_QueryInterface(rate_support, &IID_IMFMediaSession, (void **)&unk);
     ok(hr == S_OK, "Failed to get session interface, hr %#x.\n", hr);
     ok(unk == (IUnknown *)session, "Unexpected pointer.\n");
     IUnknown_Release(unk);
 
+    hr = IMFRateControl_GetRate(rate_control, NULL, NULL);
+    ok(FAILED(hr), "Unexpected hr %#x.\n", hr);
+
+    rate = 0.0f;
+    hr = IMFRateControl_GetRate(rate_control, NULL, &rate);
+    ok(hr == S_OK, "Failed to get playback rate, hr %#x.\n", hr);
+    ok(rate == 1.0f, "Unexpected rate %f.\n", rate);
+
+    hr = IMFRateControl_GetRate(rate_control, &thin, NULL);
+    ok(FAILED(hr), "Unexpected hr %#x.\n", hr);
+
+    thin = TRUE;
+    rate = 0.0f;
+    hr = IMFRateControl_GetRate(rate_control, &thin, &rate);
+    ok(hr == S_OK, "Failed to get playback rate, hr %#x.\n", hr);
+    ok(!thin, "Unexpected thinning.\n");
+    ok(rate == 1.0f, "Unexpected rate %f.\n", rate);
+
     hr = IMFMediaSession_GetClock(session, &clock);
     ok(hr == S_OK, "Failed to get clock, hr %#x.\n", hr);
 
-    hr = IMFClock_QueryInterface(clock, &IID_IMFRateControl, (void **)&rc2);
+    hr = IMFClock_QueryInterface(clock, &IID_IMFRateControl, (void **)&rate_control2);
     ok(hr == S_OK, "Failed to get rate control, hr %#x.\n", hr);
-    IMFRateControl_Release(rc2);
+
+    rate = 0.0f;
+    hr = IMFRateControl_GetRate(rate_control2, NULL, &rate);
+    ok(hr == S_OK, "Failed to get clock rate, hr %#x.\n", hr);
+    ok(rate == 1.0f, "Unexpected rate %f.\n", rate);
+
+    hr = IMFRateControl_SetRate(rate_control, FALSE, 1.5f);
+todo_wine
+    ok(hr == S_OK, "Failed to set rate, hr %#x.\n", hr);
+
+    IMFRateControl_Release(rate_control2);
 
     hr = IMFClock_GetProperties(clock, &clock_props);
     ok(hr == MF_E_CLOCK_NO_TIME_SOURCE, "Unexpected hr %#x.\n", hr);
 
-    IMFRateControl_Release(rc);
-    IMFRateSupport_Release(rs);
+    IMFRateControl_Release(rate_control);
+    IMFRateSupport_Release(rate_support);
 
     IMFGetService_Release(gs);
 
-- 
2.20.1




More information about the wine-devel mailing list