Zebediah Figura : winegstreamer: Move the "bus" field of struct parser to a new "wg_parser" object.

Alexandre Julliard julliard at winehq.org
Mon Feb 1 16:13:07 CST 2021


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

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Fri Jan 29 23:58:03 2021 -0600

winegstreamer: Move the "bus" field of struct parser to a new "wg_parser" object.

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

---

 dlls/winegstreamer/gstdemux.c | 70 ++++++++++++++++++++++++++++++++++++-------
 1 file changed, 60 insertions(+), 10 deletions(-)

diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c
index ea6808ec113..f2b015d99db 100644
--- a/dlls/winegstreamer/gstdemux.c
+++ b/dlls/winegstreamer/gstdemux.c
@@ -46,6 +46,11 @@ GST_DEBUG_CATEGORY_STATIC(wine);
 
 static const GUID MEDIASUBTYPE_CVID = {mmioFOURCC('c','v','i','d'), 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
 
+struct wg_parser
+{
+    GstBus *bus;
+};
+
 struct parser
 {
     struct strmbase_filter filter;
@@ -60,6 +65,8 @@ struct parser
 
     LONGLONG filesize;
 
+    struct wg_parser *wg_parser;
+
     /* FIXME: It would be nice to avoid duplicating these with strmbase.
      * However, synchronization is tricky; we need access to be protected by a
      * separate lock. */
@@ -67,7 +74,6 @@ struct parser
 
     GstElement *container;
     GstPad *my_src, *their_sink;
-    GstBus *bus;
     guint64 start, nextofs, nextpullofs, stop;
 
     pthread_mutex_t mutex;
@@ -1556,6 +1562,7 @@ static LONGLONG query_duration(GstPad *pad)
 
 static HRESULT GST_Connect(struct parser *This, IPin *pConnectPin)
 {
+    struct wg_parser *parser = This->wg_parser;
     unsigned int i;
     LONGLONG avail;
     GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE(
@@ -1570,13 +1577,14 @@ static HRESULT GST_Connect(struct parser *This, IPin *pConnectPin)
 
     This->read_thread = CreateThread(NULL, 0, read_thread, This, 0, NULL);
 
-    if (!This->bus) {
-        This->bus = gst_bus_new();
-        gst_bus_set_sync_handler(This->bus, watch_bus, This, NULL);
+    if (!parser->bus)
+    {
+        parser->bus = gst_bus_new();
+        gst_bus_set_sync_handler(parser->bus, watch_bus, This, NULL);
     }
 
     This->container = gst_bin_new(NULL);
-    gst_element_set_bus(This->container, This->bus);
+    gst_element_set_bus(This->container, parser->bus);
 
     This->my_src = gst_pad_new_from_static_template(&src_template, "quartz-src");
     gst_pad_set_getrange_function(This->my_src, request_buffer_src);
@@ -1639,6 +1647,17 @@ static struct strmbase_pin *parser_get_pin(struct strmbase_filter *base, unsigne
     return NULL;
 }
 
+static void wg_parser_destroy(struct wg_parser *parser)
+{
+    if (parser->bus)
+    {
+        gst_bus_set_sync_handler(parser->bus, NULL, NULL, NULL);
+        gst_object_unref(parser->bus);
+    }
+
+    free(parser);
+}
+
 static void parser_destroy(struct strmbase_filter *iface)
 {
     struct parser *filter = impl_from_strmbase_filter(iface);
@@ -1657,11 +1676,7 @@ static void parser_destroy(struct strmbase_filter *iface)
         IAsyncReader_Release(filter->reader);
     filter->reader = NULL;
 
-    if (filter->bus)
-    {
-        gst_bus_set_sync_handler(filter->bus, NULL, NULL, NULL);
-        gst_object_unref(filter->bus);
-    }
+    wg_parser_destroy(filter->wg_parser);
 
     pthread_cond_destroy(&filter->read_cond);
     pthread_cond_destroy(&filter->read_done_cond);
@@ -1966,6 +1981,17 @@ static void parser_init_common(struct parser *object)
     object->flushing = true;
 }
 
+static struct wg_parser *wg_parser_create(void)
+{
+    struct wg_parser *parser;
+
+    if (!(parser = calloc(1, sizeof(*parser))))
+        return NULL;
+
+    TRACE("Created winegstreamer parser %p.\n", parser);
+    return parser;
+}
+
 HRESULT decodebin_parser_create(IUnknown *outer, IUnknown **out)
 {
     struct parser *object;
@@ -1978,6 +2004,12 @@ HRESULT decodebin_parser_create(IUnknown *outer, IUnknown **out)
     if (!(object = heap_alloc_zero(sizeof(*object))))
         return E_OUTOFMEMORY;
 
+    if (!(object->wg_parser = wg_parser_create()))
+    {
+        heap_free(object);
+        return E_OUTOFMEMORY;
+    }
+
     parser_init_common(object);
 
     strmbase_filter_init(&object->filter, outer, &CLSID_decodebin_parser, &filter_ops);
@@ -2632,6 +2664,12 @@ HRESULT wave_parser_create(IUnknown *outer, IUnknown **out)
     if (!(object = heap_alloc_zero(sizeof(*object))))
         return E_OUTOFMEMORY;
 
+    if (!(object->wg_parser = wg_parser_create()))
+    {
+        heap_free(object);
+        return E_OUTOFMEMORY;
+    }
+
     parser_init_common(object);
 
     strmbase_filter_init(&object->filter, outer, &CLSID_WAVEParser, &filter_ops);
@@ -2745,6 +2783,12 @@ HRESULT avi_splitter_create(IUnknown *outer, IUnknown **out)
     if (!(object = heap_alloc_zero(sizeof(*object))))
         return E_OUTOFMEMORY;
 
+    if (!(object->wg_parser = wg_parser_create()))
+    {
+        heap_free(object);
+        return E_OUTOFMEMORY;
+    }
+
     parser_init_common(object);
 
     strmbase_filter_init(&object->filter, outer, &CLSID_AviSplitter, &filter_ops);
@@ -2889,6 +2933,12 @@ HRESULT mpeg_splitter_create(IUnknown *outer, IUnknown **out)
     if (!(object = heap_alloc_zero(sizeof(*object))))
         return E_OUTOFMEMORY;
 
+    if (!(object->wg_parser = wg_parser_create()))
+    {
+        heap_free(object);
+        return E_OUTOFMEMORY;
+    }
+
     parser_init_common(object);
 
     strmbase_filter_init(&object->filter, outer, &CLSID_MPEG1Splitter, &mpeg_splitter_ops);




More information about the wine-cvs mailing list