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;