From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/unix_private.h | 2 ++ dlls/winegstreamer/unixlib.c | 46 +++++++++++++++++++++++++++++++ dlls/winegstreamer/wg_parser.c | 39 +++----------------------- dlls/winegstreamer/wg_transform.c | 15 ++-------- 4 files changed, 54 insertions(+), 48 deletions(-)
diff --git a/dlls/winegstreamer/unix_private.h b/dlls/winegstreamer/unix_private.h index cb4e5910ebf..2f4e168c3a2 100644 --- a/dlls/winegstreamer/unix_private.h +++ b/dlls/winegstreamer/unix_private.h @@ -35,6 +35,8 @@ extern NTSTATUS wg_init_gstreamer(void *args) DECLSPEC_HIDDEN; extern GstElement *create_element(const char *name, const char *plugin_set) DECLSPEC_HIDDEN; extern GstElement *find_element(GstElementFactoryListType type, GstCaps *src_caps, GstCaps *sink_caps) DECLSPEC_HIDDEN; extern bool append_element(GstElement *container, GstElement *element, GstElement **first, GstElement **last) DECLSPEC_HIDDEN; +extern bool link_src_to_element(GstPad *src_pad, GstElement *element) DECLSPEC_HIDDEN; +extern bool link_element_to_sink(GstElement *element, GstPad *sink_pad) DECLSPEC_HIDDEN;
/* wg_format.c */
diff --git a/dlls/winegstreamer/unixlib.c b/dlls/winegstreamer/unixlib.c index 8869b092eaa..7111402bf0a 100644 --- a/dlls/winegstreamer/unixlib.c +++ b/dlls/winegstreamer/unixlib.c @@ -125,6 +125,52 @@ bool append_element(GstElement *container, GstElement *element, GstElement **fir return success; }
+bool link_src_to_element(GstPad *src_pad, GstElement *element) +{ + GstPadLinkReturn ret; + GstPad *sink_pad; + + if (!(sink_pad = gst_element_get_static_pad(element, "sink"))) + { + gchar *name = gst_element_get_name(element); + GST_ERROR("Failed to find sink pad on %s", name); + g_free(name); + return false; + } + if ((ret = gst_pad_link(src_pad, sink_pad))) + { + gchar *src_name = gst_pad_get_name(src_pad), *sink_name = gst_pad_get_name(sink_pad); + GST_ERROR("Failed to link element pad %s with pad %s", src_name, sink_name); + g_free(sink_name); + g_free(src_name); + } + gst_object_unref(sink_pad); + return !ret; +} + +bool link_element_to_sink(GstElement *element, GstPad *sink_pad) +{ + GstPadLinkReturn ret; + GstPad *src_pad; + + if (!(src_pad = gst_element_get_static_pad(element, "src"))) + { + gchar *name = gst_element_get_name(element); + GST_ERROR("Failed to find src pad on %s", name); + g_free(name); + return false; + } + if ((ret = gst_pad_link(src_pad, sink_pad))) + { + gchar *src_name = gst_pad_get_name(src_pad), *sink_name = gst_pad_get_name(sink_pad); + GST_ERROR("Failed to link pad %s with element pad %s", src_name, sink_name); + g_free(sink_name); + g_free(src_name); + } + gst_object_unref(src_pad); + return !ret; +} + NTSTATUS wg_init_gstreamer(void *arg) { char arg0[] = "wine"; diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index edf7b4fb548..2fa87ac611b 100644 --- a/dlls/winegstreamer/wg_parser.c +++ b/dlls/winegstreamer/wg_parser.c @@ -95,7 +95,7 @@ struct wg_parser_stream struct wg_parser *parser; uint32_t number;
- GstPad *their_src, *post_sink, *post_src, *my_sink; + GstPad *their_src, *my_sink; GstElement *flip; GstSegment segment; struct wg_format preferred_format, current_format; @@ -763,15 +763,7 @@ static void free_stream(struct wg_parser_stream *stream) unsigned int i;
if (stream->their_src) - { - if (stream->post_sink) - { - gst_object_unref(stream->post_src); - gst_object_unref(stream->post_sink); - stream->post_src = stream->post_sink = NULL; - } gst_object_unref(stream->their_src); - } gst_object_unref(stream->my_sink);
pthread_cond_destroy(&stream->event_cond); @@ -832,8 +824,8 @@ static void pad_added_cb(GstElement *element, GstPad *pad, gpointer user) || !append_element(parser->container, element, &first, &last)) goto out;
- stream->post_sink = gst_element_get_static_pad(first, "sink"); - stream->post_src = gst_element_get_static_pad(last, "src"); + if (!link_src_to_element(pad, first) || !link_element_to_sink(last, stream->my_sink)) + goto out; } else if (!strcmp(name, "audio/x-raw")) { @@ -845,31 +837,8 @@ static void pad_added_cb(GstElement *element, GstPad *pad, gpointer user) || !append_element(parser->container, element, &first, &last)) goto out;
- stream->post_sink = gst_element_get_static_pad(first, "sink"); - stream->post_src = gst_element_get_static_pad(last, "src"); - } - - if (stream->post_sink) - { - if ((ret = gst_pad_link(pad, stream->post_sink)) < 0) - { - GST_ERROR("Failed to link decodebin source pad to post-processing elements, error %s.", - gst_pad_link_get_name(ret)); - gst_object_unref(stream->post_sink); - stream->post_sink = NULL; - goto out; - } - - if ((ret = gst_pad_link(stream->post_src, stream->my_sink)) < 0) - { - GST_ERROR("Failed to link post-processing elements to our sink pad, error %s.", - gst_pad_link_get_name(ret)); - gst_object_unref(stream->post_src); - stream->post_src = NULL; - gst_object_unref(stream->post_sink); - stream->post_sink = NULL; + if (!link_src_to_element(pad, first) || !link_element_to_sink(last, stream->my_sink)) goto out; - } } else if ((ret = gst_pad_link(pad, stream->my_sink)) < 0) { diff --git a/dlls/winegstreamer/wg_transform.c b/dlls/winegstreamer/wg_transform.c index 30f191c4132..978d790fbb6 100644 --- a/dlls/winegstreamer/wg_transform.c +++ b/dlls/winegstreamer/wg_transform.c @@ -46,7 +46,6 @@ struct wg_transform GstElement *container; GstAllocator *allocator; GstPad *my_src, *my_sink; - GstPad *their_sink, *their_src; GstSegment segment; GstQuery *drain_query;
@@ -254,8 +253,6 @@ NTSTATUS wg_transform_destroy(void *args) gst_sample_unref(sample);
wg_allocator_destroy(transform->allocator); - g_object_unref(transform->their_sink); - g_object_unref(transform->their_src); g_object_unref(transform->container); g_object_unref(transform->my_sink); g_object_unref(transform->my_src); @@ -414,13 +411,9 @@ NTSTATUS wg_transform_create(void *args) goto out; }
- if (!(transform->their_sink = gst_element_get_static_pad(first, "sink"))) + if (!link_src_to_element(transform->my_src, first)) goto out; - if (!(transform->their_src = gst_element_get_static_pad(last, "src"))) - goto out; - if (gst_pad_link(transform->my_src, transform->their_sink) < 0) - goto out; - if (gst_pad_link(transform->their_src, transform->my_sink) < 0) + if (!link_element_to_sink(last, transform->my_sink)) goto out; if (!gst_pad_set_active(transform->my_sink, 1)) goto out; @@ -454,10 +447,6 @@ NTSTATUS wg_transform_create(void *args) return STATUS_SUCCESS;
out: - if (transform->their_sink) - gst_object_unref(transform->their_sink); - if (transform->their_src) - gst_object_unref(transform->their_src); if (transform->my_sink) gst_object_unref(transform->my_sink); if (transform->output_caps)