From: Brendan McGrath bmcgrath@codeweavers.com
--- dlls/mf/session.c | 18 ++++++++++++------ dlls/mf/tests/mf.c | 3 --- 2 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/dlls/mf/session.c b/dlls/mf/session.c index 2f51a19641c..414d4301eb4 100644 --- a/dlls/mf/session.c +++ b/dlls/mf/session.c @@ -1491,7 +1491,7 @@ static void session_set_consumed_clock(IUnknown *object, IMFPresentationClock *c } }
-static void session_set_presentation_clock(struct media_session *session) +static void session_set_presentation_clock(struct media_session *session, BOOL seeking) { IMFPresentationTimeSource *time_source = NULL; struct media_source *source; @@ -1499,10 +1499,13 @@ static void session_set_presentation_clock(struct media_session *session) struct topo_node *node; HRESULT hr;
- LIST_FOR_EACH_ENTRY(node, &session->presentation.nodes, struct topo_node, entry) + if (!seeking) { - if (node->type == MF_TOPOLOGY_TRANSFORM_NODE) - IMFTransform_ProcessMessage(node->object.transform, MFT_MESSAGE_NOTIFY_START_OF_STREAM, 0); + LIST_FOR_EACH_ENTRY(node, &session->presentation.nodes, struct topo_node, entry) + { + if (node->type == MF_TOPOLOGY_TRANSFORM_NODE) + IMFTransform_ProcessMessage(node->object.transform, MFT_MESSAGE_NOTIFY_START_OF_STREAM, 0); + } }
if (!(session->presentation.flags & SESSION_FLAG_PRESENTATION_CLOCK_SET)) @@ -1617,7 +1620,7 @@ static void session_complete_rate_change(struct media_session *session) return;
session->presentation.flags &= ~SESSION_FLAG_PENDING_RATE_CHANGE; - session_set_presentation_clock(session); + session_set_presentation_clock(session, FALSE);
session->presentation.thin_committed = session->presentation.thin;
@@ -3250,10 +3253,13 @@ static void session_set_source_object_state(struct media_session *session, IUnkn BOOL changed = FALSE; DWORD i, count; HRESULT hr; + BOOL seeking;
if ((state = session_get_object_state_for_event(event_type)) == OBJ_STATE_INVALID) return;
+ seeking = (event_type == MESourceSeeked || event_type == MEStreamSeeked); + switch (event_type) { case MESourceSeeked: @@ -3292,7 +3298,7 @@ static void session_set_source_object_state(struct media_session *session, IUnkn
session_set_topo_status(session, S_OK, MF_TOPOSTATUS_STARTED_SOURCE);
- session_set_presentation_clock(session); + session_set_presentation_clock(session, seeking);
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 8550157073b..a02f2859f91 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -7656,7 +7656,6 @@ static HRESULT WINAPI test_transform_ProcessMessage(IMFTransform *iface, MFT_MES return S_OK;
case MFT_MESSAGE_NOTIFY_START_OF_STREAM: - todo_wine_if(!expect_test_transform_ProcessMessage_START_OF_STREAM) CHECK_EXPECT(test_transform_ProcessMessage_START_OF_STREAM); add_object_state(&actual_object_state_record, MFT_START); return S_OK; @@ -7960,7 +7959,6 @@ static void test_media_session_seek(void) CHECK_CALLED(test_stream_sink_Flush); CHECK_CALLED(test_transform_ProcessMessage_FLUSH);
- todo_wine compare_object_states(&actual_object_state_record, &expected_seek_start_no_pending_request_records);
/* Test a sample request only (i.e. with no sample delivery), then pause and then start with a seek */ @@ -8023,7 +8021,6 @@ static void test_media_session_seek(void) CHECK_CALLED(test_transform_ProcessOutput); CHECK_CALLED(test_media_stream_RequestSample);
- todo_wine compare_object_states(&actual_object_state_record, &expected_seek_start_pending_request_records);
IMFPresentationClock_RemoveClockStateSink(presentation_clock, &test_seek_clock_sink);