From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/media_source.c | 4 ++-- dlls/winegstreamer/wg_parser.c | 18 +++++++++++++----- 2 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index 5221668b10c..1b1745d70e3 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -1351,13 +1351,13 @@ static HRESULT WINAPI media_source_Shutdown(IMFMediaSource *iface)
TRACE("%p.\n", iface);
+ wg_parser_disconnect(source->wg_parser); + if (source->state == SOURCE_SHUTDOWN) return MF_E_SHUTDOWN;
source->state = SOURCE_SHUTDOWN;
- wg_parser_disconnect(source->wg_parser); - source->read_thread_shutdown = true; WaitForSingleObject(source->read_thread, INFINITE); CloseHandle(source->read_thread); diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index dfb3da9a4ab..6730b7cf78c 100644 --- a/dlls/winegstreamer/wg_parser.c +++ b/dlls/winegstreamer/wg_parser.c @@ -1695,10 +1695,19 @@ out: static NTSTATUS wg_parser_disconnect(void *args) { struct wg_parser *parser = args; + GstElement *container; unsigned int i;
- /* Unblock all of our streams. */ pthread_mutex_lock(&parser->mutex); + + if (!(container = parser->container)) + { + pthread_mutex_unlock(&parser->mutex); + return S_OK; + } + parser->container = NULL; + + /* Unblock all of our streams. */ for (i = 0; i < parser->stream_count; ++i) { parser->streams[i]->flushing = true; @@ -1706,7 +1715,7 @@ static NTSTATUS wg_parser_disconnect(void *args) } pthread_mutex_unlock(&parser->mutex);
- gst_element_set_state(parser->container, GST_STATE_NULL); + gst_element_set_state(container, GST_STATE_NULL); gst_object_unref(parser->my_src); gst_object_unref(parser->their_sink); parser->my_src = parser->their_sink = NULL; @@ -1723,9 +1732,8 @@ static NTSTATUS wg_parser_disconnect(void *args) free(parser->streams); parser->streams = NULL;
- gst_element_set_bus(parser->container, NULL); - gst_object_unref(parser->container); - parser->container = NULL; + gst_element_set_bus(container, NULL); + gst_object_unref(container);
g_free(parser->sink_caps); parser->sink_caps = NULL;