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();