From: Brendan McGrath <bmcgrath@codeweavers.com> --- dlls/mf/session.c | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/dlls/mf/session.c b/dlls/mf/session.c index 1f23bf51592..4d321e5e717 100644 --- a/dlls/mf/session.c +++ b/dlls/mf/session.c @@ -1039,22 +1039,39 @@ static void session_subscribe_sinks(struct media_session *session) session->presentation.flags |= SESSION_FLAG_SINKS_SUBSCRIBED; } -static void session_flush_transforms(struct media_session *session) +static void session_flush_transform_node(struct topo_node *node) { - struct topo_node *node; + struct transform_stream *stream; UINT i; - LIST_FOR_EACH_ENTRY(node, &session->presentation.nodes, struct topo_node, entry) + if (node->type == MF_TOPOLOGY_TRANSFORM_NODE) { - if (node->type == MF_TOPOLOGY_TRANSFORM_NODE) + for (i = 0; i < node->u.transform.input_count; ++i) + { + stream = &node->u.transform.inputs[i]; + transform_stream_drop_events(stream); + stream->draining = FALSE; /* we're about to flush, so draining can halt */ + } + IMFTransform_ProcessMessage(node->object.transform, MFT_MESSAGE_COMMAND_FLUSH, 0); + for (i = 0; i < node->u.transform.output_count; i++) { - IMFTransform_ProcessMessage(node->object.transform, MFT_MESSAGE_COMMAND_FLUSH, 0); - for (i = 0; i < node->u.transform.output_count; i++) - node->u.transform.outputs[i].requests = 0; /* these requests might have been flushed */ + stream = &node->u.transform.outputs[i]; + transform_stream_drop_events(stream); + stream->requests = 0; /* these requests might have been flushed */ } } } +static void session_flush_transforms(struct media_session *session) +{ + struct topo_node *node; + + LIST_FOR_EACH_ENTRY(node, &session->presentation.nodes, struct topo_node, entry) + { + session_flush_transform_node(node); + } +} + static void session_request_sample(struct media_session *session, IMFStreamSink *sink_stream); static void session_flush_sinks(struct media_session *session) @@ -1084,13 +1101,8 @@ static void session_flush_nodes(struct media_session *session) { if (node->type == MF_TOPOLOGY_OUTPUT_NODE) IMFStreamSink_Flush(node->object.sink_stream); - else if (node->type == MF_TOPOLOGY_TRANSFORM_NODE) - { - for (i = 0; i < node->u.transform.output_count; ++i) - node->u.transform.outputs[i].requests = 0; - - IMFTransform_ProcessMessage(node->object.transform, MFT_MESSAGE_COMMAND_FLUSH, 0); - } + else + session_flush_transform_node(node); } } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10092