Title: [275020] releases/WebKitGTK/webkit-2.32/Source/WebCore
Revision
275020
Author
[email protected]
Date
2021-03-25 07:06:33 -0700 (Thu, 25 Mar 2021)

Log Message

Merge r274358 - [GStreamer] Crashes deep in GStreamer under gst_element_add_pad
https://bugs.webkit.org/show_bug.cgi?id=222763

Patch by Philippe Normand <[email protected]> on 2021-03-12
Reviewed by Xabier Rodriguez-Calvar.

Rely on select-streams event to configure only the first video stream of the collection
received on the bus. The select-stream decodebin3 signal is not recommended, and seems
broken anyway, because no selecting audio streams was still leading to audio decode pads
being added, leading to crashes.

* platform/graphics/gstreamer/ImageDecoderGStreamer.cpp:
(WebCore::ImageDecoderGStreamer::InnerDecoder::handleMessage):
(WebCore::ImageDecoderGStreamer::InnerDecoder::preparePipeline):
(WebCore::ImageDecoderGStreamer::InnerDecoder::selectStream): Deleted.
* platform/graphics/gstreamer/ImageDecoderGStreamer.h:

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.32/Source/WebCore/ChangeLog (275019 => 275020)


--- releases/WebKitGTK/webkit-2.32/Source/WebCore/ChangeLog	2021-03-25 14:06:27 UTC (rev 275019)
+++ releases/WebKitGTK/webkit-2.32/Source/WebCore/ChangeLog	2021-03-25 14:06:33 UTC (rev 275020)
@@ -1,3 +1,21 @@
+2021-03-12  Philippe Normand  <[email protected]>
+
+        [GStreamer] Crashes deep in GStreamer under gst_element_add_pad
+        https://bugs.webkit.org/show_bug.cgi?id=222763
+
+        Reviewed by Xabier Rodriguez-Calvar.
+
+        Rely on select-streams event to configure only the first video stream of the collection
+        received on the bus. The select-stream decodebin3 signal is not recommended, and seems
+        broken anyway, because no selecting audio streams was still leading to audio decode pads
+        being added, leading to crashes.
+
+        * platform/graphics/gstreamer/ImageDecoderGStreamer.cpp:
+        (WebCore::ImageDecoderGStreamer::InnerDecoder::handleMessage):
+        (WebCore::ImageDecoderGStreamer::InnerDecoder::preparePipeline):
+        (WebCore::ImageDecoderGStreamer::InnerDecoder::selectStream): Deleted.
+        * platform/graphics/gstreamer/ImageDecoderGStreamer.h:
+
 2021-02-26  Chris Dumez  <[email protected]>
 
         Unreviewed, address post-landing review feedback for r273542.

Modified: releases/WebKitGTK/webkit-2.32/Source/WebCore/platform/graphics/gstreamer/ImageDecoderGStreamer.cpp (275019 => 275020)


--- releases/WebKitGTK/webkit-2.32/Source/WebCore/platform/graphics/gstreamer/ImageDecoderGStreamer.cpp	2021-03-25 14:06:27 UTC (rev 275019)
+++ releases/WebKitGTK/webkit-2.32/Source/WebCore/platform/graphics/gstreamer/ImageDecoderGStreamer.cpp	2021-03-25 14:06:33 UTC (rev 275020)
@@ -230,24 +230,6 @@
     return toSample(iter);
 }
 
-int ImageDecoderGStreamer::InnerDecoder::selectStream(GstStream* stream)
-{
-    // Select only the first video stream.
-    auto* object = GST_OBJECT_CAST(m_decodebin.get());
-    GST_OBJECT_LOCK(object);
-    auto numberOfSourcePads = m_decodebin->numsrcpads;
-    GST_OBJECT_UNLOCK(object);
-
-    if (numberOfSourcePads) {
-        GST_DEBUG_OBJECT(m_pipeline.get(), "Discarding additional %" GST_PTR_FORMAT, stream);
-        return 0;
-    }
-
-    int result = gst_stream_get_stream_type(stream) & GST_STREAM_TYPE_VIDEO ? 1 : 0;
-    GST_DEBUG_OBJECT(m_pipeline.get(), "%" GST_PTR_FORMAT " selected: %s", stream, boolForPrinting(result));
-    return result;
-}
-
 void ImageDecoderGStreamer::InnerDecoder::decodebinPadAddedCallback(ImageDecoderGStreamer::InnerDecoder* decoder, GstPad* pad)
 {
     decoder->connectDecoderPad(pad);
@@ -336,6 +318,27 @@
         g_warning("Error: %d, %s. Debug output: %s", error->code, error->message, debug.get());
         m_decoder.setHasEOS();
         break;
+    case GST_MESSAGE_STREAM_COLLECTION: {
+        GRefPtr<GstStreamCollection> collection;
+        gst_message_parse_stream_collection(message, &collection.outPtr());
+        if (collection) {
+            unsigned size = gst_stream_collection_get_size(collection.get());
+            GList* streams = nullptr;
+            for (unsigned i = 0 ; i < size; i++) {
+                auto* stream = gst_stream_collection_get_stream(collection.get(), i);
+                auto streamType = gst_stream_get_stream_type(stream);
+                if (streamType == GST_STREAM_TYPE_VIDEO) {
+                    streams = g_list_append(streams, const_cast<char*>(gst_stream_get_stream_id(stream)));
+                    break;
+                }
+            }
+            if (streams) {
+                gst_element_send_event(m_decodebin.get(), gst_event_new_select_streams(streams));
+                g_list_free(streams);
+            }
+        }
+        break;
+    }
     default:
         break;
     }
@@ -369,9 +372,6 @@
     g_object_set(source, "stream", m_memoryStream.get(), nullptr);
 
     m_decodebin = gst_element_factory_make("decodebin3", nullptr);
-    g_signal_connect(m_decodebin.get(), "select-stream", G_CALLBACK(+[](GstElement*, GstStreamCollection*, GstStream* stream, ImageDecoderGStreamer::InnerDecoder* decoder) -> int {
-        return decoder->selectStream(stream);
-    }), this);
     g_signal_connect_swapped(m_decodebin.get(), "pad-added", G_CALLBACK(decodebinPadAddedCallback), this);
 
     gst_bin_add_many(GST_BIN_CAST(m_pipeline.get()), source, m_decodebin.get(), nullptr);

Modified: releases/WebKitGTK/webkit-2.32/Source/WebCore/platform/graphics/gstreamer/ImageDecoderGStreamer.h (275019 => 275020)


--- releases/WebKitGTK/webkit-2.32/Source/WebCore/platform/graphics/gstreamer/ImageDecoderGStreamer.h	2021-03-25 14:06:27 UTC (rev 275019)
+++ releases/WebKitGTK/webkit-2.32/Source/WebCore/platform/graphics/gstreamer/ImageDecoderGStreamer.h	2021-03-25 14:06:33 UTC (rev 275020)
@@ -106,7 +106,6 @@
         static void decodebinPadAddedCallback(ImageDecoderGStreamer::InnerDecoder*, GstPad*);
         void handleMessage(GstMessage*);
         void preparePipeline();
-        int selectStream(GstStream*);
         void connectDecoderPad(GstPad*);
 
         ImageDecoderGStreamer& m_decoder;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to