From: Rémi Bernon rbernon@codeweavers.com
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/winegstreamer/wm_asyncreader.c | 115 ++++++++++++++-------------- 1 file changed, 56 insertions(+), 59 deletions(-)
diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c index 97ee1fe60cd..15e7c2dc9ca 100644 --- a/dlls/winegstreamer/wm_asyncreader.c +++ b/dlls/winegstreamer/wm_asyncreader.c @@ -74,12 +74,13 @@ static DWORD WINAPI stream_thread(void *arg) struct async_reader *reader = arg; IWMReaderCallback *callback = reader->callback; REFERENCE_TIME start_time; + struct wm_stream *stream; static const DWORD zero; QWORD pts, duration; WORD stream_number; INSSBuffer *sample; + HRESULT hr = S_OK; DWORD flags; - HRESULT hr;
start_time = get_current_time(reader);
@@ -88,80 +89,76 @@ static DWORD WINAPI stream_thread(void *arg) while (reader->running) { hr = wm_reader_get_stream_sample(&reader->reader, 0, &sample, &pts, &duration, &flags, &stream_number); + if (hr != S_OK) + break; + + stream = wm_reader_get_stream_by_stream_number(&reader->reader, stream_number);
- if (hr == S_OK) + if (reader->user_clock) { - struct wm_stream *stream = wm_reader_get_stream_by_stream_number(&reader->reader, stream_number); + QWORD user_time = reader->user_time;
- if (reader->user_clock) + if (pts > user_time && reader->reader.callback_advanced) + IWMReaderCallbackAdvanced_OnTime(reader->reader.callback_advanced, user_time, reader->context); + while (pts > reader->user_time && reader->running) + SleepConditionVariableCS(&reader->stream_cv, &reader->stream_cs, INFINITE); + if (!reader->running) { - QWORD user_time = reader->user_time; - - if (pts > user_time && reader->reader.callback_advanced) - IWMReaderCallbackAdvanced_OnTime(reader->reader.callback_advanced, user_time, reader->context); - while (pts > reader->user_time && reader->running) - SleepConditionVariableCS(&reader->stream_cv, &reader->stream_cs, INFINITE); - if (!reader->running) - { - INSSBuffer_Release(sample); - goto out; - } + INSSBuffer_Release(sample); + goto out; } - else + } + else + { + for (;;) { - for (;;) - { - REFERENCE_TIME current_time = get_current_time(reader); + REFERENCE_TIME current_time = get_current_time(reader);
- if (pts <= current_time - start_time) - break; + if (pts <= current_time - start_time) + break;
- SleepConditionVariableCS(&reader->stream_cv, &reader->stream_cs, - (pts - (current_time - start_time)) / 10000); + SleepConditionVariableCS(&reader->stream_cv, &reader->stream_cs, + (pts - (current_time - start_time)) / 10000);
- if (!reader->running) - { - INSSBuffer_Release(sample); - goto out; - } + if (!reader->running) + { + INSSBuffer_Release(sample); + goto out; } } - - if (stream->read_compressed) - hr = IWMReaderCallbackAdvanced_OnStreamSample(reader->reader.callback_advanced, - stream_number, pts, duration, flags, sample, reader->context); - else - hr = IWMReaderCallback_OnSample(callback, stream_number - 1, pts, duration, - flags, sample, reader->context); - TRACE("Callback returned %#lx.\n", hr); - INSSBuffer_Release(sample); } - else if (hr == NS_E_NO_MORE_SAMPLES) - { - IWMReaderCallback_OnStatus(callback, WMT_END_OF_STREAMING, S_OK, - WMT_TYPE_DWORD, (BYTE *)&zero, reader->context); - IWMReaderCallback_OnStatus(callback, WMT_EOF, S_OK, - WMT_TYPE_DWORD, (BYTE *)&zero, reader->context); - - if (reader->user_clock && reader->reader.callback_advanced) - { - /* We can only get here if user_time is greater than the PTS - * of all samples, in which case we cannot have sent this - * notification already. */ - IWMReaderCallbackAdvanced_OnTime(reader->reader.callback_advanced, - reader->user_time, reader->context); - }
- TRACE("Reached end of stream; exiting.\n"); - LeaveCriticalSection(&reader->stream_cs); - return 0; - } + if (stream->read_compressed) + hr = IWMReaderCallbackAdvanced_OnStreamSample(reader->reader.callback_advanced, + stream_number, pts, duration, flags, sample, reader->context); else + hr = IWMReaderCallback_OnSample(callback, stream_number - 1, pts, duration, + flags, sample, reader->context); + TRACE("Callback returned %#lx.\n", hr); + INSSBuffer_Release(sample); + } + + if (hr == NS_E_NO_MORE_SAMPLES) + { + IWMReaderCallback_OnStatus(callback, WMT_END_OF_STREAMING, S_OK, + WMT_TYPE_DWORD, (BYTE *)&zero, reader->context); + IWMReaderCallback_OnStatus(callback, WMT_EOF, S_OK, + WMT_TYPE_DWORD, (BYTE *)&zero, reader->context); + + if (reader->user_clock && reader->reader.callback_advanced) { - ERR("Failed to get sample, hr %#lx.\n", hr); - LeaveCriticalSection(&reader->stream_cs); - return 0; + /* We can only get here if user_time is greater than the PTS + * of all samples, in which case we cannot have sent this + * notification already. */ + IWMReaderCallbackAdvanced_OnTime(reader->reader.callback_advanced, + reader->user_time, reader->context); } + + TRACE("Reached end of stream; exiting.\n"); + } + else if (hr != S_OK) + { + ERR("Failed to get sample, hr %#lx.\n", hr); }
out: