Modified: trunk/Source/WebCore/ChangeLog (233080 => 233081)
--- trunk/Source/WebCore/ChangeLog 2018-06-22 15:43:45 UTC (rev 233080)
+++ trunk/Source/WebCore/ChangeLog 2018-06-22 16:38:02 UTC (rev 233081)
@@ -1,3 +1,25 @@
+2018-06-22 Thibault Saunier <[email protected]>
+
+ [GStreamer] Avoid sending SELECT_STREAM events when nothing changed
+ https://bugs.webkit.org/show_bug.cgi?id=186678
+
+ Reviewed by Philippe Normand.
+
+ This avoid extra work in decodebin3 and should work around a crash
+ in decodebin3 when we send spurious SELECT_STREAM in the mediastream
+ layout tests.
+
+ GStreamer was also missing safe guards in the GstStream APIs which have been
+ added in gstreamer core in 8833ca942ea21c58c0f63822f0e2b61695b39447
+ "stream: Add some missing API safe guards".
+
+ Should fix following flakes:
+ - fast/mediastream/MediaStream-video-element-track-stop.html
+ - fast/mediastream/change-tracks-media-stream-being-played.html
+
+ * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
+ (WebCore::MediaPlayerPrivateGStreamer::enableTrack):
+
2018-06-22 Michael Catanzaro <[email protected]>
REGRESSION(r230950): [GTK] WebKit::CoordinatedBackingStoreTile::setBackBuffer(): WebKitWebProcess killed by SIGSEGV (ASSERTION FAILED: it != m_tiles.end())
Modified: trunk/Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.cpp (233080 => 233081)
--- trunk/Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.cpp 2018-06-22 15:43:45 UTC (rev 233080)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.cpp 2018-06-22 16:38:02 UTC (rev 233081)
@@ -48,8 +48,18 @@
: TrackPrivateBaseGStreamer(this, index, stream)
, m_player(player)
{
+ gint kind;
+ auto tags = gst_stream_get_tags(m_stream.get());
+
+ if (gst_tag_list_get_int(tags, "webkit-media-stream-kind", &kind) && kind == static_cast<int>(VideoTrackPrivate::Kind::Main)) {
+ GstStreamFlags streamFlags = gst_stream_get_stream_flags(stream.get());
+ gst_stream_set_stream_flags(stream.get(), static_cast<GstStreamFlags>(streamFlags | GST_STREAM_FLAG_SELECT));
+ }
+
m_id = gst_stream_get_stream_id(stream.get());
- setActive(gst_stream_get_stream_flags(stream.get()) & GST_STREAM_FLAG_SELECT);
+ if (gst_stream_get_stream_flags(stream.get()) & GST_STREAM_FLAG_SELECT)
+ markAsActive();
+
notifyTrackOfActiveChanged();
}
Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp (233080 => 233081)
--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp 2018-06-22 15:43:45 UTC (rev 233080)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp 2018-06-22 16:38:02 UTC (rev 233081)
@@ -741,32 +741,62 @@
{
const char* propertyName;
const char* trackTypeAsString;
- GList* selectedStreams = nullptr;
+ Vector<String> selectedStreams;
+ String selectedStreamId;
+#if GST_CHECK_VERSION(1, 10, 0)
+ GstStream* stream = nullptr;
+
+ if (!m_isLegacyPlaybin) {
+ gst_stream_collection_get_stream(m_streamCollection.get(), index);
+ if (!stream) {
+ GST_WARNING_OBJECT(pipeline(), "No stream to select at index %u", index);
+ return;
+ }
+ selectedStreamId = String::fromUTF8(gst_stream_get_stream_id(stream));
+ selectedStreams.append(selectedStreamId);
+ }
+#endif // GST_CHECK_VERSION(1,0,0)
+
switch (trackType) {
case TrackPrivateBaseGStreamer::TrackType::Audio:
propertyName = "current-audio";
trackTypeAsString = "audio";
+ if (!selectedStreamId.isEmpty() && selectedStreamId == m_currentAudioStreamId) {
+ GST_INFO_OBJECT(pipeline(), "%s stream: %s already selected, not doing anything.", trackTypeAsString, selectedStreamId.utf8().data());
+ return;
+ }
+
if (!m_currentTextStreamId.isEmpty())
- selectedStreams = g_list_append(selectedStreams, g_strdup(m_currentTextStreamId.utf8().data()));
+ selectedStreams.append(m_currentTextStreamId);
if (!m_currentVideoStreamId.isEmpty())
- selectedStreams = g_list_append(selectedStreams, g_strdup(m_currentVideoStreamId.utf8().data()));
+ selectedStreams.append(m_currentVideoStreamId);
break;
case TrackPrivateBaseGStreamer::TrackType::Video:
propertyName = "current-video";
trackTypeAsString = "video";
+ if (!selectedStreamId.isEmpty() && selectedStreamId == m_currentVideoStreamId) {
+ GST_INFO_OBJECT(pipeline(), "%s stream: %s already selected, not doing anything.", trackTypeAsString, selectedStreamId.utf8().data());
+ return;
+ }
+
if (!m_currentAudioStreamId.isEmpty())
- selectedStreams = g_list_append(selectedStreams, g_strdup(m_currentAudioStreamId.utf8().data()));
+ selectedStreams.append(m_currentAudioStreamId);
if (!m_currentTextStreamId.isEmpty())
- selectedStreams = g_list_append(selectedStreams, g_strdup(m_currentTextStreamId.utf8().data()));
+ selectedStreams.append(m_currentTextStreamId);
break;
case TrackPrivateBaseGStreamer::TrackType::Text:
+ if (!selectedStreamId.isEmpty() && selectedStreamId == m_currentTextStreamId) {
+ GST_INFO_OBJECT(pipeline(), "%s stream: %s already selected, not doing anything.", trackTypeAsString, selectedStreamId.utf8().data());
+ return;
+ }
+
propertyName = "current-text";
trackTypeAsString = "text";
if (!m_currentAudioStreamId.isEmpty())
- selectedStreams = g_list_append(selectedStreams, g_strdup(m_currentAudioStreamId.utf8().data()));
+ selectedStreams.append(m_currentAudioStreamId);
if (!m_currentVideoStreamId.isEmpty())
- selectedStreams = g_list_append(selectedStreams, g_strdup(m_currentVideoStreamId.utf8().data()));
+ selectedStreams.append(m_currentVideoStreamId);
break;
case TrackPrivateBaseGStreamer::TrackType::Unknown:
default:
@@ -781,20 +811,16 @@
}
#if GST_CHECK_VERSION(1, 10, 0)
else {
- GstStream* stream = gst_stream_collection_get_stream(m_streamCollection.get(), index);
- if (stream) {
- String streamId = gst_stream_get_stream_id(stream);
- selectedStreams = g_list_append(selectedStreams, g_strdup(streamId.utf8().data()));
- } else
- GST_WARNING("%s stream %u not found", trackTypeAsString, index);
+ GList* selectedStreamsList = nullptr;
+ for (const auto& streamId : selectedStreams)
+ selectedStreamsList = g_list_append(selectedStreamsList, g_strdup(streamId.utf8().data()));
+
// TODO: MSE GstStream API support: https://bugs.webkit.org/show_bug.cgi?id=182531
- gst_element_send_event(m_pipeline.get(), gst_event_new_select_streams(selectedStreams));
+ gst_element_send_event(m_pipeline.get(), gst_event_new_select_streams(selectedStreamsList));
+ g_list_free_full(selectedStreamsList, reinterpret_cast<GDestroyNotify>(g_free));
}
#endif
-
- if (selectedStreams)
- g_list_free_full(selectedStreams, reinterpret_cast<GDestroyNotify>(g_free));
}
void MediaPlayerPrivateGStreamer::videoChangedCallback(MediaPlayerPrivateGStreamer* player)
Modified: trunk/Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.cpp (233080 => 233081)
--- trunk/Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.cpp 2018-06-22 15:43:45 UTC (rev 233080)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.cpp 2018-06-22 16:38:02 UTC (rev 233081)
@@ -57,7 +57,8 @@
}
m_id = gst_stream_get_stream_id(stream.get());
- setActive(gst_stream_get_stream_flags(stream.get()) & GST_STREAM_FLAG_SELECT);
+ if (gst_stream_get_stream_flags(stream.get()) & GST_STREAM_FLAG_SELECT)
+ markAsActive();
notifyTrackOfActiveChanged();
}