[PATCH 2/3] winegstreamer: Move IWMReaderCallbackAdvanced *callback_advanced to a local variable.

Rémi Bernon wine at gitlab.winehq.org
Wed Jul 6 12:14:21 CDT 2022


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

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/winegstreamer/gst_private.h    |  4 +---
 dlls/winegstreamer/wm_asyncreader.c | 27 +++++++++++++++------------
 dlls/winegstreamer/wm_reader.c      |  7 +------
 dlls/winegstreamer/wm_syncreader.c  |  2 +-
 4 files changed, 18 insertions(+), 22 deletions(-)

diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index 8348d2e8360..2c3039acbe9 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -180,8 +180,6 @@ struct wm_reader
     struct wm_stream *streams;
     WORD stream_count;
 
-    IWMReaderCallbackAdvanced *callback_advanced;
-
     const struct wm_reader_ops *ops;
 };
 
@@ -201,7 +199,7 @@ HRESULT wm_reader_get_output_props(struct wm_reader *reader, DWORD output,
         IWMOutputMediaProps **props);
 struct wm_stream *wm_reader_get_stream_by_stream_number(struct wm_reader *reader,
         WORD stream_number);
-HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, WORD stream_number,
+HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, IWMReaderCallbackAdvanced *callback_advanced, WORD stream_number,
         INSSBuffer **ret_sample, QWORD *pts, QWORD *duration, DWORD *flags, WORD *ret_stream_number);
 HRESULT wm_reader_get_stream_selection(struct wm_reader *reader,
         WORD stream_number, WMT_STREAM_SELECTION *selection);
diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c
index ef6e445a51b..9d8c2be45cb 100644
--- a/dlls/winegstreamer/wm_asyncreader.c
+++ b/dlls/winegstreamer/wm_asyncreader.c
@@ -57,22 +57,17 @@ static REFERENCE_TIME get_current_time(const struct async_reader *reader)
 static void open_stream(struct async_reader *reader, IWMReaderCallback *callback, void *context)
 {
     static const DWORD zero;
-    HRESULT hr;
 
     IWMReaderCallback_AddRef(reader->callback = callback);
     reader->context = context;
     IWMReaderCallback_OnStatus(callback, WMT_OPENED, S_OK, WMT_TYPE_DWORD, (BYTE *)&zero, context);
-
-    if (FAILED(hr = IWMReaderCallback_QueryInterface(callback,
-            &IID_IWMReaderCallbackAdvanced, (void **)&reader->reader.callback_advanced)))
-        reader->reader.callback_advanced = NULL;
-    TRACE("Querying for IWMReaderCallbackAdvanced returned %#lx.\n", hr);
 }
 
 static DWORD WINAPI stream_thread(void *arg)
 {
     struct async_reader *reader = arg;
     IWMReaderCallback *callback = reader->callback;
+    IWMReaderCallbackAdvanced *callback_advanced;
     REFERENCE_TIME start_time;
     struct wm_stream *stream;
     static const DWORD zero;
@@ -86,9 +81,14 @@ static DWORD WINAPI stream_thread(void *arg)
 
     EnterCriticalSection(&reader->stream_cs);
 
+    if (FAILED(hr = IWMReaderCallback_QueryInterface(callback,
+            &IID_IWMReaderCallbackAdvanced, (void **)&callback_advanced)))
+        callback_advanced = NULL;
+    TRACE("Querying for IWMReaderCallbackAdvanced returned %#lx.\n", hr);
+
     while (reader->running)
     {
-        hr = wm_reader_get_stream_sample(&reader->reader, 0, &sample, &pts, &duration, &flags, &stream_number);
+        hr = wm_reader_get_stream_sample(&reader->reader, callback_advanced, 0, &sample, &pts, &duration, &flags, &stream_number);
         if (hr != S_OK)
             break;
 
@@ -98,10 +98,10 @@ static DWORD WINAPI stream_thread(void *arg)
         {
             QWORD user_time = reader->user_time;
 
-            if (pts > user_time && reader->reader.callback_advanced)
+            if (pts > user_time && callback_advanced)
             {
                 LeaveCriticalSection(&reader->stream_cs);
-                IWMReaderCallbackAdvanced_OnTime(reader->reader.callback_advanced, user_time, reader->context);
+                IWMReaderCallbackAdvanced_OnTime(callback_advanced, user_time, reader->context);
                 EnterCriticalSection(&reader->stream_cs);
             }
 
@@ -126,7 +126,7 @@ static DWORD WINAPI stream_thread(void *arg)
         {
             LeaveCriticalSection(&reader->stream_cs);
             if (stream->read_compressed)
-                hr = IWMReaderCallbackAdvanced_OnStreamSample(reader->reader.callback_advanced,
+                hr = IWMReaderCallbackAdvanced_OnStreamSample(callback_advanced,
                         stream_number, pts, duration, flags, sample, reader->context);
             else
                 hr = IWMReaderCallback_OnSample(callback, stream_number - 1, pts, duration,
@@ -148,12 +148,12 @@ static DWORD WINAPI stream_thread(void *arg)
         IWMReaderCallback_OnStatus(callback, WMT_EOF, S_OK,
                 WMT_TYPE_DWORD, (BYTE *)&zero, reader->context);
 
-        if (reader->user_clock && reader->reader.callback_advanced)
+        if (reader->user_clock && 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,
+            IWMReaderCallbackAdvanced_OnTime(callback_advanced,
                     reader->user_time, reader->context);
         }
 
@@ -164,6 +164,9 @@ static DWORD WINAPI stream_thread(void *arg)
         ERR("Failed to get sample, hr %#lx.\n", hr);
     }
 
+    if (callback_advanced)
+        IWMReaderCallbackAdvanced_Release(callback_advanced);
+
     TRACE("Reader is stopping; exiting.\n");
     return 0;
 }
diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c
index 03adea8a318..8038b61f7a7 100644
--- a/dlls/winegstreamer/wm_reader.c
+++ b/dlls/winegstreamer/wm_reader.c
@@ -1607,10 +1607,6 @@ HRESULT wm_reader_close(struct wm_reader *reader)
     CloseHandle(reader->read_thread);
     reader->read_thread = NULL;
 
-    if (reader->callback_advanced)
-        IWMReaderCallbackAdvanced_Release(reader->callback_advanced);
-    reader->callback_advanced = NULL;
-
     wg_parser_destroy(reader->wg_parser);
     reader->wg_parser = NULL;
 
@@ -1871,10 +1867,9 @@ static WORD get_earliest_buffer(struct wm_reader *reader, struct wg_parser_buffe
     return stream_number;
 }
 
-HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, WORD stream_number,
+HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, IWMReaderCallbackAdvanced *callback_advanced, WORD stream_number,
         INSSBuffer **ret_sample, QWORD *pts, QWORD *duration, DWORD *flags, WORD *ret_stream_number)
 {
-    IWMReaderCallbackAdvanced *callback_advanced = reader->callback_advanced;
     struct wg_parser_stream *wg_stream;
     struct wg_parser_buffer wg_buffer;
     struct wm_stream *stream;
diff --git a/dlls/winegstreamer/wm_syncreader.c b/dlls/winegstreamer/wm_syncreader.c
index c7cccd52c4f..c80574b87fd 100644
--- a/dlls/winegstreamer/wm_syncreader.c
+++ b/dlls/winegstreamer/wm_syncreader.c
@@ -92,7 +92,7 @@ static HRESULT WINAPI WMSyncReader_GetNextSample(IWMSyncReader2 *iface,
 
     EnterCriticalSection(&reader->reader.cs);
 
-    hr = wm_reader_get_stream_sample(&reader->reader, stream_number, sample, pts, duration, flags, &stream_number);
+    hr = wm_reader_get_stream_sample(&reader->reader, NULL, stream_number, sample, pts, duration, flags, &stream_number);
     if (output_number && hr == S_OK)
         *output_number = stream_number - 1;
     if (ret_stream_number && (hr == S_OK || stream_number))
-- 
GitLab


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



More information about the wine-devel mailing list