From: Santino Mazza smazza@codeweavers.com
--- dlls/mf/tests/mf.c | 130 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index fa538e8ad9f..48c87573ea8 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -7050,6 +7050,135 @@ static void test_mpeg4_media_sink(void) IMFMediaType_Release(audio_type); }
+static void add_source_topology(IMFMediaSource *source, HWND hwnd, IMFTopology *topology) +{ + IMFTopologyNode *src_node, *sink_node; + IMFMediaTypeHandler *typehandler; + IMFPresentationDescriptor *pd; + IMFActivate *sink_activate; + IMFMediaType *output_type; + IMFStreamDescriptor *sd; + GUID major_type; + DWORD sd_count; + BOOL selected; + HRESULT hr; + + hr = IMFMediaSource_CreatePresentationDescriptor(source, &pd); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IMFPresentationDescriptor_GetStreamDescriptorCount(pd, &sd_count); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + + for (int i = 0; i < sd_count; ++i) + { + hr = MFCreateTopologyNode(MF_TOPOLOGY_OUTPUT_NODE, &sink_node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = MFCreateTopologyNode(MF_TOPOLOGY_SOURCESTREAM_NODE, &src_node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IMFPresentationDescriptor_GetStreamDescriptorByIndex(pd, i, &selected, &sd); + ok(selected, "got selected %u.\n", !!selected); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + init_source_node(source, -1, src_node, pd, sd); + + hr = IMFStreamDescriptor_GetMediaTypeHandler(sd, &typehandler); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaTypeHandler_GetCurrentMediaType(typehandler, &output_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IMFMediaType_GetMajorType(output_type, &major_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + if (IsEqualGUID(&major_type, &MFMediaType_Video)) + { + hr = MFCreateVideoRendererActivate(hwnd, &sink_activate); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + } + else if (IsEqualGUID(&major_type, &MFMediaType_Audio)) + { + hr = MFCreateAudioRendererActivate(&sink_activate); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + } + + hr = IMFTopologyNode_SetObject(sink_node, (IUnknown *)sink_activate); + ok(hr == S_OK, "Failed to set object, hr %#lx.\n", hr); + hr = IMFTopologyNode_SetUINT32(sink_node, &MF_TOPONODE_CONNECT_METHOD, MF_CONNECT_ALLOW_DECODER); + ok(hr == S_OK, "Failed to set connect method, hr %#lx.\n", hr); + + hr = IMFTopology_AddNode(topology, sink_node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFTopology_AddNode(topology, src_node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFTopologyNode_ConnectOutput(src_node, 0, sink_node, 0); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IMFTopologyNode_Release(src_node); + IMFTopologyNode_Release(sink_node); + IMFStreamDescriptor_Release(sd); + IMFMediaTypeHandler_Release(typehandler); + IMFMediaType_Release(output_type); + IMFActivate_Release(sink_activate); + } + + IMFPresentationDescriptor_Release(pd); +} + +static void test_topology_change(void) +{ + IMFAsyncCallback *callback; + IMFMediaSession *session; + IMFMediaSource *source; + IMFTopology *topology; + PROPVARIANT propvar; + HRESULT hr; + HWND hwnd; + + hr = MFStartup(MF_VERSION, MFSTARTUP_FULL); + ok(hr == S_OK, "Failed to start up, hr %#lx.\n", hr); + + if (!(source = create_media_source(L"test.mp4", L"video/mp4"))) + { + win_skip("MP4 media source is not supported, skipping tests.\n"); + return; + } + + callback = create_test_callback(TRUE); + + hr = MFCreateMediaSession(NULL, &session); + ok(hr == S_OK, "Failed to create media session, hr %#lx.\n", hr); + + hr = MFCreateTopology(&topology); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hwnd = create_window(); + add_source_topology(source, hwnd, topology); + + hr = IMFMediaSession_SetTopology(session, MFSESSION_SETTOPOLOGY_IMMEDIATE, topology); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = wait_media_event_until_blocking(session, callback, MESessionTopologySet, 1000, &propvar); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(propvar.vt == VT_UNKNOWN, "got vt %u\n", propvar.vt); + + propvar.vt = VT_EMPTY; + hr = IMFMediaSession_Start(session, &GUID_NULL, &propvar); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = wait_media_event_until_blocking(session, callback, MESessionStarted, 1000, &propvar); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(propvar.vt == VT_EMPTY, "got vt %u\n", propvar.vt); + + hr = IMFMediaSession_Stop(session); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = wait_media_event_until_blocking(session, callback, MESessionStopped, 1000, &propvar); + todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(propvar.vt == VT_EMPTY, "got vt %u\n", propvar.vt); + + hr = IMFMediaSession_ClearTopologies(session); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + IMFTopology_Release(topology); + CloseWindow(hwnd); + DestroyWindow(hwnd); +} + START_TEST(mf) { init_functions(); @@ -7084,4 +7213,5 @@ START_TEST(mf) test_MFGetTopoNodeCurrentType(); test_MFRequireProtectedEnvironment(); test_mpeg4_media_sink(); + test_topology_change(); }