Zebediah Figura : winegstreamer: Avoid accessing the DirectShow peer from GStreamer callbacks.

Alexandre Julliard julliard at winehq.org
Thu Feb 4 16:15:18 CST 2021


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

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Wed Feb  3 17:41:41 2021 -0600

winegstreamer: Avoid accessing the DirectShow peer from GStreamer callbacks.

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

---

 dlls/winegstreamer/gstdemux.c | 29 +++++++++++++++++++++--------
 1 file changed, 21 insertions(+), 8 deletions(-)

diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c
index 1332810e4ea..e47b4a30388 100644
--- a/dlls/winegstreamer/gstdemux.c
+++ b/dlls/winegstreamer/gstdemux.c
@@ -106,7 +106,7 @@ struct wg_parser_stream
     pthread_cond_t event_cond, event_empty_cond;
     struct wg_parser_event event;
 
-    bool flushing, eos;
+    bool flushing, eos, enabled;
 };
 
 struct parser
@@ -546,6 +546,7 @@ static GstCaps *amt_to_gst_caps(const AM_MEDIA_TYPE *mt)
 static gboolean query_sink(GstPad *pad, GstObject *parent, GstQuery *query)
 {
     struct parser_source *pin = gst_pad_get_element_private(pad);
+    struct wg_parser_stream *stream = pin->wg_stream;
 
     TRACE("pin %p, type \"%s\".\n", pin, gst_query_type_get_name(query->type));
 
@@ -557,7 +558,7 @@ static gboolean query_sink(GstPad *pad, GstObject *parent, GstQuery *query)
 
             gst_query_parse_caps(query, &filter);
 
-            if (pin->pin.pin.peer)
+            if (stream->enabled)
                 caps = amt_to_gst_caps(&pin->pin.pin.mt);
             else
                 caps = gst_caps_new_any();
@@ -581,7 +582,7 @@ static gboolean query_sink(GstPad *pad, GstObject *parent, GstQuery *query)
             AM_MEDIA_TYPE mt;
             GstCaps *caps;
 
-            if (!pin->pin.pin.peer)
+            if (!stream->enabled)
             {
                 gst_query_set_accept_caps_result(query, TRUE);
                 return TRUE;
@@ -751,7 +752,7 @@ static gboolean event_sink(GstPad *pad, GstObject *parent, GstEvent *event)
     switch (event->type)
     {
         case GST_EVENT_SEGMENT:
-            if (pin->pin.pin.peer)
+            if (stream->enabled)
             {
                 struct wg_parser_event stream_event;
                 const GstSegment *segment;
@@ -775,7 +776,7 @@ static gboolean event_sink(GstPad *pad, GstObject *parent, GstEvent *event)
             break;
 
         case GST_EVENT_EOS:
-            if (pin->pin.pin.peer)
+            if (stream->enabled)
             {
                 struct wg_parser_event stream_event;
 
@@ -792,7 +793,7 @@ static gboolean event_sink(GstPad *pad, GstObject *parent, GstEvent *event)
             break;
 
         case GST_EVENT_FLUSH_START:
-            if (pin->pin.pin.peer)
+            if (stream->enabled)
             {
                 pthread_mutex_lock(&parser->mutex);
 
@@ -818,7 +819,7 @@ static gboolean event_sink(GstPad *pad, GstObject *parent, GstEvent *event)
 
         case GST_EVENT_FLUSH_STOP:
             gst_segment_init(stream->segment, GST_FORMAT_TIME);
-            if (pin->pin.pin.peer)
+            if (stream->enabled)
             {
                 pthread_mutex_lock(&parser->mutex);
                 stream->flushing = false;
@@ -900,12 +901,13 @@ static void *push_data(void *iface)
 static GstFlowReturn got_data_sink(GstPad *pad, GstObject *parent, GstBuffer *buffer)
 {
     struct parser_source *pin = gst_pad_get_element_private(pad);
+    struct wg_parser_stream *stream = pin->wg_stream;
     struct wg_parser_event stream_event;
     GstFlowReturn ret;
 
     GST_LOG("pin %p, buffer %p.", pin, buffer);
 
-    if (!pin->pin.pin.peer)
+    if (!stream->enabled)
     {
         gst_buffer_unref(buffer);
         return GST_FLOW_OK;
@@ -2434,6 +2436,8 @@ static HRESULT WINAPI GSTOutPin_DecideBufferSize(struct strmbase_source *iface,
         buffer_size = format->nAvgBytesPerSec;
     }
 
+    stream->enabled = true;
+
     gst_pad_push_event(stream->my_sink, gst_event_new_reconfigure());
     /* We do need to drop any buffers that might have been sent with the old
      * caps, but this will be handled in parser_init_stream(). */
@@ -2444,6 +2448,14 @@ static HRESULT WINAPI GSTOutPin_DecideBufferSize(struct strmbase_source *iface,
     return IMemAllocator_SetProperties(allocator, props, &ret_props);
 }
 
+static void source_disconnect(struct strmbase_source *iface)
+{
+    struct parser_source *pin = impl_source_from_IPin(&iface->pin.IPin_iface);
+    struct wg_parser_stream *stream = pin->wg_stream;
+
+    stream->enabled = false;
+}
+
 static void free_source_pin(struct parser_source *pin)
 {
     struct wg_parser_stream *stream = pin->wg_stream;
@@ -2493,6 +2505,7 @@ static const struct strmbase_source_ops source_ops =
     .pfnAttemptConnection = BaseOutputPinImpl_AttemptConnection,
     .pfnDecideAllocator = BaseOutputPinImpl_DecideAllocator,
     .pfnDecideBufferSize = GSTOutPin_DecideBufferSize,
+    .source_disconnect = source_disconnect,
 };
 
 static struct parser_source *create_pin(struct parser *filter, const WCHAR *name)




More information about the wine-cvs mailing list