Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mf/evr.c | 17 +++++++++++++---- dlls/mf/tests/mf.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 4 deletions(-)
diff --git a/dlls/mf/evr.c b/dlls/mf/evr.c index 2a529895237..292e84ddd6b 100644 --- a/dlls/mf/evr.c +++ b/dlls/mf/evr.c @@ -2677,17 +2677,26 @@ static ULONG WINAPI video_renderer_rate_support_Release(IMFRateSupport *iface) static HRESULT WINAPI video_renderer_rate_support_GetSlowestRate(IMFRateSupport *iface, MFRATE_DIRECTION direction, BOOL thin, float *rate) { - FIXME("%p, %d, %d, %p.\n", iface, direction, thin, rate); + struct video_renderer *renderer = impl_from_IMFRateSupport(iface);
- return E_NOTIMPL; + TRACE("%p, %d, %d, %p.\n", iface, direction, thin, rate); + + if (renderer->flags & EVR_SHUT_DOWN) + return MF_E_SHUTDOWN; + + *rate = 0.0f; + + return S_OK; }
static HRESULT WINAPI video_renderer_rate_support_GetFastestRate(IMFRateSupport *iface, MFRATE_DIRECTION direction, BOOL thin, float *rate) { - FIXME("%p, %d, %d, %p.\n", iface, direction, thin, rate); + struct video_renderer *renderer = impl_from_IMFRateSupport(iface);
- return E_NOTIMPL; + TRACE("%p, %d, %d, %p.\n", iface, direction, thin, rate); + + return renderer->flags & EVR_SHUT_DOWN ? MF_E_SHUTDOWN : MF_E_INVALIDREQUEST; }
static HRESULT WINAPI video_renderer_rate_support_IsRateSupported(IMFRateSupport *iface, BOOL thin, float rate, diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index 89da5d0ab64..c8c7e0569cc 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -4224,10 +4224,12 @@ static void test_evr(void) DWORD flags, count, value; IMFActivate *activate; HWND window, window2; + IMFRateSupport *rs; LONG sample_count; IMFSample *sample; IUnknown *unk; UINT64 window3; + float rate; HRESULT hr; GUID guid;
@@ -4510,6 +4512,50 @@ todo_wine hr = IMFMediaSink_SetPresentationClock(sink, clock); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ hr = IMFMediaSink_QueryInterface(sink, &IID_IMFRateSupport, (void **)&rs); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + rate = 1.0f; + hr = IMFRateSupport_GetSlowestRate(rs, MFRATE_FORWARD, FALSE, &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, FALSE, &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_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); + + hr = IMFRateSupport_GetFastestRate(rs, MFRATE_FORWARD, FALSE, &rate); + ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr); + + hr = IMFRateSupport_GetFastestRate(rs, MFRATE_REVERSE, FALSE, &rate); + ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr); + + hr = IMFRateSupport_GetFastestRate(rs, MFRATE_FORWARD, TRUE, &rate); + ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr); + + hr = IMFRateSupport_GetFastestRate(rs, MFRATE_REVERSE, TRUE, &rate); + ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr); + + hr = IMFMediaSink_Shutdown(sink); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IMFRateSupport_GetSlowestRate(rs, MFRATE_FORWARD, FALSE, &rate); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); + + hr = IMFRateSupport_GetFastestRate(rs, MFRATE_FORWARD, FALSE, &rate); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); + IMFPresentationClock_Release(clock);
IMFActivate_Release(activate);