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