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;
|
IMFAsyncCallback IMFAsyncCallback_iface;
|
||||||
HANDLE event;
|
HANDLE event;
|
||||||
DWORD param;
|
DWORD param;
|
||||||
|
IMFMediaEvent *media_event;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct test_callback *impl_from_IMFAsyncCallback(IMFAsyncCallback *iface)
|
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,
|
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)
|
static BOOL get_event(IMFMediaEventGenerator *generator, MediaEventType expected_event_type, PROPVARIANT *value)
|
||||||
{
|
{
|
||||||
|
struct test_callback callback = { 0 };
|
||||||
MediaEventType event_type;
|
MediaEventType event_type;
|
||||||
HRESULT hr, event_status;
|
BOOL ret = FALSE;
|
||||||
IMFMediaEvent *event;
|
HRESULT hr;
|
||||||
|
|
||||||
hr = IMFMediaEventGenerator_GetEvent(generator, 0, &event);
|
callback.IMFAsyncCallback_iface.lpVtbl = &events_callback_vtbl;
|
||||||
ok(hr == S_OK, "Failed to get event, hr %#x.\n", hr);
|
callback.event = CreateEventA(NULL, FALSE, FALSE, NULL);
|
||||||
|
|
||||||
hr = IMFMediaEvent_GetStatus(event, &event_status);
|
for (;;)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
IMFMediaEvent_Release(event);
|
hr = IMFMediaEventGenerator_BeginGetEvent(generator, &callback.IMFAsyncCallback_iface,
|
||||||
return FALSE;
|
(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)
|
CloseHandle(callback.event);
|
||||||
{
|
if (callback.media_event)
|
||||||
hr = IMFMediaEvent_GetValue(event, value);
|
IMFMediaEvent_Release(callback.media_event);
|
||||||
ok(hr == S_OK, "Failed to get value of event, hr %#x.\n", hr);
|
|
||||||
}
|
|
||||||
|
|
||||||
IMFMediaEvent_Release(event);
|
return ret;
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_source_resolver(void)
|
static void test_source_resolver(void)
|
||||||
|
@ -612,14 +652,13 @@ todo_wine
|
||||||
hr = IMFMediaSource_Start(mediasource, descriptor, &GUID_NULL, &var);
|
hr = IMFMediaSource_Start(mediasource, descriptor, &GUID_NULL, &var);
|
||||||
ok(hr == S_OK, "Failed to start media source, hr %#x.\n", hr);
|
ok(hr == S_OK, "Failed to start media source, hr %#x.\n", hr);
|
||||||
|
|
||||||
get_event((IMFMediaEventGenerator *)mediasource, MENewStream, &var);
|
video_stream = NULL;
|
||||||
ok(var.vt == VT_UNKNOWN, "Unexpected value type %u from MENewStream event.\n", var.vt);
|
if (get_event((IMFMediaEventGenerator *)mediasource, MENewStream, &var))
|
||||||
video_stream = (IMFMediaStream *)var.punkVal;
|
{
|
||||||
|
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;
|
sample_count = 10;
|
||||||
|
|
||||||
for (i = 0; i < sample_count; ++i)
|
for (i = 0; i < sample_count; ++i)
|
||||||
|
|
Loading…
Reference in New Issue