[PATCH 4/6] winegstreamer: Move end conditions out of the wm_asyncreader stream loop.

Rémi Bernon wine at gitlab.winehq.org
Fri Jun 10 11:05:04 CDT 2022


From: Rémi Bernon <rbernon at codeweavers.com>

Signed-off-by: Rémi Bernon <rbernon at 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:
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/226



More information about the wine-devel mailing list