[PATCH 2/5] winegstreamer: Allocate source media buffers in the PE components.
Derek Lesho
dlesho at codeweavers.com
Wed Sep 1 16:05:55 CDT 2021
This adds a allocate/blit for the input data, but this is necessary for both WOW64 support and an internal rework of the source path in wg_parser to use GstAppSrc. Source data is usually compressed anyway, so it shouldn't affect performance too badly.
Signed-off-by: Derek Lesho <dlesho at codeweavers.com>
---
dlls/winegstreamer/gst_private.h | 7 ++++---
dlls/winegstreamer/media_source.c | 11 +++++++++--
dlls/winegstreamer/quartz_parser.c | 8 ++++++--
dlls/winegstreamer/wg_parser.c | 18 +++++++++++-------
4 files changed, 30 insertions(+), 14 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index c6c99b1dd55..9943682facb 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -169,9 +169,10 @@ struct unix_funcs
void (CDECL *wg_parser_begin_flush)(struct wg_parser *parser);
void (CDECL *wg_parser_end_flush)(struct wg_parser *parser);
- bool (CDECL *wg_parser_get_read_request)(struct wg_parser *parser,
- void **data, uint64_t *offset, uint32_t *size);
- void (CDECL *wg_parser_complete_read_request)(struct wg_parser *parser, bool ret);
+ bool (CDECL *wg_parser_get_next_read_offset)(struct wg_parser *parser,
+ uint64_t *offset, uint32_t *size);
+ void (CDECL *wg_parser_push_data)(struct wg_parser *parser,
+ const void *data, uint32_t size);
void (CDECL *wg_parser_set_unlimited_buffering)(struct wg_parser *parser);
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
index 383afcfce75..abd9a220a7f 100644
--- a/dlls/winegstreamer/media_source.c
+++ b/dlls/winegstreamer/media_source.c
@@ -541,14 +541,21 @@ static DWORD CALLBACK read_thread(void *arg)
HRESULT hr;
void *data;
- if (!unix_funcs->wg_parser_get_read_request(source->wg_parser, &data, &offset, &size))
+ if (!unix_funcs->wg_parser_get_next_read_offset(source->wg_parser, &offset, &size))
continue;
+ data = malloc(size);
+ ret_size = 0;
+
if (SUCCEEDED(hr = IMFByteStream_SetCurrentPosition(byte_stream, offset)))
hr = IMFByteStream_Read(byte_stream, data, size, &ret_size);
+ if (FAILED(hr))
+ ERR("Failed to read source stream bytes %p+%u. hr=%#x\n", data, size, hr);
if (SUCCEEDED(hr) && ret_size != size)
ERR("Unexpected short read: requested %u bytes, got %u.\n", size, ret_size);
- unix_funcs->wg_parser_complete_read_request(source->wg_parser, SUCCEEDED(hr));
+ unix_funcs->wg_parser_push_data(source->wg_parser, SUCCEEDED(hr) ? data : NULL, ret_size);
+
+ free(data);
}
TRACE("Media source is shutting down; exiting.\n");
diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c
index 09a916d7f5c..c85cbe4cf44 100644
--- a/dlls/winegstreamer/quartz_parser.c
+++ b/dlls/winegstreamer/quartz_parser.c
@@ -795,10 +795,14 @@ static DWORD CALLBACK read_thread(void *arg)
HRESULT hr;
void *data;
- if (!unix_funcs->wg_parser_get_read_request(filter->wg_parser, &data, &offset, &size))
+ if (!unix_funcs->wg_parser_get_next_read_offset(filter->wg_parser, &offset, &size))
continue;
+ data = malloc(size);
hr = IAsyncReader_SyncRead(filter->reader, offset, size, data);
- unix_funcs->wg_parser_complete_read_request(filter->wg_parser, SUCCEEDED(hr));
+ if (FAILED(hr))
+ ERR("Async Reader failed to failed to read %p+%u. hr=%#x\n", data, size, hr);
+ unix_funcs->wg_parser_push_data(filter->wg_parser, SUCCEEDED(hr) ? data : NULL, size);
+ free(data);
}
TRACE("Streaming stopped; exiting.\n");
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
index cd12a23d0c8..5de8ba84ed3 100644
--- a/dlls/winegstreamer/wg_parser.c
+++ b/dlls/winegstreamer/wg_parser.c
@@ -517,8 +517,8 @@ static void CDECL wg_parser_end_flush(struct wg_parser *parser)
pthread_mutex_unlock(&parser->mutex);
}
-static bool CDECL wg_parser_get_read_request(struct wg_parser *parser,
- void **data, uint64_t *offset, uint32_t *size)
+static bool CDECL wg_parser_get_next_read_offset(struct wg_parser *parser,
+ uint64_t *offset, uint32_t *size)
{
pthread_mutex_lock(&parser->mutex);
@@ -531,7 +531,6 @@ static bool CDECL wg_parser_get_read_request(struct wg_parser *parser,
return false;
}
- *data = parser->read_request.data;
*offset = parser->read_request.offset;
*size = parser->read_request.size;
@@ -539,11 +538,15 @@ 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, bool ret)
+static void CDECL wg_parser_push_data(struct wg_parser *parser,
+ const void *data, uint32_t size)
{
pthread_mutex_lock(&parser->mutex);
+ parser->read_request.size = size;
parser->read_request.done = true;
- parser->read_request.ret = ret;
+ parser->read_request.ret = !!data;
+ if (data)
+ memcpy(parser->read_request.data, data, size);
parser->read_request.data = NULL;
pthread_mutex_unlock(&parser->mutex);
pthread_cond_signal(&parser->read_done_cond);
@@ -1217,6 +1220,7 @@ static GstFlowReturn src_getrange_cb(GstPad *pad, GstObject *parent,
pthread_cond_wait(&parser->read_done_cond, &parser->mutex);
ret = parser->read_request.ret;
+ gst_buffer_set_size(*buffer, parser->read_request.size);
pthread_mutex_unlock(&parser->mutex);
@@ -1918,8 +1922,8 @@ static const struct unix_funcs funcs =
wg_parser_begin_flush,
wg_parser_end_flush,
- wg_parser_get_read_request,
- wg_parser_complete_read_request,
+ wg_parser_get_next_read_offset,
+ wg_parser_push_data,
wg_parser_set_unlimited_buffering,
--
2.33.0
More information about the wine-devel
mailing list