Zebediah Figura : winegstreamer: Defer source pin creation until after all pads are exposed.

Alexandre Julliard julliard at winehq.org
Thu Feb 11 15:37:13 CST 2021


Module: wine
Branch: master
Commit: c46505c0abd1a4317982d5ce4c62a41fbc05b923
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=c46505c0abd1a4317982d5ce4c62a41fbc05b923

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Wed Feb 10 16:18:25 2021 -0600

winegstreamer: Defer source pin creation until after all pads are exposed.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winegstreamer/gstdemux.c | 38 ++++++++++++++++++++++++++------------
 1 file changed, 26 insertions(+), 12 deletions(-)

diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c
index 2767b027f92..9ecd1e0b7fb 100644
--- a/dlls/winegstreamer/gstdemux.c
+++ b/dlls/winegstreamer/gstdemux.c
@@ -1584,21 +1584,16 @@ static void free_stream(struct wg_parser_stream *stream);
 
 static void init_new_decoded_pad(GstElement *bin, GstPad *pad, struct parser *This)
 {
-    static const WCHAR formatW[] = {'S','t','r','e','a','m',' ','%','0','2','u',0};
     struct wg_parser *parser = This->wg_parser;
     struct wg_parser_stream *stream;
     const char *typename;
     char *name;
     GstCaps *caps;
     GstStructure *arg;
-    struct parser_source *pin;
     int ret;
-    WCHAR nameW[128];
 
     TRACE("%p %p %p\n", This, bin, pad);
 
-    sprintfW(nameW, formatW, This->source_count);
-
     name = gst_pad_get_name(pad);
     TRACE("Name: %s\n", name);
     g_free(name);
@@ -1611,12 +1606,6 @@ static void init_new_decoded_pad(GstElement *bin, GstPad *pad, struct parser *Th
     if (!(stream = create_stream(parser)))
         goto out;
 
-    if (!(pin = create_pin(This, stream, nameW)))
-    {
-        free_stream(stream);
-        goto out;
-    }
-
     if (!strcmp(typename, "video/x-raw"))
     {
         GstElement *deinterlace, *vconv, *flip, *vconv2;
@@ -2203,8 +2192,11 @@ static const struct strmbase_sink_ops sink_ops =
 
 static BOOL decodebin_parser_init_gst(struct parser *filter)
 {
+    static const WCHAR formatW[] = {'S','t','r','e','a','m',' ','%','0','2','u',0};
     GstElement *element = gst_element_factory_make("decodebin", NULL);
     struct wg_parser *parser = filter->wg_parser;
+    WCHAR source_name[20];
+    unsigned int i;
     int ret;
 
     if (!element)
@@ -2250,6 +2242,14 @@ static BOOL decodebin_parser_init_gst(struct parser *filter)
         return FALSE;
     }
     pthread_mutex_unlock(&parser->mutex);
+
+    for (i = 0; i < parser->stream_count; ++i)
+    {
+        sprintfW(source_name, formatW, i);
+        if (!create_pin(filter, parser->streams[i], source_name))
+            return FALSE;
+    }
+
     return TRUE;
 }
 
@@ -2909,7 +2909,10 @@ static HRESULT GST_RemoveOutputPins(struct parser *This)
     CloseHandle(This->read_thread);
 
     for (i = 0; i < This->source_count; ++i)
-        free_source_pin(This->sources[i]);
+    {
+        if (This->sources[i])
+            free_source_pin(This->sources[i]);
+    }
 
     This->source_count = 0;
     heap_free(This->sources);
@@ -3094,8 +3097,11 @@ static const struct strmbase_sink_ops avi_splitter_sink_ops =
 
 static BOOL avi_splitter_init_gst(struct parser *filter)
 {
+    static const WCHAR formatW[] = {'S','t','r','e','a','m',' ','%','0','2','u',0};
     GstElement *element = gst_element_factory_make("avidemux", NULL);
     struct wg_parser *parser = filter->wg_parser;
+    WCHAR source_name[20];
+    unsigned int i;
     int ret;
 
     if (!element)
@@ -3140,6 +3146,14 @@ static BOOL avi_splitter_init_gst(struct parser *filter)
         return FALSE;
     }
     pthread_mutex_unlock(&parser->mutex);
+
+    for (i = 0; i < parser->stream_count; ++i)
+    {
+        sprintfW(source_name, formatW, i);
+        if (!create_pin(filter, parser->streams[i], source_name))
+            return FALSE;
+    }
+
     return TRUE;
 }
 




More information about the wine-cvs mailing list