Title: [276756] releases/WebKitGTK/webkit-2.32
Revision
276756
Author
[email protected]
Date
2021-04-29 01:09:23 -0700 (Thu, 29 Apr 2021)

Log Message

Merge r275514 - [GStreamer][WebRTC] Audio is not played from an audio element when the srcObject object has unstarted video tracks
https://bugs.webkit.org/show_bug.cgi?id=209163

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

Source/WebCore:

Ensure no MediaStream (active) video tracks can be added in a pipeline representing an <audio> element.

* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
(WebCore::MediaPlayerPrivateGStreamer::sourceSetup):
(WebCore::MediaPlayerPrivateGStreamer::hasFirstSampleReachedSink const):
(WebCore::MediaPlayerPrivateGStreamer::videoSinkCapsChanged):
(WebCore::MediaPlayerPrivateGStreamer::playbackPosition const):
(WebCore::MediaPlayerPrivateGStreamer::updateTracks):
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
* platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:
(webkitMediaStreamSrcPostStreamCollection):
(webkitMediaStreamSrcSetStream):
* platform/mediastream/gstreamer/GStreamerMediaStreamSource.h:

LayoutTests:

* platform/glib/TestExpectations: Unflag now-passing test.

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.32/LayoutTests/ChangeLog (276755 => 276756)


--- releases/WebKitGTK/webkit-2.32/LayoutTests/ChangeLog	2021-04-29 08:09:13 UTC (rev 276755)
+++ releases/WebKitGTK/webkit-2.32/LayoutTests/ChangeLog	2021-04-29 08:09:23 UTC (rev 276756)
@@ -1,3 +1,12 @@
+2021-04-06  Philippe Normand  <[email protected]>
+
+        [GStreamer][WebRTC] Audio is not played from an audio element when the srcObject object has unstarted video tracks
+        https://bugs.webkit.org/show_bug.cgi?id=209163
+
+        Reviewed by Xabier Rodriguez-Calvar.
+
+        * platform/glib/TestExpectations: Unflag now-passing test.
+
 2021-04-09  Philippe Normand  <[email protected]>
 
         [GStreamer] fast/canvas/canvas-createPattern-video-loading.html is failing since r218170

Modified: releases/WebKitGTK/webkit-2.32/LayoutTests/platform/glib/TestExpectations (276755 => 276756)


--- releases/WebKitGTK/webkit-2.32/LayoutTests/platform/glib/TestExpectations	2021-04-29 08:09:13 UTC (rev 276755)
+++ releases/WebKitGTK/webkit-2.32/LayoutTests/platform/glib/TestExpectations	2021-04-29 08:09:23 UTC (rev 276756)
@@ -1012,7 +1012,7 @@
 
 webkit.org/b/209163 webrtc/audio-video-element-playing.html [ Crash Failure Pass ]
 
-webkit.org/b/216538 webkit.org/b/222451 webrtc/captureCanvas-webrtc-software-h264-baseline.html [ Failure Crash ]
+webkit.org/b/216538 webrtc/captureCanvas-webrtc-software-h264-baseline.html [ Slow Failure ]
 
 webkit.org/b/216763 webrtc/captureCanvas-webrtc-software-h264-high.html [ Crash Failure ]
 

Modified: releases/WebKitGTK/webkit-2.32/Source/WebCore/ChangeLog (276755 => 276756)


--- releases/WebKitGTK/webkit-2.32/Source/WebCore/ChangeLog	2021-04-29 08:09:13 UTC (rev 276755)
+++ releases/WebKitGTK/webkit-2.32/Source/WebCore/ChangeLog	2021-04-29 08:09:23 UTC (rev 276756)
@@ -1,3 +1,24 @@
+2021-04-06  Philippe Normand  <[email protected]>
+
+        [GStreamer][WebRTC] Audio is not played from an audio element when the srcObject object has unstarted video tracks
+        https://bugs.webkit.org/show_bug.cgi?id=209163
+
+        Reviewed by Xabier Rodriguez-Calvar.
+
+        Ensure no MediaStream (active) video tracks can be added in a pipeline representing an <audio> element.
+
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
+        (WebCore::MediaPlayerPrivateGStreamer::sourceSetup):
+        (WebCore::MediaPlayerPrivateGStreamer::hasFirstSampleReachedSink const):
+        (WebCore::MediaPlayerPrivateGStreamer::videoSinkCapsChanged):
+        (WebCore::MediaPlayerPrivateGStreamer::playbackPosition const):
+        (WebCore::MediaPlayerPrivateGStreamer::updateTracks):
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
+        * platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:
+        (webkitMediaStreamSrcPostStreamCollection):
+        (webkitMediaStreamSrcSetStream):
+        * platform/mediastream/gstreamer/GStreamerMediaStreamSource.h:
+
 2021-03-01  Philippe Normand  <[email protected]>
 
         [GStreamer][Playbin3] Stream collection handling fixes

Modified: releases/WebKitGTK/webkit-2.32/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp (276755 => 276756)


--- releases/WebKitGTK/webkit-2.32/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp	2021-04-29 08:09:13 UTC (rev 276755)
+++ releases/WebKitGTK/webkit-2.32/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp	2021-04-29 08:09:23 UTC (rev 276756)
@@ -882,7 +882,7 @@
     } else if (WEBKIT_IS_MEDIA_STREAM_SRC(sourceElement)) {
         auto stream = m_streamPrivate.get();
         ASSERT(stream);
-        webkitMediaStreamSrcSetStream(WEBKIT_MEDIA_STREAM_SRC(sourceElement), stream);
+        webkitMediaStreamSrcSetStream(WEBKIT_MEDIA_STREAM_SRC(sourceElement), stream, m_player->isVideoPlayer());
 #endif
     }
 }
@@ -1043,6 +1043,11 @@
 
     m_player->mediaEngineUpdated();
 }
+bool MediaPlayerPrivateGStreamer::hasFirstVideoSampleReachedSink() const
+{
+    auto sampleLocker = holdLock(m_sampleMutex);
+    return !!m_sample;
+}
 
 void MediaPlayerPrivateGStreamer::videoSinkCapsChanged(GstPad* videoSinkPad)
 {
@@ -1055,14 +1060,7 @@
     ASSERT(!isMainThread());
     GST_DEBUG_OBJECT(videoSinkPad, "Received new caps: %" GST_PTR_FORMAT, caps.get());
 
-    bool hasFirstSampleReachedSink;
-    // This actually lacks contention since both notify::caps and triggerRepaint() are both run in the same streaming thread.
-    {
-        auto sampleLocker = holdLock(m_sampleMutex);
-        hasFirstSampleReachedSink = !!m_sample;
-    }
-
-    if (!hasFirstSampleReachedSink) {
+    if (!hasFirstVideoSampleReachedSink()) {
         // We want to wait for the sink to receive the first buffer before emitting dimensions, since only by then we
         // are guaranteed that any potential tag event with a rotation has been handled.
         GST_DEBUG_OBJECT(videoSinkPad, "Ignoring notify::caps until the first buffer reaches the sink.");
@@ -1351,6 +1349,12 @@
 MediaTime MediaPlayerPrivateGStreamer::playbackPosition() const
 {
     GST_TRACE_OBJECT(pipeline(), "isEndReached: %s, seeking: %s, seekTime: %s", boolForPrinting(m_isEndReached), boolForPrinting(m_isSeeking), m_seekTime.toString().utf8().data());
+
+#if ENABLE(MEDIA_STREAM)
+    if (m_streamPrivate && m_player->isVideoPlayer() && !hasFirstVideoSampleReachedSink())
+        return MediaTime::zeroTime();
+#endif
+
     if (m_isSeeking)
         return m_seekTime;
     if (m_isEndReached)
@@ -1494,7 +1498,6 @@
     unsigned textTrackIndex = 0;
 
 #define CREATE_TRACK(type, Type) G_STMT_START {                         \
-        m_has##Type = true;                                             \
         if (!useMediaSource) {                                          \
             RefPtr<Type##TrackPrivateGStreamer> track = Type##TrackPrivateGStreamer::create(makeWeakPtr(*this), type##TrackIndex, stream); \
             auto trackId = track->id();                                 \
@@ -1518,7 +1521,7 @@
 
         if (type & GST_STREAM_TYPE_AUDIO)
             CREATE_TRACK(audio, Audio);
-        else if (type & GST_STREAM_TYPE_VIDEO)
+        else if (type & GST_STREAM_TYPE_VIDEO && m_player->isVideoPlayer())
             CREATE_TRACK(video, Video);
         else if (type & GST_STREAM_TYPE_TEXT && !useMediaSource) {
             auto track = InbandTextTrackPrivateGStreamer::create(textTrackIndex++, stream);
@@ -1528,10 +1531,13 @@
             GST_WARNING("Unknown track type found for stream %s", streamId.utf8().data());
     }
 
+    m_hasAudio = !m_audioTracks.isEmpty();
+    m_hasVideo = !m_videoTracks.isEmpty();
+
     if (oldHasVideo != m_hasVideo || oldHasAudio != m_hasAudio)
         m_player->characteristicChanged();
 
-    if (m_hasVideo)
+    if (!oldHasVideo && m_hasVideo)
         m_player->sizeChanged();
 
     m_player->mediaEngineUpdated();

Modified: releases/WebKitGTK/webkit-2.32/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h (276755 => 276756)


--- releases/WebKitGTK/webkit-2.32/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h	2021-04-29 08:09:13 UTC (rev 276755)
+++ releases/WebKitGTK/webkit-2.32/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h	2021-04-29 08:09:23 UTC (rev 276756)
@@ -448,6 +448,7 @@
     void updateTracks(const GRefPtr<GstStreamCollection>&);
     void videoSinkCapsChanged(GstPad*);
     void updateVideoSizeAndOrientationFromCaps(const GstCaps*);
+    bool hasFirstVideoSampleReachedSink() const;
 
 #if ENABLE(ENCRYPTED_MEDIA)
     bool isCDMAttached() const { return m_cdmInstance; }

Modified: releases/WebKitGTK/webkit-2.32/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp (276755 => 276756)


--- releases/WebKitGTK/webkit-2.32/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp	2021-04-29 08:09:13 UTC (rev 276755)
+++ releases/WebKitGTK/webkit-2.32/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp	2021-04-29 08:09:23 UTC (rev 276756)
@@ -558,15 +558,18 @@
     auto* priv = self->priv;
 
     GST_OBJECT_LOCK(self);
-    String upstreamId;
-    if (priv->stream)
-        upstreamId = priv->stream->id();
-    else
-        upstreamId = createCanonicalUUIDString();
+    if (priv->stream && (!priv->stream->active() || !priv->stream->hasTracks())) {
+        GST_OBJECT_UNLOCK(self);
+        return;
+    }
 
+    auto upstreamId = priv->stream ? priv->stream->id() : createCanonicalUUIDString();
     priv->streamCollection = adoptGRef(gst_stream_collection_new(upstreamId.ascii().data()));
-    for (auto& track : priv->tracks)
+    for (auto& track : priv->tracks) {
+        if (!track->isActive())
+            continue;
         gst_stream_collection_add_stream(priv->streamCollection.get(), webkitMediaStreamNew(track.get()));
+    }
 
     GST_OBJECT_UNLOCK(self);
 
@@ -599,7 +602,7 @@
         GST_INFO_OBJECT(self, "Unsupported track type: %d", static_cast<int>(trackType));
 }
 
-void webkitMediaStreamSrcSetStream(WebKitMediaStreamSrc* self, MediaStreamPrivate* stream)
+void webkitMediaStreamSrcSetStream(WebKitMediaStreamSrc* self, MediaStreamPrivate* stream, bool isVideoPlayer)
 {
     ASSERT(WEBKIT_IS_MEDIA_STREAM_SRC(self));
     ASSERT(!self->priv->stream);
@@ -608,9 +611,11 @@
     self->priv->stream->addObserver(*self->priv->mediaStreamObserver.get());
     auto tracks = stream->tracks();
     bool _onlyTrack_ = tracks.size() == 1;
-    for (auto& track : tracks)
+    for (auto& track : tracks) {
+        if (!isVideoPlayer && track->type() == RealtimeMediaSource::Type::Video)
+            continue;
         webkitMediaStreamSrcAddTrack(self, track.get(), onlyTrack);
-
+    }
     webkitMediaStreamSrcPostStreamCollection(self);
     gst_element_no_more_pads(GST_ELEMENT_CAST(self));
 }

Modified: releases/WebKitGTK/webkit-2.32/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.h (276755 => 276756)


--- releases/WebKitGTK/webkit-2.32/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.h	2021-04-29 08:09:13 UTC (rev 276755)
+++ releases/WebKitGTK/webkit-2.32/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.h	2021-04-29 08:09:23 UTC (rev 276756)
@@ -54,7 +54,7 @@
     GstBinClass parentClass;
 };
 
-void webkitMediaStreamSrcSetStream(WebKitMediaStreamSrc*, WebCore::MediaStreamPrivate*);
+void webkitMediaStreamSrcSetStream(WebKitMediaStreamSrc*, WebCore::MediaStreamPrivate*, bool isVideoPlayer);
 void webkitMediaStreamSrcAddTrack(WebKitMediaStreamSrc*, WebCore::MediaStreamTrackPrivate*, bool onlyTrack);
 GstElement* webkitMediaStreamSrcNew();
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to