Module: wine Branch: master Commit: 819a848a5f035d48eb6987d5eeecb21051d049c3 URL: https://gitlab.winehq.org/wine/wine/-/commit/819a848a5f035d48eb6987d5eeecb21...
Author: Rémi Bernon rbernon@codeweavers.com Date: Sat Sep 24 01:23:04 2022 +0200
winegstreamer: Merge wm_reader_get_stream_sample with GetNextSample.
---
dlls/winegstreamer/wm_reader.c | 74 +++++++++++++----------------------------- 1 file changed, 23 insertions(+), 51 deletions(-)
diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index 43de0f5e970..8ac852a99b0 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -1652,55 +1652,6 @@ static HRESULT wm_reader_read_stream_sample(struct wm_reader *reader, struct wg_ return S_OK; }
-static HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, WORD stream_number, - INSSBuffer **ret_sample, QWORD *pts, QWORD *duration, DWORD *flags, WORD *ret_stream_number) -{ - struct wg_parser_buffer wg_buffer; - struct wm_stream *stream; - HRESULT hr = S_OK; - - do - { - if (!stream_number) - { - if (!wg_parser_stream_get_buffer(reader->wg_parser, NULL, &wg_buffer)) - { - /* All streams are disabled or EOS. */ - return NS_E_NO_MORE_SAMPLES; - } - } - else - { - if (!(stream = wm_reader_get_stream_by_stream_number(reader, stream_number))) - { - WARN("Invalid stream number %u; returning E_INVALIDARG.\n", stream_number); - return E_INVALIDARG; - } - - if (stream->selection == WMT_OFF) - { - WARN("Stream %u is deselected; returning NS_E_INVALID_REQUEST.\n", stream_number); - return NS_E_INVALID_REQUEST; - } - - if (stream->eos) - return NS_E_NO_MORE_SAMPLES; - - if (!wg_parser_stream_get_buffer(reader->wg_parser, stream->wg_stream, &wg_buffer)) - { - stream->eos = true; - TRACE("End of stream.\n"); - return NS_E_NO_MORE_SAMPLES; - } - } - - if (SUCCEEDED(hr = wm_reader_read_stream_sample(reader, &wg_buffer, ret_sample, pts, duration, flags))) - *ret_stream_number = wg_buffer.stream + 1; - } while (hr == S_FALSE); - - return hr; -} - static struct wm_reader *impl_from_IUnknown(IUnknown *iface) { return CONTAINING_RECORD(iface, struct wm_reader, IUnknown_inner); @@ -1869,7 +1820,8 @@ static HRESULT WINAPI reader_GetNextSample(IWMSyncReader2 *iface, DWORD *flags, DWORD *output_number, WORD *ret_stream_number) { struct wm_reader *reader = impl_from_IWMSyncReader2(iface); - HRESULT hr = NS_E_NO_MORE_SAMPLES; + struct wm_stream *stream; + HRESULT hr = S_FALSE;
TRACE("reader %p, stream_number %u, sample %p, pts %p, duration %p," " flags %p, output_number %p, ret_stream_number %p.\n", @@ -1880,7 +1832,27 @@ static HRESULT WINAPI reader_GetNextSample(IWMSyncReader2 *iface,
EnterCriticalSection(&reader->cs);
- hr = wm_reader_get_stream_sample(reader, stream_number, sample, pts, duration, flags, &stream_number); + if (!stream_number) + stream = NULL; + else if (!(stream = wm_reader_get_stream_by_stream_number(reader, stream_number))) + hr = E_INVALIDARG; + else if (stream->selection == WMT_OFF) + hr = NS_E_INVALID_REQUEST; + else if (stream->eos) + hr = NS_E_NO_MORE_SAMPLES; + + while (hr == S_FALSE) + { + struct wg_parser_buffer wg_buffer; + if (!wg_parser_stream_get_buffer(reader->wg_parser, stream ? stream->wg_stream : NULL, &wg_buffer)) + hr = NS_E_NO_MORE_SAMPLES; + else if (SUCCEEDED(hr = wm_reader_read_stream_sample(reader, &wg_buffer, sample, pts, duration, flags))) + stream_number = wg_buffer.stream + 1; + } + + if (stream && hr == NS_E_NO_MORE_SAMPLES) + stream->eos = true; + if (output_number && hr == S_OK) *output_number = stream_number - 1; if (ret_stream_number && (hr == S_OK || stream_number))