[PATCH 1/7] mfplay: Better handle video control method calls when there is no media item set.

Nikolay Sivov nsivov at codeweavers.com
Mon Oct 25 05:04:16 CDT 2021


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mfplay/player.c          | 33 +++++++-------
 dlls/mfplay/tests/Makefile.in |  2 +-
 dlls/mfplay/tests/mfplay.c    | 86 +++++++++++++++++++++++++++++++++--
 3 files changed, 101 insertions(+), 20 deletions(-)

diff --git a/dlls/mfplay/player.c b/dlls/mfplay/player.c
index 28226f92962..03f204768ab 100644
--- a/dlls/mfplay/player.c
+++ b/dlls/mfplay/player.c
@@ -1323,6 +1323,15 @@ static HRESULT WINAPI media_player_SetMute(IMFPMediaPlayer *iface, BOOL mute)
     return E_NOTIMPL;
 }
 
+static HRESULT media_player_get_display_control(const struct media_player *player,
+        IMFVideoDisplayControl **display_control)
+{
+    HRESULT hr = MFGetService((IUnknown *)player->session, &MR_VIDEO_RENDER_SERVICE,
+            &IID_IMFVideoDisplayControl, (void **)display_control);
+    if (SUCCEEDED(hr)) return hr;
+    return hr == MF_E_SHUTDOWN ? hr : MF_E_INVALIDREQUEST;
+}
+
 static HRESULT WINAPI media_player_GetNativeVideoSize(IMFPMediaPlayer *iface,
         SIZE *video, SIZE *arvideo)
 {
@@ -1332,8 +1341,7 @@ static HRESULT WINAPI media_player_GetNativeVideoSize(IMFPMediaPlayer *iface,
 
     TRACE("%p, %p, %p.\n", iface, video, arvideo);
 
-    if (SUCCEEDED(hr = MFGetService((IUnknown *)player->session, &MR_VIDEO_RENDER_SERVICE,
-            &IID_IMFVideoDisplayControl, (void **)&display_control)))
+    if (SUCCEEDED(hr = media_player_get_display_control(player, &display_control)))
     {
         hr = IMFVideoDisplayControl_GetNativeVideoSize(display_control, video, arvideo);
         IMFVideoDisplayControl_Release(display_control);
@@ -1351,8 +1359,7 @@ static HRESULT WINAPI media_player_GetIdealVideoSize(IMFPMediaPlayer *iface,
 
     TRACE("%p, %p, %p.\n", iface, min_size, max_size);
 
-    if (SUCCEEDED(hr = MFGetService((IUnknown *)player->session, &MR_VIDEO_RENDER_SERVICE,
-            &IID_IMFVideoDisplayControl, (void **)&display_control)))
+    if (SUCCEEDED(hr = media_player_get_display_control(player, &display_control)))
     {
         hr = IMFVideoDisplayControl_GetIdealVideoSize(display_control, min_size, max_size);
         IMFVideoDisplayControl_Release(display_control);
@@ -1370,8 +1377,7 @@ static HRESULT WINAPI media_player_SetVideoSourceRect(IMFPMediaPlayer *iface,
 
     TRACE("%p, %p.\n", iface, rect);
 
-    if (SUCCEEDED(hr = MFGetService((IUnknown *)player->session, &MR_VIDEO_RENDER_SERVICE,
-            &IID_IMFVideoDisplayControl, (void **)&display_control)))
+    if (SUCCEEDED(hr = media_player_get_display_control(player, &display_control)))
     {
         hr = IMFVideoDisplayControl_SetVideoPosition(display_control, rect, NULL);
         IMFVideoDisplayControl_Release(display_control);
@@ -1390,8 +1396,7 @@ static HRESULT WINAPI media_player_GetVideoSourceRect(IMFPMediaPlayer *iface,
 
     TRACE("%p, %p.\n", iface, rect);
 
-    if (SUCCEEDED(hr = MFGetService((IUnknown *)player->session, &MR_VIDEO_RENDER_SERVICE,
-            &IID_IMFVideoDisplayControl, (void **)&display_control)))
+    if (SUCCEEDED(hr = media_player_get_display_control(player, &display_control)))
     {
         hr = IMFVideoDisplayControl_GetVideoPosition(display_control, rect, &dest);
         IMFVideoDisplayControl_Release(display_control);
@@ -1408,8 +1413,7 @@ static HRESULT WINAPI media_player_SetAspectRatioMode(IMFPMediaPlayer *iface, DW
 
     TRACE("%p, %u.\n", iface, mode);
 
-    if (SUCCEEDED(hr = MFGetService((IUnknown *)player->session, &MR_VIDEO_RENDER_SERVICE,
-            &IID_IMFVideoDisplayControl, (void **)&display_control)))
+    if (SUCCEEDED(hr = media_player_get_display_control(player, &display_control)))
     {
         hr = IMFVideoDisplayControl_SetAspectRatioMode(display_control, mode);
         IMFVideoDisplayControl_Release(display_control);
@@ -1427,8 +1431,7 @@ static HRESULT WINAPI media_player_GetAspectRatioMode(IMFPMediaPlayer *iface,
 
     TRACE("%p, %p.\n", iface, mode);
 
-    if (SUCCEEDED(hr = MFGetService((IUnknown *)player->session, &MR_VIDEO_RENDER_SERVICE,
-            &IID_IMFVideoDisplayControl, (void **)&display_control)))
+    if (SUCCEEDED(hr = media_player_get_display_control(player, &display_control)))
     {
         hr = IMFVideoDisplayControl_GetAspectRatioMode(display_control, mode);
         IMFVideoDisplayControl_Release(display_control);
@@ -1463,8 +1466,7 @@ static HRESULT WINAPI media_player_SetBorderColor(IMFPMediaPlayer *iface, COLORR
 
     TRACE("%p, %#x.\n", iface, color);
 
-    if (SUCCEEDED(hr = MFGetService((IUnknown *)player->session, &MR_VIDEO_RENDER_SERVICE,
-            &IID_IMFVideoDisplayControl, (void **)&display_control)))
+    if (SUCCEEDED(hr = media_player_get_display_control(player, &display_control)))
     {
         hr = IMFVideoDisplayControl_SetBorderColor(display_control, color);
         IMFVideoDisplayControl_Release(display_control);
@@ -1481,8 +1483,7 @@ static HRESULT WINAPI media_player_GetBorderColor(IMFPMediaPlayer *iface, COLORR
 
     TRACE("%p, %p.\n", iface, color);
 
-    if (SUCCEEDED(hr = MFGetService((IUnknown *)player->session, &MR_VIDEO_RENDER_SERVICE,
-            &IID_IMFVideoDisplayControl, (void **)&display_control)))
+    if (SUCCEEDED(hr = media_player_get_display_control(player, &display_control)))
     {
         hr = IMFVideoDisplayControl_GetBorderColor(display_control, color);
         IMFVideoDisplayControl_Release(display_control);
diff --git a/dlls/mfplay/tests/Makefile.in b/dlls/mfplay/tests/Makefile.in
index 43c7ec26240..4eabb5ae0ab 100644
--- a/dlls/mfplay/tests/Makefile.in
+++ b/dlls/mfplay/tests/Makefile.in
@@ -1,5 +1,5 @@
 TESTDLL   = mfplay.dll
-IMPORTS   = mfplay uuid mfuuid
+IMPORTS   = mfplay user32 uuid mfuuid
 
 C_SRCS = \
 	mfplay.c
diff --git a/dlls/mfplay/tests/mfplay.c b/dlls/mfplay/tests/mfplay.c
index 438d636daa2..074cee6d217 100644
--- a/dlls/mfplay/tests/mfplay.c
+++ b/dlls/mfplay/tests/mfplay.c
@@ -142,13 +142,16 @@ static void test_create_player(void)
 
 static void test_shutdown(void)
 {
-    SIZE min_size, max_size;
+    SIZE size, min_size, max_size;
+    MFP_MEDIAPLAYER_STATE state;
+    MFVideoNormalizedRect rect;
     IMFPMediaPlayer *player;
     float slowest, fastest;
-    HRESULT hr;
-    MFP_MEDIAPLAYER_STATE state;
     IMFPMediaItem *item;
+    COLORREF color;
     HWND window;
+    DWORD mode;
+    HRESULT hr;
 
     hr = MFPCreateMediaPlayer(NULL, FALSE, 0, NULL, NULL, &player);
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
@@ -180,6 +183,28 @@ static void test_shutdown(void)
     hr = IMFPMediaPlayer_GetIdealVideoSize(player, &min_size, &max_size);
     ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
 
+    hr = IMFPMediaPlayer_GetVideoSourceRect(player, &rect);
+    ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFPMediaPlayer_GetBorderColor(player, &color);
+    ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFPMediaPlayer_GetAspectRatioMode(player, &mode);
+    ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFPMediaPlayer_GetNativeVideoSize(player, &size, &size);
+    ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFPMediaPlayer_SetBorderColor(player, 0);
+    ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFPMediaPlayer_SetAspectRatioMode(player, MFVideoARMode_None);
+    ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFPMediaPlayer_UpdateVideo(player);
+todo_wine
+    ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+
     hr = IMFPMediaPlayer_CreateMediaItemFromURL(player, L"url", TRUE, 0, &item);
     ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
 
@@ -212,9 +237,64 @@ static void test_media_item(void)
     IMFPMediaPlayer_Release(player);
 }
 
+static void test_video_control(void)
+{
+    MFVideoNormalizedRect rect;
+    IMFPMediaPlayer *player;
+    COLORREF color;
+    HWND window;
+    DWORD mode;
+    HRESULT hr;
+    SIZE size;
+
+    window = CreateWindowA("static", "mfplay_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, 0, 0, 0, 0);
+    ok(!!window, "Failed to create output window.\n");
+
+    hr = MFPCreateMediaPlayer(NULL, FALSE, 0, NULL, window, &player);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    /* No active media item */
+
+    rect.left = rect.top = 0.0f;
+    rect.right = rect.bottom = 1.0f;
+    hr = IMFPMediaPlayer_SetVideoSourceRect(player, &rect);
+    ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFPMediaPlayer_SetBorderColor(player, 0);
+    ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFPMediaPlayer_SetAspectRatioMode(player, MFVideoARMode_None);
+    ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFPMediaPlayer_GetVideoSourceRect(player, &rect);
+    ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFPMediaPlayer_GetBorderColor(player, &color);
+    ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFPMediaPlayer_GetAspectRatioMode(player, &mode);
+    ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFPMediaPlayer_GetIdealVideoSize(player, &size, &size);
+    ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFPMediaPlayer_GetNativeVideoSize(player, &size, &size);
+    ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFPMediaPlayer_UpdateVideo(player);
+todo_wine
+    ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
+
+    IMFPMediaPlayer_Release(player);
+
+    DestroyWindow(window);
+}
+
 START_TEST(mfplay)
 {
     test_create_player();
     test_shutdown();
     test_media_item();
+    test_video_control();
 }
-- 
2.33.0




More information about the wine-devel mailing list