From: Torge Matthies openglfreak@googlemail.com
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..ecfa94dcfa1 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 = HRESULT_FROM_WIN32(ERROR_RETRY); 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 != HRESULT_FROM_WIN32(ERROR_RETRY)) + return hr; + }
return media_stream_send_eos(source, stream); }