From: Brendan McGrath <bmcgrath@codeweavers.com> Windows waits until it receives the MEStreamStarted event(s) before subscribing to the sink event queues. --- dlls/mf/session.c | 38 ++++++++++++++++++++++++++------------ dlls/mf/tests/mf.c | 7 ------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/dlls/mf/session.c b/dlls/mf/session.c index 3257418a574..70bad8bf04b 100644 --- a/dlls/mf/session.c +++ b/dlls/mf/session.c @@ -235,6 +235,7 @@ enum presentation_flags SESSION_FLAG_PENDING_RATE_CHANGE = 0x20, SESSION_FLAG_RESTARTING = 0x40, SESSION_FLAG_PRESENTATION_ENDING = 0x80, + SESSION_FLAG_SINKS_SUBSCRIBED = 0x100, }; struct media_session @@ -1015,6 +1016,30 @@ static HRESULT session_subscribe_sources(struct media_session *session) return hr; } +static HRESULT session_subscribe_sinks(struct media_session *session) +{ + struct topo_node *node; + HRESULT hr = S_OK; + + if (session->presentation.flags & SESSION_FLAG_SINKS_SUBSCRIBED) + return hr; + + LIST_FOR_EACH_ENTRY(node, &session->presentation.nodes, struct topo_node, entry) + { + if (node->type != MF_TOPOLOGY_OUTPUT_NODE) + continue; + + if (FAILED(hr = IMFStreamSink_BeginGetEvent(node->object.sink_stream, &session->events_callback, + node->object.object))) + { + WARN("Failed to subscribe to stream sink events, hr %#lx.\n", hr); + } + } + + session->presentation.flags |= SESSION_FLAG_SINKS_SUBSCRIBED; + return hr; +} + static void session_flush_transforms(struct media_session *session) { struct topo_node *node; @@ -1498,18 +1523,6 @@ static void session_set_presentation_clock(struct media_session *session) if (FAILED(hr)) WARN("Failed to set time source, hr %#lx.\n", hr); - LIST_FOR_EACH_ENTRY(node, &session->presentation.nodes, struct topo_node, entry) - { - if (node->type != MF_TOPOLOGY_OUTPUT_NODE) - continue; - - if (FAILED(hr = IMFStreamSink_BeginGetEvent(node->object.sink_stream, &session->events_callback, - node->object.object))) - { - WARN("Failed to subscribe to stream sink events, hr %#lx.\n", hr); - } - } - /* Set clock for all topology nodes. */ LIST_FOR_EACH_ENTRY(source, &session->presentation.sources, struct media_source, entry) { @@ -3210,6 +3223,7 @@ static void session_set_source_object_state(struct media_session *session, IUnkn } } + session_subscribe_sinks(session); session_set_presentation_clock(session); if ((session->presentation.flags & SESSION_FLAG_NEEDS_PREROLL) && session_is_output_nodes_state(session, OBJ_STATE_STOPPED)) diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index 5e9c7fbd5a3..c7417e6a919 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -3144,13 +3144,6 @@ static void test_media_session_events(void) test_handler_clear_current_type(handler); - if (winetest_platform_is_wine) - { - todo_wine - ok(0, "This test currently crashes under wine.\n"); - goto skip_invalid; - } - IMFMediaSession_Release(session); /* test sample request from sink prior to starting sources */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10053