[PATCH 1/3] mf/evr: Implement IsRateSupported().

Nikolay Sivov nsivov at codeweavers.com
Wed Feb 16 02:53:30 CST 2022


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mf/evr.c      | 33 +++++++++++++++--
 dlls/mf/tests/mf.c | 92 +++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 121 insertions(+), 4 deletions(-)

diff --git a/dlls/mf/evr.c b/dlls/mf/evr.c
index eae8338df7a..1d7c792fb1a 100644
--- a/dlls/mf/evr.c
+++ b/dlls/mf/evr.c
@@ -2715,6 +2715,17 @@ static ULONG WINAPI video_renderer_rate_support_Release(IMFRateSupport *iface)
     return IMFMediaSink_Release(&renderer->IMFMediaSink_iface);
 }
 
+static BOOL video_renderer_is_main_stream_configured(const struct video_renderer *renderer)
+{
+    IMFMediaType *media_type;
+    HRESULT hr;
+
+    if (SUCCEEDED(hr = IMFTransform_GetInputCurrentType(renderer->mixer, 0, &media_type)))
+        IMFMediaType_Release(media_type);
+
+    return SUCCEEDED(hr);
+}
+
 static HRESULT WINAPI video_renderer_rate_support_GetSlowestRate(IMFRateSupport *iface, MFRATE_DIRECTION direction,
         BOOL thin, float *rate)
 {
@@ -2741,11 +2752,27 @@ static HRESULT WINAPI video_renderer_rate_support_GetFastestRate(IMFRateSupport
 }
 
 static HRESULT WINAPI video_renderer_rate_support_IsRateSupported(IMFRateSupport *iface, BOOL thin, float rate,
-        float *nearest_supported_rate)
+        float *nearest_rate)
 {
-    FIXME("%p, %d, %f, %p.\n", iface, thin, rate, nearest_supported_rate);
+    struct video_renderer *renderer = impl_from_IMFRateSupport(iface);
+    HRESULT hr = S_OK;
 
-    return E_NOTIMPL;
+    TRACE("%p, %d, %f, %p.\n", iface, thin, rate, nearest_rate);
+
+    EnterCriticalSection(&renderer->cs);
+    if (renderer->flags & EVR_SHUT_DOWN)
+        hr = MF_E_SHUTDOWN;
+    else
+    {
+        if (!thin && !video_renderer_is_main_stream_configured(renderer))
+            hr = MF_E_INVALIDREQUEST;
+
+        if (nearest_rate)
+            *nearest_rate = rate;
+    }
+    LeaveCriticalSection(&renderer->cs);
+
+    return hr;
 }
 
 static const IMFRateSupportVtbl video_renderer_rate_support_vtbl =
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index 6bde7568202..58c7cbbadd4 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -4258,6 +4258,10 @@ if (SUCCEEDED(hr))
 
 static void test_evr(void)
 {
+    static const float supported_rates[] =
+    {
+        0.0f, 1.0f, -20.0f, 20.0f, 1000.0f, -1000.0f,
+    };
     IMFVideoSampleAllocatorCallback *allocator_callback;
     IMFStreamSink *stream_sink, *stream_sink2;
     IMFVideoDisplayControl *display_control;
@@ -4275,8 +4279,9 @@ static void test_evr(void)
     IMFRateSupport *rs;
     LONG sample_count;
     IMFSample *sample;
-    IUnknown *unk;
+    unsigned int i;
     UINT64 window3;
+    IUnknown *unk;
     float rate;
     HRESULT hr;
     GUID guid;
@@ -4607,6 +4612,88 @@ todo_wine {
     hr = IMFRateSupport_GetFastestRate(rs, MFRATE_REVERSE, TRUE, &rate);
     ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
 
+    for (i = 0; i < ARRAY_SIZE(supported_rates); ++i)
+    {
+        rate = supported_rates[i] + 1.0f;
+        hr = IMFRateSupport_IsRateSupported(rs, TRUE, supported_rates[i], &rate);
+        ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+        ok(rate == supported_rates[i], "Unexpected rate %f.\n", rate);
+
+        rate = supported_rates[i] + 1.0f;
+        hr = IMFRateSupport_IsRateSupported(rs, FALSE, supported_rates[i], &rate);
+        ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
+        ok(rate == supported_rates[i], "Unexpected rate %f.\n", rate);
+
+        hr = IMFRateSupport_IsRateSupported(rs, TRUE, supported_rates[i], NULL);
+        ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+        hr = IMFRateSupport_IsRateSupported(rs, FALSE, supported_rates[i], NULL);
+        ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
+    }
+
+    /* Configuring stream type make rate support work. */
+    hr = IMFMediaSink_GetStreamSinkById(sink, 0, &stream_sink);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    hr = IMFStreamSink_GetMediaTypeHandler(stream_sink, &type_handler);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    hr = MFCreateMediaType(&media_type);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    hr = IMFMediaType_SetGUID(media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Video);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    hr = IMFMediaType_SetGUID(media_type, &MF_MT_SUBTYPE, &MFVideoFormat_RGB32);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    hr = IMFMediaType_SetUINT64(media_type, &MF_MT_FRAME_SIZE, (UINT64)64 << 32 | 64);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    hr = IMFMediaType_SetUINT32(media_type, &MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    hr = IMFMediaTypeHandler_SetCurrentMediaType(type_handler, media_type);
+    ok(hr == S_OK, "Failed to set current type, hr %#x.\n", hr);
+
+    rate = 1.0f;
+    hr = IMFRateSupport_GetSlowestRate(rs, MFRATE_FORWARD, TRUE, &rate);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(rate == 0.0f, "Unexpected rate %f.\n", rate);
+
+    rate = 1.0f;
+    hr = IMFRateSupport_GetSlowestRate(rs, MFRATE_REVERSE, TRUE, &rate);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(rate == 0.0f, "Unexpected rate %f.\n", rate);
+
+    rate = 0.0f;
+    hr = IMFRateSupport_GetFastestRate(rs, MFRATE_FORWARD, TRUE, &rate);
+todo_wine {
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(rate == FLT_MAX, "Unexpected rate %f.\n", rate);
+}
+    rate = 0.0f;
+    hr = IMFRateSupport_GetFastestRate(rs, MFRATE_REVERSE, TRUE, &rate);
+todo_wine {
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(rate == -FLT_MAX, "Unexpected rate %f.\n", rate);
+}
+    for (i = 0; i < ARRAY_SIZE(supported_rates); ++i)
+    {
+        rate = supported_rates[i] + 1.0f;
+        hr = IMFRateSupport_IsRateSupported(rs, TRUE, supported_rates[i], &rate);
+        ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+        ok(rate == supported_rates[i], "Unexpected rate %f.\n", rate);
+
+        rate = supported_rates[i] + 1.0f;
+        hr = IMFRateSupport_IsRateSupported(rs, FALSE, supported_rates[i], &rate);
+        ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+        ok(rate == supported_rates[i], "Unexpected rate %f.\n", rate);
+
+        hr = IMFRateSupport_IsRateSupported(rs, TRUE, supported_rates[i], NULL);
+        ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+        hr = IMFRateSupport_IsRateSupported(rs, FALSE, supported_rates[i], NULL);
+        ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    }
+
+    IMFMediaTypeHandler_Release(type_handler);
+    IMFMediaType_Release(media_type);
+    IMFStreamSink_Release(stream_sink);
+
     hr = IMFMediaSink_Shutdown(sink);
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
 
@@ -4622,6 +4709,9 @@ todo_wine {
     hr = IMFRateSupport_GetFastestRate(rs, MFRATE_FORWARD, FALSE, &rate);
     ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
 
+    hr = IMFRateSupport_IsRateSupported(rs, TRUE, 1.0f, &rate);
+    ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+
     IMFPresentationClock_Release(clock);
 
     IMFActivate_Release(activate);
-- 
2.34.1




More information about the wine-devel mailing list