Re-enable mfplat-streaming-support

We had reverted the current upstream winegreamer commits to allow
mfplat-streaming-support to be used within staging.  Hopefully the
patchset in question will be upstream shortly.
This commit is contained in:
Alistair Leslie-Hughes
2021-09-19 13:13:15 +10:00
parent fdcc8bec48
commit fc40539f6d
9 changed files with 1476 additions and 1 deletions

View File

@@ -0,0 +1,29 @@
From 28339597a00da381c079c9d4f46b67780511c267 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Sun, 19 Sep 2021 13:07:56 +1000
Subject: [PATCH 1/6] Revert "winegstreamer: Fix return code in init_gst
failure case."
This reverts commit b9a7e961cdd39203866be38e90b1d901595d54ba.
---
dlls/winegstreamer/quartz_parser.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c
index a8e7e3d979f..5299f4dc2ed 100644
--- a/dlls/winegstreamer/quartz_parser.c
+++ b/dlls/winegstreamer/quartz_parser.c
@@ -982,10 +982,7 @@ static HRESULT parser_sink_connect(struct strmbase_sink *iface, IPin *peer, cons
goto err;
if (!filter->init_gst(filter))
- {
- hr = E_FAIL;
goto err;
- }
for (i = 0; i < filter->source_count; ++i)
{
--
2.33.0

View File

@@ -0,0 +1,224 @@
From 2e341e32dd761e40c9045648b0edfabd9b49fc4e Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Sun, 19 Sep 2021 13:08:02 +1000
Subject: [PATCH 3/6] 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 49e06b31369..c29fc4a2437 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -170,10 +170,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 825bad8da27..95bdb9b488e 100644
--- a/dlls/winegstreamer/media_source.c
+++ b/dlls/winegstreamer/media_source.c
@@ -530,11 +530,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);
@@ -544,33 +539,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 f0815e37689..119cbffbd88 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_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);
@@ -531,6 +531,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;
@@ -538,15 +539,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);
@@ -1217,6 +1214,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);
@@ -1240,7 +1241,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);
@@ -1248,12 +1248,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)
@@ -1920,8 +1918,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

View File

@@ -0,0 +1,221 @@
From ca25389c3980c848dc6094f84160079a4cf805f7 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Sun, 19 Sep 2021 13:08:03 +1000
Subject: [PATCH 4/6] Revert "winegstreamer: Duplicate source shutdown path
into constructor with leak fixes."
This reverts commit 67734bfce31d6032cee1a8980a9022665e9e18fa.
---
dlls/winegstreamer/gst_private.h | 1 -
dlls/winegstreamer/media_source.c | 102 +++++++++++-------------------
2 files changed, 37 insertions(+), 66 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index c29fc4a2437..c6c99b1dd55 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -22,7 +22,6 @@
#define __GST_PRIVATE_INCLUDED__
#include <assert.h>
-#include <limits.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
index 95bdb9b488e..01ab626254a 100644
--- a/dlls/winegstreamer/media_source.c
+++ b/dlls/winegstreamer/media_source.c
@@ -733,12 +733,6 @@ static HRESULT new_media_stream(struct media_source *source,
object->IMFMediaStream_iface.lpVtbl = &media_stream_vtbl;
object->ref = 1;
- if (FAILED(hr = MFCreateEventQueue(&object->event_queue)))
- {
- free(object);
- return hr;
- }
-
IMFMediaSource_AddRef(&source->IMFMediaSource_iface);
object->parent_source = source;
object->stream_id = stream_id;
@@ -747,11 +741,20 @@ static HRESULT new_media_stream(struct media_source *source,
object->eos = FALSE;
object->wg_stream = wg_stream;
+ if (FAILED(hr = MFCreateEventQueue(&object->event_queue)))
+ goto fail;
+
TRACE("Created stream object %p.\n", object);
*out_stream = object;
return S_OK;
+
+fail:
+ WARN("Failed to construct media stream, hr %#x.\n", hr);
+
+ IMFMediaStream_Release(&object->IMFMediaStream_iface);
+ return hr;
}
static HRESULT media_stream_init_desc(struct media_stream *stream)
@@ -844,16 +847,10 @@ static HRESULT media_stream_init_desc(struct media_stream *stream)
goto done;
if (FAILED(hr = IMFStreamDescriptor_GetMediaTypeHandler(stream->descriptor, &type_handler)))
- {
- IMFStreamDescriptor_Release(stream->descriptor);
goto done;
- }
if (FAILED(hr = IMFMediaTypeHandler_SetCurrentMediaType(type_handler, stream_types[0])))
- {
- IMFStreamDescriptor_Release(stream->descriptor);
goto done;
- }
done:
if (type_handler)
@@ -1216,13 +1213,19 @@ static HRESULT WINAPI media_source_Shutdown(IMFMediaSource *iface)
unix_funcs->wg_parser_disconnect(source->wg_parser);
- source->read_thread_shutdown = true;
- WaitForSingleObject(source->read_thread, INFINITE);
- CloseHandle(source->read_thread);
+ if (source->read_thread)
+ {
+ source->read_thread_shutdown = true;
+ WaitForSingleObject(source->read_thread, INFINITE);
+ CloseHandle(source->read_thread);
+ }
- IMFPresentationDescriptor_Release(source->pres_desc);
- IMFMediaEventQueue_Shutdown(source->event_queue);
- IMFByteStream_Release(source->byte_stream);
+ if (source->pres_desc)
+ IMFPresentationDescriptor_Release(source->pres_desc);
+ if (source->event_queue)
+ IMFMediaEventQueue_Shutdown(source->event_queue);
+ if (source->byte_stream)
+ IMFByteStream_Release(source->byte_stream);
for (i = 0; i < source->stream_count; i++)
{
@@ -1230,18 +1233,23 @@ static HRESULT WINAPI media_source_Shutdown(IMFMediaSource *iface)
stream->state = STREAM_SHUTDOWN;
- IMFMediaEventQueue_Shutdown(stream->event_queue);
- IMFStreamDescriptor_Release(stream->descriptor);
- IMFMediaSource_Release(&stream->parent_source->IMFMediaSource_iface);
+ if (stream->event_queue)
+ IMFMediaEventQueue_Shutdown(stream->event_queue);
+ if (stream->descriptor)
+ IMFStreamDescriptor_Release(stream->descriptor);
+ if (stream->parent_source)
+ IMFMediaSource_Release(&stream->parent_source->IMFMediaSource_iface);
IMFMediaStream_Release(&stream->IMFMediaStream_iface);
}
unix_funcs->wg_parser_destroy(source->wg_parser);
- free(source->streams);
+ if (source->stream_count)
+ free(source->streams);
- MFUnlockWorkQueue(source->async_commands_queue);
+ if (source->async_commands_queue)
+ MFUnlockWorkQueue(source->async_commands_queue);
return S_OK;
}
@@ -1266,7 +1274,6 @@ static const IMFMediaSourceVtbl IMFMediaSource_vtbl =
static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_source **out_media_source)
{
IMFStreamDescriptor **descriptors = NULL;
- unsigned int stream_count = UINT_MAX;
struct media_source *object;
UINT64 total_pres_time = 0;
struct wg_parser *parser;
@@ -1330,15 +1337,15 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
* leak occurs with native. */
unix_funcs->wg_parser_set_unlimited_buffering(parser);
- stream_count = unix_funcs->wg_parser_get_stream_count(parser);
+ object->stream_count = unix_funcs->wg_parser_get_stream_count(parser);
- if (!(object->streams = calloc(stream_count, sizeof(*object->streams))))
+ if (!(object->streams = calloc(object->stream_count, sizeof(*object->streams))))
{
hr = E_OUTOFMEMORY;
goto fail;
}
- for (i = 0; i < stream_count; ++i)
+ for (i = 0; i < object->stream_count; ++i)
{
if (FAILED(hr = new_media_stream(object, unix_funcs->wg_parser_get_stream(parser, i), i, &object->streams[i])))
goto fail;
@@ -1346,13 +1353,9 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
if (FAILED(hr = media_stream_init_desc(object->streams[i])))
{
ERR("Failed to finish initialization of media stream %p, hr %x.\n", object->streams[i], hr);
- IMFMediaSource_Release(&object->streams[i]->parent_source->IMFMediaSource_iface);
- IMFMediaEventQueue_Release(object->streams[i]->event_queue);
- free(object->streams[i]);
+ IMFMediaStream_Release(&object->streams[i]->IMFMediaStream_iface);
goto fail;
}
-
- object->stream_count++;
}
/* init presentation descriptor */
@@ -1389,39 +1392,8 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
fail:
WARN("Failed to construct MFMediaSource, hr %#x.\n", hr);
- if (descriptors)
- {
- for (i = 0; i < object->stream_count; i++)
- IMFStreamDescriptor_Release(descriptors[i]);
- free(descriptors);
- }
- for (i = 0; i < object->stream_count; i++)
- {
- struct media_stream *stream = object->streams[i];
-
- IMFMediaEventQueue_Release(stream->event_queue);
- IMFStreamDescriptor_Release(stream->descriptor);
- IMFMediaSource_Release(&stream->parent_source->IMFMediaSource_iface);
-
- free(stream);
- }
- free(object->streams);
- if (stream_count != UINT_MAX)
- unix_funcs->wg_parser_disconnect(object->wg_parser);
- if (object->read_thread)
- {
- object->read_thread_shutdown = true;
- WaitForSingleObject(object->read_thread, INFINITE);
- CloseHandle(object->read_thread);
- }
- if (object->wg_parser)
- unix_funcs->wg_parser_destroy(object->wg_parser);
- if (object->async_commands_queue)
- MFUnlockWorkQueue(object->async_commands_queue);
- if (object->event_queue)
- IMFMediaEventQueue_Release(object->event_queue);
- IMFByteStream_Release(object->byte_stream);
- free(object);
+ free(descriptors);
+ IMFMediaSource_Release(&object->IMFMediaSource_iface);
return hr;
}
--
2.33.0

View File

@@ -0,0 +1,140 @@
From e648d762c2609321822334a9a8db8a2f5905b51d Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Sun, 19 Sep 2021 13:08:04 +1000
Subject: [PATCH 5/6] Revert "winegstreamer: Properly clean up from failure in
wg_parser_connect()."
This reverts commit 721b1eb2ebe5c3eaab8ac3fb1e4f4648cbee5b4d.
---
dlls/winegstreamer/wg_parser.c | 76 ++++++++++------------------------
1 file changed, 23 insertions(+), 53 deletions(-)
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
index 119cbffbd88..bf5a51aeaf4 100644
--- a/dlls/winegstreamer/wg_parser.c
+++ b/dlls/winegstreamer/wg_parser.c
@@ -1034,30 +1034,6 @@ static struct wg_parser_stream *create_stream(struct wg_parser *parser)
return stream;
}
-static void free_stream(struct wg_parser_stream *stream)
-{
- if (stream->their_src)
- {
- if (stream->post_sink)
- {
- gst_pad_unlink(stream->their_src, stream->post_sink);
- gst_pad_unlink(stream->post_src, stream->my_sink);
- gst_object_unref(stream->post_src);
- gst_object_unref(stream->post_sink);
- stream->post_src = stream->post_sink = NULL;
- }
- else
- gst_pad_unlink(stream->their_src, stream->my_sink);
- gst_object_unref(stream->their_src);
- }
- gst_object_unref(stream->my_sink);
-
- pthread_cond_destroy(&stream->event_cond);
- pthread_cond_destroy(&stream->event_empty_cond);
-
- free(stream);
-}
-
static void pad_added_cb(GstElement *element, GstPad *pad, gpointer user)
{
struct wg_parser *parser = user;
@@ -1544,14 +1520,14 @@ static HRESULT CDECL wg_parser_connect(struct wg_parser *parser, uint64_t file_s
parser->error = false;
if (!parser->init_gst(parser))
- goto out;
+ return E_FAIL;
gst_element_set_state(parser->container, GST_STATE_PAUSED);
ret = gst_element_get_state(parser->container, NULL, NULL, -1);
if (ret == GST_STATE_CHANGE_FAILURE)
{
GST_ERROR("Failed to play stream.\n");
- goto out;
+ return E_FAIL;
}
pthread_mutex_lock(&parser->mutex);
@@ -1561,7 +1537,7 @@ static HRESULT CDECL wg_parser_connect(struct wg_parser *parser, uint64_t file_s
if (parser->error)
{
pthread_mutex_unlock(&parser->mutex);
- goto out;
+ return E_FAIL;
}
for (i = 0; i < parser->stream_count; ++i)
@@ -1601,7 +1577,7 @@ static HRESULT CDECL wg_parser_connect(struct wg_parser *parser, uint64_t file_s
if (parser->error)
{
pthread_mutex_unlock(&parser->mutex);
- goto out;
+ return E_FAIL;
}
if (gst_pad_query_duration(stream->their_src, GST_FORMAT_TIME, &duration))
{
@@ -1638,36 +1614,30 @@ static HRESULT CDECL wg_parser_connect(struct wg_parser *parser, uint64_t file_s
parser->next_offset = 0;
return S_OK;
+}
-out:
- if (parser->container)
- gst_element_set_state(parser->container, GST_STATE_NULL);
- if (parser->their_sink)
- {
- gst_pad_unlink(parser->my_src, parser->their_sink);
- gst_object_unref(parser->their_sink);
- parser->my_src = parser->their_sink = NULL;
- }
-
- for (i = 0; i < parser->stream_count; ++i)
- free_stream(parser->streams[i]);
- parser->stream_count = 0;
- free(parser->streams);
- parser->streams = NULL;
-
- if (parser->container)
+static void free_stream(struct wg_parser_stream *stream)
+{
+ if (stream->their_src)
{
- gst_element_set_bus(parser->container, NULL);
- gst_object_unref(parser->container);
- parser->container = NULL;
+ if (stream->post_sink)
+ {
+ gst_pad_unlink(stream->their_src, stream->post_sink);
+ gst_pad_unlink(stream->post_src, stream->my_sink);
+ gst_object_unref(stream->post_src);
+ gst_object_unref(stream->post_sink);
+ stream->post_src = stream->post_sink = NULL;
+ }
+ else
+ gst_pad_unlink(stream->their_src, stream->my_sink);
+ gst_object_unref(stream->their_src);
}
+ gst_object_unref(stream->my_sink);
- pthread_mutex_lock(&parser->mutex);
- parser->sink_connected = false;
- pthread_mutex_unlock(&parser->mutex);
- pthread_cond_signal(&parser->read_cond);
+ pthread_cond_destroy(&stream->event_cond);
+ pthread_cond_destroy(&stream->event_empty_cond);
- return E_FAIL;
+ free(stream);
}
static void CDECL wg_parser_disconnect(struct wg_parser *parser)
--
2.33.0

View File

@@ -0,0 +1,160 @@
From 6d496c2655531790cdfdb5869fd37b64ae405b8a Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Sun, 19 Sep 2021 13:08:05 +1000
Subject: [PATCH 6/6] Revert "winegstreamer: Factor out more of the init_gst
callback into wg_parser_connect()."
This reverts commit 830efe873a967dbbb0c9a65be6a66b124a5fa826.
---
dlls/winegstreamer/wg_parser.c | 78 +++++++++++++++++++++++-----------
1 file changed, 54 insertions(+), 24 deletions(-)
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
index bf5a51aeaf4..cd12a23d0c8 100644
--- a/dlls/winegstreamer/wg_parser.c
+++ b/dlls/winegstreamer/wg_parser.c
@@ -1494,7 +1494,6 @@ static HRESULT CDECL wg_parser_connect(struct wg_parser *parser, uint64_t file_s
GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE("quartz_src",
GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY);
unsigned int i;
- int ret;
parser->file_size = file_size;
parser->sink_connected = true;
@@ -1517,29 +1516,12 @@ static HRESULT CDECL wg_parser_connect(struct wg_parser *parser, uint64_t file_s
parser->start_offset = parser->next_offset = parser->stop_offset = 0;
parser->next_pull_offset = 0;
- parser->error = false;
if (!parser->init_gst(parser))
return E_FAIL;
- gst_element_set_state(parser->container, GST_STATE_PAUSED);
- ret = gst_element_get_state(parser->container, NULL, NULL, -1);
- if (ret == GST_STATE_CHANGE_FAILURE)
- {
- GST_ERROR("Failed to play stream.\n");
- return E_FAIL;
- }
-
pthread_mutex_lock(&parser->mutex);
- while (!parser->no_more_pads && !parser->error)
- pthread_cond_wait(&parser->init_cond, &parser->mutex);
- if (parser->error)
- {
- pthread_mutex_unlock(&parser->mutex);
- return E_FAIL;
- }
-
for (i = 0; i < parser->stream_count; ++i)
{
struct wg_parser_stream *stream = parser->streams[i];
@@ -1695,7 +1677,7 @@ static BOOL decodebin_parser_init_gst(struct wg_parser *parser)
parser->their_sink = gst_element_get_static_pad(element, "sink");
pthread_mutex_lock(&parser->mutex);
- parser->no_more_pads = false;
+ parser->no_more_pads = parser->error = false;
pthread_mutex_unlock(&parser->mutex);
if ((ret = gst_pad_link(parser->my_src, parser->their_sink)) < 0)
@@ -1704,6 +1686,24 @@ static BOOL decodebin_parser_init_gst(struct wg_parser *parser)
return FALSE;
}
+ gst_element_set_state(parser->container, GST_STATE_PAUSED);
+ ret = gst_element_get_state(parser->container, NULL, NULL, -1);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ {
+ GST_ERROR("Failed to play stream.\n");
+ return FALSE;
+ }
+
+ pthread_mutex_lock(&parser->mutex);
+ while (!parser->no_more_pads && !parser->error)
+ pthread_cond_wait(&parser->init_cond, &parser->mutex);
+ if (parser->error)
+ {
+ pthread_mutex_unlock(&parser->mutex);
+ return FALSE;
+ }
+ pthread_mutex_unlock(&parser->mutex);
+
return TRUE;
}
@@ -1724,7 +1724,7 @@ static BOOL avi_parser_init_gst(struct wg_parser *parser)
parser->their_sink = gst_element_get_static_pad(element, "sink");
pthread_mutex_lock(&parser->mutex);
- parser->no_more_pads = false;
+ parser->no_more_pads = parser->error = false;
pthread_mutex_unlock(&parser->mutex);
if ((ret = gst_pad_link(parser->my_src, parser->their_sink)) < 0)
@@ -1733,6 +1733,24 @@ static BOOL avi_parser_init_gst(struct wg_parser *parser)
return FALSE;
}
+ gst_element_set_state(parser->container, GST_STATE_PAUSED);
+ ret = gst_element_get_state(parser->container, NULL, NULL, -1);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ {
+ GST_ERROR("Failed to play stream.\n");
+ return FALSE;
+ }
+
+ pthread_mutex_lock(&parser->mutex);
+ while (!parser->no_more_pads && !parser->error)
+ pthread_cond_wait(&parser->init_cond, &parser->mutex);
+ if (parser->error)
+ {
+ pthread_mutex_unlock(&parser->mutex);
+ return FALSE;
+ }
+ pthread_mutex_unlock(&parser->mutex);
+
return TRUE;
}
@@ -1763,9 +1781,15 @@ static BOOL mpeg_audio_parser_init_gst(struct wg_parser *parser)
GST_ERROR("Failed to link source pads, error %d.\n", ret);
return FALSE;
}
- gst_pad_set_active(stream->my_sink, 1);
- parser->no_more_pads = true;
+ gst_pad_set_active(stream->my_sink, 1);
+ gst_element_set_state(parser->container, GST_STATE_PAUSED);
+ ret = gst_element_get_state(parser->container, NULL, NULL, -1);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ {
+ GST_ERROR("Failed to play stream.\n");
+ return FALSE;
+ }
return TRUE;
}
@@ -1798,9 +1822,15 @@ static BOOL wave_parser_init_gst(struct wg_parser *parser)
GST_ERROR("Failed to link source pads, error %d.\n", ret);
return FALSE;
}
- gst_pad_set_active(stream->my_sink, 1);
- parser->no_more_pads = true;
+ gst_pad_set_active(stream->my_sink, 1);
+ gst_element_set_state(parser->container, GST_STATE_PAUSED);
+ ret = gst_element_get_state(parser->container, NULL, NULL, -1);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ {
+ GST_ERROR("Failed to play stream.\n");
+ return FALSE;
+ }
return TRUE;
}
--
2.33.0

View File

@@ -0,0 +1,2 @@
# This is just a revert of update mfplat patches until it's new versions
# of the mfplat have been merged upstream.