mfplat/tests: Add more comprehensive media source tests.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
a832b2b799
commit
b7047b5ae9
|
@ -350,25 +350,62 @@ 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 BOOL get_event(IMFMediaEventGenerator *generator, MediaEventType expected_event_type, PROPVARIANT *value)
|
||||||
|
{
|
||||||
|
MediaEventType event_type;
|
||||||
|
HRESULT hr, event_status;
|
||||||
|
IMFMediaEvent *event;
|
||||||
|
|
||||||
|
hr = IMFMediaEventGenerator_GetEvent(generator, 0, &event);
|
||||||
|
ok(hr == S_OK, "Failed to get event, hr %#x.\n", hr);
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
IMFMediaEvent_Release(event);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value)
|
||||||
|
{
|
||||||
|
hr = IMFMediaEvent_GetValue(event, value);
|
||||||
|
ok(hr == S_OK, "Failed to get value of event, hr %#x.\n", hr);
|
||||||
|
}
|
||||||
|
|
||||||
|
IMFMediaEvent_Release(event);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static void test_source_resolver(void)
|
static void test_source_resolver(void)
|
||||||
{
|
{
|
||||||
static const WCHAR file_type[] = {'v','i','d','e','o','/','m','p','4',0};
|
|
||||||
struct test_callback callback = { { &test_create_from_url_callback_vtbl } };
|
struct test_callback callback = { { &test_create_from_url_callback_vtbl } };
|
||||||
struct test_callback callback2 = { { &test_create_from_file_handler_callback_vtbl } };
|
struct test_callback callback2 = { { &test_create_from_file_handler_callback_vtbl } };
|
||||||
IMFSourceResolver *resolver, *resolver2;
|
IMFSourceResolver *resolver, *resolver2;
|
||||||
|
IMFPresentationDescriptor *descriptor;
|
||||||
IMFSchemeHandler *scheme_handler;
|
IMFSchemeHandler *scheme_handler;
|
||||||
|
IMFMediaStream *video_stream;
|
||||||
IMFAttributes *attributes;
|
IMFAttributes *attributes;
|
||||||
IMFMediaSource *mediasource;
|
IMFMediaSource *mediasource;
|
||||||
IMFPresentationDescriptor *descriptor;
|
|
||||||
IMFMediaTypeHandler *handler;
|
IMFMediaTypeHandler *handler;
|
||||||
|
IMFMediaType *media_type;
|
||||||
BOOL selected, do_uninit;
|
BOOL selected, do_uninit;
|
||||||
MF_OBJECT_TYPE obj_type;
|
MF_OBJECT_TYPE obj_type;
|
||||||
IMFStreamDescriptor *sd;
|
IMFStreamDescriptor *sd;
|
||||||
IUnknown *cancel_cookie;
|
IUnknown *cancel_cookie;
|
||||||
IMFByteStream *stream;
|
IMFByteStream *stream;
|
||||||
WCHAR pathW[MAX_PATH];
|
WCHAR pathW[MAX_PATH];
|
||||||
HRESULT hr;
|
int i, sample_count;
|
||||||
WCHAR *filename;
|
WCHAR *filename;
|
||||||
|
PROPVARIANT var;
|
||||||
|
HRESULT hr;
|
||||||
GUID guid;
|
GUID guid;
|
||||||
|
|
||||||
if (!pMFCreateSourceResolver)
|
if (!pMFCreateSourceResolver)
|
||||||
|
@ -428,7 +465,7 @@ static void test_source_resolver(void)
|
||||||
|
|
||||||
hr = IMFByteStream_QueryInterface(stream, &IID_IMFAttributes, (void **)&attributes);
|
hr = IMFByteStream_QueryInterface(stream, &IID_IMFAttributes, (void **)&attributes);
|
||||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
hr = IMFAttributes_SetString(attributes, &MF_BYTESTREAM_CONTENT_TYPE, file_type);
|
hr = IMFAttributes_SetString(attributes, &MF_BYTESTREAM_CONTENT_TYPE, L"video/mp4");
|
||||||
ok(hr == S_OK, "Failed to set string value, hr %#x.\n", hr);
|
ok(hr == S_OK, "Failed to set string value, hr %#x.\n", hr);
|
||||||
IMFAttributes_Release(attributes);
|
IMFAttributes_Release(attributes);
|
||||||
|
|
||||||
|
@ -447,13 +484,101 @@ static void test_source_resolver(void)
|
||||||
|
|
||||||
hr = IMFStreamDescriptor_GetMediaTypeHandler(sd, &handler);
|
hr = IMFStreamDescriptor_GetMediaTypeHandler(sd, &handler);
|
||||||
ok(hr == S_OK, "Failed to get type handler, hr %#x.\n", hr);
|
ok(hr == S_OK, "Failed to get type handler, hr %#x.\n", hr);
|
||||||
|
IMFStreamDescriptor_Release(sd);
|
||||||
|
|
||||||
hr = IMFMediaTypeHandler_GetMajorType(handler, &guid);
|
hr = IMFMediaTypeHandler_GetMajorType(handler, &guid);
|
||||||
todo_wine
|
todo_wine
|
||||||
ok(hr == S_OK, "Failed to get stream major type, hr %#x.\n", hr);
|
ok(hr == S_OK, "Failed to get stream major type, hr %#x.\n", hr);
|
||||||
|
if (FAILED(hr))
|
||||||
|
goto skip_source_tests;
|
||||||
|
|
||||||
|
/* Check major/minor type for the test media. */
|
||||||
|
ok(IsEqualGUID(&guid, &MFMediaType_Video), "Unexpected major type %s.\n", debugstr_guid(&guid));
|
||||||
|
|
||||||
|
hr = IMFMediaTypeHandler_GetCurrentMediaType(handler, &media_type);
|
||||||
|
ok(hr == S_OK, "Failed to get current media type, hr %#x.\n", hr);
|
||||||
|
hr = IMFMediaType_GetGUID(media_type, &MF_MT_SUBTYPE, &guid);
|
||||||
|
ok(hr == S_OK, "Failed to get media sub type, hr %#x.\n", hr);
|
||||||
|
ok(IsEqualGUID(&guid, &MFVideoFormat_M4S2), "Unexpected sub type %s.\n", debugstr_guid(&guid));
|
||||||
|
IMFMediaType_Release(media_type);
|
||||||
|
|
||||||
|
hr = IMFPresentationDescriptor_SelectStream(descriptor, 0);
|
||||||
|
ok(hr == S_OK, "Failed to select video stream, hr %#x.\n", hr);
|
||||||
|
|
||||||
|
var.vt = VT_EMPTY;
|
||||||
|
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);
|
||||||
|
|
||||||
|
/* Request samples, our file is 10 frames at 25fps */
|
||||||
|
get_event((IMFMediaEventGenerator *)video_stream, MEStreamStarted, NULL);
|
||||||
|
sample_count = 10;
|
||||||
|
|
||||||
|
/* Request one beyond EOS, otherwise EndOfStream isn't queued. */
|
||||||
|
for (i = 0; i <= sample_count; ++i)
|
||||||
|
{
|
||||||
|
hr = IMFMediaStream_RequestSample(video_stream, NULL);
|
||||||
|
if (i == sample_count)
|
||||||
|
break;
|
||||||
|
ok(hr == S_OK, "Failed to request sample %u, hr %#x.\n", i + 1, hr);
|
||||||
|
if (hr != S_OK)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < sample_count; ++i)
|
||||||
|
{
|
||||||
|
static const LONGLONG MILLI_TO_100_NANO = 10000;
|
||||||
|
LONGLONG duration, time;
|
||||||
|
DWORD buffer_count;
|
||||||
|
IMFSample *sample;
|
||||||
|
BOOL ret;
|
||||||
|
|
||||||
|
ret = get_event((IMFMediaEventGenerator *)video_stream, MEMediaSample, &var);
|
||||||
|
ok(ret, "Sample %u not received.\n", i + 1);
|
||||||
|
if (!ret)
|
||||||
|
break;
|
||||||
|
|
||||||
|
ok(var.vt == VT_UNKNOWN, "Unexpected value type %u from MEMediaSample event.\n", var.vt);
|
||||||
|
sample = (IMFSample *)var.punkVal;
|
||||||
|
|
||||||
|
hr = IMFSample_GetBufferCount(sample, &buffer_count);
|
||||||
|
ok(hr == S_OK, "Failed to get buffer count, hr %#x.\n", hr);
|
||||||
|
ok(buffer_count == 1, "Unexpected buffer count %u.\n", buffer_count);
|
||||||
|
|
||||||
|
hr = IMFSample_GetSampleDuration(sample, &duration);
|
||||||
|
ok(hr == S_OK, "Failed to get sample duration, hr %#x.\n", hr);
|
||||||
|
ok(duration == 40 * MILLI_TO_100_NANO, "Unexpected duration %s.\n", wine_dbgstr_longlong(duration));
|
||||||
|
|
||||||
|
hr = IMFSample_GetSampleTime(sample, &time);
|
||||||
|
ok(hr == S_OK, "Failed to get sample time, hr %#x.\n", hr);
|
||||||
|
ok(time == i * 40 * MILLI_TO_100_NANO, "Unexpected time %s.\n", wine_dbgstr_longlong(time));
|
||||||
|
|
||||||
|
IMFSample_Release(sample);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == sample_count)
|
||||||
|
get_event((IMFMediaEventGenerator *)video_stream, MEEndOfStream, NULL);
|
||||||
|
|
||||||
|
hr = IMFMediaStream_RequestSample(video_stream, NULL);
|
||||||
|
ok(hr == MF_E_END_OF_STREAM, "Unexpected hr %#x.\n", hr);
|
||||||
|
IMFMediaStream_Release(video_stream);
|
||||||
|
|
||||||
|
get_event((IMFMediaEventGenerator *)mediasource, MEEndOfPresentation, NULL);
|
||||||
|
|
||||||
IMFMediaTypeHandler_Release(handler);
|
IMFMediaTypeHandler_Release(handler);
|
||||||
IMFStreamDescriptor_Release(sd);
|
|
||||||
|
hr = IMFMediaSource_Shutdown(mediasource);
|
||||||
|
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
|
hr = IMFMediaSource_CreatePresentationDescriptor(mediasource, NULL);
|
||||||
|
ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
|
skip_source_tests:
|
||||||
|
|
||||||
IMFPresentationDescriptor_Release(descriptor);
|
IMFPresentationDescriptor_Release(descriptor);
|
||||||
IMFMediaSource_Release(mediasource);
|
IMFMediaSource_Release(mediasource);
|
||||||
|
|
Loading…
Reference in New Issue