From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/session.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/dlls/mf/session.c b/dlls/mf/session.c index dc7fe9c9b93..df86ba1e3ad 100644 --- a/dlls/mf/session.c +++ b/dlls/mf/session.c @@ -231,7 +231,6 @@ enum presentation_flags SESSION_FLAG_NEEDS_PREROLL = 0x8, SESSION_FLAG_END_OF_PRESENTATION = 0x10, SESSION_FLAG_PENDING_RATE_CHANGE = 0x20, - SESSION_FLAG_PENDING_COMMAND = 0x40, };
struct media_session @@ -484,7 +483,7 @@ static HRESULT session_submit_command(struct media_session *session, struct sess EnterCriticalSection(&session->cs); if (SUCCEEDED(hr = session_is_shut_down(session))) { - if (list_empty(&session->commands) && !(session->presentation.flags & SESSION_FLAG_PENDING_COMMAND)) + if (list_empty(&session->commands) && session->command_state == COMMAND_STATE_COMPLETE) { hr = MFPutWorkItem(MFASYNC_CALLBACK_QUEUE_STANDARD, &session->commands_callback, &op->IUnknown_iface); op->submitted = SUCCEEDED(hr); @@ -978,7 +977,6 @@ static void session_command_complete(struct media_session *session) HRESULT hr;
session->command_state = COMMAND_STATE_COMPLETE; - session->presentation.flags &= ~SESSION_FLAG_PENDING_COMMAND;
/* Submit next command. */ if ((e = list_head(&session->commands))) @@ -2813,14 +2811,13 @@ static HRESULT WINAPI session_commands_callback_Invoke(IMFAsyncCallback *iface,
EnterCriticalSection(&session->cs);
- if (session->presentation.flags & SESSION_FLAG_PENDING_COMMAND) + if (session->command_state != COMMAND_STATE_COMPLETE) { WARN("session %p command is in progress, waiting for it to complete.\n", session); LeaveCriticalSection(&session->cs); return S_OK; } list_remove(&op->entry); - session->presentation.flags |= SESSION_FLAG_PENDING_COMMAND;
switch (op->command) { @@ -4172,7 +4169,8 @@ static void session_raise_end_of_presentation(struct media_session *session) { if (session_nodes_is_mask_set(session, MF_TOPOLOGY_MAX, SOURCE_FLAG_END_OF_PRESENTATION)) { - session->presentation.flags |= SESSION_FLAG_END_OF_PRESENTATION | SESSION_FLAG_PENDING_COMMAND; + session->command_state = COMMAND_STATE_STOPPING_SINKS; + session->presentation.flags |= SESSION_FLAG_END_OF_PRESENTATION; IMFMediaEventQueue_QueueEventParamVar(session->event_queue, MEEndOfPresentation, &GUID_NULL, S_OK, NULL); } }