1
0
mirror of https://github.com/wine-mirror/wine synced 2024-06-29 06:14:34 +00:00

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.
This commit is contained in:
Torge Matthies 2024-06-14 03:11:44 +02:00 committed by Alexandre Julliard
parent 62d8d3415c
commit 9dd9c455d3

View File

@ -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);
}