Title: [264648] trunk
Revision
264648
Author
[email protected]
Date
2020-07-21 02:03:00 -0700 (Tue, 21 Jul 2020)

Log Message

[GStreamer][1.18] mediastreamsrc element hits assert in gst -core
https://bugs.webkit.org/show_bug.cgi?id=214150

Reviewed by Philippe Normand.

Source/WebCore:

Removed track pointers from observers cause the object was
self-referencing a couple of times. Observers are 1-1 with the
source so there is no need to keep an owned reference and there is
no danger of incorrect dereferencing.

Turned finalize into dispose as the work is doing is more removing
the references with other objects, which what the dispose is
about. Called the parent on that, which as missing as well.

* platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:
(WebKitMediaStreamTrackObserver::WebKitMediaStreamTrackObserver):
(WebKitMediaStreamObserver::WebKitMediaStreamObserver):
(webkitMediaStreamSrcConstructed):
(webkitMediaStreamSrcDispose):
(webkit_media_stream_src_class_init):

LayoutTests:

As result of this bug
fast/mediastream/MediaStream-removeTrack-while-playing.html begins
to crash in debug mode in an assertion. When a track is removed
the observer is not removed and when it dies there are null
objects in the observer weak hash set. Still, if you do a quick
patch to remove the observer, things can still crash as track
removal is racy and in release there' other crash. All this needs
to be taclked as a general approach to fix track removal.

* platform/glib/TestExpectations: Added
fast/mediastream/MediaStream-removeTrack-while-playing.html as
Pass Crash for release and crash for debug.

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (264647 => 264648)


--- trunk/LayoutTests/ChangeLog	2020-07-21 08:08:18 UTC (rev 264647)
+++ trunk/LayoutTests/ChangeLog	2020-07-21 09:03:00 UTC (rev 264648)
@@ -1,3 +1,23 @@
+2020-07-21  Xabier Rodriguez Calvar  <[email protected]>
+
+        [GStreamer][1.18] mediastreamsrc element hits assert in gst -core
+        https://bugs.webkit.org/show_bug.cgi?id=214150
+
+        Reviewed by Philippe Normand.
+
+        As result of this bug
+        fast/mediastream/MediaStream-removeTrack-while-playing.html begins
+        to crash in debug mode in an assertion. When a track is removed
+        the observer is not removed and when it dies there are null
+        objects in the observer weak hash set. Still, if you do a quick
+        patch to remove the observer, things can still crash as track
+        removal is racy and in release there' other crash. All this needs
+        to be taclked as a general approach to fix track removal.
+
+        * platform/glib/TestExpectations: Added
+        fast/mediastream/MediaStream-removeTrack-while-playing.html as
+        Pass Crash for release and crash for debug.
+
 2020-07-21  Carlos Garcia Campos  <[email protected]>
 
         [FreeType] Add support for text-underline-offset and text-decoration-thickness

Modified: trunk/LayoutTests/platform/glib/TestExpectations (264647 => 264648)


--- trunk/LayoutTests/platform/glib/TestExpectations	2020-07-21 08:08:18 UTC (rev 264647)
+++ trunk/LayoutTests/platform/glib/TestExpectations	2020-07-21 09:03:00 UTC (rev 264648)
@@ -193,6 +193,8 @@
 webkit.org/b/79203  fast/mediastream/RTCRtpSender-replaceTrack.html [ Failure Crash ]
 webkit.org/b/187603 fast/mediastream/media-stream-track-source-failure.html [ Timeout Failure Pass ]
 webkit.org/b/191886 webkit.org/b/210800 fast/mediastream/MediaStream-video-element-remove-track.html [ Failure Crash ]
+webkit.org/b/191886 webkit.org/b/210800 [ Release ] fast/mediastream/MediaStream-removeTrack-while-playing.html [ Pass Crash ]
+webkit.org/b/191886 webkit.org/b/210800 [ Debug ] fast/mediastream/MediaStream-removeTrack-while-playing.html [ Crash ]
 webkit.org/b/199440 fast/mediastream/mediastreamtrack-video-clone.html [ Crash Pass ]
 webkit.org/b/210337 fast/mediastream/mediastreamtrack-audio-clone.html [ Failure Pass ]
 webkit.org/b/210385 fast/mediastream/stream-switch.html [ Crash Timeout ]

Modified: trunk/Source/WebCore/ChangeLog (264647 => 264648)


--- trunk/Source/WebCore/ChangeLog	2020-07-21 08:08:18 UTC (rev 264647)
+++ trunk/Source/WebCore/ChangeLog	2020-07-21 09:03:00 UTC (rev 264648)
@@ -1,3 +1,26 @@
+2020-07-21  Xabier Rodriguez Calvar  <[email protected]>
+
+        [GStreamer][1.18] mediastreamsrc element hits assert in gst -core
+        https://bugs.webkit.org/show_bug.cgi?id=214150
+
+        Reviewed by Philippe Normand.
+
+        Removed track pointers from observers cause the object was
+        self-referencing a couple of times. Observers are 1-1 with the
+        source so there is no need to keep an owned reference and there is
+        no danger of incorrect dereferencing.
+
+        Turned finalize into dispose as the work is doing is more removing
+        the references with other objects, which what the dispose is
+        about. Called the parent on that, which as missing as well.
+
+        * platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:
+        (WebKitMediaStreamTrackObserver::WebKitMediaStreamTrackObserver):
+        (WebKitMediaStreamObserver::WebKitMediaStreamObserver):
+        (webkitMediaStreamSrcConstructed):
+        (webkitMediaStreamSrcDispose):
+        (webkit_media_stream_src_class_init):
+
 2020-07-21  Carlos Garcia Campos  <[email protected]>
 
         [FreeType] Add support for text-underline-offset and text-decoration-thickness

Modified: trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp (264647 => 264648)


--- trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp	2020-07-21 08:08:18 UTC (rev 264647)
+++ trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp	2020-07-21 09:03:00 UTC (rev 264648)
@@ -100,14 +100,14 @@
     WTF_MAKE_FAST_ALLOCATED;
 public:
     virtual ~WebKitMediaStreamTrackObserver() { };
-    WebKitMediaStreamTrackObserver(GRefPtr<GstElement>&& src)
-        : m_src(WTFMove(src)) { }
+    WebKitMediaStreamTrackObserver(GstElement* src)
+        : m_src(src) { }
     void trackStarted(MediaStreamTrackPrivate&) final { };
 
     void trackEnded(MediaStreamTrackPrivate& track) final
     {
         if (m_src)
-            webkitMediaStreamSrcTrackEnded(WEBKIT_MEDIA_STREAM_SRC(m_src.get()), track);
+            webkitMediaStreamSrcTrackEnded(WEBKIT_MEDIA_STREAM_SRC(m_src), track);
     }
 
     void trackEnabledChanged(MediaStreamTrackPrivate& track) final
@@ -125,7 +125,7 @@
             return;
 
         auto* gstSample = static_cast<MediaSampleGStreamer*>(&sample)->platformSample().sample.gstSample;
-        webkitMediaStreamSrcPushVideoSample(WEBKIT_MEDIA_STREAM_SRC(m_src.get()), gstSample);
+        webkitMediaStreamSrcPushVideoSample(WEBKIT_MEDIA_STREAM_SRC(m_src), gstSample);
     }
 
     void audioSamplesAvailable(const MediaTime&, const PlatformAudioData& audioData, const AudioStreamDescription&, size_t) final
@@ -134,11 +134,11 @@
             return;
 
         auto data = "" GStreamerAudioData&>(audioData);
-        webkitMediaStreamSrcPushAudioSample(WEBKIT_MEDIA_STREAM_SRC(m_src.get()), data.getSample());
+        webkitMediaStreamSrcPushAudioSample(WEBKIT_MEDIA_STREAM_SRC(m_src), data.getSample());
     }
 
 private:
-    GRefPtr<GstElement> m_src;
+    GstElement* m_src;
     bool m_enabled { true };
 };
 
@@ -146,13 +146,13 @@
     WTF_MAKE_FAST_ALLOCATED;
 public:
     virtual ~WebKitMediaStreamObserver() { };
-    WebKitMediaStreamObserver(GRefPtr<GstElement>&& src)
-        : m_src(WTFMove(src)) { }
+    WebKitMediaStreamObserver(GstElement* src)
+        : m_src(src) { }
 
     void characteristicsChanged() final
     {
         if (m_src)
-            GST_DEBUG_OBJECT(m_src.get(), "renegotiation should happen");
+            GST_DEBUG_OBJECT(m_src, "renegotiation should happen");
     }
     void activeStatusChanged() final { }
 
@@ -159,17 +159,17 @@
     void didAddTrack(MediaStreamTrackPrivate& track) final
     {
         if (m_src)
-            webkitMediaStreamSrcAddTrack(WEBKIT_MEDIA_STREAM_SRC(m_src.get()), &track, false);
+            webkitMediaStreamSrcAddTrack(WEBKIT_MEDIA_STREAM_SRC(m_src), &track, false);
     }
 
     void didRemoveTrack(MediaStreamTrackPrivate& track) final
     {
         if (m_src)
-            webkitMediaStreamSrcRemoveTrackByType(WEBKIT_MEDIA_STREAM_SRC(m_src.get()), track.type());
+            webkitMediaStreamSrcRemoveTrackByType(WEBKIT_MEDIA_STREAM_SRC(m_src), track.type());
     }
 
 private:
-    GRefPtr<GstElement> m_src;
+    GstElement* m_src;
 };
 
 class InternalSource {
@@ -340,9 +340,13 @@
     WebKitMediaStreamSrc* self = WEBKIT_MEDIA_STREAM_SRC(object);
     auto* priv = self->priv;
 
-    priv->mediaStreamTrackObserver = makeUnique<WebKitMediaStreamTrackObserver>(GST_ELEMENT_CAST(gst_object_ref(self)));
-    priv->mediaStreamObserver = makeUnique<WebKitMediaStreamObserver>(GST_ELEMENT_CAST(gst_object_ref(self)));
+    priv->mediaStreamTrackObserver = makeUnique<WebKitMediaStreamTrackObserver>(GST_ELEMENT_CAST(self));
+    priv->mediaStreamObserver = makeUnique<WebKitMediaStreamObserver>(GST_ELEMENT_CAST(self));
     priv->flowCombiner = GUniquePtr<GstFlowCombiner>(gst_flow_combiner_new());
+
+    // https://bugs.webkit.org/show_bug.cgi?id=214150
+    ASSERT(GST_OBJECT_REFCOUNT(self) == 1);
+    ASSERT(g_object_is_floating(self));
 }
 
 static void stopObservingTracks(WebKitMediaStreamSrc* self)
@@ -363,7 +367,7 @@
     GST_OBJECT_UNLOCK(self);
 }
 
-static void webkitMediaStreamSrcFinalize(GObject* object)
+static void webkitMediaStreamSrcDispose(GObject* object)
 {
     WebKitMediaStreamSrc* self = WEBKIT_MEDIA_STREAM_SRC(object);
 
@@ -375,7 +379,10 @@
         priv->stream->removeObserver(*priv->mediaStreamObserver);
         priv->stream = nullptr;
     }
+    priv->track = nullptr;
     GST_OBJECT_UNLOCK(self);
+
+    GST_CALL_PARENT(G_OBJECT_CLASS, dispose, (object));
 }
 
 static GstStateChangeReturn webkitMediaStreamSrcChangeState(GstElement* element, GstStateChange transition)
@@ -401,7 +408,7 @@
     GstElementClass* gstElementClass = GST_ELEMENT_CLASS(klass);
 
     gobjectClass->constructed = webkitMediaStreamSrcConstructed;
-    gobjectClass->finalize = webkitMediaStreamSrcFinalize;
+    gobjectClass->dispose = webkitMediaStreamSrcDispose;
     gobjectClass->get_property = webkitMediaStreamSrcGetProperty;
     gobjectClass->set_property = webkitMediaStreamSrcSetProperty;
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to