[PATCH 3/4] evr/presenter: Handle type invalidation calls without attached mixer.
Nikolay Sivov
nsivov at codeweavers.com
Wed Oct 27 09:23:04 CDT 2021
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/evr/presenter.c | 5 ++-
dlls/evr/tests/evr.c | 74 ++++++++++++++++++++++++++++++++++++++++----
2 files changed, 72 insertions(+), 7 deletions(-)
diff --git a/dlls/evr/presenter.c b/dlls/evr/presenter.c
index 5b262e7c663..027d0338896 100644
--- a/dlls/evr/presenter.c
+++ b/dlls/evr/presenter.c
@@ -348,6 +348,9 @@ static HRESULT video_presenter_invalidate_media_type(struct video_presenter *pre
RECT rect;
HRESULT hr;
+ if (!presenter->mixer)
+ return MF_E_TRANSFORM_TYPE_NOT_SET;
+
if (FAILED(hr = MFCreateMediaType(&media_type)))
return hr;
@@ -965,7 +968,7 @@ static HRESULT WINAPI video_presenter_ProcessMessage(IMFVideoPresenter *iface, M
switch (message)
{
case MFVP_MESSAGE_INVALIDATEMEDIATYPE:
- hr = video_presenter_invalidate_media_type(presenter);
+ hr = presenter->mixer ? video_presenter_invalidate_media_type(presenter) : MF_E_INVALIDREQUEST;
break;
case MFVP_MESSAGE_BEGINSTREAMING:
hr = video_presenter_start_streaming(presenter);
diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c
index 6fb92d9ced1..8e3288afaec 100644
--- a/dlls/evr/tests/evr.c
+++ b/dlls/evr/tests/evr.c
@@ -1754,12 +1754,41 @@ static void test_presenter_video_position(void)
DWORD count;
HWND hwnd;
+ hwnd = create_window();
+ ok(!!hwnd, "Failed to create a test window.\n");
+
+ /* Setting position without the mixer. */
+ hr = MFCreateVideoPresenter(NULL, &IID_IDirect3DDevice9, &IID_IMFVideoPresenter, (void **)&presenter);
+ ok(hr == S_OK, "Failed to create default presenter, hr %#x.\n", hr);
+ hr = IMFVideoPresenter_QueryInterface(presenter, &IID_IMFVideoDisplayControl, (void **)&display_control);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFVideoPresenter_ProcessMessage(presenter, MFVP_MESSAGE_INVALIDATEMEDIATYPE, 0);
+ ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
+ SetRect(&dst_rect, 0, 0, 10, 10);
+ hr = IMFVideoDisplayControl_SetVideoPosition(display_control, NULL, &dst_rect);
+ ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
+ hr = IMFVideoDisplayControl_SetVideoWindow(display_control, hwnd);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFVideoPresenter_ProcessMessage(presenter, MFVP_MESSAGE_INVALIDATEMEDIATYPE, 0);
+ ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
+ hr = IMFVideoDisplayControl_SetVideoPosition(display_control, NULL, &dst_rect);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ IMFVideoDisplayControl_Release(display_control);
+ IMFVideoPresenter_Release(presenter);
+
+ /* With the mixer. */
hr = MFCreateVideoMixer(NULL, &IID_IDirect3DDevice9, &IID_IMFTransform, (void **)&mixer);
ok(hr == S_OK, "Failed to create a mixer, hr %#x.\n", hr);
hr = MFCreateVideoPresenter(NULL, &IID_IDirect3DDevice9, &IID_IMFVideoPresenter, (void **)&presenter);
ok(hr == S_OK, "Failed to create default presenter, hr %#x.\n", hr);
+ hr = IMFVideoPresenter_QueryInterface(presenter, &IID_IMFVideoDisplayControl, (void **)&display_control);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
hr = IMFVideoPresenter_QueryInterface(presenter, &IID_IMFTopologyServiceLookupClient, (void **)&lookup_client);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
@@ -1785,9 +1814,6 @@ static void test_presenter_video_position(void)
ok(src_rect.left == 0.0f && src_rect.top == 0.0f && src_rect.right == 1.0f &&
src_rect.bottom == 1.0f, "Unexpected source rectangle.\n");
- hr = IMFVideoPresenter_QueryInterface(presenter, &IID_IMFVideoDisplayControl, (void **)&display_control);
- ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
-
hr = IMFVideoDisplayControl_GetVideoPosition(display_control, NULL, &dst_rect);
ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
@@ -1806,9 +1832,6 @@ static void test_presenter_video_position(void)
ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
/* Setting position requires a window. */
- hwnd = create_window();
- ok(!!hwnd, "Failed to create a test window.\n");
-
SetRect(&dst_rect, 0, 0, 10, 10);
memset(&src_rect, 0, sizeof(src_rect));
hr = IMFVideoDisplayControl_SetVideoPosition(display_control, &src_rect, &dst_rect);
@@ -2297,6 +2320,44 @@ done:
DestroyWindow(window);
}
+static void test_presenter_shutdown(void)
+{
+ IMFTopologyServiceLookupClient *lookup_client;
+ IMFVideoPresenter *presenter;
+ HRESULT hr;
+
+ hr = MFCreateVideoPresenter(NULL, &IID_IDirect3DDevice9, &IID_IMFVideoPresenter, (void **)&presenter);
+ ok(hr == S_OK, "Failed to create default presenter, hr %#x.\n", hr);
+
+ hr = IMFVideoPresenter_QueryInterface(presenter, &IID_IMFTopologyServiceLookupClient, (void **)&lookup_client);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFTopologyServiceLookupClient_ReleaseServicePointers(lookup_client);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFVideoPresenter_ProcessMessage(presenter, MFVP_MESSAGE_INVALIDATEMEDIATYPE, 0);
+todo_wine
+ ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFVideoPresenter_ProcessMessage(presenter, MFVP_MESSAGE_BEGINSTREAMING, 0);
+todo_wine
+ ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFVideoPresenter_ProcessMessage(presenter, MFVP_MESSAGE_ENDSTREAMING, 0);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFVideoPresenter_ProcessMessage(presenter, MFVP_MESSAGE_PROCESSINPUTNOTIFY, 0);
+todo_wine
+ ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFTopologyServiceLookupClient_ReleaseServicePointers(lookup_client);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ IMFTopologyServiceLookupClient_Release(lookup_client);
+
+ IMFVideoPresenter_Release(presenter);
+}
+
static void test_mixer_output_rectangle(void)
{
IMFVideoMixerControl *mixer_control;
@@ -2848,6 +2909,7 @@ START_TEST(evr)
test_presenter_video_window();
test_presenter_quality_control();
test_presenter_media_type();
+ test_presenter_shutdown();
test_mixer_output_rectangle();
test_mixer_zorder();
test_mixer_samples();
--
2.33.0
More information about the wine-devel
mailing list