GStreamer pads are automatically unlinked when destroyed.
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/winegstreamer/wg_parser.c | 6 ------ 1 file changed, 6 deletions(-)
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index f36feead9c6..46a298f13c1 100644 --- a/dlls/winegstreamer/wg_parser.c +++ b/dlls/winegstreamer/wg_parser.c @@ -683,14 +683,10 @@ static void free_stream(struct wg_parser_stream *stream) { 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); @@ -1286,7 +1282,6 @@ out: 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; } @@ -1327,7 +1322,6 @@ static NTSTATUS wg_parser_disconnect(void *args) pthread_mutex_unlock(&parser->mutex);
gst_element_set_state(parser->container, GST_STATE_NULL); - gst_pad_unlink(parser->my_src, parser->their_sink); gst_object_unref(parser->my_src); gst_object_unref(parser->their_sink); parser->my_src = parser->their_sink = NULL;
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/winegstreamer/wg_transform.c | 50 +++++++++++++++---------------- 1 file changed, 25 insertions(+), 25 deletions(-)
diff --git a/dlls/winegstreamer/wg_transform.c b/dlls/winegstreamer/wg_transform.c index d316071cf60..0772915e46f 100644 --- a/dlls/winegstreamer/wg_transform.c +++ b/dlls/winegstreamer/wg_transform.c @@ -158,25 +158,25 @@ NTSTATUS wg_transform_create(void *args) if (!(transform = calloc(1, sizeof(*transform)))) return STATUS_NO_MEMORY; if (!(transform->container = gst_bin_new("wg_transform"))) - goto out_free_transform; + goto out;
if (!(src_caps = wg_format_to_caps(&input_format))) - goto out_free_container; + goto out; if (!(template = gst_pad_template_new("src", GST_PAD_SRC, GST_PAD_ALWAYS, src_caps))) - goto out_free_src_caps; + goto out; transform->my_src = gst_pad_new_from_template(template, "src"); g_object_unref(template); if (!transform->my_src) - goto out_free_src_caps; + goto out;
if (!(sink_caps = wg_format_to_caps(&output_format))) - goto out_free_src_pad; + goto out; if (!(template = gst_pad_template_new("sink", GST_PAD_SINK, GST_PAD_ALWAYS, sink_caps))) - goto out_free_sink_caps; + goto out; transform->my_sink = gst_pad_new_from_template(template, "sink"); g_object_unref(template); if (!transform->my_sink) - goto out_free_sink_caps; + goto out;
gst_pad_set_element_private(transform->my_sink, transform); gst_pad_set_chain_function(transform->my_sink, transform_sink_chain_cb); @@ -187,7 +187,7 @@ NTSTATUS wg_transform_create(void *args) */ media_type = gst_structure_get_name(gst_caps_get_structure(sink_caps, 0)); if (!(raw_caps = gst_caps_new_empty_simple(media_type))) - goto out_free_sink_pad; + goto out;
switch (input_format.major_type) { @@ -196,7 +196,7 @@ NTSTATUS wg_transform_create(void *args) || !transform_append_element(transform, element, &first, &last)) { gst_caps_unref(raw_caps); - goto out_free_sink_pad; + goto out; } break;
@@ -205,7 +205,7 @@ NTSTATUS wg_transform_create(void *args) case WG_MAJOR_TYPE_UNKNOWN: GST_FIXME("Format %u not implemented!", input_format.major_type); gst_caps_unref(raw_caps); - goto out_free_sink_pad; + goto out; }
gst_caps_unref(raw_caps); @@ -224,22 +224,22 @@ NTSTATUS wg_transform_create(void *args) */ if (!(element = create_element("audioconvert", "base")) || !transform_append_element(transform, element, &first, &last)) - goto out_free_sink_pad; + goto out; if (!(element = create_element("audioresample", "base")) || !transform_append_element(transform, element, &first, &last)) - goto out_free_sink_pad; + goto out; break;
case WG_MAJOR_TYPE_VIDEO: case WG_MAJOR_TYPE_WMA: case WG_MAJOR_TYPE_UNKNOWN: GST_FIXME("Format %u not implemented!", output_format.major_type); - goto out_free_sink_pad; + goto out; }
gst_element_set_state(transform->container, GST_STATE_PAUSED); if (!gst_element_get_state(transform->container, NULL, NULL, -1)) - goto out_free_sink_pad; + goto out;
gst_caps_unref(sink_caps); gst_caps_unref(src_caps); @@ -248,17 +248,17 @@ NTSTATUS wg_transform_create(void *args) params->transform = transform; return STATUS_SUCCESS;
-out_free_sink_pad: - gst_object_unref(transform->my_sink); -out_free_sink_caps: - gst_caps_unref(sink_caps); -out_free_src_pad: - gst_object_unref(transform->my_src); -out_free_src_caps: - gst_caps_unref(src_caps); -out_free_container: - gst_object_unref(transform->container); -out_free_transform: +out: + if (transform->my_sink) + gst_object_unref(transform->my_sink); + if (sink_caps) + gst_caps_unref(sink_caps); + if (transform->my_src) + gst_object_unref(transform->my_src); + if (src_caps) + gst_caps_unref(src_caps); + if (transform->container) + gst_object_unref(transform->container); free(transform); GST_ERROR("Failed to create winegstreamer transform."); return status;
From: Rémi Bernon rbernon@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51931 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52391 Signed-off-by: Rémi Bernon rbernon@codeweavers.com Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- v3: Rebase; don't bother unlinking pads.
dlls/winegstreamer/wg_transform.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
diff --git a/dlls/winegstreamer/wg_transform.c b/dlls/winegstreamer/wg_transform.c index 0772915e46f..c5aa4acb2cc 100644 --- a/dlls/winegstreamer/wg_transform.c +++ b/dlls/winegstreamer/wg_transform.c @@ -46,6 +46,7 @@ struct wg_transform { GstElement *container; GstPad *my_src, *my_sink; + GstPad *their_sink, *their_src; };
static GstFlowReturn transform_sink_chain_cb(GstPad *pad, GstObject *parent, GstBuffer *buffer) @@ -64,6 +65,8 @@ NTSTATUS wg_transform_destroy(void *args) struct wg_transform *transform = args;
gst_element_set_state(transform->container, GST_STATE_NULL); + 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); @@ -237,6 +240,19 @@ NTSTATUS wg_transform_create(void *args) goto out; }
+ if (!(transform->their_sink = gst_element_get_static_pad(first, "sink"))) + 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) + goto out; + if (!gst_pad_set_active(transform->my_sink, 1)) + goto out; + if (!gst_pad_set_active(transform->my_src, 1)) + goto out; + gst_element_set_state(transform->container, GST_STATE_PAUSED); if (!gst_element_get_state(transform->container, NULL, NULL, -1)) goto out; @@ -249,6 +265,10 @@ 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 (sink_caps)
From: Rémi Bernon rbernon@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51931 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52391 Signed-off-by: Rémi Bernon rbernon@codeweavers.com Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- v3: Rebase; mention the SEGMENT event in the commit message.
dlls/winegstreamer/wg_transform.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
diff --git a/dlls/winegstreamer/wg_transform.c b/dlls/winegstreamer/wg_transform.c index c5aa4acb2cc..25fa6b39c05 100644 --- a/dlls/winegstreamer/wg_transform.c +++ b/dlls/winegstreamer/wg_transform.c @@ -47,6 +47,7 @@ struct wg_transform GstElement *container; GstPad *my_src, *my_sink; GstPad *their_sink, *their_src; + GstSegment segment; };
static GstFlowReturn transform_sink_chain_cb(GstPad *pad, GstObject *parent, GstBuffer *buffer) @@ -154,6 +155,7 @@ NTSTATUS wg_transform_create(void *args) GstPadTemplate *template = NULL; struct wg_transform *transform; const gchar *media_type; + GstEvent *event;
if (!init_gstreamer()) return STATUS_UNSUCCESSFUL; @@ -257,6 +259,22 @@ NTSTATUS wg_transform_create(void *args) if (!gst_element_get_state(transform->container, NULL, NULL, -1)) goto out;
+ if (!(event = gst_event_new_stream_start("stream")) + || !gst_pad_push_event(transform->my_src, event)) + goto out_unlink_sink_pad; + if (!(event = gst_event_new_caps(src_caps)) + || !gst_pad_push_event(transform->my_src, event)) + goto out_unlink_sink_pad; + + /* We need to use GST_FORMAT_TIME here because it's the only format + * some elements such avdec_wmav2 correctly support. */ + gst_segment_init(&transform->segment, GST_FORMAT_TIME); + transform->segment.start = 0; + transform->segment.stop = -1; + if (!(event = gst_event_new_segment(&transform->segment)) + || !gst_pad_push_event(transform->my_src, event)) + goto out_unlink_sink_pad; + gst_caps_unref(sink_caps); gst_caps_unref(src_caps);
@@ -278,7 +296,10 @@ out: if (src_caps) gst_caps_unref(src_caps); if (transform->container) + { + gst_element_set_state(transform->container); gst_object_unref(transform->container); + } free(transform); GST_ERROR("Failed to create winegstreamer transform."); return status;
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=109282
Your paranoid android.
=== debian11 (build log) ===
../wine/dlls/winegstreamer/wg_transform.c:300:9: error: too few arguments to function ‘gst_element_set_state’ ../wine/dlls/winegstreamer/wg_transform.c:276:9: error: label ‘out_unlink_sink_pad’ used but not defined Task: The win32 Wine build failed
=== debian11 (build log) ===
../wine/dlls/winegstreamer/wg_transform.c:300:9: error: too few arguments to function ‘gst_element_set_state’ ../wine/dlls/winegstreamer/wg_transform.c:276:9: error: label ‘out_unlink_sink_pad’ used but not defined Task: The wow64 Wine build failed