[PATCH 2/6] winegstreamer: Separate parser_source and wg_parser_stream allocation.

Zebediah Figura z.figura12 at gmail.com
Wed Feb 10 16:18:24 CST 2021


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/winegstreamer/gstdemux.c | 89 ++++++++++++++++++++++-------------
 1 file changed, 55 insertions(+), 34 deletions(-)

diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c
index ba632f3297d..2767b027f92 100644
--- a/dlls/winegstreamer/gstdemux.c
+++ b/dlls/winegstreamer/gstdemux.c
@@ -168,7 +168,9 @@ static const WCHAR wcsInputPinName[] = {'i','n','p','u','t',' ','p','i','n',0};
 static const IMediaSeekingVtbl GST_Seeking_Vtbl;
 static const IQualityControlVtbl GSTOutPin_QualityControl_Vtbl;
 
-static struct parser_source *create_pin(struct parser *filter, const WCHAR *name);
+static struct wg_parser_stream *create_stream(struct wg_parser *parser);
+static struct parser_source *create_pin(struct parser *filter,
+        struct wg_parser_stream *stream, const WCHAR *name);
 static HRESULT GST_RemoveOutputPins(struct parser *This);
 static HRESULT WINAPI GST_ChangeCurrent(IMediaSeeking *iface);
 static HRESULT WINAPI GST_ChangeStop(IMediaSeeking *iface);
@@ -1578,6 +1580,8 @@ static void removed_decoded_pad(GstElement *bin, GstPad *pad, gpointer user)
     g_free(name);
 }
 
+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};
@@ -1604,12 +1608,14 @@ static void init_new_decoded_pad(GstElement *bin, GstPad *pad, struct parser *Th
     arg = gst_caps_get_structure(caps, 0);
     typename = gst_structure_get_name(arg);
 
-    if (!(pin = create_pin(This, nameW)))
+    if (!(stream = create_stream(parser)))
+        goto out;
+
+    if (!(pin = create_pin(This, stream, nameW)))
     {
-        ERR("Failed to allocate memory.\n");
+        free_stream(stream);
         goto out;
     }
-    stream = pin->wg_stream;
 
     if (!strcmp(typename, "video/x-raw"))
     {
@@ -2813,53 +2819,56 @@ static const struct strmbase_source_ops source_ops =
     .source_disconnect = source_disconnect,
 };
 
-static struct parser_source *create_pin(struct parser *filter, const WCHAR *name)
+static struct wg_parser_stream *create_stream(struct wg_parser *parser)
 {
-    struct wg_parser *parser = filter->wg_parser;
-    struct wg_parser_stream *stream;
-    struct parser_source *pin;
+    struct wg_parser_stream *stream, **new_array;
     char pad_name[19];
-    void *new_array;
-
-    if (!(new_array = heap_realloc(filter->sources, (filter->source_count + 1) * sizeof(*filter->sources))))
-        return NULL;
-    filter->sources = new_array;
 
     if (!(new_array = realloc(parser->streams, (parser->stream_count + 1) * sizeof(*parser->streams))))
         return NULL;
     parser->streams = new_array;
 
-    if (!(pin = heap_alloc_zero(sizeof(*pin))))
-        return NULL;
-
     if (!(stream = calloc(1, sizeof(*stream))))
-    {
-        heap_free(pin);
         return NULL;
-    }
-    pin->wg_stream = stream;
 
     stream->parser = parser;
-    strmbase_source_init(&pin->pin, &filter->filter, name, &source_ops);
-    pin->IQualityControl_iface.lpVtbl = &GSTOutPin_QualityControl_Vtbl;
-    strmbase_seeking_init(&pin->seek, &GST_Seeking_Vtbl, GST_ChangeStop,
-            GST_ChangeCurrent, GST_ChangeRate);
     pthread_cond_init(&stream->event_cond, NULL);
     pthread_cond_init(&stream->event_empty_cond, NULL);
-    BaseFilterImpl_IncrementPinVersion(&filter->filter);
-
-    InitializeCriticalSection(&pin->flushing_cs);
-    pin->flushing_cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": pin.flushing_cs");
 
-    sprintf(pad_name, "qz_sink_%u", filter->source_count);
+    sprintf(pad_name, "qz_sink_%u", parser->stream_count);
     stream->my_sink = gst_pad_new(pad_name, GST_PAD_SINK);
     gst_pad_set_element_private(stream->my_sink, stream);
     gst_pad_set_chain_function(stream->my_sink, got_data_sink);
     gst_pad_set_event_function(stream->my_sink, event_sink);
     gst_pad_set_query_function(stream->my_sink, query_sink);
 
-    filter->sources[filter->source_count++] = pin;
     parser->streams[parser->stream_count++] = stream;
+    return stream;
+}
+
+static struct parser_source *create_pin(struct parser *filter,
+        struct wg_parser_stream *stream, const WCHAR *name)
+{
+    struct parser_source *pin, **new_array;
+
+    if (!(new_array = heap_realloc(filter->sources, (filter->source_count + 1) * sizeof(*filter->sources))))
+        return NULL;
+    filter->sources = new_array;
+
+    if (!(pin = heap_alloc_zero(sizeof(*pin))))
+        return NULL;
+
+    pin->wg_stream = stream;
+    strmbase_source_init(&pin->pin, &filter->filter, name, &source_ops);
+    pin->IQualityControl_iface.lpVtbl = &GSTOutPin_QualityControl_Vtbl;
+    strmbase_seeking_init(&pin->seek, &GST_Seeking_Vtbl, GST_ChangeStop,
+            GST_ChangeCurrent, GST_ChangeRate);
+    BaseFilterImpl_IncrementPinVersion(&filter->filter);
+
+    InitializeCriticalSection(&pin->flushing_cs);
+    pin->flushing_cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": pin.flushing_cs");
+
+    filter->sources[filter->source_count++] = pin;
     return pin;
 }
 
@@ -2984,9 +2993,15 @@ static BOOL wave_parser_init_gst(struct parser *filter)
         return FALSE;
     }
 
-    if (!(pin = create_pin(filter, source_name)))
+    if (!(stream = create_stream(parser)))
+        return FALSE;
+
+    if (!(pin = create_pin(filter, stream, source_name)))
+    {
+        free_stream(stream);
         return FALSE;
-    stream = pin->wg_stream;
+    }
+
     stream->their_src = gst_element_get_static_pad(element, "src");
     gst_object_ref(stream->their_src);
     if ((ret = gst_pad_link(stream->their_src, stream->my_sink)) < 0)
@@ -3228,9 +3243,15 @@ static BOOL mpeg_splitter_init_gst(struct parser *filter)
         return FALSE;
     }
 
-    if (!(pin = create_pin(filter, source_name)))
+    if (!(stream = create_stream(parser)))
         return FALSE;
-    stream = pin->wg_stream;
+
+    if (!(pin = create_pin(filter, stream, source_name)))
+    {
+        free_stream(stream);
+        return FALSE;
+    }
+
     gst_object_ref(stream->their_src = gst_element_get_static_pad(element, "src"));
     if ((ret = gst_pad_link(stream->their_src, stream->my_sink)) < 0)
     {
-- 
2.30.0




More information about the wine-devel mailing list