Fixes test crashes on Windows 7, that happen on synchronous GetEvent().
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfplat/tests/mfplat.c | 95 +++++++++++++++++++++++++++----------- 1 file changed, 67 insertions(+), 28 deletions(-)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index b361d4da162..77ac299c918 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -191,6 +191,7 @@ struct test_callback IMFAsyncCallback IMFAsyncCallback_iface; HANDLE event; DWORD param; + IMFMediaEvent *media_event; };
static struct test_callback *impl_from_IMFAsyncCallback(IMFAsyncCallback *iface) @@ -420,38 +421,77 @@ static const IMFAsyncCallbackVtbl test_create_from_file_handler_callback_vtbl = test_create_from_file_handler_callback_Invoke, };
+static HRESULT WINAPI source_events_callback_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result) +{ + struct test_callback *callback = impl_from_IMFAsyncCallback(iface); + IMFMediaEventGenerator *generator; + HRESULT hr; + + ok(!!result, "Unexpected result object.\n"); + + generator = (IMFMediaEventGenerator *)IMFAsyncResult_GetStateNoAddRef(result); + + hr = IMFMediaEventGenerator_EndGetEvent(generator, result, &callback->media_event); + ok(hr == S_OK, "Failed to create an object, hr %#x.\n", hr); + + SetEvent(callback->event); + + return S_OK; +} + +static const IMFAsyncCallbackVtbl events_callback_vtbl = +{ + testcallback_QueryInterface, + testcallback_AddRef, + testcallback_Release, + testcallback_GetParameters, + source_events_callback_Invoke, +}; + static BOOL get_event(IMFMediaEventGenerator *generator, MediaEventType expected_event_type, PROPVARIANT *value) { + struct test_callback callback = { 0 }; MediaEventType event_type; - HRESULT hr, event_status; - IMFMediaEvent *event; + BOOL ret = FALSE; + HRESULT hr;
- hr = IMFMediaEventGenerator_GetEvent(generator, 0, &event); - ok(hr == S_OK, "Failed to get event, hr %#x.\n", hr); + callback.IMFAsyncCallback_iface.lpVtbl = &events_callback_vtbl; + callback.event = CreateEventA(NULL, FALSE, FALSE, NULL);
- hr = IMFMediaEvent_GetStatus(event, &event_status); - ok(hr == S_OK, "Failed to get status code, hr %#x.\n", hr); - ok(event_status == S_OK, "Unexpected event status code %#x.\n", event_status); + for (;;) + { + hr = IMFMediaEventGenerator_BeginGetEvent(generator, &callback.IMFAsyncCallback_iface, + (IUnknown *)generator); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
- hr = IMFMediaEvent_GetType(event, &event_type); - ok(hr == S_OK, "Failed to event type, hr %#x.\n", hr); - ok(event_type == expected_event_type, "Unexpected event type %u, expected %u.\n", event_type, expected_event_type); + if (WaitForSingleObject(callback.event, 1000) == WAIT_TIMEOUT) + { + ok(0, "timeout\n"); + break; + }
- if (event_type != expected_event_type) - { - IMFMediaEvent_Release(event); - return FALSE; - } + Sleep(10);
- if (value) - { - hr = IMFMediaEvent_GetValue(event, value); - ok(hr == S_OK, "Failed to get value of event, hr %#x.\n", hr); + hr = IMFMediaEvent_GetType(callback.media_event, &event_type); + ok(hr == S_OK, "Failed to event type, hr %#x.\n", hr); + + if ((ret = (event_type == expected_event_type))) + { + if (value) + { + hr = IMFMediaEvent_GetValue(callback.media_event, value); + ok(hr == S_OK, "Failed to get value of event, hr %#x.\n", hr); + } + + break; + } }
- IMFMediaEvent_Release(event); + CloseHandle(callback.event); + if (callback.media_event) + IMFMediaEvent_Release(callback.media_event);
- return TRUE; + return ret; }
static void test_source_resolver(void) @@ -612,14 +652,13 @@ todo_wine hr = IMFMediaSource_Start(mediasource, descriptor, &GUID_NULL, &var); ok(hr == S_OK, "Failed to start media source, hr %#x.\n", hr);
- get_event((IMFMediaEventGenerator *)mediasource, MENewStream, &var); - ok(var.vt == VT_UNKNOWN, "Unexpected value type %u from MENewStream event.\n", var.vt); - video_stream = (IMFMediaStream *)var.punkVal; - - get_event((IMFMediaEventGenerator *)mediasource, MESourceStarted, NULL); + video_stream = NULL; + if (get_event((IMFMediaEventGenerator *)mediasource, MENewStream, &var)) + { + ok(var.vt == VT_UNKNOWN, "Unexpected value type.\n"); + video_stream = (IMFMediaStream *)var.punkVal; + }
- /* Request samples, our file is 10 frames at 25fps */ - get_event((IMFMediaEventGenerator *)video_stream, MEStreamStarted, NULL); sample_count = 10;
for (i = 0; i < sample_count; ++i)
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=83876
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
mfplat: mfplat.c:5072: Test failed: Failed to allocate a queue, hr 0x80070057. mfplat.c:5076: Test failed: Failed to queue work item, hr 0xc00d36bb. mfplat.c:5009: Test failed: Timed out waiting for the child process
=== w7u_adm (32 bit report) ===
mfplat: mfplat.c:5072: Test failed: Failed to allocate a queue, hr 0x80070057. mfplat.c:5076: Test failed: Failed to queue work item, hr 0xc00d36bb. mfplat.c:5009: Test failed: Timed out waiting for the child process
=== wvistau64 (64 bit report) ===
mfplat: mfplat: Timeout