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 a10655fc57a..c86012c5056 100644 --- a/dlls/mf/session.c +++ b/dlls/mf/session.c @@ -1483,7 +1483,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; @@ -1491,10 +1491,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)) @@ -1608,7 +1611,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);
hr = IMFRateControl_SetRate(session->clock_rate_control, session->presentation.thin, session->presentation.rate); @@ -3239,6 +3242,7 @@ static void session_set_source_object_state(struct media_session *session, IUnkn BOOL changed = FALSE; DWORD i, count; HRESULT hr; + BOOL seeking = FALSE;
if ((state = session_get_object_state_for_event(event_type)) == OBJ_STATE_INVALID) return; @@ -3246,6 +3250,7 @@ static void session_set_source_object_state(struct media_session *session, IUnkn switch (event_type) { case MESourceSeeked: + seeking = TRUE; case MESourceStarted: case MESourcePaused: case MESourceStopped: @@ -3261,6 +3266,7 @@ static void session_set_source_object_state(struct media_session *session, IUnkn } break; case MEStreamSeeked: + seeking = TRUE; case MEStreamStarted: case MEStreamPaused: case MEStreamStopped: @@ -3281,7 +3287,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 3d69e5640cf..420faf88349 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -7328,7 +7328,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; @@ -7632,7 +7631,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 */ @@ -7695,7 +7693,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);