[PATCH 2/5] winegstreamer: Create, start and stop a bin container.

Rémi Bernon rbernon at codeweavers.com
Fri Feb 18 11:27:12 CST 2022


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 at codeweavers.com>
---
 dlls/winegstreamer/wg_transform.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/dlls/winegstreamer/wg_transform.c b/dlls/winegstreamer/wg_transform.c
index e4545774428..c52650b80d9 100644
--- a/dlls/winegstreamer/wg_transform.c
+++ b/dlls/winegstreamer/wg_transform.c
@@ -44,6 +44,7 @@ GST_DEBUG_CATEGORY_EXTERN(wine);
 
 struct wg_transform
 {
+    GstElement *container;
     GstPad *my_src, *my_sink;
 };
 
@@ -62,6 +63,12 @@ NTSTATUS wg_transform_destroy(void *args)
 {
     struct wg_transform *transform = args;
 
+    if (transform->container)
+        gst_element_set_state(transform->container, GST_STATE_NULL);
+
+    if (transform->container)
+        g_object_unref(transform->container);
+
     if (transform->my_sink)
         g_object_unref(transform->my_sink);
     if (transform->my_src)
@@ -80,6 +87,7 @@ NTSTATUS wg_transform_create(void *args)
     GstPadTemplate *template = NULL;
     struct wg_transform *transform;
     NTSTATUS status;
+    int ret;
 
     if (!init_gstreamer())
         return STATUS_UNSUCCESSFUL;
@@ -94,6 +102,9 @@ NTSTATUS wg_transform_create(void *args)
     if (!(sink_caps = wg_format_to_caps(&output_format)))
         goto done;
 
+    if (!(transform->container = gst_bin_new("wg_transform")))
+        goto done;
+
     if (!(template = gst_pad_template_new("src", GST_PAD_SRC, GST_PAD_ALWAYS, src_caps)))
         goto done;
     if (!(transform->my_src = gst_pad_new_from_template(template, "src")))
@@ -111,6 +122,13 @@ NTSTATUS wg_transform_create(void *args)
     gst_pad_set_element_private(transform->my_sink, transform);
     gst_pad_set_chain_function(transform->my_sink, transform_sink_chain_cb);
 
+    status = STATUS_UNSUCCESSFUL;
+
+    gst_element_set_state(transform->container, GST_STATE_PAUSED);
+    ret = gst_element_get_state(transform->container, NULL, NULL, -1);
+    if (ret == GST_STATE_CHANGE_FAILURE)
+        goto done;
+
     status = STATUS_SUCCESS;
 
 done:
-- 
2.34.1




More information about the wine-devel mailing list