From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/session.c | 85 ++++++++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 37 deletions(-)
diff --git a/dlls/mf/session.c b/dlls/mf/session.c index 9062b799318..c202b9a0c24 100644 --- a/dlls/mf/session.c +++ b/dlls/mf/session.c @@ -3164,14 +3164,58 @@ static HRESULT transform_node_pull_samples(const struct media_session *session, return hr; }
+static HRESULT transform_node_push_samples(const struct media_session *session, struct topo_node *node) +{ + IMFSample *sample; + HRESULT hr; + BOOL drain; + UINT i, id; + + for (i = 0; i < node->u.transform.input_count; ++i) + { + struct transform_stream *stream = &node->u.transform.inputs[i]; + + id = transform_node_get_stream_id(node, FALSE, i); + while (SUCCEEDED(hr = transform_stream_pop_sample(stream, &sample))) + { + if (!sample) + { + transform_stream_drop_samples(stream); + drain = TRUE; + break; + } + + hr = IMFTransform_ProcessInput(node->object.transform, id, sample, 0); + if (hr == MF_E_NOTACCEPTING) + { + transform_stream_push_sample(stream, sample, TRUE); + IMFSample_Release(sample); + break; + } + + if (FAILED(hr)) + WARN("Failed to process input for stream %u/%u, hr %#lx.\n", i, id, hr); + IMFSample_Release(sample); + } + } + + if (drain) + { + if (FAILED(hr = IMFTransform_ProcessMessage(node->object.transform, MFT_MESSAGE_COMMAND_DRAIN, 0))) + WARN("Drain command failed for transform, hr %#lx.\n", hr); + return MF_E_END_OF_STREAM; + } + + return hr; +} + static void session_deliver_sample_to_node(struct media_session *session, IMFTopologyNode *node, unsigned int input, IMFSample *sample) { - DWORD stream_id, downstream_input; + DWORD downstream_input; IMFTopologyNode *downstream_node; struct topo_node *topo_node; MF_TOPOLOGY_TYPE node_type; - BOOL drain = FALSE; TOPOID node_id; unsigned int i; HRESULT hr; @@ -3208,45 +3252,12 @@ static void session_deliver_sample_to_node(struct media_session *session, IMFTop transform_stream_push_sample(input_stream, sample, FALSE);
transform_node_pull_samples(session, topo_node); - - for (i = 0; i < topo_node->u.transform.input_count; ++i) - { - struct transform_stream *stream = &topo_node->u.transform.inputs[i]; - - stream_id = transform_node_get_stream_id(topo_node, FALSE, i); - while (SUCCEEDED(hr = transform_stream_pop_sample(stream, &sample))) - { - if (!sample) - { - transform_stream_drop_samples(stream); - drain = TRUE; - break; - } - - hr = IMFTransform_ProcessInput(topo_node->object.transform, stream_id, sample, 0); - if (hr == MF_E_NOTACCEPTING) - { - transform_stream_push_sample(stream, sample, TRUE); - IMFSample_Release(sample); - break; - } - - if (FAILED(hr)) - WARN("Failed to process input for stream %u/%lu, hr %#lx.\n", i, stream_id, hr); - IMFSample_Release(sample); - } - } - - if (drain) - { - if (FAILED(hr = IMFTransform_ProcessMessage(topo_node->object.transform, MFT_MESSAGE_COMMAND_DRAIN, 0))) - WARN("Drain command failed for transform, hr %#lx.\n", hr); - } + hr = transform_node_push_samples(session, topo_node);
transform_node_pull_samples(session, topo_node);
/* Remaining unprocessed input has been discarded, now queue markers for every output. */ - if (drain) + if (hr == MF_E_END_OF_STREAM) { for (i = 0; i < topo_node->u.transform.output_count; ++i) {