[PATCH 2/5] winegstreamer: Store the segment parameters in the parser_event structure.
Zebediah Figura
z.figura12 at gmail.com
Thu Jan 21 17:22:52 CST 2021
Instead of the segment event.
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/winegstreamer/gst_private.h | 1 +
dlls/winegstreamer/gstdemux.c | 49 ++++++++++++++------------------
2 files changed, 23 insertions(+), 27 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index 9cd3c8adff5..b6942e5ae77 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -23,6 +23,7 @@
#include <stdarg.h>
#include <stdbool.h>
+#include <stdint.h>
#include <stdio.h>
#include <gst/gst.h>
#include <gst/video/video.h>
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c
index 903305724a4..d79622094f6 100644
--- a/dlls/winegstreamer/gstdemux.c
+++ b/dlls/winegstreamer/gstdemux.c
@@ -94,7 +94,11 @@ struct parser_event
union
{
GstBuffer *buffer;
- GstEvent *segment;
+ struct
+ {
+ uint64_t position, stop;
+ double rate;
+ } segment;
} u;
};
@@ -709,14 +713,23 @@ static gboolean event_sink(GstPad *pad, GstObject *parent, GstEvent *event)
if (pin->pin.pin.peer)
{
struct parser_event stream_event;
+ const GstSegment *segment;
- stream_event.type = PARSER_EVENT_SEGMENT;
- stream_event.u.segment = event;
- if (queue_stream_event(pin, &stream_event) == GST_FLOW_OK)
+ gst_event_parse_segment(event, &segment);
+
+ if (segment->format != GST_FORMAT_TIME)
{
- /* Transfer our reference to the event to the thread. */
- return TRUE;
+ FIXME("Unhandled format \"%s\".\n", gst_format_get_name(segment->format));
+ break;
}
+
+ gst_segment_copy_into(segment, pin->segment);
+
+ stream_event.type = PARSER_EVENT_SEGMENT;
+ stream_event.u.segment.position = segment->position / 100;
+ stream_event.u.segment.stop = segment->stop / 100;
+ stream_event.u.segment.rate = segment->rate * segment->applied_rate;
+ queue_stream_event(pin, &stream_event);
}
break;
@@ -744,15 +757,12 @@ static gboolean event_sink(GstPad *pad, GstObject *parent, GstEvent *event)
{
case PARSER_EVENT_NONE:
case PARSER_EVENT_EOS:
+ case PARSER_EVENT_SEGMENT:
break;
case PARSER_EVENT_BUFFER:
gst_buffer_unref(pin->event.u.buffer);
break;
-
- case PARSER_EVENT_SEGMENT:
- gst_event_unref(pin->event.u.segment);
- break;
}
pin->event.type = PARSER_EVENT_NONE;
@@ -1057,24 +1067,9 @@ static DWORD CALLBACK stream_thread(void *arg)
break;
case PARSER_EVENT_SEGMENT:
- {
- const GstSegment *segment;
-
- gst_event_parse_segment(event.u.segment, &segment);
-
- if (segment->format != GST_FORMAT_TIME)
- {
- FIXME("Unhandled format \"%s\".\n", gst_format_get_name(segment->format));
- break;
- }
-
- gst_segment_copy_into(segment, pin->segment);
-
- IPin_NewSegment(pin->pin.pin.peer, segment->position / 100,
- segment->stop / 100, segment->rate * segment->applied_rate);
- gst_event_unref(event.u.segment);
+ IPin_NewSegment(pin->pin.pin.peer, event.u.segment.position,
+ event.u.segment.stop, event.u.segment.rate);
break;
- }
case PARSER_EVENT_NONE:
assert(0);
--
2.30.0
More information about the wine-devel
mailing list