From: Conor McCarthy cmccarthy@codeweavers.com
--- dlls/mf/samplegrabber.c | 3 ++- dlls/mf/session.c | 18 ++++++++++++++++++ dlls/mf/tests/mf.c | 1 - 3 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/dlls/mf/samplegrabber.c b/dlls/mf/samplegrabber.c index 52f287dac26..a125acf54a2 100644 --- a/dlls/mf/samplegrabber.c +++ b/dlls/mf/samplegrabber.c @@ -1193,7 +1193,8 @@ static HRESULT sample_grabber_set_state(struct sample_grabber *grabber, enum sin grabber->sample_count = MAX_SAMPLE_QUEUE_LENGTH; }
- if (state == SINK_STATE_RUNNING && grabber->state != SINK_STATE_RUNNING) + if (state == SINK_STATE_RUNNING + && (grabber->state != SINK_STATE_RUNNING || offset != PRESENTATION_CURRENT_POSITION)) { /* Seek operations flush all pending sample requests. */ if (offset != PRESENTATION_CURRENT_POSITION) diff --git a/dlls/mf/session.c b/dlls/mf/session.c index 2e95d763984..d5776ceaa70 100644 --- a/dlls/mf/session.c +++ b/dlls/mf/session.c @@ -1033,6 +1033,21 @@ static void session_flush_nodes(struct media_session *session) } }
+static void session_reset_request_count(struct media_session *session) +{ + struct topo_node *node; + UINT i; + + LIST_FOR_EACH_ENTRY(node, &session->presentation.nodes, struct topo_node, entry) + { + if (node->type == MF_TOPOLOGY_TRANSFORM_NODE) + { + for (i = 0; i < node->u.transform.output_count; ++i) + node->u.transform.outputs[i].requests = 0; + } + } +} + static void session_handle_source_shutdown(struct media_session *session);
static void session_start(struct media_session *session, const GUID *time_format, const PROPVARIANT *start_position) @@ -3154,6 +3169,9 @@ static void session_set_source_object_state(struct media_session *session, IUnkn if (!session_is_source_nodes_state(session, OBJ_STATE_STARTED)) break;
+ /* In a paused state, the request count may be non-zero from when the session was running. */ + session_reset_request_count(session); + session_set_topo_status(session, S_OK, MF_TOPOSTATUS_STARTED_SOURCE);
session_set_presentation_clock(session); diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index 6893500426d..e5c61b9356b 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -6405,7 +6405,6 @@ static void test_media_session_Start(void) hr = IMFPresentationClock_GetTime(presentation_clock, &time); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(llabs(time - 10000000) <= allowed_error, "Unexpected time %I64d.\n", time); - todo_wine check_sample_delivery(grabber_callback->ready_event);
/* Seek to beyond duration */