Zebediah Figura : winegstreamer: Move the read request fields to struct wg_parser.

Alexandre Julliard julliard at winehq.org
Tue Feb 2 15:52:08 CST 2021


Module: wine
Branch: master
Commit: 6e5af4fc7d035de2bb09402103f4923d305589c0
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=6e5af4fc7d035de2bb09402103f4923d305589c0

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Mon Feb  1 18:36:58 2021 -0600

winegstreamer: Move the read request fields to struct wg_parser.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winegstreamer/gstdemux.c | 63 ++++++++++++++++++++++---------------------
 1 file changed, 33 insertions(+), 30 deletions(-)

diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c
index 2c838643554..ea5d84e4105 100644
--- a/dlls/winegstreamer/gstdemux.c
+++ b/dlls/winegstreamer/gstdemux.c
@@ -58,6 +58,16 @@ struct wg_parser
 
     pthread_cond_t init_cond;
     bool no_more_pads, has_duration, error;
+
+    pthread_cond_t read_cond, read_done_cond;
+    struct
+    {
+        GstBuffer *buffer;
+        uint64_t offset;
+        uint32_t size;
+        bool done;
+        GstFlowReturn ret;
+    } read_request;
 };
 
 struct parser
@@ -86,15 +96,6 @@ struct parser
     pthread_mutex_t mutex;
 
     HANDLE read_thread;
-    pthread_cond_t read_cond, read_done_cond;
-    struct
-    {
-        GstBuffer *buffer;
-        uint64_t offset;
-        uint32_t size;
-        bool done;
-        GstFlowReturn ret;
-    } read_request;
 
     BOOL (*init_gst)(struct parser *filter);
     HRESULT (*source_query_accept)(struct parser_source *pin, const AM_MEDIA_TYPE *mt);
@@ -1108,6 +1109,7 @@ static DWORD CALLBACK stream_thread(void *arg)
 static GstFlowReturn request_buffer_src(GstPad *pad, GstObject *parent, guint64 offset, guint size, GstBuffer **buffer)
 {
     struct parser *filter = gst_pad_get_element_private(pad);
+    struct wg_parser *parser = filter->wg_parser;
     GstBuffer *new_buffer = NULL;
     GstFlowReturn ret;
 
@@ -1118,21 +1120,21 @@ static GstFlowReturn request_buffer_src(GstPad *pad, GstObject *parent, guint64
 
     pthread_mutex_lock(&filter->mutex);
 
-    assert(!filter->read_request.buffer);
-    filter->read_request.buffer = *buffer;
-    filter->read_request.offset = offset;
-    filter->read_request.size = size;
-    filter->read_request.done = false;
-    pthread_cond_signal(&filter->read_cond);
+    assert(!parser->read_request.buffer);
+    parser->read_request.buffer = *buffer;
+    parser->read_request.offset = offset;
+    parser->read_request.size = size;
+    parser->read_request.done = false;
+    pthread_cond_signal(&parser->read_cond);
 
     /* Note that we don't unblock this wait on GST_EVENT_FLUSH_START. We expect
      * the upstream pin to flush if necessary. We should never be blocked on
      * read_thread() not running. */
 
-    while (!filter->read_request.done)
-        pthread_cond_wait(&filter->read_done_cond, &filter->mutex);
+    while (!parser->read_request.done)
+        pthread_cond_wait(&parser->read_done_cond, &filter->mutex);
 
-    ret = filter->read_request.ret;
+    ret = parser->read_request.ret;
 
     pthread_mutex_unlock(&filter->mutex);
 
@@ -1177,6 +1179,7 @@ static GstFlowReturn read_buffer(struct parser *This, guint64 ofs, guint len, Gs
 static DWORD CALLBACK read_thread(void *arg)
 {
     struct parser *filter = arg;
+    struct wg_parser *parser = filter->wg_parser;
 
     TRACE("Starting read thread for filter %p.\n", filter);
 
@@ -1184,17 +1187,17 @@ static DWORD CALLBACK read_thread(void *arg)
 
     for (;;)
     {
-        while (filter->sink_connected && !filter->read_request.buffer)
-            pthread_cond_wait(&filter->read_cond, &filter->mutex);
+        while (filter->sink_connected && !parser->read_request.buffer)
+            pthread_cond_wait(&parser->read_cond, &filter->mutex);
 
         if (!filter->sink_connected)
             break;
 
-        filter->read_request.done = true;
-        filter->read_request.ret = read_buffer(filter, filter->read_request.offset,
-                filter->read_request.size, filter->read_request.buffer);
-        filter->read_request.buffer = NULL;
-        pthread_cond_signal(&filter->read_done_cond);
+        parser->read_request.done = true;
+        parser->read_request.ret = read_buffer(filter, parser->read_request.offset,
+                parser->read_request.size, parser->read_request.buffer);
+        parser->read_request.buffer = NULL;
+        pthread_cond_signal(&parser->read_done_cond);
     }
 
     pthread_mutex_unlock(&filter->mutex);
@@ -1671,6 +1674,8 @@ static void wg_parser_destroy(struct wg_parser *parser)
     }
 
     pthread_cond_destroy(&parser->init_cond);
+    pthread_cond_destroy(&parser->read_cond);
+    pthread_cond_destroy(&parser->read_done_cond);
 
     free(parser);
 }
@@ -1695,8 +1700,6 @@ static void parser_destroy(struct strmbase_filter *iface)
 
     wg_parser_destroy(filter->wg_parser);
 
-    pthread_cond_destroy(&filter->read_cond);
-    pthread_cond_destroy(&filter->read_done_cond);
     pthread_mutex_destroy(&filter->mutex);
 
     strmbase_sink_cleanup(&filter->sink);
@@ -1994,8 +1997,6 @@ static BOOL parser_init_gstreamer(void)
 static void parser_init_common(struct parser *object)
 {
     pthread_mutex_init(&object->mutex, NULL);
-    pthread_cond_init(&object->read_cond, NULL);
-    pthread_cond_init(&object->read_done_cond, NULL);
     object->flushing = true;
 }
 
@@ -2007,6 +2008,8 @@ static struct wg_parser *wg_parser_create(void)
         return NULL;
 
     pthread_cond_init(&parser->init_cond, NULL);
+    pthread_cond_init(&parser->read_cond, NULL);
+    pthread_cond_init(&parser->read_done_cond, NULL);
 
     TRACE("Created winegstreamer parser %p.\n", parser);
     return parser;
@@ -2537,7 +2540,7 @@ static HRESULT GST_RemoveOutputPins(struct parser *This)
     pthread_mutex_lock(&This->mutex);
     This->sink_connected = false;
     pthread_mutex_unlock(&This->mutex);
-    pthread_cond_signal(&This->read_cond);
+    pthread_cond_signal(&parser->read_cond);
     WaitForSingleObject(This->read_thread, INFINITE);
     CloseHandle(This->read_thread);
 




More information about the wine-cvs mailing list