[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