From 47c589a15c0a20a6643fc61eab0772e60bb7d6e9 Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Sun, 19 Sep 2021 13:08:02 +1000 Subject: [PATCH 09/12] Revert "winegstreamer: Allocate source media buffers in the PE components." This reverts commit 8b7390f80d866435f06f2571a93bcd67c0947673. --- dlls/winegstreamer/gst_private.h | 7 +++---- dlls/winegstreamer/media_source.c | 28 ++++------------------------ dlls/winegstreamer/quartz_parser.c | 26 +++----------------------- dlls/winegstreamer/wg_parser.c | 28 +++++++++++++--------------- 4 files changed, 23 insertions(+), 66 deletions(-) diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index 923bba25d38..c5e4367811f 100644 --- a/dlls/winegstreamer/gst_private.h +++ b/dlls/winegstreamer/gst_private.h @@ -163,10 +163,9 @@ 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_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); + 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); 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 12ca14ca139..87959546a7c 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -613,11 +613,6 @@ static DWORD CALLBACK read_thread(void *arg) { struct media_source *source = arg; IMFByteStream *byte_stream = source->byte_stream; - uint32_t buffer_size = 0; - uint64_t file_size; - void *data = NULL; - - IMFByteStream_GetLength(byte_stream, &file_size); TRACE("Starting read thread for media source %p.\n", source); @@ -627,33 +622,18 @@ static DWORD CALLBACK read_thread(void *arg) ULONG ret_size; uint32_t size; HRESULT hr; + void *data; - if (!unix_funcs->wg_parser_get_next_read_offset(source->wg_parser, &offset, &size)) + if (!unix_funcs->wg_parser_get_read_request(source->wg_parser, &data, &offset, &size)) continue; - if (offset >= file_size) - size = 0; - else if (offset + size >= file_size) - size = file_size - offset; - - if (size > buffer_size) - { - buffer_size = size; - data = realloc(data, 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 %u bytes at offset %I64u, hr %#x.\n", size, offset, hr); - else if (ret_size != size) + if (SUCCEEDED(hr) && ret_size != size) ERR("Unexpected short read: requested %u bytes, got %u.\n", size, ret_size); - unix_funcs->wg_parser_push_data(source->wg_parser, SUCCEEDED(hr) ? data : NULL, ret_size); + unix_funcs->wg_parser_complete_read_request(source->wg_parser, SUCCEEDED(hr)); } - free(data); TRACE("Media source is shutting down; exiting.\n"); return 0; } diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c index 5299f4dc2ed..09a916d7f5c 100644 --- a/dlls/winegstreamer/quartz_parser.c +++ b/dlls/winegstreamer/quartz_parser.c @@ -785,11 +785,6 @@ static DWORD CALLBACK stream_thread(void *arg) static DWORD CALLBACK read_thread(void *arg) { struct parser *filter = arg; - LONGLONG file_size, unused; - uint32_t buffer_size = 0; - void *data = NULL; - - IAsyncReader_Length(filter->reader, &file_size, &unused); TRACE("Starting read thread for filter %p.\n", filter); @@ -798,29 +793,14 @@ static DWORD CALLBACK read_thread(void *arg) uint64_t offset; uint32_t size; HRESULT hr; + void *data; - if (!unix_funcs->wg_parser_get_next_read_offset(filter->wg_parser, &offset, &size)) + if (!unix_funcs->wg_parser_get_read_request(filter->wg_parser, &data, &offset, &size)) continue; - - if (offset >= file_size) - size = 0; - else if (offset + size >= file_size) - size = file_size - offset; - - if (size > buffer_size) - { - buffer_size = size; - data = realloc(data, size); - } - hr = IAsyncReader_SyncRead(filter->reader, offset, size, data); - if (FAILED(hr)) - ERR("Failed to read %u bytes at offset %I64u, hr %#x.\n", size, offset, hr); - - unix_funcs->wg_parser_push_data(filter->wg_parser, SUCCEEDED(hr) ? data : NULL, size); + unix_funcs->wg_parser_complete_read_request(filter->wg_parser, SUCCEEDED(hr)); } - free(data); TRACE("Streaming stopped; exiting.\n"); return 0; } diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index dde137ef186..e12cb08776b 100644 --- a/dlls/winegstreamer/wg_parser.c +++ b/dlls/winegstreamer/wg_parser.c @@ -524,8 +524,8 @@ static void CDECL wg_parser_end_flush(struct wg_parser *parser) pthread_mutex_unlock(&parser->mutex); } -static bool CDECL wg_parser_get_next_read_offset(struct wg_parser *parser, - uint64_t *offset, uint32_t *size) +static bool CDECL wg_parser_get_read_request(struct wg_parser *parser, + void **data, uint64_t *offset, uint32_t *size) { pthread_mutex_lock(&parser->mutex); @@ -538,6 +538,7 @@ static bool CDECL wg_parser_get_next_read_offset(struct wg_parser *parser, return false; } + *data = parser->read_request.data; *offset = parser->read_request.offset; *size = parser->read_request.size; @@ -545,15 +546,11 @@ static bool CDECL wg_parser_get_next_read_offset(struct wg_parser *parser, return true; } -static void CDECL wg_parser_push_data(struct wg_parser *parser, - const void *data, uint32_t size) +static void CDECL wg_parser_complete_read_request(struct wg_parser *parser, bool ret) { pthread_mutex_lock(&parser->mutex); - parser->read_request.size = size; parser->read_request.done = true; - parser->read_request.ret = !!data; - if (data) - memcpy(parser->read_request.data, data, size); + parser->read_request.ret = ret; parser->read_request.data = NULL; pthread_mutex_unlock(&parser->mutex); pthread_cond_signal(&parser->read_done_cond); @@ -1224,6 +1221,10 @@ static GstFlowReturn src_getrange_cb(GstPad *pad, GstObject *parent, if (offset == GST_BUFFER_OFFSET_NONE) offset = parser->next_pull_offset; parser->next_pull_offset = offset + size; + if (offset >= parser->file_size) + return GST_FLOW_EOS; + if (offset + size >= parser->file_size) + size = parser->file_size - offset; if (!*buffer) *buffer = new_buffer = gst_buffer_new_and_alloc(size); @@ -1247,7 +1248,6 @@ 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); @@ -1255,12 +1255,10 @@ static GstFlowReturn src_getrange_cb(GstPad *pad, GstObject *parent, GST_LOG("Request returned %d.", ret); - if ((!ret || !size) && new_buffer) + if (!ret && new_buffer) gst_buffer_unref(new_buffer); - if (ret) - return size ? GST_FLOW_OK : GST_FLOW_EOS; - return GST_FLOW_ERROR; + return ret ? GST_FLOW_OK : GST_FLOW_ERROR; } static gboolean src_query_cb(GstPad *pad, GstObject *parent, GstQuery *query) @@ -1927,8 +1925,8 @@ static const struct unix_funcs funcs = wg_parser_begin_flush, wg_parser_end_flush, - wg_parser_get_next_read_offset, - wg_parser_push_data, + wg_parser_get_read_request, + wg_parser_complete_read_request, wg_parser_set_unlimited_buffering, -- 2.33.0