From: Conor McCarthy cmccarthy@codeweavers.com
The start position is empty when starting at the current position from the paused state, but if it is not empty, this is a seek operation. --- dlls/mf/session.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/dlls/mf/session.c b/dlls/mf/session.c index e595cadd185..876dd6eb95c 100644 --- a/dlls/mf/session.c +++ b/dlls/mf/session.c @@ -1061,7 +1061,7 @@ static void session_handle_start_error(struct media_session *session, HRESULT hr session_command_complete_with_event(session, MESessionStarted, hr, NULL); }
-static void session_reset_transforms(struct media_session *session) +static void session_reset_transforms(struct media_session *session, BOOL drop) { struct topo_node *topo_node; UINT i; @@ -1071,10 +1071,15 @@ static void session_reset_transforms(struct media_session *session) if (topo_node->type != MF_TOPOLOGY_TRANSFORM_NODE) continue;
+ if (drop) + IMFTransform_ProcessMessage(topo_node->object.transform, MFT_MESSAGE_COMMAND_FLUSH, 0); + for (i = 0; i < topo_node->u.transform.input_count; i++) { struct transform_stream *stream = &topo_node->u.transform.inputs[i]; stream->draining = FALSE; + if (drop) + transform_stream_drop_events(stream); } } } @@ -1119,7 +1124,7 @@ static void session_start(struct media_session *session, const GUID *time_format } }
- session_reset_transforms(session); + session_reset_transforms(session, start_position->vt == VT_I8);
session->state = SESSION_STATE_STARTING_SOURCES; break;