From: Torge Matthies openglfreak@googlemail.com
Leaving SESSION_FLAG_PENDING_COMMAND set results in no more work items being queued by session_submit_command, and even if they were, callback would return immediately due to a check at the start of the function. Thus, it is never valid to leave the function without clearing the SESSION_FLAG_PENDING_COMMAND flag.
This case can be hit by SESSION_CMD_START, and leaves the session unable to process any commands.
Fix this by ensuring that SESSION_FLAG_PENDING_COMMAND is always cleared before the command callback returns. --- dlls/mf/session.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/dlls/mf/session.c b/dlls/mf/session.c index 3c989249229..da8e0bb824a 100644 --- a/dlls/mf/session.c +++ b/dlls/mf/session.c @@ -2725,7 +2725,6 @@ static HRESULT WINAPI session_commands_callback_Invoke(IMFAsyncCallback *iface, break; case SESSION_CMD_SET_TOPOLOGY: session_set_topology(session, op->set_topology.flags, op->set_topology.topology); - session_command_complete(session); break; case SESSION_CMD_START: session_start(session, &op->start.time_format, &op->start.start_position); @@ -2744,12 +2743,14 @@ static HRESULT WINAPI session_commands_callback_Invoke(IMFAsyncCallback *iface, break; case SESSION_CMD_SHUTDOWN: session_clear_command_list(session); - session_command_complete(session); break; default: ; }
+ if (session->presentation.flags & SESSION_FLAG_PENDING_COMMAND) + session_command_complete(session); + LeaveCriticalSection(&session->cs);
IUnknown_Release(&op->IUnknown_iface);