[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