Giovanni Mascellani : winegstreamer: Wait on error conditions when initializing GStreamer.

Alexandre Julliard julliard at winehq.org
Tue Jan 19 15:44:00 CST 2021


Module: wine
Branch: master
Commit: cc116548fd006951943e60cddb7d79ec8c363213
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=cc116548fd006951943e60cddb7d79ec8c363213

Author: Giovanni Mascellani <gmascellani at codeweavers.com>
Date:   Tue Jan 19 10:02:07 2021 +0100

winegstreamer: Wait on error conditions when initializing GStreamer.

GStreamer doesn't necessarily signal all error when setting the
PLAYING or PAUSED state. If Wine just waits on no-more-pads, it risks
a deadlock if an error is signaled after gst_element_get_state was
called.

Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winegstreamer/gstdemux.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c
index 54691a0318a..4a0a95c68f3 100644
--- a/dlls/winegstreamer/gstdemux.c
+++ b/dlls/winegstreamer/gstdemux.c
@@ -1648,6 +1648,7 @@ static BOOL decodebin_parser_init_gst(struct parser *filter)
 {
     GstElement *element = gst_element_factory_make("decodebin", NULL);
     unsigned int i;
+    HANDLE events[2];
     int ret;
 
     if (!element)
@@ -1681,15 +1682,19 @@ static BOOL decodebin_parser_init_gst(struct parser *filter)
         return FALSE;
     }
 
-    WaitForSingleObject(filter->no_more_pads_event, INFINITE);
+    events[0] = filter->no_more_pads_event;
+    events[1] = filter->error_event;
+    if (WaitForMultipleObjects(2, events, FALSE, INFINITE))
+        return FALSE;
 
     for (i = 0; i < filter->source_count; ++i)
     {
         struct parser_source *pin = filter->sources[i];
-        const HANDLE events[2] = {pin->caps_event, filter->error_event};
 
         pin->seek.llDuration = pin->seek.llStop = query_duration(pin->their_src);
         pin->seek.llCurrent = 0;
+        events[0] = pin->caps_event;
+        events[1] = filter->error_event;
         if (WaitForMultipleObjects(2, events, FALSE, INFINITE))
             return FALSE;
     }
@@ -2470,6 +2475,7 @@ static BOOL avi_splitter_init_gst(struct parser *filter)
 {
     GstElement *element = gst_element_factory_make("avidemux", NULL);
     unsigned int i;
+    HANDLE events[2];
     int ret;
 
     if (!element)
@@ -2502,15 +2508,19 @@ static BOOL avi_splitter_init_gst(struct parser *filter)
         return FALSE;
     }
 
-    WaitForSingleObject(filter->no_more_pads_event, INFINITE);
+    events[0] = filter->no_more_pads_event;
+    events[1] = filter->error_event;
+    if (WaitForMultipleObjects(2, events, FALSE, INFINITE))
+        return FALSE;
 
     for (i = 0; i < filter->source_count; ++i)
     {
         struct parser_source *pin = filter->sources[i];
-        const HANDLE events[2] = {pin->caps_event, filter->error_event};
 
         pin->seek.llDuration = pin->seek.llStop = query_duration(pin->their_src);
         pin->seek.llCurrent = 0;
+        events[0] = pin->caps_event;
+        events[1] = filter->error_event;
         if (WaitForMultipleObjects(2, events, FALSE, INFINITE))
             return FALSE;
     }




More information about the wine-cvs mailing list