Changeset 275514 in webkit
- Timestamp:
- Apr 6, 2021 6:53:24 AM (3 years ago)
- Location:
- trunk
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r275508 r275514 1 2021-04-06 Philippe Normand <pnormand@igalia.com> 2 3 [GStreamer][WebRTC] Audio is not played from an audio element when the srcObject object has unstarted video tracks 4 https://bugs.webkit.org/show_bug.cgi?id=209163 5 6 Reviewed by Xabier Rodriguez-Calvar. 7 8 * platform/glib/TestExpectations: Unflag now-passing test. 9 1 10 2021-04-06 Keith Miller <keith_miller@apple.com> 2 11 -
trunk/LayoutTests/platform/glib/TestExpectations
r275507 r275514 1070 1070 1071 1071 webkit.org/b/208125 webrtc/peerconnection-new-candidate-page-cache.html [ Failure Timeout ] 1072 1073 webkit.org/b/209163 webrtc/audio-video-element-playing.html [ Crash Failure Pass ]1074 1072 1075 1073 webkit.org/b/216538 webrtc/captureCanvas-webrtc-software-h264-baseline.html [ Slow Failure ] -
trunk/Source/WebCore/ChangeLog
r275512 r275514 1 2021-04-06 Philippe Normand <pnormand@igalia.com> 2 3 [GStreamer][WebRTC] Audio is not played from an audio element when the srcObject object has unstarted video tracks 4 https://bugs.webkit.org/show_bug.cgi?id=209163 5 6 Reviewed by Xabier Rodriguez-Calvar. 7 8 Ensure no MediaStream (active) video tracks can be added in a pipeline representing an <audio> element. 9 10 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: 11 (WebCore::MediaPlayerPrivateGStreamer::sourceSetup): 12 (WebCore::MediaPlayerPrivateGStreamer::hasFirstSampleReachedSink const): 13 (WebCore::MediaPlayerPrivateGStreamer::videoSinkCapsChanged): 14 (WebCore::MediaPlayerPrivateGStreamer::playbackPosition const): 15 (WebCore::MediaPlayerPrivateGStreamer::updateTracks): 16 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: 17 * platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp: 18 (webkitMediaStreamSrcPostStreamCollection): 19 (webkitMediaStreamSrcSetStream): 20 * platform/mediastream/gstreamer/GStreamerMediaStreamSource.h: 21 1 22 2021-04-06 Philippe Normand <pnormand@igalia.com> 2 23 -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp
r275412 r275514 873 873 auto stream = m_streamPrivate.get(); 874 874 ASSERT(stream); 875 webkitMediaStreamSrcSetStream(WEBKIT_MEDIA_STREAM_SRC(sourceElement), stream );875 webkitMediaStreamSrcSetStream(WEBKIT_MEDIA_STREAM_SRC(sourceElement), stream, m_player->isVideoPlayer()); 876 876 #endif 877 877 } … … 1034 1034 m_player->mediaEngineUpdated(); 1035 1035 } 1036 bool MediaPlayerPrivateGStreamer::hasFirstVideoSampleReachedSink() const 1037 { 1038 auto sampleLocker = holdLock(m_sampleMutex); 1039 return !!m_sample; 1040 } 1036 1041 1037 1042 void MediaPlayerPrivateGStreamer::videoSinkCapsChanged(GstPad* videoSinkPad) … … 1046 1051 GST_DEBUG_OBJECT(videoSinkPad, "Received new caps: %" GST_PTR_FORMAT, caps.get()); 1047 1052 1048 bool hasFirstSampleReachedSink; 1049 // This actually lacks contention since both notify::caps and triggerRepaint() are both run in the same streaming thread. 1050 { 1051 auto sampleLocker = holdLock(m_sampleMutex); 1052 hasFirstSampleReachedSink = !!m_sample; 1053 } 1054 1055 if (!hasFirstSampleReachedSink) { 1053 if (!hasFirstVideoSampleReachedSink()) { 1056 1054 // We want to wait for the sink to receive the first buffer before emitting dimensions, since only by then we 1057 1055 // are guaranteed that any potential tag event with a rotation has been handled. … … 1342 1340 { 1343 1341 GST_TRACE_OBJECT(pipeline(), "isEndReached: %s, seeking: %s, seekTime: %s", boolForPrinting(m_isEndReached), boolForPrinting(m_isSeeking), m_seekTime.toString().utf8().data()); 1342 1343 #if ENABLE(MEDIA_STREAM) 1344 if (m_streamPrivate && m_player->isVideoPlayer() && !hasFirstVideoSampleReachedSink()) 1345 return MediaTime::zeroTime(); 1346 #endif 1347 1344 1348 if (m_isSeeking) 1345 1349 return m_seekTime; … … 1485 1489 1486 1490 #define CREATE_TRACK(type, Type) G_STMT_START { \ 1487 m_has##Type = true; \1488 1491 if (!useMediaSource) { \ 1489 1492 RefPtr<Type##TrackPrivateGStreamer> track = Type##TrackPrivateGStreamer::create(makeWeakPtr(*this), type##TrackIndex, stream); \ … … 1509 1512 if (type & GST_STREAM_TYPE_AUDIO) 1510 1513 CREATE_TRACK(audio, Audio); 1511 else if (type & GST_STREAM_TYPE_VIDEO )1514 else if (type & GST_STREAM_TYPE_VIDEO && m_player->isVideoPlayer()) 1512 1515 CREATE_TRACK(video, Video); 1513 1516 else if (type & GST_STREAM_TYPE_TEXT && !useMediaSource) { … … 1519 1522 } 1520 1523 1524 m_hasAudio = !m_audioTracks.isEmpty(); 1525 m_hasVideo = !m_videoTracks.isEmpty(); 1526 1521 1527 if (oldHasVideo != m_hasVideo || oldHasAudio != m_hasAudio) 1522 1528 m_player->characteristicChanged(); 1523 1529 1524 if ( m_hasVideo)1530 if (!oldHasVideo && m_hasVideo) 1525 1531 m_player->sizeChanged(); 1526 1532 -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h
r275412 r275514 449 449 void videoSinkCapsChanged(GstPad*); 450 450 void updateVideoSizeAndOrientationFromCaps(const GstCaps*); 451 bool hasFirstVideoSampleReachedSink() const; 451 452 452 453 #if ENABLE(ENCRYPTED_MEDIA) -
trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp
r274150 r275514 575 575 576 576 GST_OBJECT_LOCK(self); 577 String upstreamId;578 if (priv->stream)579 upstreamId = priv->stream->id();580 else581 upstreamId = createCanonicalUUIDString(); 582 577 if (priv->stream && (!priv->stream->active() || !priv->stream->hasTracks())) { 578 GST_OBJECT_UNLOCK(self); 579 return; 580 } 581 582 auto upstreamId = priv->stream ? priv->stream->id() : createCanonicalUUIDString(); 583 583 priv->streamCollection = adoptGRef(gst_stream_collection_new(upstreamId.ascii().data())); 584 for (auto& track : priv->tracks) 584 for (auto& track : priv->tracks) { 585 if (!track->isActive()) 586 continue; 585 587 gst_stream_collection_add_stream(priv->streamCollection.get(), webkitMediaStreamNew(track.get())); 588 } 586 589 587 590 GST_OBJECT_UNLOCK(self); … … 616 619 } 617 620 618 void webkitMediaStreamSrcSetStream(WebKitMediaStreamSrc* self, MediaStreamPrivate* stream )621 void webkitMediaStreamSrcSetStream(WebKitMediaStreamSrc* self, MediaStreamPrivate* stream, bool isVideoPlayer) 619 622 { 620 623 ASSERT(WEBKIT_IS_MEDIA_STREAM_SRC(self)); … … 625 628 auto tracks = stream->tracks(); 626 629 bool onlyTrack = tracks.size() == 1; 627 for (auto& track : tracks) 630 for (auto& track : tracks) { 631 if (!isVideoPlayer && track->type() == RealtimeMediaSource::Type::Video) 632 continue; 628 633 webkitMediaStreamSrcAddTrack(self, track.get(), onlyTrack); 629 634 } 630 635 webkitMediaStreamSrcPostStreamCollection(self); 631 636 gst_element_no_more_pads(GST_ELEMENT_CAST(self)); -
trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.h
r263836 r275514 55 55 }; 56 56 57 void webkitMediaStreamSrcSetStream(WebKitMediaStreamSrc*, WebCore::MediaStreamPrivate* );57 void webkitMediaStreamSrcSetStream(WebKitMediaStreamSrc*, WebCore::MediaStreamPrivate*, bool isVideoPlayer); 58 58 void webkitMediaStreamSrcAddTrack(WebKitMediaStreamSrc*, WebCore::MediaStreamTrackPrivate*, bool onlyTrack); 59 59 GstElement* webkitMediaStreamSrcNew();
Note: See TracChangeset
for help on using the changeset viewer.