From e648d762c2609321822334a9a8db8a2f5905b51d Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes 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