mfplat/tests: Get source events in async mode.
Fixes test crashes on Windows 7, that happen on synchronous GetEvent(). Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
4b362d016c
commit
f72f1ff952
|
@ -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);
|
||||
|
||||
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 (event_type != expected_event_type)
|
||||
for (;;)
|
||||
{
|
||||
IMFMediaEvent_Release(event);
|
||||
return FALSE;
|
||||
hr = IMFMediaEventGenerator_BeginGetEvent(generator, &callback.IMFAsyncCallback_iface,
|
||||
(IUnknown *)generator);
|
||||
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
|
||||
|
||||
if (WaitForSingleObject(callback.event, 1000) == WAIT_TIMEOUT)
|
||||
{
|
||||
ok(0, "timeout\n");
|
||||
break;
|
||||
}
|
||||
|
||||
Sleep(10);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
if (value)
|
||||
{
|
||||
hr = IMFMediaEvent_GetValue(event, value);
|
||||
ok(hr == S_OK, "Failed to get value of event, hr %#x.\n", hr);
|
||||
}
|
||||
CloseHandle(callback.event);
|
||||
if (callback.media_event)
|
||||
IMFMediaEvent_Release(callback.media_event);
|
||||
|
||||
IMFMediaEvent_Release(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;
|
||||
video_stream = NULL;
|
||||
if (get_event((IMFMediaEventGenerator *)mediasource, MENewStream, &var))
|
||||
{
|
||||
ok(var.vt == VT_UNKNOWN, "Unexpected value type.\n");
|
||||
video_stream = (IMFMediaStream *)var.punkVal;
|
||||
}
|
||||
|
||||
get_event((IMFMediaEventGenerator *)mediasource, MESourceStarted, NULL);
|
||||
|
||||
/* 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)
|
||||
|
|
Loading…
Reference in New Issue