Title: [233081] trunk/Source/WebCore
Revision
233081
Author
[email protected]
Date
2018-06-22 09:38:02 -0700 (Fri, 22 Jun 2018)

Log Message

[GStreamer] Avoid sending SELECT_STREAM events when nothing changed
https://bugs.webkit.org/show_bug.cgi?id=186678

Patch by Thibault Saunier <[email protected]> on 2018-06-22
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):

Modified Paths

Diff

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();
 }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to