Signed-off-by: Nikolay Sivov nsivov@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(); }
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfplay/player.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/mfplay/player.c b/dlls/mfplay/player.c index 03f204768ab..fb748a485d8 100644 --- a/dlls/mfplay/player.c +++ b/dlls/mfplay/player.c @@ -705,7 +705,7 @@ static HRESULT WINAPI media_item_GetMetadata(IMFPMediaItem *iface, IPropertyStor TRACE("%p, %p.\n", iface, metadata);
return MFGetService((IUnknown *)item->source, &MF_PROPERTY_HANDLER_SERVICE, - &IID_IPropertyStore, (void **)&metadata); + &IID_IPropertyStore, (void **)metadata); }
static const IMFPMediaItemVtbl media_item_vtbl =
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfplay/player.c | 7 +++++-- dlls/mfplay/tests/mfplay.c | 43 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-)
diff --git a/dlls/mfplay/player.c b/dlls/mfplay/player.c index fb748a485d8..2ccee418b72 100644 --- a/dlls/mfplay/player.c +++ b/dlls/mfplay/player.c @@ -1373,13 +1373,16 @@ static HRESULT WINAPI media_player_SetVideoSourceRect(IMFPMediaPlayer *iface, { struct media_player *player = impl_from_IMFPMediaPlayer(iface); IMFVideoDisplayControl *display_control; + RECT dst_rect; HRESULT hr;
TRACE("%p, %p.\n", iface, rect);
- if (SUCCEEDED(hr = media_player_get_display_control(player, &display_control))) + if (!GetClientRect(player->output_window, &dst_rect)) + hr = HRESULT_FROM_WIN32(GetLastError()); + else if (SUCCEEDED(hr = media_player_get_display_control(player, &display_control))) { - hr = IMFVideoDisplayControl_SetVideoPosition(display_control, rect, NULL); + hr = IMFVideoDisplayControl_SetVideoPosition(display_control, rect, &dst_rect); IMFVideoDisplayControl_Release(display_control); }
diff --git a/dlls/mfplay/tests/mfplay.c b/dlls/mfplay/tests/mfplay.c index 074cee6d217..70fde9160c8 100644 --- a/dlls/mfplay/tests/mfplay.c +++ b/dlls/mfplay/tests/mfplay.c @@ -261,6 +261,49 @@ static void test_video_control(void) hr = IMFPMediaPlayer_SetVideoSourceRect(player, &rect); ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
+ hr = IMFPMediaPlayer_SetVideoSourceRect(player, NULL); + 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); + + /* No active media item, no output window.*/ + + hr = MFPCreateMediaPlayer(NULL, FALSE, 0, NULL, NULL, &player); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + rect.left = rect.top = 0.0f; + rect.right = rect.bottom = 1.0f; + hr = IMFPMediaPlayer_SetVideoSourceRect(player, &rect); + ok(hr == HRESULT_FROM_WIN32(ERROR_INVALID_WINDOW_HANDLE), "Unexpected hr %#x.\n", hr); + + hr = IMFPMediaPlayer_SetVideoSourceRect(player, NULL); + ok(hr == HRESULT_FROM_WIN32(ERROR_INVALID_WINDOW_HANDLE), "Unexpected hr %#x.\n", hr); + hr = IMFPMediaPlayer_SetBorderColor(player, 0); ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfplay/player.c | 15 +++++++++++++-- dlls/mfplay/tests/mfplay.c | 11 +++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/dlls/mfplay/player.c b/dlls/mfplay/player.c index 2ccee418b72..adb88fff053 100644 --- a/dlls/mfplay/player.c +++ b/dlls/mfplay/player.c @@ -968,8 +968,6 @@ static HRESULT media_player_create_item_from_url(struct media_player *player, IUnknown *object; HRESULT hr;
- *ret = NULL; - if (FAILED(hr = create_media_item(&player->IMFPMediaPlayer_iface, user_data, &item))) return hr;
@@ -981,6 +979,11 @@ static HRESULT media_player_create_item_from_url(struct media_player *player,
if (sync) { + if (!ret) + return E_POINTER; + + *ret = NULL; + if (SUCCEEDED(hr = IMFSourceResolver_CreateObjectFromURL(player->resolver, url, MF_RESOLUTION_MEDIASOURCE, player->propstore, &obj_type, &object))) { @@ -1000,6 +1003,14 @@ static HRESULT media_player_create_item_from_url(struct media_player *player, } else { + if (!player->callback) + { + WARN("Asynchronous item creation is not supported without user callback.\n"); + return MF_E_INVALIDREQUEST; + } + + if (ret) *ret = NULL; + hr = IMFSourceResolver_BeginCreateObjectFromURL(player->resolver, url, MF_RESOLUTION_MEDIASOURCE, player->propstore, NULL, &player->resolver_callback, (IUnknown *)&item->IMFPMediaItem_iface);
diff --git a/dlls/mfplay/tests/mfplay.c b/dlls/mfplay/tests/mfplay.c index 70fde9160c8..f18e041a4d0 100644 --- a/dlls/mfplay/tests/mfplay.c +++ b/dlls/mfplay/tests/mfplay.c @@ -226,6 +226,7 @@ todo_wine static void test_media_item(void) { IMFPMediaPlayer *player; + IMFPMediaItem *item; HRESULT hr;
hr = MFPCreateMediaPlayer(NULL, FALSE, 0, NULL, NULL, &player); @@ -234,6 +235,16 @@ static void test_media_item(void) hr = IMFPMediaPlayer_SetMediaItem(player, NULL); ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
+ /* Async mode, no callback was specified. */ + hr = IMFPMediaPlayer_CreateMediaItemFromURL(player, L"url", FALSE, 0, &item); + ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr); + + hr = IMFPMediaPlayer_CreateMediaItemFromURL(player, L"url", FALSE, 0, NULL); + ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr); + + hr = IMFPMediaPlayer_CreateMediaItemFromURL(player, L"url", TRUE, 0, NULL); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); + IMFPMediaPlayer_Release(player); }
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfplay/player.c | 22 +++++++++++++++++++--- dlls/mfplay/tests/mfplay.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 3 deletions(-)
diff --git a/dlls/mfplay/player.c b/dlls/mfplay/player.c index adb88fff053..0e33dcbd649 100644 --- a/dlls/mfplay/player.c +++ b/dlls/mfplay/player.c @@ -909,11 +909,27 @@ static HRESULT WINAPI media_player_GetPosition(IMFPMediaPlayer *iface, REFGUID p return E_NOTIMPL; }
-static HRESULT WINAPI media_player_GetDuration(IMFPMediaPlayer *iface, REFGUID postype, PROPVARIANT *position) +static HRESULT WINAPI media_player_GetDuration(IMFPMediaPlayer *iface, REFGUID postype, PROPVARIANT *duration) { - FIXME("%p, %s, %p.\n", iface, debugstr_guid(postype), position); + struct media_player *player = impl_from_IMFPMediaPlayer(iface); + HRESULT hr;
- return E_NOTIMPL; + TRACE("%p, %s, %p.\n", iface, debugstr_guid(postype), duration); + + if (!postype || !duration) + return E_POINTER; + + EnterCriticalSection(&player->cs); + if (player->state == MFP_MEDIAPLAYER_STATE_SHUTDOWN) + hr = MF_E_SHUTDOWN; + else if (!player->item) + hr = MF_E_INVALIDREQUEST; + else + /* FIXME: use start/stop markers for resulting duration */ + hr = IMFPMediaItem_GetDuration(player->item, postype, duration); + LeaveCriticalSection(&player->cs); + + return hr; }
static HRESULT WINAPI media_player_SetRate(IMFPMediaPlayer *iface, float rate) diff --git a/dlls/mfplay/tests/mfplay.c b/dlls/mfplay/tests/mfplay.c index f18e041a4d0..cfa689c189e 100644 --- a/dlls/mfplay/tests/mfplay.c +++ b/dlls/mfplay/tests/mfplay.c @@ -148,6 +148,7 @@ static void test_shutdown(void) IMFPMediaPlayer *player; float slowest, fastest; IMFPMediaItem *item; + PROPVARIANT propvar; COLORREF color; HWND window; DWORD mode; @@ -217,6 +218,15 @@ todo_wine hr = IMFPMediaPlayer_GetVideoWindow(player, &window); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ hr = IMFPMediaPlayer_GetDuration(player, NULL, NULL); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); + + hr = IMFPMediaPlayer_GetDuration(player, &MFP_POSITIONTYPE_100NS, NULL); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); + + hr = IMFPMediaPlayer_GetDuration(player, &MFP_POSITIONTYPE_100NS, &propvar); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); + hr = IMFPMediaPlayer_Shutdown(player); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
@@ -345,10 +355,33 @@ todo_wine DestroyWindow(window); }
+static void test_duration(void) +{ + IMFPMediaPlayer *player; + PROPVARIANT propvar; + HRESULT hr; + + hr = MFPCreateMediaPlayer(NULL, FALSE, 0, NULL, NULL, &player); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + /* No media item. */ + hr = IMFPMediaPlayer_GetDuration(player, NULL, NULL); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); + + hr = IMFPMediaPlayer_GetDuration(player, &MFP_POSITIONTYPE_100NS, NULL); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); + + hr = IMFPMediaPlayer_GetDuration(player, &MFP_POSITIONTYPE_100NS, &propvar); + ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr); + + IMFPMediaPlayer_Release(player); +} + START_TEST(mfplay) { test_create_player(); test_shutdown(); test_media_item(); test_video_control(); + test_duration(); }
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfplay/player.c | 40 +++++++++++++++++++++++++++++++++++--- dlls/mfplay/tests/mfplay.c | 24 +++++++++++++++++++++++ 2 files changed, 61 insertions(+), 3 deletions(-)
diff --git a/dlls/mfplay/player.c b/dlls/mfplay/player.c index 0e33dcbd649..a34973f8e36 100644 --- a/dlls/mfplay/player.c +++ b/dlls/mfplay/player.c @@ -904,9 +904,40 @@ static HRESULT WINAPI media_player_SetPosition(IMFPMediaPlayer *iface, REFGUID p
static HRESULT WINAPI media_player_GetPosition(IMFPMediaPlayer *iface, REFGUID postype, PROPVARIANT *position) { - FIXME("%p, %s, %p.\n", iface, debugstr_guid(postype), position); + struct media_player *player = impl_from_IMFPMediaPlayer(iface); + IMFPresentationClock *presentation_clock; + IMFClock *clock; + HRESULT hr;
- return E_NOTIMPL; + TRACE("%p, %s, %p.\n", iface, debugstr_guid(postype), position); + + if (!position) + return E_POINTER; + + if (!IsEqualGUID(postype, &MFP_POSITIONTYPE_100NS)) + return E_INVALIDARG; + + EnterCriticalSection(&player->cs); + if (player->state == MFP_MEDIAPLAYER_STATE_SHUTDOWN) + hr = MF_E_SHUTDOWN; + else if (!player->item) + hr = MF_E_INVALIDREQUEST; + else + { + if (SUCCEEDED(hr = IMFMediaSession_GetClock(player->session, &clock))) + { + if (SUCCEEDED(hr = IMFClock_QueryInterface(clock, &IID_IMFPresentationClock, (void **)&presentation_clock))) + { + position->vt = VT_UI8; + hr = IMFPresentationClock_GetTime(presentation_clock, (MFTIME *)&position->uhVal.QuadPart); + IMFPresentationClock_Release(presentation_clock); + } + IMFClock_Release(clock); + } + } + LeaveCriticalSection(&player->cs); + + return hr; }
static HRESULT WINAPI media_player_GetDuration(IMFPMediaPlayer *iface, REFGUID postype, PROPVARIANT *duration) @@ -916,9 +947,12 @@ static HRESULT WINAPI media_player_GetDuration(IMFPMediaPlayer *iface, REFGUID p
TRACE("%p, %s, %p.\n", iface, debugstr_guid(postype), duration);
- if (!postype || !duration) + if (!duration) return E_POINTER;
+ if (!IsEqualGUID(postype, &MFP_POSITIONTYPE_100NS)) + return E_INVALIDARG; + EnterCriticalSection(&player->cs); if (player->state == MFP_MEDIAPLAYER_STATE_SHUTDOWN) hr = MF_E_SHUTDOWN; diff --git a/dlls/mfplay/tests/mfplay.c b/dlls/mfplay/tests/mfplay.c index cfa689c189e..1daaa3af1d5 100644 --- a/dlls/mfplay/tests/mfplay.c +++ b/dlls/mfplay/tests/mfplay.c @@ -227,6 +227,15 @@ todo_wine hr = IMFPMediaPlayer_GetDuration(player, &MFP_POSITIONTYPE_100NS, &propvar); ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+ hr = IMFPMediaPlayer_GetPosition(player, NULL, NULL); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); + + hr = IMFPMediaPlayer_GetPosition(player, &MFP_POSITIONTYPE_100NS, NULL); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); + + hr = IMFPMediaPlayer_GetPosition(player, &MFP_POSITIONTYPE_100NS, &propvar); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); + hr = IMFPMediaPlayer_Shutdown(player); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
@@ -371,9 +380,24 @@ static void test_duration(void) hr = IMFPMediaPlayer_GetDuration(player, &MFP_POSITIONTYPE_100NS, NULL); ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
+ hr = IMFPMediaPlayer_GetDuration(player, &IID_IUnknown, &propvar); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); + hr = IMFPMediaPlayer_GetDuration(player, &MFP_POSITIONTYPE_100NS, &propvar); ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
+ hr = IMFPMediaPlayer_GetPosition(player, NULL, NULL); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); + + hr = IMFPMediaPlayer_GetPosition(player, &MFP_POSITIONTYPE_100NS, NULL); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); + + hr = IMFPMediaPlayer_GetPosition(player, &IID_IUnknown, &propvar); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); + + hr = IMFPMediaPlayer_GetPosition(player, &MFP_POSITIONTYPE_100NS, &propvar); + ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr); + IMFPMediaPlayer_Release(player); }
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfplay/player.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/dlls/mfplay/player.c b/dlls/mfplay/player.c index a34973f8e36..6f8d4942a0b 100644 --- a/dlls/mfplay/player.c +++ b/dlls/mfplay/player.c @@ -1929,6 +1929,17 @@ static void media_player_create_forward_event(struct media_player *player, HRESU LeaveCriticalSection(&player->cs); }
+static void media_player_playback_ended(struct media_player *player, HRESULT event_status, + struct media_event **event) +{ + EnterCriticalSection(&player->cs); + + media_player_set_state(player, MFP_MEDIAPLAYER_STATE_STOPPED); + media_event_create(player, MFP_EVENT_TYPE_PLAYBACK_ENDED, event_status, player->item, event); + + LeaveCriticalSection(&player->cs); +} + static HRESULT WINAPI media_player_session_events_callback_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result) { @@ -1990,7 +2001,7 @@ static HRESULT WINAPI media_player_session_events_callback_Invoke(IMFAsyncCallba if (SUCCEEDED(IMFMediaEvent_GetUINT32(session_event, &MF_EVENT_TOPOLOGY_STATUS, &status)) && status == MF_TOPOSTATUS_ENDED) { - media_event_create(player, MFP_EVENT_TYPE_PLAYBACK_ENDED, event_status, player->item, &event); + media_player_playback_ended(player, event_status, &event); }
break;