Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/evr/presenter.c | 29 +++++++++++++++++++++++++++-- dlls/evr/tests/evr.c | 25 +++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-)
diff --git a/dlls/evr/presenter.c b/dlls/evr/presenter.c index 9aef960dbb8..0381cb3e593 100644 --- a/dlls/evr/presenter.c +++ b/dlls/evr/presenter.c @@ -116,6 +116,12 @@ struct video_presenter unsigned int ar_mode; unsigned int state; unsigned int flags; + + struct + { + int presented; + } frame_stats; + CRITICAL_SECTION cs; };
@@ -532,6 +538,7 @@ static void video_presenter_sample_present(struct video_presenter *presenter, IM }
IDirect3DSwapChain9_Present(presenter->swapchain, &src, &dst, NULL, NULL, 0); + presenter->frame_stats.presented++;
IDirect3DDevice9_Release(device); IDirect3DSurface9_Release(backbuffer); @@ -934,6 +941,7 @@ static HRESULT WINAPI video_presenter_OnClockStop(IMFVideoPresenter *iface, MFTI
EnterCriticalSection(&presenter->cs); presenter->state = PRESENTER_STATE_STOPPED; + presenter->frame_stats.presented = 0; LeaveCriticalSection(&presenter->cs);
return S_OK; @@ -1766,9 +1774,26 @@ static HRESULT WINAPI video_presenter_qualprop_get_FramesDroppedInRenderer(IQual
static HRESULT WINAPI video_presenter_qualprop_get_FramesDrawn(IQualProp *iface, int *frames) { - FIXME("%p, %p stub.\n", iface, frames); + struct video_presenter *presenter = impl_from_IQualProp(iface); + HRESULT hr = S_OK;
- return E_NOTIMPL; + TRACE("%p, %p.\n", iface, frames); + + EnterCriticalSection(&presenter->cs); + + switch (presenter->state) + { + case PRESENTER_STATE_STARTED: + case PRESENTER_STATE_PAUSED: + if (frames) *frames = presenter->frame_stats.presented; + else hr = E_POINTER; + default: + hr = E_NOTIMPL; + } + + LeaveCriticalSection(&presenter->cs); + + return hr; }
static HRESULT WINAPI video_presenter_qualprop_get_AvgFrameRate(IQualProp *iface, int *avg_frame_rate) diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c index 48115388993..57b64937b79 100644 --- a/dlls/evr/tests/evr.c +++ b/dlls/evr/tests/evr.c @@ -2240,6 +2240,8 @@ static void test_presenter_quality_control(void) MF_QUALITY_DROP_MODE mode; IMFQualityAdvise *advise; MF_QUALITY_LEVEL level; + IQualProp *qual_prop; + int frame_count; HRESULT hr;
hr = MFCreateVideoPresenter(NULL, &IID_IDirect3DDevice9, &IID_IMFVideoPresenter, (void **)&presenter); @@ -2293,6 +2295,17 @@ todo_wine {
IMFQualityAdvise_Release(advise);
+ hr = IMFVideoPresenter_QueryInterface(presenter, &IID_IQualProp, (void **)&qual_prop); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IQualProp_get_FramesDrawn(qual_prop, NULL); + ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr); + + hr = IQualProp_get_FramesDrawn(qual_prop, &frame_count); + ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr); + + IQualProp_Release(qual_prop); + IMFVideoPresenter_Release(presenter); }
@@ -2432,6 +2445,8 @@ static void test_presenter_shutdown(void) IMFVideoPresenter *presenter; IMFVideoDeviceID *deviceid; HWND window, window2; + IQualProp *qual_prop; + int frame_count; HRESULT hr; DWORD mode; RECT rect; @@ -2453,6 +2468,9 @@ static void test_presenter_shutdown(void) hr = IMFVideoPresenter_QueryInterface(presenter, &IID_IMFVideoDisplayControl, (void **)&display_control); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ hr = IMFVideoPresenter_QueryInterface(presenter, &IID_IQualProp, (void **)&qual_prop); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + hr = IMFTopologyServiceLookupClient_ReleaseServicePointers(lookup_client); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
@@ -2505,9 +2523,16 @@ static void test_presenter_shutdown(void) hr = IMFVideoDisplayControl_RepaintVideo(display_control); ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+ hr = IQualProp_get_FramesDrawn(qual_prop, NULL); + ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr); + + hr = IQualProp_get_FramesDrawn(qual_prop, &frame_count); + ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr); + hr = IMFTopologyServiceLookupClient_ReleaseServicePointers(lookup_client); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ IQualProp_Release(qual_prop); IMFVideoDeviceID_Release(deviceid); IMFVideoDisplayControl_Release(display_control); IMFTopologyServiceLookupClient_Release(lookup_client);