[PATCH v2] winegstreamer: Do not block forever if EOS races with command queue.

Nikolay Sivov nsivov at codeweavers.com
Tue Feb 22 15:09:54 CST 2022



On 2/9/22 11:40, Giovanni Mascellani wrote:
> Currently, the winegstreamer media source checks for EOS when
> RequestSample() is called, but doesn't handle the cases when EOS
> is detected between the RequestSample() call and the moment when
> the request is popped from the command queue and serviced. This
> can result in the media source waiting forever for a sample and
> get stuck.
>
> This commit fixes the bug by adding a check for EOS in
> wait_for_event().
>
> This commit fixes Medieval Dynasty hanging on developer logos on
> the Steam Deck.
>
> Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
> ---
>   dlls/winegstreamer/media_source.c | 6 ++++++
>   1 file changed, 6 insertions(+)
>
> diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
> index 85ec31d2498..ca8f92b07ea 100644
> --- a/dlls/winegstreamer/media_source.c
> +++ b/dlls/winegstreamer/media_source.c
> @@ -534,6 +534,12 @@ static void wait_on_sample(struct media_stream *stream, IUnknown *token)
>   
>       TRACE("%p, %p\n", stream, token);
>   
> +    if (stream->eos)
> +    {
> +        IMFMediaEventQueue_QueueEventParamVar(stream->event_queue, MEError, &GUID_NULL, MF_E_END_OF_STREAM, &empty_var);
> +        return;
> +    }
> +
>       for (;;)
>       {
>           if (!wg_parser_stream_get_event(stream->wg_stream, &event))
Sorry, I missed this one. What I don't understand about this is why 
wg_parser_stream_get_event() can't simply return for streams that 
reached eos. It seems it should be able to track such state differences. 
There is already eos flag in wg_parser_stream(), but I see it means 
something else, and is never reset (I think).

Anyway, since there is no way to test this situation on Windows, at 
least for file-based sources that I tried, I think we should simply 
return without producing an event.



More information about the wine-devel mailing list