Signed-off-by: Zebediah Figura z.figura12@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);
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/winegstreamer/gstdemux.c | 62 ++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 27 deletions(-)
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index f2b015d99db..2bd6622b889 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -48,6 +48,7 @@ static const GUID MEDIASUBTYPE_CVID = {mmioFOURCC('c','v','i','d'), 0x0000, 0x00
struct wg_parser { + GstElement *container; GstBus *bus; };
@@ -72,7 +73,6 @@ struct parser * separate lock. */ bool streaming, flushing, sink_connected;
- GstElement *container; GstPad *my_src, *their_sink; guint64 start, nextofs, nextpullofs, stop;
@@ -1228,6 +1228,7 @@ static void removed_decoded_pad(GstElement *bin, GstPad *pad, gpointer user) 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}; + struct wg_parser *parser = This->wg_parser; const char *typename; char *name; GstCaps *caps; @@ -1296,13 +1297,13 @@ static void init_new_decoded_pad(GstElement *bin, GstPad *pad, struct parser *Th }
/* The bin takes ownership of these elements. */ - gst_bin_add(GST_BIN(This->container), deinterlace); + gst_bin_add(GST_BIN(parser->container), deinterlace); gst_element_sync_state_with_parent(deinterlace); - gst_bin_add(GST_BIN(This->container), vconv); + gst_bin_add(GST_BIN(parser->container), vconv); gst_element_sync_state_with_parent(vconv); - gst_bin_add(GST_BIN(This->container), flip); + gst_bin_add(GST_BIN(parser->container), flip); gst_element_sync_state_with_parent(flip); - gst_bin_add(GST_BIN(This->container), vconv2); + gst_bin_add(GST_BIN(parser->container), vconv2); gst_element_sync_state_with_parent(vconv2);
gst_element_link(deinterlace, vconv); @@ -1328,7 +1329,7 @@ static void init_new_decoded_pad(GstElement *bin, GstPad *pad, struct parser *Th goto out; }
- gst_bin_add(GST_BIN(This->container), convert); + gst_bin_add(GST_BIN(parser->container), convert); gst_element_sync_state_with_parent(convert);
pin->post_sink = gst_element_get_static_pad(convert, "sink"); @@ -1583,8 +1584,8 @@ static HRESULT GST_Connect(struct parser *This, IPin *pConnectPin) gst_bus_set_sync_handler(parser->bus, watch_bus, This, NULL); }
- This->container = gst_bin_new(NULL); - gst_element_set_bus(This->container, parser->bus); + parser->container = gst_bin_new(NULL); + gst_element_set_bus(parser->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); @@ -1691,11 +1692,12 @@ static void parser_destroy(struct strmbase_filter *iface) static HRESULT parser_init_stream(struct strmbase_filter *iface) { struct parser *filter = impl_from_strmbase_filter(iface); + struct wg_parser *parser = filter->wg_parser; GstSeekType stop_type = GST_SEEK_TYPE_NONE; const SourceSeeking *seeking; unsigned int i;
- if (!filter->container) + if (!parser->container) return S_OK;
filter->streaming = true; @@ -1733,9 +1735,10 @@ static HRESULT parser_init_stream(struct strmbase_filter *iface) static HRESULT parser_cleanup_stream(struct strmbase_filter *iface) { struct parser *filter = impl_from_strmbase_filter(iface); + struct wg_parser *parser = filter->wg_parser; unsigned int i;
- if (!filter->container) + if (!parser->container) return S_OK;
filter->streaming = false; @@ -1834,6 +1837,7 @@ static const struct strmbase_sink_ops sink_ops = static BOOL decodebin_parser_init_gst(struct parser *filter) { GstElement *element = gst_element_factory_make("decodebin", NULL); + struct wg_parser *parser = filter->wg_parser; int ret;
if (!element) @@ -1843,7 +1847,7 @@ static BOOL decodebin_parser_init_gst(struct parser *filter) return FALSE; }
- gst_bin_add(GST_BIN(filter->container), element); + gst_bin_add(GST_BIN(parser->container), element);
g_signal_connect(element, "pad-added", G_CALLBACK(existing_new_pad_wrapper), filter); g_signal_connect(element, "pad-removed", G_CALLBACK(removed_decoded_pad), filter); @@ -1862,8 +1866,8 @@ static BOOL decodebin_parser_init_gst(struct parser *filter) return FALSE; }
- gst_element_set_state(filter->container, GST_STATE_PAUSED); - ret = gst_element_get_state(filter->container, NULL, NULL, -1); + gst_element_set_state(parser->container, GST_STATE_PAUSED); + ret = gst_element_get_state(parser->container, NULL, NULL, -1); if (ret == GST_STATE_CHANGE_FAILURE) { ERR("Failed to play stream.\n"); @@ -2488,12 +2492,13 @@ static struct parser_source *create_pin(struct parser *filter, const WCHAR *name
static HRESULT GST_RemoveOutputPins(struct parser *This) { + struct wg_parser *parser = This->wg_parser; unsigned int i;
TRACE("(%p)\n", This); mark_wine_thread();
- if (!This->container) + if (!parser->container) return S_OK;
/* Unblock all of our streams. */ @@ -2505,7 +2510,7 @@ static HRESULT GST_RemoveOutputPins(struct parser *This) } pthread_mutex_unlock(&This->mutex);
- gst_element_set_state(This->container, GST_STATE_NULL); + gst_element_set_state(parser->container, GST_STATE_NULL); gst_pad_unlink(This->my_src, This->their_sink); gst_object_unref(This->my_src); gst_object_unref(This->their_sink); @@ -2526,9 +2531,9 @@ static HRESULT GST_RemoveOutputPins(struct parser *This) This->source_count = 0; heap_free(This->sources); This->sources = NULL; - gst_element_set_bus(This->container, NULL); - gst_object_unref(This->container); - This->container = NULL; + gst_element_set_bus(parser->container, NULL); + gst_object_unref(parser->container); + parser->container = NULL; BaseFilterImpl_IncrementPinVersion(&This->filter); return S_OK; } @@ -2587,6 +2592,7 @@ static const struct strmbase_sink_ops wave_parser_sink_ops = static BOOL wave_parser_init_gst(struct parser *filter) { static const WCHAR source_name[] = {'o','u','t','p','u','t',0}; + struct wg_parser *parser = filter->wg_parser; struct parser_source *pin; GstElement *element; int ret; @@ -2598,7 +2604,7 @@ static BOOL wave_parser_init_gst(struct parser *filter) return FALSE; }
- gst_bin_add(GST_BIN(filter->container), element); + gst_bin_add(GST_BIN(parser->container), element);
filter->their_sink = gst_element_get_static_pad(element, "sink"); if ((ret = gst_pad_link(filter->my_src, filter->their_sink)) < 0) @@ -2618,8 +2624,8 @@ static BOOL wave_parser_init_gst(struct parser *filter) }
gst_pad_set_active(pin->my_sink, 1); - gst_element_set_state(filter->container, GST_STATE_PAUSED); - ret = gst_element_get_state(filter->container, NULL, NULL, -1); + gst_element_set_state(parser->container, GST_STATE_PAUSED); + ret = gst_element_get_state(parser->container, NULL, NULL, -1); if (ret == GST_STATE_CHANGE_FAILURE) { ERR("Failed to play stream.\n"); @@ -2701,6 +2707,7 @@ static const struct strmbase_sink_ops avi_splitter_sink_ops = static BOOL avi_splitter_init_gst(struct parser *filter) { GstElement *element = gst_element_factory_make("avidemux", NULL); + struct wg_parser *parser = filter->wg_parser; int ret;
if (!element) @@ -2710,7 +2717,7 @@ static BOOL avi_splitter_init_gst(struct parser *filter) return FALSE; }
- gst_bin_add(GST_BIN(filter->container), element); + gst_bin_add(GST_BIN(parser->container), element);
g_signal_connect(element, "pad-added", G_CALLBACK(existing_new_pad_wrapper), filter); g_signal_connect(element, "pad-removed", G_CALLBACK(removed_decoded_pad), filter); @@ -2728,8 +2735,8 @@ static BOOL avi_splitter_init_gst(struct parser *filter) return FALSE; }
- gst_element_set_state(filter->container, GST_STATE_PAUSED); - ret = gst_element_get_state(filter->container, NULL, NULL, -1); + gst_element_set_state(parser->container, GST_STATE_PAUSED); + ret = gst_element_get_state(parser->container, NULL, NULL, -1); if (ret == GST_STATE_CHANGE_FAILURE) { ERR("Failed to play stream.\n"); @@ -2825,6 +2832,7 @@ static const struct strmbase_sink_ops mpeg_splitter_sink_ops = static BOOL mpeg_splitter_init_gst(struct parser *filter) { static const WCHAR source_name[] = {'A','u','d','i','o',0}; + struct wg_parser *parser = filter->wg_parser; struct parser_source *pin; GstElement *element; int ret; @@ -2836,7 +2844,7 @@ static BOOL mpeg_splitter_init_gst(struct parser *filter) return FALSE; }
- gst_bin_add(GST_BIN(filter->container), element); + gst_bin_add(GST_BIN(parser->container), element);
filter->their_sink = gst_element_get_static_pad(element, "sink"); if ((ret = gst_pad_link(filter->my_src, filter->their_sink)) < 0) @@ -2855,8 +2863,8 @@ static BOOL mpeg_splitter_init_gst(struct parser *filter) }
gst_pad_set_active(pin->my_sink, 1); - gst_element_set_state(filter->container, GST_STATE_PAUSED); - ret = gst_element_get_state(filter->container, NULL, NULL, -1); + gst_element_set_state(parser->container, GST_STATE_PAUSED); + ret = gst_element_get_state(parser->container, NULL, NULL, -1); if (ret == GST_STATE_CHANGE_FAILURE) { ERR("Failed to play stream.\n");
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/winegstreamer/gstdemux.c | 54 ++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 26 deletions(-)
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index 2bd6622b889..377f548d806 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -50,6 +50,7 @@ struct wg_parser { GstElement *container; GstBus *bus; + GstPad *my_src, *their_sink; };
struct parser @@ -73,7 +74,6 @@ struct parser * separate lock. */ bool streaming, flushing, sink_connected;
- GstPad *my_src, *their_sink; guint64 start, nextofs, nextpullofs, stop;
pthread_mutex_t mutex; @@ -623,6 +623,7 @@ static gboolean query_sink(GstPad *pad, GstObject *parent, GstQuery *query)
static gboolean gst_base_src_perform_seek(struct parser *This, GstEvent *event) { + struct wg_parser *parser = This->wg_parser; gboolean res = TRUE; gdouble rate; GstFormat seek_format; @@ -650,9 +651,9 @@ static gboolean gst_base_src_perform_seek(struct parser *This, GstEvent *event) if (flush) { tevent = gst_event_new_flush_start(); gst_event_set_seqnum(tevent, seqnum); - gst_pad_push_event(This->my_src, tevent); + gst_pad_push_event(parser->my_src, tevent); if (thread) - gst_pad_set_active(This->my_src, 1); + gst_pad_set_active(parser->my_src, 1); }
This->nextofs = This->start = cur; @@ -661,9 +662,9 @@ static gboolean gst_base_src_perform_seek(struct parser *This, GstEvent *event) if (flush) { tevent = gst_event_new_flush_stop(TRUE); gst_event_set_seqnum(tevent, seqnum); - gst_pad_push_event(This->my_src, tevent); + gst_pad_push_event(parser->my_src, tevent); if (thread) - gst_pad_set_active(This->my_src, 1); + gst_pad_set_active(parser->my_src, 1); }
return res; @@ -832,6 +833,7 @@ static GstFlowReturn request_buffer_src(GstPad *pad, GstObject *parent, guint64 static void *push_data(void *iface) { struct parser *This = iface; + struct wg_parser *parser = This->wg_parser; GstBuffer *buffer; LONGLONG maxlen;
@@ -853,7 +855,7 @@ static void *push_data(void *iface) break; len = min(16384, maxlen - This->nextofs);
- if ((ret = request_buffer_src(This->my_src, NULL, This->nextofs, len, &buffer)) < 0) + if ((ret = request_buffer_src(parser->my_src, NULL, This->nextofs, len, &buffer)) < 0) { GST_ERROR("Failed to read data, ret %s.", gst_flow_get_name(ret)); break; @@ -862,7 +864,7 @@ static void *push_data(void *iface) This->nextofs += len;
buffer->duration = buffer->pts = -1; - if ((ret = gst_pad_push(This->my_src, buffer)) < 0) + if ((ret = gst_pad_push(parser->my_src, buffer)) < 0) { GST_ERROR("Failed to push data, ret %s.", gst_flow_get_name(ret)); break; @@ -871,7 +873,7 @@ static void *push_data(void *iface)
gst_buffer_unref(buffer);
- gst_pad_push_event(This->my_src, gst_event_new_eos()); + gst_pad_push_event(parser->my_src, gst_event_new_eos());
GST_DEBUG("Stopping push thread.");
@@ -1587,12 +1589,12 @@ static HRESULT GST_Connect(struct parser *This, IPin *pConnectPin) parser->container = gst_bin_new(NULL); gst_element_set_bus(parser->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); - gst_pad_set_query_function(This->my_src, query_function); - gst_pad_set_activatemode_function(This->my_src, activate_mode); - gst_pad_set_event_function(This->my_src, event_src); - gst_pad_set_element_private (This->my_src, This); + parser->my_src = gst_pad_new_from_static_template(&src_template, "quartz-src"); + gst_pad_set_getrange_function(parser->my_src, request_buffer_src); + gst_pad_set_query_function(parser->my_src, query_function); + gst_pad_set_activatemode_function(parser->my_src, activate_mode); + gst_pad_set_event_function(parser->my_src, event_src); + gst_pad_set_element_private (parser->my_src, This);
This->start = This->nextofs = This->nextpullofs = This->stop = 0;
@@ -1854,13 +1856,13 @@ static BOOL decodebin_parser_init_gst(struct parser *filter) g_signal_connect(element, "autoplug-select", G_CALLBACK(autoplug_blacklist), filter); g_signal_connect(element, "no-more-pads", G_CALLBACK(no_more_pads), filter);
- filter->their_sink = gst_element_get_static_pad(element, "sink"); + parser->their_sink = gst_element_get_static_pad(element, "sink");
pthread_mutex_lock(&filter->mutex); filter->no_more_pads = filter->error = false; pthread_mutex_unlock(&filter->mutex);
- if ((ret = gst_pad_link(filter->my_src, filter->their_sink)) < 0) + if ((ret = gst_pad_link(parser->my_src, parser->their_sink)) < 0) { ERR("Failed to link pads, error %d.\n", ret); return FALSE; @@ -2511,10 +2513,10 @@ static HRESULT GST_RemoveOutputPins(struct parser *This) pthread_mutex_unlock(&This->mutex);
gst_element_set_state(parser->container, GST_STATE_NULL); - gst_pad_unlink(This->my_src, This->their_sink); - gst_object_unref(This->my_src); - gst_object_unref(This->their_sink); - This->my_src = This->their_sink = NULL; + gst_pad_unlink(parser->my_src, parser->their_sink); + gst_object_unref(parser->my_src); + gst_object_unref(parser->their_sink); + parser->my_src = parser->their_sink = NULL;
/* read_thread() needs to stay alive to service any read requests GStreamer * sends, so we can only shut it down after GStreamer stops. */ @@ -2606,8 +2608,8 @@ static BOOL wave_parser_init_gst(struct parser *filter)
gst_bin_add(GST_BIN(parser->container), element);
- filter->their_sink = gst_element_get_static_pad(element, "sink"); - if ((ret = gst_pad_link(filter->my_src, filter->their_sink)) < 0) + parser->their_sink = gst_element_get_static_pad(element, "sink"); + if ((ret = gst_pad_link(parser->my_src, parser->their_sink)) < 0) { ERR("Failed to link sink pads, error %d.\n", ret); return FALSE; @@ -2723,13 +2725,13 @@ static BOOL avi_splitter_init_gst(struct parser *filter) g_signal_connect(element, "pad-removed", G_CALLBACK(removed_decoded_pad), filter); g_signal_connect(element, "no-more-pads", G_CALLBACK(no_more_pads), filter);
- filter->their_sink = gst_element_get_static_pad(element, "sink"); + parser->their_sink = gst_element_get_static_pad(element, "sink");
pthread_mutex_lock(&filter->mutex); filter->no_more_pads = filter->error = false; pthread_mutex_unlock(&filter->mutex);
- if ((ret = gst_pad_link(filter->my_src, filter->their_sink)) < 0) + if ((ret = gst_pad_link(parser->my_src, parser->their_sink)) < 0) { ERR("Failed to link pads, error %d.\n", ret); return FALSE; @@ -2846,8 +2848,8 @@ static BOOL mpeg_splitter_init_gst(struct parser *filter)
gst_bin_add(GST_BIN(parser->container), element);
- filter->their_sink = gst_element_get_static_pad(element, "sink"); - if ((ret = gst_pad_link(filter->my_src, filter->their_sink)) < 0) + parser->their_sink = gst_element_get_static_pad(element, "sink"); + if ((ret = gst_pad_link(parser->my_src, parser->their_sink)) < 0) { ERR("Failed to link sink pads, error %d.\n", ret); return FALSE;
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/winegstreamer/gstdemux.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-)
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index 377f548d806..f8ff0bcdf4f 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -51,6 +51,8 @@ struct wg_parser GstElement *container; GstBus *bus; GstPad *my_src, *their_sink; + + guint64 start_offset, next_offset, stop_offset; };
struct parser @@ -74,7 +76,7 @@ struct parser * separate lock. */ bool streaming, flushing, sink_connected;
- guint64 start, nextofs, nextpullofs, stop; + uint64_t next_pull_offset;
pthread_mutex_t mutex; pthread_cond_t init_cond; @@ -656,7 +658,7 @@ static gboolean gst_base_src_perform_seek(struct parser *This, GstEvent *event) gst_pad_set_active(parser->my_src, 1); }
- This->nextofs = This->start = cur; + parser->next_offset = parser->start_offset = cur;
/* and prepare to continue streaming */ if (flush) { @@ -845,23 +847,23 @@ static void *push_data(void *iface) return NULL; }
- maxlen = This->stop ? This->stop : This->filesize; + maxlen = parser->stop_offset ? parser->stop_offset : This->filesize;
for (;;) { ULONG len; int ret;
- if (This->nextofs >= maxlen) + if (parser->next_offset >= maxlen) break; - len = min(16384, maxlen - This->nextofs); + len = min(16384, maxlen - parser->next_offset);
- if ((ret = request_buffer_src(parser->my_src, NULL, This->nextofs, len, &buffer)) < 0) + if ((ret = request_buffer_src(parser->my_src, NULL, parser->next_offset, len, &buffer)) < 0) { GST_ERROR("Failed to read data, ret %s.", gst_flow_get_name(ret)); break; }
- This->nextofs += len; + parser->next_offset += len;
buffer->duration = buffer->pts = -1; if ((ret = gst_pad_push(parser->my_src, buffer)) < 0) @@ -1148,14 +1150,14 @@ static GstFlowReturn read_buffer(struct parser *This, guint64 ofs, guint len, Gs TRACE("filter %p, offset %s, length %u, buffer %p.\n", This, wine_dbgstr_longlong(ofs), len, buffer);
if (ofs == GST_BUFFER_OFFSET_NONE) - ofs = This->nextpullofs; + ofs = This->next_pull_offset; if (ofs >= This->filesize) { WARN("Reading past eof: %s, %u\n", wine_dbgstr_longlong(ofs), len); return GST_FLOW_EOS; } if (len + ofs > This->filesize) len = This->filesize - ofs; - This->nextpullofs = ofs + len; + This->next_pull_offset = ofs + len;
gst_buffer_map(buffer, &info, GST_MAP_WRITE); hr = IAsyncReader_SyncRead(This->reader, ofs, len, info.data); @@ -1429,6 +1431,7 @@ static gboolean query_function(GstPad *pad, GstObject *parent, GstQuery *query) static gboolean activate_push(GstPad *pad, gboolean activate) { struct parser *This = gst_pad_get_element_private(pad); + struct wg_parser *parser = This->wg_parser;
if (!activate) { if (This->push_thread) { @@ -1436,7 +1439,7 @@ static gboolean activate_push(GstPad *pad, gboolean activate) This->push_thread = 0; } if (This->filter.state == State_Stopped) - This->nextofs = This->start; + parser->next_offset = parser->start_offset; } else if (!This->push_thread) { int ret;
@@ -1596,7 +1599,8 @@ static HRESULT GST_Connect(struct parser *This, IPin *pConnectPin) gst_pad_set_event_function(parser->my_src, event_src); gst_pad_set_element_private (parser->my_src, This);
- This->start = This->nextofs = This->nextpullofs = This->stop = 0; + parser->start_offset = parser->next_offset = parser->stop_offset = 0; + This->next_pull_offset = 0;
if (!This->init_gst(This)) return E_FAIL; @@ -1620,7 +1624,8 @@ static HRESULT GST_Connect(struct parser *This, IPin *pConnectPin)
pthread_mutex_unlock(&This->mutex);
- This->nextofs = This->nextpullofs = 0; + parser->next_offset = 0; + This->next_pull_offset = 0; return S_OK; }
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/winegstreamer/gstdemux.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index f8ff0bcdf4f..734984d7fed 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -52,7 +52,7 @@ struct wg_parser GstBus *bus; GstPad *my_src, *their_sink;
- guint64 start_offset, next_offset, stop_offset; + guint64 file_size, start_offset, next_offset, stop_offset; };
struct parser @@ -67,7 +67,7 @@ struct parser unsigned int source_count; BOOL enum_sink_first;
- LONGLONG filesize; + LONGLONG file_size;
struct wg_parser *wg_parser;
@@ -847,7 +847,7 @@ static void *push_data(void *iface) return NULL; }
- maxlen = parser->stop_offset ? parser->stop_offset : This->filesize; + maxlen = parser->stop_offset ? parser->stop_offset : parser->file_size;
for (;;) { ULONG len; @@ -1151,12 +1151,13 @@ static GstFlowReturn read_buffer(struct parser *This, guint64 ofs, guint len, Gs
if (ofs == GST_BUFFER_OFFSET_NONE) ofs = This->next_pull_offset; - if (ofs >= This->filesize) { + if (ofs >= This->file_size) + { WARN("Reading past eof: %s, %u\n", wine_dbgstr_longlong(ofs), len); return GST_FLOW_EOS; } - if (len + ofs > This->filesize) - len = This->filesize - ofs; + if (len + ofs > This->file_size) + len = This->file_size - ofs; This->next_pull_offset = ofs + len;
gst_buffer_map(buffer, &info, GST_MAP_WRITE); @@ -1390,6 +1391,7 @@ static void existing_new_pad(GstElement *bin, GstPad *pad, gpointer user) static gboolean query_function(GstPad *pad, GstObject *parent, GstQuery *query) { struct parser *This = gst_pad_get_element_private(pad); + struct wg_parser *parser = This->wg_parser; GstFormat format;
GST_LOG("filter %p, type %s.", This, GST_QUERY_TYPE_NAME(query)); @@ -1404,7 +1406,7 @@ static gboolean query_function(GstPad *pad, GstObject *parent, GstQuery *query) } else if (format == GST_FORMAT_BYTES) { - gst_query_set_duration(query, GST_FORMAT_BYTES, This->filesize); + gst_query_set_duration(query, GST_FORMAT_BYTES, parser->file_size); return TRUE; } return FALSE; @@ -1415,7 +1417,7 @@ static gboolean query_function(GstPad *pad, GstObject *parent, GstQuery *query) GST_WARNING("Cannot seek using format "%s".", gst_format_get_name(format)); return FALSE; } - gst_query_set_seeking(query, GST_FORMAT_BYTES, 1, 0, This->filesize); + gst_query_set_seeking(query, GST_FORMAT_BYTES, 1, 0, parser->file_size); return TRUE; case GST_QUERY_SCHEDULING: gst_query_set_scheduling(query, GST_SCHEDULING_FLAG_SEEKABLE, 1, -1, 0); @@ -1577,7 +1579,8 @@ static HRESULT GST_Connect(struct parser *This, IPin *pConnectPin) GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY);
- IAsyncReader_Length(This->reader, &This->filesize, &avail); + IAsyncReader_Length(This->reader, &This->file_size, &avail); + parser->file_size = This->file_size;
This->sink_connected = true;