Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
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);
--
2.30.0