Zebediah Figura : winegstreamer: Map the read buffer in the Unix library.
Alexandre Julliard
julliard at winehq.org
Thu Feb 18 16:06:05 CST 2021
Module: wine
Branch: master
Commit: 9a6aa56cd83b6948bfe12e6446132a7d20fa5a1f
URL: https://source.winehq.org/git/wine.git/?a=commit;h=9a6aa56cd83b6948bfe12e6446132a7d20fa5a1f
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Wed Feb 17 17:30:34 2021 -0600
winegstreamer: Map the read buffer in the Unix library.
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winegstreamer/gst_private.h | 8 ++++----
dlls/winegstreamer/gstdemux.c | 29 +++++------------------------
dlls/winegstreamer/wg_parser.c | 27 ++++++++++++++++-----------
3 files changed, 25 insertions(+), 39 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index 2ac10ee37d3..31fca81ce6c 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -157,11 +157,11 @@ struct wg_parser
pthread_cond_t read_cond, read_done_cond;
struct
{
- GstBuffer *buffer;
+ void *data;
uint64_t offset;
uint32_t size;
bool done;
- GstFlowReturn ret;
+ bool ret;
} read_request;
bool flushing, sink_connected;
@@ -228,8 +228,8 @@ struct unix_funcs
void (CDECL *wg_parser_end_flush)(struct wg_parser *parser);
bool (CDECL *wg_parser_get_read_request)(struct wg_parser *parser,
- GstBuffer **buffer, uint64_t *offset, uint32_t *size);
- void (CDECL *wg_parser_complete_read_request)(struct wg_parser *parser, GstFlowReturn ret);
+ void **data, uint64_t *offset, uint32_t *size);
+ void (CDECL *wg_parser_complete_read_request)(struct wg_parser *parser, bool ret);
uint32_t (CDECL *wg_parser_get_stream_count)(struct wg_parser *parser);
struct wg_parser_stream *(CDECL *wg_parser_get_stream)(struct wg_parser *parser, uint32_t index);
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c
index 53977ed52c4..ab901a34843 100644
--- a/dlls/winegstreamer/gstdemux.c
+++ b/dlls/winegstreamer/gstdemux.c
@@ -787,25 +787,6 @@ static DWORD CALLBACK stream_thread(void *arg)
return 0;
}
-static GstFlowReturn read_buffer(struct parser *This, guint64 ofs, guint len, GstBuffer *buffer)
-{
- HRESULT hr;
- GstMapInfo info;
-
- TRACE("filter %p, offset %s, length %u, buffer %p.\n", This, wine_dbgstr_longlong(ofs), len, buffer);
-
- gst_buffer_map(buffer, &info, GST_MAP_WRITE);
- hr = IAsyncReader_SyncRead(This->reader, ofs, len, info.data);
- gst_buffer_unmap(buffer, &info);
- if (FAILED(hr))
- {
- ERR("Failed to read data, hr %#x.\n", hr);
- return GST_FLOW_ERROR;
- }
-
- return GST_FLOW_OK;
-}
-
static DWORD CALLBACK read_thread(void *arg)
{
struct parser *filter = arg;
@@ -814,15 +795,15 @@ static DWORD CALLBACK read_thread(void *arg)
while (filter->sink_connected)
{
- GstBuffer *buffer;
uint64_t offset;
uint32_t size;
+ HRESULT hr;
+ void *data;
- if (!unix_funcs->wg_parser_get_read_request(filter->wg_parser, &buffer, &offset, &size))
+ if (!unix_funcs->wg_parser_get_read_request(filter->wg_parser, &data, &offset, &size))
continue;
-
- unix_funcs->wg_parser_complete_read_request(filter->wg_parser,
- read_buffer(filter, offset, size, buffer));
+ hr = IAsyncReader_SyncRead(filter->reader, offset, size, data);
+ unix_funcs->wg_parser_complete_read_request(filter->wg_parser, SUCCEEDED(hr));
}
TRACE("Streaming stopped; exiting.\n");
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
index 9fb3c4383fc..ccd60853007 100644
--- a/dlls/winegstreamer/wg_parser.c
+++ b/dlls/winegstreamer/wg_parser.c
@@ -350,11 +350,11 @@ static void CDECL wg_parser_end_flush(struct wg_parser *parser)
}
static bool CDECL wg_parser_get_read_request(struct wg_parser *parser,
- GstBuffer **buffer, uint64_t *offset, uint32_t *size)
+ void **data, uint64_t *offset, uint32_t *size)
{
pthread_mutex_lock(&parser->mutex);
- while (parser->sink_connected && !parser->read_request.buffer)
+ while (parser->sink_connected && !parser->read_request.data)
pthread_cond_wait(&parser->read_cond, &parser->mutex);
if (!parser->sink_connected)
@@ -363,7 +363,7 @@ static bool CDECL wg_parser_get_read_request(struct wg_parser *parser,
return false;
}
- *buffer = parser->read_request.buffer;
+ *data = parser->read_request.data;
*offset = parser->read_request.offset;
*size = parser->read_request.size;
@@ -371,12 +371,12 @@ static bool CDECL wg_parser_get_read_request(struct wg_parser *parser,
return true;
}
-static void CDECL wg_parser_complete_read_request(struct wg_parser *parser, GstFlowReturn ret)
+static void CDECL wg_parser_complete_read_request(struct wg_parser *parser, bool ret)
{
pthread_mutex_lock(&parser->mutex);
parser->read_request.done = true;
parser->read_request.ret = ret;
- parser->read_request.buffer = NULL;
+ parser->read_request.data = NULL;
pthread_mutex_unlock(&parser->mutex);
pthread_cond_signal(&parser->read_done_cond);
}
@@ -985,7 +985,8 @@ static GstFlowReturn request_buffer_src(GstPad *pad, GstObject *parent, guint64
{
struct wg_parser *parser = gst_pad_get_element_private(pad);
GstBuffer *new_buffer = NULL;
- GstFlowReturn ret;
+ GstMapInfo map_info;
+ bool ret;
GST_LOG("pad %p, offset %" G_GINT64_MODIFIER "u, length %u, buffer %p.", pad, offset, size, *buffer);
@@ -1000,10 +1001,12 @@ static GstFlowReturn request_buffer_src(GstPad *pad, GstObject *parent, guint64
if (!*buffer)
*buffer = new_buffer = gst_buffer_new_and_alloc(size);
+ gst_buffer_map(*buffer, &map_info, GST_MAP_WRITE);
+
pthread_mutex_lock(&parser->mutex);
- assert(!parser->read_request.buffer);
- parser->read_request.buffer = *buffer;
+ assert(!parser->read_request.data);
+ parser->read_request.data = map_info.data;
parser->read_request.offset = offset;
parser->read_request.size = size;
parser->read_request.done = false;
@@ -1020,12 +1023,14 @@ static GstFlowReturn request_buffer_src(GstPad *pad, GstObject *parent, guint64
pthread_mutex_unlock(&parser->mutex);
- GST_LOG("Request returned %s.", gst_flow_get_name(ret));
+ gst_buffer_unmap(*buffer, &map_info);
- if (ret != GST_FLOW_OK && new_buffer)
+ GST_LOG("Request returned %d.", ret);
+
+ if (!ret && new_buffer)
gst_buffer_unref(new_buffer);
- return ret;
+ return ret ? GST_FLOW_OK : GST_FLOW_ERROR;
}
static gboolean query_function(GstPad *pad, GstObject *parent, GstQuery *query)
More information about the wine-cvs
mailing list