From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/session.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/dlls/mf/session.c b/dlls/mf/session.c index 586be71a95c..cc1dc7da987 100644 --- a/dlls/mf/session.c +++ b/dlls/mf/session.c @@ -3212,13 +3212,14 @@ static HRESULT transform_node_push_samples(const struct media_session *session, static void session_deliver_sample_to_node(struct media_session *session, IMFTopologyNode *node, unsigned int input, IMFSample *sample) { - DWORD downstream_input; - IMFTopologyNode *downstream_node; + DWORD downstream_input, upstream_output; + IMFTopologyNode *downstream_node, *upstream_node; struct topo_node *topo_node; MF_TOPOLOGY_TYPE node_type; TOPOID node_id; unsigned int i; HRESULT hr; + BOOL need_more;
if (session->quality_manager) IMFQualityManager_NotifyProcessInput(session->quality_manager, node, input, sample); @@ -3269,7 +3270,7 @@ static void session_deliver_sample_to_node(struct media_session *session, IMFTop }
/* Push down all available output. */ - for (i = 0; i < topo_node->u.transform.output_count; ++i) + for (need_more = FALSE, i = 0; i < topo_node->u.transform.output_count; ++i) { struct transform_stream *stream = &topo_node->u.transform.outputs[i];
@@ -3287,9 +3288,18 @@ static void session_deliver_sample_to_node(struct media_session *session, IMFTop IMFSample_Release(sample); }
+ if (stream->requests) + need_more = TRUE; + IMFTopologyNode_Release(downstream_node); }
+ if (need_more && SUCCEEDED(hr = IMFTopologyNode_GetInput(node, 0 /* FIXME */, &upstream_node, &upstream_output))) + { + hr = session_request_sample_from_node(session, upstream_node, upstream_output); + IMFTopologyNode_Release(upstream_node); + } + break; } case MF_TOPOLOGY_TEE_NODE: