[PATCH 2/5] mfplat/tests: Test rate control for media source.

Giovanni Mascellani gmascellani at codeweavers.com
Fri May 7 03:56:25 CDT 2021


Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
---
 dlls/mfplat/tests/mfplat.c | 82 ++++++++++++++++++++++++++++----------
 1 file changed, 61 insertions(+), 21 deletions(-)

diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index 605fbc4fe27..6f7771bb79c 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -94,26 +94,6 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO
         IUnknown_Release(unk);
 }
 
-#define check_service_interface(a, b, c, d) check_service_interface_(__LINE__, a, b, c, d)
-static void check_service_interface_(unsigned int line, void *iface_ptr, REFGUID service, REFIID iid, BOOL supported)
-{
-    IUnknown *iface = iface_ptr;
-    HRESULT hr, expected_hr;
-    IMFGetService *gs;
-    IUnknown *unk;
-
-    expected_hr = supported ? S_OK : E_NOINTERFACE;
-
-    if (SUCCEEDED(hr = IUnknown_QueryInterface(iface, &IID_IMFGetService, (void **)&gs)))
-    {
-        hr = IMFGetService_GetService(gs, service, iid, (void **)&unk);
-        IMFGetService_Release(gs);
-    }
-    ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr);
-    if (SUCCEEDED(hr))
-        IUnknown_Release(unk);
-}
-
 struct d3d11_resource_readback
 {
     ID3D11Resource *resource;
@@ -656,6 +636,7 @@ static void test_source_resolver(void)
     IMFByteStream *stream;
     IMFGetService *get_service;
     IMFRateSupport *rate_support;
+    IMFRateControl *rate_control;
     WCHAR pathW[MAX_PATH];
     int i, sample_count;
     WCHAR *filename;
@@ -663,6 +644,7 @@ static void test_source_resolver(void)
     HRESULT hr;
     GUID guid;
     float rate;
+    BOOL thinning;
 
     if (!pMFCreateSourceResolver)
     {
@@ -804,7 +786,64 @@ todo_wine {
     ok(rate == 0.0f, "Unexpected slowest rate %f.\n", rate);
 }
 
-    check_service_interface(mediasource, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateControl, TRUE);
+    hr = IMFGetService_GetService(get_service, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateControl, (void**)&rate_control);
+    ok(hr == S_OK, "Failed to get rate control interface, hr %#x.\n", hr);
+
+    hr = IMFRateControl_GetRate(rate_control, &thinning, &rate);
+    ok(hr == S_OK, "Failed to get current rate, hr %#x.\n", hr);
+    ok(!thinning, "Unexpected thinning.\n", thinning);
+    ok(rate == 1.0f, "Unexpected rate %f.\n", rate);
+
+    /* 1e6f + 0.06f == 1.0f + 1 ulp */
+    hr = IMFRateControl_SetRate(rate_control, FALSE, 1e6f + 0.06f);
+    ok(hr == MF_E_UNSUPPORTED_RATE, "Unexpected hr %#x.\n", hr);
+    hr = IMFRateControl_GetRate(rate_control, &thinning, &rate);
+    ok(hr == S_OK, "Failed to get current rate, hr %#x.\n", hr);
+    ok(!thinning, "Unexpected thinning.\n", thinning);
+    ok(rate == 1.0f, "Unexpected rate %f.\n", rate);
+
+    hr = IMFRateControl_SetRate(rate_control, FALSE, 1e6f);
+todo_wine
+    ok(hr == S_OK, "Cannot set rate, hr %#x.\n", hr);
+    if (SUCCEEDED(hr))
+    {
+        get_event((IMFMediaEventGenerator *)mediasource, MESourceRateChanged, &var);
+        ok(var.vt == VT_R4 && var.fltVal == 1e6f, "Unexpected rate in propvariant.\n");
+    }
+    hr = IMFRateControl_GetRate(rate_control, &thinning, &rate);
+    ok(hr == S_OK, "Failed to get current rate, hr %#x.\n", hr);
+    ok(!thinning, "Unexpected thinning.\n", thinning);
+todo_wine
+    ok(rate == 1e6f, "Unexpected rate %f.\n", rate);
+
+    hr = IMFRateControl_SetRate(rate_control, FALSE, 0.0f);
+todo_wine
+    ok(hr == S_OK, "Cannot set rate, hr %#x.\n", hr);
+    if (SUCCEEDED(hr))
+    {
+        get_event((IMFMediaEventGenerator *)mediasource, MESourceRateChanged, &var);
+        ok(var.vt == VT_R4 && var.fltVal == 0.0f, "Unexpected rate in propvariant.\n");
+    }
+    hr = IMFRateControl_GetRate(rate_control, &thinning, &rate);
+    ok(hr == S_OK, "Failed to get current rate, hr %#x.\n", hr);
+    ok(!thinning, "Unexpected thinning.\n", thinning);
+todo_wine
+    ok(rate == 0.0f, "Unexpected rate %f.\n", rate);
+
+    hr = IMFRateControl_SetRate(rate_control, FALSE, 1e-6f);
+todo_wine
+    ok(hr == S_OK, "Cannot set rate, hr %#x.\n", hr);
+    if (SUCCEEDED(hr))
+    {
+        get_event((IMFMediaEventGenerator *)mediasource, MESourceRateChanged, &var);
+        ok(var.vt == VT_R4 && var.fltVal == 1e-6f, "Unexpected rate in propvariant.\n");
+    }
+    hr = IMFRateControl_GetRate(rate_control, &thinning, &rate);
+    ok(hr == S_OK, "Failed to get current rate, hr %#x.\n", hr);
+    ok(!thinning, "Unexpected thinning.\n", thinning);
+todo_wine
+    ok(rate == 1e-6f, "Unexpected rate %f.\n", rate);
+
     hr = IMFMediaSource_CreatePresentationDescriptor(mediasource, &descriptor);
     ok(hr == S_OK, "Failed to get presentation descriptor, hr %#x.\n", hr);
     ok(descriptor != NULL, "got %p\n", descriptor);
@@ -917,6 +956,7 @@ todo_wine
     hr = IMFMediaSource_CreatePresentationDescriptor(mediasource, NULL);
     ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
 
+    IMFRateControl_Release(rate_control);
     IMFRateSupport_Release(rate_support);
     IMFGetService_Release(get_service);
     IMFMediaSource_Release(mediasource);
-- 
2.31.1




More information about the wine-devel mailing list