mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2024-11-21 16:46:54 -08:00
141 lines
4.5 KiB
Diff
141 lines
4.5 KiB
Diff
|
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
|
||
|
|