Nikolay Sivov : mf/evr: Set display window to the presenter if it was specified on sink creation.
Alexandre Julliard
julliard at winehq.org
Thu Nov 12 15:17:45 CST 2020
Module: wine
Branch: master
Commit: 176ca7b87bcaf830d93c5a219b966ecb7879841c
URL: https://source.winehq.org/git/wine.git/?a=commit;h=176ca7b87bcaf830d93c5a219b966ecb7879841c
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Thu Nov 12 13:36:39 2020 +0300
mf/evr: Set display window to the presenter if it was specified on sink creation.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mf/evr.c | 19 ++++++++++++++++---
dlls/mf/tests/Makefile.in | 2 +-
dlls/mf/tests/mf.c | 37 +++++++++++++++++++++++++++++++++++++
3 files changed, 54 insertions(+), 4 deletions(-)
diff --git a/dlls/mf/evr.c b/dlls/mf/evr.c
index d01bb0f06f1..f14f2f46612 100644
--- a/dlls/mf/evr.c
+++ b/dlls/mf/evr.c
@@ -84,6 +84,7 @@ struct video_renderer
IMFTransform *mixer;
IMFVideoPresenter *presenter;
+ HWND window;
IUnknown *device_manager;
unsigned int flags;
unsigned int state;
@@ -1098,13 +1099,18 @@ static HRESULT video_renderer_create_mixer(IMFAttributes *attributes, IMFTransfo
return CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IMFTransform, (void **)out);
}
-static HRESULT video_renderer_create_presenter(IMFAttributes *attributes, IMFVideoPresenter **out)
+static HRESULT video_renderer_create_presenter(struct video_renderer *renderer, IMFAttributes *attributes,
+ IMFVideoPresenter **out)
{
unsigned int flags = 0;
IMFActivate *activate;
+ UINT64 value;
CLSID clsid;
HRESULT hr;
+ if (attributes && SUCCEEDED(IMFAttributes_GetUINT64(attributes, &MF_ACTIVATE_VIDEO_WINDOW, &value)))
+ renderer->window = UlongToHandle(value);
+
if (attributes && SUCCEEDED(IMFAttributes_GetUnknown(attributes, &MF_ACTIVATE_CUSTOM_VIDEO_PRESENTER_ACTIVATE,
&IID_IMFActivate, (void **)&activate)))
{
@@ -1193,8 +1199,15 @@ static HRESULT video_renderer_configure_mixer(struct video_renderer *renderer)
static HRESULT video_renderer_configure_presenter(struct video_renderer *renderer)
{
IMFTopologyServiceLookupClient *lookup_client;
+ IMFVideoDisplayControl *control;
HRESULT hr;
+ if (SUCCEEDED(IMFVideoPresenter_QueryInterface(renderer->presenter, &IID_IMFVideoDisplayControl, (void **)&control)))
+ {
+ IMFVideoDisplayControl_SetVideoWindow(control, renderer->window);
+ IMFVideoDisplayControl_Release(control);
+ }
+
if (SUCCEEDED(hr = IMFVideoPresenter_QueryInterface(renderer->presenter, &IID_IMFTopologyServiceLookupClient,
(void **)&lookup_client)))
{
@@ -1270,7 +1283,7 @@ static HRESULT WINAPI video_renderer_InitializeRenderer(IMFVideoRenderer *iface,
if (presenter)
IMFVideoPresenter_AddRef(presenter);
- else if (FAILED(hr = video_renderer_create_presenter(NULL, &presenter)))
+ else if (FAILED(hr = video_renderer_create_presenter(renderer, NULL, &presenter)))
{
WARN("Failed to create default presenter, hr %#x.\n", hr);
IMFTransform_Release(mixer);
@@ -2141,7 +2154,7 @@ static HRESULT evr_create_object(IMFAttributes *attributes, void *user_context,
if (FAILED(hr = video_renderer_create_mixer(attributes, &mixer)))
goto failed;
- if (FAILED(hr = video_renderer_create_presenter(attributes, &presenter)))
+ if (FAILED(hr = video_renderer_create_presenter(object, attributes, &presenter)))
goto failed;
if (FAILED(hr = video_renderer_initialize(object, mixer, presenter)))
diff --git a/dlls/mf/tests/Makefile.in b/dlls/mf/tests/Makefile.in
index b26c8630063..5eb9ee4d4e3 100644
--- a/dlls/mf/tests/Makefile.in
+++ b/dlls/mf/tests/Makefile.in
@@ -1,5 +1,5 @@
TESTDLL = mf.dll
-IMPORTS = mf mfplat mfuuid ole32
+IMPORTS = mf mfplat mfuuid ole32 user32
C_SRCS = \
mf.c
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index 7780bf4ea58..9eccafee633 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -56,6 +56,16 @@ static void _expect_ref(IUnknown* obj, ULONG expected_refcount, int line)
expected_refcount);
}
+static HWND create_window(void)
+{
+ RECT r = {0, 0, 640, 480};
+
+ AdjustWindowRect(&r, WS_OVERLAPPEDWINDOW | WS_VISIBLE, FALSE);
+
+ return CreateWindowA("static", "mf_test", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
+ 0, 0, r.right - r.left, r.bottom - r.top, NULL, NULL, NULL, NULL);
+}
+
static WCHAR *load_resource(const WCHAR *name)
{
static WCHAR pathW[MAX_PATH];
@@ -3235,6 +3245,7 @@ static void test_evr(void)
IMFMediaSink *sink, *sink2;
IMFAttributes *attributes;
IMFActivate *activate;
+ HWND window, window2;
DWORD flags, count;
LONG sample_count;
IMFGetService *gs;
@@ -3258,6 +3269,32 @@ static void test_evr(void)
hr = MFCreateVideoRendererActivate(NULL, NULL);
ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
+ /* Window */
+ window = create_window();
+ hr = MFCreateVideoRendererActivate(window, &activate);
+ ok(hr == S_OK, "Failed to create activate object, hr %#x.\n", hr);
+
+ hr = IMFActivate_GetUINT64(activate, &MF_ACTIVATE_VIDEO_WINDOW, &value);
+ ok(hr == S_OK, "Failed to get attribute, hr %#x.\n", hr);
+ ok(UlongToHandle(value) == window, "Unexpected value.\n");
+
+ hr = IMFActivate_ActivateObject(activate, &IID_IMFMediaSink, (void **)&sink);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = MFGetService((IUnknown *)sink, &MR_VIDEO_RENDER_SERVICE, &IID_IMFVideoDisplayControl,
+ (void **)&display_control);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ window2 = NULL;
+ hr = IMFVideoDisplayControl_GetVideoWindow(display_control, &window2);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(window2 == window, "Unexpected window %p.\n", window2);
+
+ IMFVideoDisplayControl_Release(display_control);
+ IMFMediaSink_Release(sink);
+ IMFActivate_Release(activate);
+ DestroyWindow(window);
+
hr = MFCreateVideoRendererActivate(NULL, &activate);
ok(hr == S_OK, "Failed to create activate object, hr %#x.\n", hr);
More information about the wine-cvs
mailing list