[PATCH 1/5] winegstreamer: Move the stream event fields to struct wg_parser_stream.

Zebediah Figura z.figura12 at gmail.com
Wed Feb 3 17:41:38 CST 2021


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/winegstreamer/gstdemux.c | 125 +++++++++++++++++-----------------
 1 file changed, 64 insertions(+), 61 deletions(-)

diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c
index 8d08ff370f4..eaad0f56133 100644
--- a/dlls/winegstreamer/gstdemux.c
+++ b/dlls/winegstreamer/gstdemux.c
@@ -74,12 +74,37 @@ struct wg_parser
     bool flushing, sink_connected;
 };
 
+enum wg_parser_event_type
+{
+    WG_PARSER_EVENT_NONE = 0,
+    WG_PARSER_EVENT_BUFFER,
+    WG_PARSER_EVENT_EOS,
+    WG_PARSER_EVENT_SEGMENT,
+};
+
+struct wg_parser_event
+{
+    enum wg_parser_event_type type;
+    union
+    {
+        GstBuffer *buffer;
+        struct
+        {
+            uint64_t position, stop;
+            double rate;
+        } segment;
+    } u;
+};
+
 struct wg_parser_stream
 {
     GstPad *their_src, *post_sink, *post_src, *my_sink;
     GstElement *flip;
     GstSegment *segment;
     GstCaps *caps;
+
+    pthread_cond_t event_cond, event_empty_cond;
+    struct wg_parser_event event;
 };
 
 struct parser
@@ -112,28 +137,6 @@ struct parser
     HRESULT (*source_get_media_type)(struct parser_source *pin, unsigned int index, AM_MEDIA_TYPE *mt);
 };
 
-enum parser_event_type
-{
-    PARSER_EVENT_NONE = 0,
-    PARSER_EVENT_BUFFER,
-    PARSER_EVENT_EOS,
-    PARSER_EVENT_SEGMENT,
-};
-
-struct parser_event
-{
-    enum parser_event_type type;
-    union
-    {
-        GstBuffer *buffer;
-        struct
-        {
-            uint64_t position, stop;
-            double rate;
-        } segment;
-    } u;
-};
-
 struct parser_source
 {
     struct strmbase_source pin;
@@ -144,9 +147,7 @@ struct parser_source
     SourceSeeking seek;
 
     CRITICAL_SECTION flushing_cs;
-    pthread_cond_t event_cond, event_empty_cond;
     bool flushing, eos;
-    struct parser_event event;
     HANDLE thread;
 };
 
@@ -710,9 +711,10 @@ static gboolean event_src(GstPad *pad, GstObject *parent, GstEvent *event)
     return ret;
 }
 
-static GstFlowReturn queue_stream_event(struct parser_source *pin, const struct parser_event *event)
+static GstFlowReturn queue_stream_event(struct parser_source *pin, const struct wg_parser_event *event)
 {
     struct wg_parser *parser = impl_from_strmbase_filter(pin->pin.pin.filter)->wg_parser;
+    struct wg_parser_stream *stream = pin->wg_stream;
 
     /* Unlike request_buffer_src() [q.v.], we need to watch for GStreamer
      * flushes here. The difference is that we can be blocked by the streaming
@@ -721,17 +723,17 @@ static GstFlowReturn queue_stream_event(struct parser_source *pin, const struct
      * is solved by flushing the upstream source. */
 
     pthread_mutex_lock(&parser->mutex);
-    while (!pin->flushing && pin->event.type != PARSER_EVENT_NONE)
-        pthread_cond_wait(&pin->event_empty_cond, &parser->mutex);
+    while (!pin->flushing && stream->event.type != WG_PARSER_EVENT_NONE)
+        pthread_cond_wait(&stream->event_empty_cond, &parser->mutex);
     if (pin->flushing)
     {
         pthread_mutex_unlock(&parser->mutex);
         GST_DEBUG("Filter is flushing; discarding event.");
         return GST_FLOW_FLUSHING;
     }
-    pin->event = *event;
+    stream->event = *event;
     pthread_mutex_unlock(&parser->mutex);
-    pthread_cond_signal(&pin->event_cond);
+    pthread_cond_signal(&stream->event_cond);
     GST_LOG("Event queued.");
     return GST_FLOW_OK;
 }
@@ -750,7 +752,7 @@ static gboolean event_sink(GstPad *pad, GstObject *parent, GstEvent *event)
         case GST_EVENT_SEGMENT:
             if (pin->pin.pin.peer)
             {
-                struct parser_event stream_event;
+                struct wg_parser_event stream_event;
                 const GstSegment *segment;
 
                 gst_event_parse_segment(event, &segment);
@@ -763,7 +765,7 @@ static gboolean event_sink(GstPad *pad, GstObject *parent, GstEvent *event)
 
                 gst_segment_copy_into(segment, stream->segment);
 
-                stream_event.type = PARSER_EVENT_SEGMENT;
+                stream_event.type = WG_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;
@@ -774,9 +776,9 @@ static gboolean event_sink(GstPad *pad, GstObject *parent, GstEvent *event)
         case GST_EVENT_EOS:
             if (pin->pin.pin.peer)
             {
-                struct parser_event stream_event;
+                struct wg_parser_event stream_event;
 
-                stream_event.type = PARSER_EVENT_EOS;
+                stream_event.type = WG_PARSER_EVENT_EOS;
                 queue_stream_event(pin, &stream_event);
             }
             else
@@ -794,20 +796,20 @@ static gboolean event_sink(GstPad *pad, GstObject *parent, GstEvent *event)
                 pthread_mutex_lock(&parser->mutex);
 
                 pin->flushing = true;
-                pthread_cond_signal(&pin->event_empty_cond);
+                pthread_cond_signal(&stream->event_empty_cond);
 
-                switch (pin->event.type)
+                switch (stream->event.type)
                 {
-                    case PARSER_EVENT_NONE:
-                    case PARSER_EVENT_EOS:
-                    case PARSER_EVENT_SEGMENT:
+                    case WG_PARSER_EVENT_NONE:
+                    case WG_PARSER_EVENT_EOS:
+                    case WG_PARSER_EVENT_SEGMENT:
                         break;
 
-                    case PARSER_EVENT_BUFFER:
-                        gst_buffer_unref(pin->event.u.buffer);
+                    case WG_PARSER_EVENT_BUFFER:
+                        gst_buffer_unref(stream->event.u.buffer);
                         break;
                 }
-                pin->event.type = PARSER_EVENT_NONE;
+                stream->event.type = WG_PARSER_EVENT_NONE;
 
                 pthread_mutex_unlock(&parser->mutex);
             }
@@ -897,7 +899,7 @@ 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 parser_event stream_event;
+    struct wg_parser_event stream_event;
     GstFlowReturn ret;
 
     GST_LOG("pin %p, buffer %p.", pin, buffer);
@@ -908,7 +910,7 @@ static GstFlowReturn got_data_sink(GstPad *pad, GstObject *parent, GstBuffer *bu
         return GST_FLOW_OK;
     }
 
-    stream_event.type = PARSER_EVENT_BUFFER;
+    stream_event.type = WG_PARSER_EVENT_BUFFER;
     stream_event.u.buffer = buffer;
     /* Transfer our reference to the buffer to the thread. */
     if ((ret = queue_stream_event(pin, &stream_event)) != GST_FLOW_OK)
@@ -1044,15 +1046,16 @@ static void send_buffer(struct parser_source *pin, GstBuffer *buf)
     gst_buffer_unref(buf);
 }
 
-static bool get_stream_event(struct parser_source *pin, struct parser_event *event)
+static bool get_stream_event(struct parser_source *pin, struct wg_parser_event *event)
 {
     struct parser *filter = impl_from_strmbase_filter(pin->pin.pin.filter);
+    struct wg_parser_stream *stream = pin->wg_stream;
     struct wg_parser *parser = filter->wg_parser;
 
     pthread_mutex_lock(&parser->mutex);
 
-    while (!parser->flushing && pin->event.type == PARSER_EVENT_NONE)
-        pthread_cond_wait(&pin->event_cond, &parser->mutex);
+    while (!parser->flushing && stream->event.type == WG_PARSER_EVENT_NONE)
+        pthread_cond_wait(&stream->event_cond, &parser->mutex);
 
     if (parser->flushing)
     {
@@ -1061,11 +1064,11 @@ static bool get_stream_event(struct parser_source *pin, struct parser_event *eve
         return false;
     }
 
-    *event = pin->event;
-    pin->event.type = PARSER_EVENT_NONE;
+    *event = stream->event;
+    stream->event.type = WG_PARSER_EVENT_NONE;
 
     pthread_mutex_unlock(&parser->mutex);
-    pthread_cond_signal(&pin->event_empty_cond);
+    pthread_cond_signal(&stream->event_empty_cond);
 
     return true;
 }
@@ -1079,7 +1082,7 @@ static DWORD CALLBACK stream_thread(void *arg)
 
     while (filter->streaming)
     {
-        struct parser_event event;
+        struct wg_parser_event event;
 
         EnterCriticalSection(&pin->flushing_cs);
 
@@ -1093,20 +1096,20 @@ static DWORD CALLBACK stream_thread(void *arg)
 
         switch (event.type)
         {
-            case PARSER_EVENT_BUFFER:
+            case WG_PARSER_EVENT_BUFFER:
                 send_buffer(pin, event.u.buffer);
                 break;
 
-            case PARSER_EVENT_EOS:
+            case WG_PARSER_EVENT_EOS:
                 IPin_EndOfStream(pin->pin.pin.peer);
                 break;
 
-            case PARSER_EVENT_SEGMENT:
+            case WG_PARSER_EVENT_SEGMENT:
                 IPin_NewSegment(pin->pin.pin.peer, event.u.segment.position,
                         event.u.segment.stop, event.u.segment.rate);
                 break;
 
-            case PARSER_EVENT_NONE:
+            case WG_PARSER_EVENT_NONE:
                 assert(0);
         }
 
@@ -1785,7 +1788,7 @@ static HRESULT parser_cleanup_stream(struct strmbase_filter *iface)
         if (!pin->pin.pin.peer)
             continue;
 
-        pthread_cond_signal(&pin->event_cond);
+        pthread_cond_signal(&pin->wg_stream->event_cond);
     }
 
     for (i = 0; i < filter->source_count; ++i)
@@ -2187,7 +2190,7 @@ static HRESULT WINAPI GST_Seeking_SetPositions(IMediaSeeking *iface,
         {
             if (filter->sources[i]->pin.pin.peer)
             {
-                pthread_cond_signal(&pin->event_cond);
+                pthread_cond_signal(&stream->event_cond);
                 IPin_BeginFlush(filter->sources[i]->pin.pin.peer);
             }
         }
@@ -2468,8 +2471,8 @@ static void free_source_pin(struct parser_source *pin)
     gst_object_unref(stream->my_sink);
     gst_segment_free(stream->segment);
 
-    pthread_cond_destroy(&pin->event_cond);
-    pthread_cond_destroy(&pin->event_empty_cond);
+    pthread_cond_destroy(&stream->event_cond);
+    pthread_cond_destroy(&stream->event_empty_cond);
 
     free(stream);
 
@@ -2517,8 +2520,8 @@ static struct parser_source *create_pin(struct parser *filter, const WCHAR *name
     pin->IQualityControl_iface.lpVtbl = &GSTOutPin_QualityControl_Vtbl;
     strmbase_seeking_init(&pin->seek, &GST_Seeking_Vtbl, GST_ChangeStop,
             GST_ChangeCurrent, GST_ChangeRate);
-    pthread_cond_init(&pin->event_cond, NULL);
-    pthread_cond_init(&pin->event_empty_cond, NULL);
+    pthread_cond_init(&stream->event_cond, NULL);
+    pthread_cond_init(&stream->event_empty_cond, NULL);
     BaseFilterImpl_IncrementPinVersion(&filter->filter);
 
     InitializeCriticalSection(&pin->flushing_cs);
@@ -2551,7 +2554,7 @@ static HRESULT GST_RemoveOutputPins(struct parser *This)
     for (i = 0; i < This->source_count; ++i)
     {
         This->sources[i]->flushing = true;
-        pthread_cond_signal(&This->sources[i]->event_empty_cond);
+        pthread_cond_signal(&This->sources[i]->wg_stream->event_empty_cond);
     }
     pthread_mutex_unlock(&parser->mutex);
 
-- 
2.30.0




More information about the wine-devel mailing list