Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- 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);