Torge Matthies : winegstreamer: Handle Gstreamer pipeline flushes gracefully in the media source.
Module: wine Branch: master Commit: 9dd9c455d345835a9a5454546b8489245b81f3ed URL: https://gitlab.winehq.org/wine/wine/-/commit/9dd9c455d345835a9a5454546b84892... Author: Torge Matthies <openglfreak(a)googlemail.com> Date: Fri Jun 14 03:11:44 2024 +0200 winegstreamer: Handle Gstreamer pipeline flushes gracefully in the media source. If a GST_EVENT_FLUSH_START event is received between the calls from PE code to wg_parser_stream_get_buffer and wg_parser_stream_copy_buffer, the latter function will return an error, resulting in the sample request being dropped without having delivered a sample. If wg_parser_stream_copy_buffer returns an error, retry the whole wait_on_sample procedure. Flushes can be triggered by seek operations. --- dlls/winegstreamer/media_source.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index 474bc42ae15..030d0c1b9a2 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -728,6 +728,7 @@ static HRESULT media_stream_send_sample(struct media_stream *stream, const struc if (!wg_parser_stream_copy_buffer(stream->wg_stream, data, 0, wg_buffer->size)) { + hr = S_FALSE; wg_parser_stream_release_buffer(stream->wg_stream); IMFMediaBuffer_Unlock(buffer); goto out; @@ -789,8 +790,12 @@ static HRESULT wait_on_sample(struct media_stream *stream, IUnknown *token) TRACE("%p, %p\n", stream, token); - if (wg_parser_stream_get_buffer(source->wg_parser, stream->wg_stream, &buffer)) - return media_stream_send_sample(stream, &buffer, token); + while (wg_parser_stream_get_buffer(source->wg_parser, stream->wg_stream, &buffer)) + { + HRESULT hr = media_stream_send_sample(stream, &buffer, token); + if (hr != S_FALSE) + return hr; + } return media_stream_send_eos(source, stream); }
participants (1)
-
Alexandre Julliard