[PATCH 4/5] winegstreamer: Rename wg_parser_get_next_read_offset to wg_parser_wait_request.

Rémi Bernon wine at gitlab.winehq.org
Tue Jun 14 02:27:02 CDT 2022


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

And wg_parser_push_data to wg_parser_reply_read.

Wrapping the request in a more general structure so we can later emit
buffer pool allocation request to the reader thread.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/winegstreamer/gst_private.h   |  4 ++--
 dlls/winegstreamer/main.c          | 17 ++++++++--------
 dlls/winegstreamer/media_source.c  | 24 ++++++++++++++++-------
 dlls/winegstreamer/quartz_parser.c | 24 ++++++++++++++++-------
 dlls/winegstreamer/unixlib.h       | 29 ++++++++++++++++++++++------
 dlls/winegstreamer/wg_parser.c     | 31 +++++++++++++++---------------
 dlls/winegstreamer/wm_reader.c     | 24 ++++++++++++++++-------
 7 files changed, 100 insertions(+), 53 deletions(-)

diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index e1abe7018da..2552e1d7f61 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -76,8 +76,8 @@ void wg_parser_destroy(struct wg_parser *parser);
 HRESULT wg_parser_connect(struct wg_parser *parser, uint64_t file_size);
 void wg_parser_disconnect(struct wg_parser *parser);
 
-bool wg_parser_get_next_read_offset(struct wg_parser *parser, uint64_t *offset, uint32_t *size);
-void wg_parser_push_data(struct wg_parser *parser, const void *data, uint32_t size);
+bool wg_parser_wait_request(struct wg_parser *parser, struct wg_request *request);
+void wg_parser_reply_read(struct wg_parser *parser, const void *data, uint32_t size);
 
 uint32_t wg_parser_get_stream_count(struct wg_parser *parser);
 struct wg_parser_stream *wg_parser_get_stream(struct wg_parser *parser, uint32_t index);
diff --git a/dlls/winegstreamer/main.c b/dlls/winegstreamer/main.c
index 5075b3118cd..25f0c38b700 100644
--- a/dlls/winegstreamer/main.c
+++ b/dlls/winegstreamer/main.c
@@ -107,25 +107,24 @@ void wg_parser_disconnect(struct wg_parser *parser)
     __wine_unix_call(unix_handle, unix_wg_parser_disconnect, parser);
 }
 
-bool wg_parser_get_next_read_offset(struct wg_parser *parser, uint64_t *offset, uint32_t *size)
+bool wg_parser_wait_request(struct wg_parser *parser, struct wg_request *wg_request)
 {
-    struct wg_parser_get_next_read_offset_params params =
+    struct wg_parser_wait_request_params params =
     {
         .parser = parser,
     };
 
-    TRACE("parser %p, offset %p, size %p.\n", parser, offset, size);
+    TRACE("parser %p, wg_request %p.\n", parser, wg_request);
 
-    if (__wine_unix_call(unix_handle, unix_wg_parser_get_next_read_offset, &params))
+    if (__wine_unix_call(unix_handle, unix_wg_parser_wait_request, &params))
         return false;
-    *offset = params.offset;
-    *size = params.size;
+    *wg_request = params.request;
     return true;
 }
 
-void wg_parser_push_data(struct wg_parser *parser, const void *data, uint32_t size)
+void wg_parser_reply_read(struct wg_parser *parser, const void *data, uint32_t size)
 {
-    struct wg_parser_push_data_params params =
+    struct wg_parser_reply_read_params params =
     {
         .parser = parser,
         .data = data,
@@ -134,7 +133,7 @@ void wg_parser_push_data(struct wg_parser *parser, const void *data, uint32_t si
 
     TRACE("parser %p, data %p, size %u.\n", parser, data, size);
 
-    __wine_unix_call(unix_handle, unix_wg_parser_push_data, &params);
+    __wine_unix_call(unix_handle, unix_wg_parser_reply_read, &params);
 }
 
 uint32_t wg_parser_get_stream_count(struct wg_parser *parser)
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
index ac23b1bc94c..5b98c90a8b4 100644
--- a/dlls/winegstreamer/media_source.c
+++ b/dlls/winegstreamer/media_source.c
@@ -593,9 +593,11 @@ static const IMFAsyncCallbackVtbl source_async_commands_callback_vtbl =
 };
 
 static void handle_read_request(struct media_source *source, QWORD file_size,
-        void **buffer, size_t *buffer_size, uint64_t offset, uint32_t size)
+        void **buffer, size_t *buffer_size, struct wg_request *request)
 {
     IMFByteStream *byte_stream = source->byte_stream;
+    uint64_t offset = request->u.read.offset;
+    uint32_t size = request->u.read.size;
     ULONG ret_size = 0;
     HRESULT hr;
     void *data;
@@ -607,7 +609,7 @@ static void handle_read_request(struct media_source *source, QWORD file_size,
 
     if (!array_reserve(buffer, buffer_size, size, 1))
     {
-        wg_parser_push_data(source->wg_parser, NULL, 0);
+        wg_parser_reply_read(source->wg_parser, NULL, 0);
         return;
     }
     data = *buffer;
@@ -631,7 +633,7 @@ static void handle_read_request(struct media_source *source, QWORD file_size,
         size = ret_size;
     }
 
-    wg_parser_push_data(source->wg_parser, data, size);
+    wg_parser_reply_read(source->wg_parser, data, size);
 }
 
 static DWORD CALLBACK read_thread(void *arg)
@@ -651,13 +653,21 @@ static DWORD CALLBACK read_thread(void *arg)
 
     while (!source->read_thread_shutdown)
     {
-        uint64_t offset;
-        uint32_t size;
+        struct wg_request request;
 
-        if (!wg_parser_get_next_read_offset(source->wg_parser, &offset, &size))
+        if (!wg_parser_wait_request(source->wg_parser, &request))
             continue;
 
-        handle_read_request(source, file_size, &data, &buffer_size, offset, size);
+        switch (request.type)
+        {
+            case WG_REQUEST_READ:
+                handle_read_request(source, file_size, &data, &buffer_size, &request);
+                break;
+
+            default:
+                FIXME("Ingoring unknown request %u\n", request.type);
+                continue;
+        }
     }
 
     free(data);
diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c
index 0e9f183d499..edf7ed6454b 100644
--- a/dlls/winegstreamer/quartz_parser.c
+++ b/dlls/winegstreamer/quartz_parser.c
@@ -866,8 +866,10 @@ static DWORD CALLBACK stream_thread(void *arg)
 }
 
 static void handle_read_request(struct parser *filter, LONGLONG file_size,
-        void **buffer, size_t *buffer_size, uint64_t offset, uint32_t size)
+        void **buffer, size_t *buffer_size, struct wg_request *request)
 {
+    uint64_t offset = request->u.read.offset;
+    uint32_t size = request->u.read.size;
     HRESULT hr;
     void *data;
 
@@ -878,7 +880,7 @@ static void handle_read_request(struct parser *filter, LONGLONG file_size,
 
     if (!array_reserve(buffer, buffer_size, size, 1))
     {
-        wg_parser_push_data(filter->wg_parser, NULL, 0);
+        wg_parser_reply_read(filter->wg_parser, NULL, 0);
         return;
     }
     data = *buffer;
@@ -891,7 +893,7 @@ static void handle_read_request(struct parser *filter, LONGLONG file_size,
         data = NULL;
     }
 
-    wg_parser_push_data(filter->wg_parser, data, size);
+    wg_parser_reply_read(filter->wg_parser, data, size);
 }
 
 static DWORD CALLBACK read_thread(void *arg)
@@ -910,13 +912,21 @@ static DWORD CALLBACK read_thread(void *arg)
 
     while (filter->sink_connected)
     {
-        uint64_t offset;
-        uint32_t size;
+        struct wg_request request;
 
-        if (!wg_parser_get_next_read_offset(filter->wg_parser, &offset, &size))
+        if (!wg_parser_wait_request(filter->wg_parser, &request))
             continue;
 
-        handle_read_request(filter, file_size, &data, &buffer_size, offset, size);
+        switch (request.type)
+        {
+            case WG_REQUEST_READ:
+                handle_read_request(filter, file_size, &data, &buffer_size, &request);
+                break;
+
+            default:
+                FIXME("Ingoring unknown request %u\n", request.type);
+                continue;
+        }
     }
 
     free(data);
diff --git a/dlls/winegstreamer/unixlib.h b/dlls/winegstreamer/unixlib.h
index 860a8ab2a52..f767daed513 100644
--- a/dlls/winegstreamer/unixlib.h
+++ b/dlls/winegstreamer/unixlib.h
@@ -135,6 +135,24 @@ struct wg_sample
     BYTE *data;
 };
 
+struct wg_request
+{
+    enum wg_request_type
+    {
+        WG_REQUEST_NONE = 0,
+        WG_REQUEST_READ = 1,
+    } type;
+
+    union
+    {
+        struct
+        {
+            UINT32 size;
+            UINT64 offset;
+        } read;
+    } u;
+};
+
 struct wg_parser_buffer
 {
     /* pts and duration are in 100-nanosecond units. */
@@ -165,14 +183,13 @@ struct wg_parser_connect_params
     UINT64 file_size;
 };
 
-struct wg_parser_get_next_read_offset_params
+struct wg_parser_wait_request_params
 {
     struct wg_parser *parser;
-    UINT32 size;
-    UINT64 offset;
+    struct wg_request request;
 };
 
-struct wg_parser_push_data_params
+struct wg_parser_reply_read_params
 {
     struct wg_parser *parser;
     const void *data;
@@ -271,8 +288,8 @@ enum unix_funcs
     unix_wg_parser_connect,
     unix_wg_parser_disconnect,
 
-    unix_wg_parser_get_next_read_offset,
-    unix_wg_parser_push_data,
+    unix_wg_parser_wait_request,
+    unix_wg_parser_reply_read,
 
     unix_wg_parser_get_stream_count,
     unix_wg_parser_get_stream,
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
index 865b6d3643a..56525da1348 100644
--- a/dlls/winegstreamer/wg_parser.c
+++ b/dlls/winegstreamer/wg_parser.c
@@ -77,7 +77,7 @@ struct wg_parser
     pthread_cond_t init_cond;
     bool no_more_pads, has_duration, error;
 
-    pthread_cond_t read_cond, read_done_cond;
+    pthread_cond_t request_cond, read_done_cond;
     struct
     {
         GstBuffer *buffer;
@@ -126,15 +126,15 @@ static NTSTATUS wg_parser_get_stream(void *args)
     return S_OK;
 }
 
-static NTSTATUS wg_parser_get_next_read_offset(void *args)
+static NTSTATUS wg_parser_wait_request(void *args)
 {
-    struct wg_parser_get_next_read_offset_params *params = args;
+    struct wg_parser_wait_request_params *params = args;
     struct wg_parser *parser = params->parser;
 
     pthread_mutex_lock(&parser->mutex);
 
     while (parser->sink_connected && !parser->read_request.size)
-        pthread_cond_wait(&parser->read_cond, &parser->mutex);
+        pthread_cond_wait(&parser->request_cond, &parser->mutex);
 
     if (!parser->sink_connected)
     {
@@ -142,16 +142,17 @@ static NTSTATUS wg_parser_get_next_read_offset(void *args)
         return VFW_E_WRONG_STATE;
     }
 
-    params->offset = parser->read_request.offset;
-    params->size = parser->read_request.size;
+    params->request.type = WG_REQUEST_READ;
+    params->request.u.read.offset = parser->read_request.offset;
+    params->request.u.read.size = parser->read_request.size;
 
     pthread_mutex_unlock(&parser->mutex);
     return S_OK;
 }
 
-static NTSTATUS wg_parser_push_data(void *args)
+static NTSTATUS wg_parser_reply_read(void *args)
 {
-    const struct wg_parser_push_data_params *params = args;
+    const struct wg_parser_reply_read_params *params = args;
     struct wg_parser *parser = params->parser;
     const void *data = params->data;
     uint32_t size = params->size;
@@ -890,7 +891,7 @@ static GstFlowReturn src_getrange_cb(GstPad *pad, GstObject *parent,
     parser->read_request.offset = offset;
     parser->read_request.size = size;
     parser->read_request.done = false;
-    pthread_cond_signal(&parser->read_cond);
+    pthread_cond_signal(&parser->request_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
@@ -1328,7 +1329,7 @@ out:
     pthread_mutex_lock(&parser->mutex);
     parser->sink_connected = false;
     pthread_mutex_unlock(&parser->mutex);
-    pthread_cond_signal(&parser->read_cond);
+    pthread_cond_signal(&parser->request_cond);
 
     return E_FAIL;
 }
@@ -1355,7 +1356,7 @@ static NTSTATUS wg_parser_disconnect(void *args)
     pthread_mutex_lock(&parser->mutex);
     parser->sink_connected = false;
     pthread_mutex_unlock(&parser->mutex);
-    pthread_cond_signal(&parser->read_cond);
+    pthread_cond_signal(&parser->request_cond);
 
     for (i = 0; i < parser->stream_count; ++i)
         free_stream(parser->streams[i]);
@@ -1557,7 +1558,7 @@ static NTSTATUS wg_parser_create(void *args)
 
     pthread_mutex_init(&parser->mutex, NULL);
     pthread_cond_init(&parser->init_cond, NULL);
-    pthread_cond_init(&parser->read_cond, NULL);
+    pthread_cond_init(&parser->request_cond, NULL);
     pthread_cond_init(&parser->read_done_cond, NULL);
     parser->init_gst = init_funcs[params->type];
     parser->unlimited_buffering = params->unlimited_buffering;
@@ -1579,7 +1580,7 @@ static NTSTATUS wg_parser_destroy(void *args)
 
     pthread_mutex_destroy(&parser->mutex);
     pthread_cond_destroy(&parser->init_cond);
-    pthread_cond_destroy(&parser->read_cond);
+    pthread_cond_destroy(&parser->request_cond);
     pthread_cond_destroy(&parser->read_done_cond);
 
     free(parser);
@@ -1595,8 +1596,8 @@ const unixlib_entry_t __wine_unix_call_funcs[] =
     X(wg_parser_connect),
     X(wg_parser_disconnect),
 
-    X(wg_parser_get_next_read_offset),
-    X(wg_parser_push_data),
+    X(wg_parser_wait_request),
+    X(wg_parser_reply_read),
 
     X(wg_parser_get_stream_count),
     X(wg_parser_get_stream),
diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c
index 9d1eb2a95ed..9de7ab6edf3 100644
--- a/dlls/winegstreamer/wm_reader.c
+++ b/dlls/winegstreamer/wm_reader.c
@@ -527,9 +527,11 @@ static const IWMMediaPropsVtbl stream_props_vtbl =
 };
 
 static void handle_read_request(struct wm_reader *reader, uint64_t file_size,
-        void **buffer, size_t *buffer_size, uint64_t offset, uint32_t size)
+        void **buffer, size_t *buffer_size, struct wg_request *request)
 {
+    uint64_t offset = request->u.read.offset;
     IStream *stream = reader->source_stream;
+    uint32_t size = request->u.read.size;
     LARGE_INTEGER large_offset;
     HANDLE file = reader->file;
     ULONG ret_size = 0;
@@ -543,7 +545,7 @@ static void handle_read_request(struct wm_reader *reader, uint64_t file_size,
 
     if (!array_reserve(buffer, buffer_size, size, 1))
     {
-        wg_parser_push_data(reader->wg_parser, NULL, 0);
+        wg_parser_reply_read(reader->wg_parser, NULL, 0);
         return;
     }
     data = *buffer;
@@ -576,7 +578,7 @@ static void handle_read_request(struct wm_reader *reader, uint64_t file_size,
         size = ret_size;
     }
 
-    wg_parser_push_data(reader->wg_parser, data, size);
+    wg_parser_reply_read(reader->wg_parser, data, size);
 }
 
 static DWORD CALLBACK read_thread(void *arg)
@@ -610,13 +612,21 @@ static DWORD CALLBACK read_thread(void *arg)
 
     while (!reader->read_thread_shutdown)
     {
-        uint64_t offset;
-        uint32_t size;
+        struct wg_request request;
 
-        if (!wg_parser_get_next_read_offset(reader->wg_parser, &offset, &size))
+        if (!wg_parser_wait_request(reader->wg_parser, &request))
             continue;
 
-        handle_read_request(reader, file_size, &data, &buffer_size, offset, size);
+        switch (request.type)
+        {
+            case WG_REQUEST_READ:
+                handle_read_request(reader, file_size, &data, &buffer_size, &request);
+                break;
+
+            default:
+                FIXME("Ingoring unknown request %u\n", request.type);
+                continue;
+        }
     }
 
     free(data);
-- 
GitLab


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



More information about the wine-devel mailing list