Changeset 244736 in webkit
- Timestamp:
- Apr 29, 2019 9:24:31 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r244728 r244736 1 2019-04-29 Youenn Fablet <youenn@apple.com> 2 3 RTCTrackEvent should be delayed until the whole remote description is set 4 https://bugs.webkit.org/show_bug.cgi?id=196808 5 <rdar://problem/49802649> 6 7 Reviewed by Eric Carlson. 8 9 * webrtc/video-addTrack.html: 10 1 11 2019-04-29 Javier Fernandez <jfernandez@igalia.com> 2 12 -
trunk/LayoutTests/webrtc/video-addTrack.html
r235480 r244736 61 61 else 62 62 assert_equals(trackEvent.track.id, stream.getAudioTracks()[0].id); 63 assert_equals(trackEvent.streams.length, 1); 64 assert_equals(trackEvent.streams[0].getTracks().length, 2); 63 65 }, " track " + count + ", wait = " + waitForSecondTrack); 64 66 if (count++ === (waitForSecondTrack ? 1 : 0)) -
trunk/Source/WebCore/ChangeLog
r244731 r244736 1 2019-04-29 Youenn Fablet <youenn@apple.com> 2 3 RTCTrackEvent should be delayed until the whole remote description is set 4 https://bugs.webkit.org/show_bug.cgi?id=196808 5 <rdar://problem/49802649> 6 7 Reviewed by Eric Carlson. 8 9 As per https://w3c.github.io/webrtc-pc/#set-description, 10 fire events just before resolving the setRemoteDescription promise. 11 This ensures that the exposed stream has all necessary tracks from the beginning. 12 Pending track events are created in LibWebRTCMediaEndpoint and stored in PeerConnectionBackend. 13 14 Covered by updated test. 15 16 * Modules/mediastream/PeerConnectionBackend.cpp: 17 (WebCore::PeerConnectionBackend::setRemoteDescriptionSucceeded): 18 (WebCore::PeerConnectionBackend::setRemoteDescriptionFailed): 19 (WebCore::PeerConnectionBackend::addPendingTrackEvent): 20 (WebCore::PeerConnectionBackend::stop): 21 * Modules/mediastream/PeerConnectionBackend.h: 22 * Modules/mediastream/RTCPeerConnection.cpp: 23 * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp: 24 (WebCore::LibWebRTCMediaEndpoint::addRemoteTrack): 25 (WebCore::LibWebRTCMediaEndpoint::addPendingTrackEvent): 26 (WebCore::LibWebRTCMediaEndpoint::newTransceiver): 27 * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h: 28 1 29 2019-04-25 Carlos Garcia Campos <cgarcia@igalia.com> 2 30 -
trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp
r244724 r244736 44 44 #include "RTCPeerConnectionIceEvent.h" 45 45 #include "RTCRtpCapabilities.h" 46 #include "RTCTrackEvent.h" 46 47 #include "RuntimeEnabledFeatures.h" 47 48 #include <wtf/text/StringBuilder.h> … … 249 250 ALWAYS_LOG(LOGIDENTIFIER, "Set remote description succeeded"); 250 251 252 ASSERT(!m_peerConnection.isClosed()); 253 254 auto events = WTFMove(m_pendingTrackEvents); 255 for (auto& event : events) { 256 auto& track = event.track.get(); 257 258 m_peerConnection.fireEvent(RTCTrackEvent::create(eventNames().trackEvent, Event::CanBubble::No, Event::IsCancelable::No, WTFMove(event.receiver), WTFMove(event.track), WTFMove(event.streams), WTFMove(event.transceiver))); 259 260 if (m_peerConnection.isClosed()) 261 return; 262 263 // FIXME: As per spec, we should set muted to 'false' when starting to receive the content from network. 264 track.source().setMuted(false); 265 } 266 251 267 if (m_peerConnection.isClosed()) 252 268 return; … … 263 279 ALWAYS_LOG(LOGIDENTIFIER, "Set remote description failed:", exception.message()); 264 280 265 if (m_peerConnection.isClosed()) 266 return; 267 281 ASSERT(m_pendingTrackEvents.isEmpty()); 282 m_pendingTrackEvents.clear(); 283 284 ASSERT(!m_peerConnection.isClosed()); 268 285 ASSERT(m_setDescriptionPromise); 269 286 270 287 m_setDescriptionPromise->reject(WTFMove(exception)); 271 288 m_setDescriptionPromise = WTF::nullopt; 289 } 290 291 void PeerConnectionBackend::addPendingTrackEvent(PendingTrackEvent&& event) 292 { 293 ASSERT(!m_peerConnection.isClosed()); 294 m_pendingTrackEvents.append(WTFMove(event)); 272 295 } 273 296 … … 492 515 m_addIceCandidatePromise = WTF::nullopt; 493 516 517 m_pendingTrackEvents.clear(); 518 494 519 doStop(); 495 520 } -
trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h
r244724 r244736 193 193 String filterSDP(String&&) const; 194 194 195 struct PendingTrackEvent { 196 Ref<RTCRtpReceiver> receiver; 197 Ref<MediaStreamTrack> track; 198 Vector<RefPtr<MediaStream>> streams; 199 RefPtr<RTCRtpTransceiver> transceiver; 200 }; 201 void addPendingTrackEvent(PendingTrackEvent&&); 202 195 203 private: 196 204 virtual void doCreateOffer(RTCOfferOptions&&) = 0; … … 222 230 Vector<PendingICECandidate> m_pendingICECandidates; 223 231 232 Vector<PendingTrackEvent> m_pendingTrackEvents; 233 224 234 #if !RELEASE_LOG_DISABLED 225 235 Ref<const Logger> m_logger; -
trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp
r243887 r244736 53 53 #include "RTCPeerConnectionIceEvent.h" 54 54 #include "RTCSessionDescription.h" 55 #include "RTCTrackEvent.h"56 55 #include <wtf/CryptographicallyRandomNumber.h> 57 56 #include <wtf/IsoMallocInlines.h> -
trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp
r244632 r244736 48 48 #include "RTCSessionDescription.h" 49 49 #include "RTCStatsReport.h" 50 #include "RTCTrackEvent.h"51 50 #include "RealtimeIncomingAudioSource.h" 52 51 #include "RealtimeIncomingVideoSource.h" … … 396 395 receiver->setBackend(std::make_unique<LibWebRTCRtpReceiverBackend>(WTFMove(rtcReceiver))); 397 396 auto& track = receiver->track(); 398 fireTrackEvent(receiver.releaseNonNull(), track, rtcStreams, nullptr);399 } 400 401 void LibWebRTCMediaEndpoint:: fireTrackEvent(Ref<RTCRtpReceiver>&& receiver, MediaStreamTrack& track, const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>& rtcStreams, RefPtr<RTCRtpTransceiver>&& transceiver)397 addPendingTrackEvent(receiver.releaseNonNull(), track, rtcStreams, nullptr); 398 } 399 400 void LibWebRTCMediaEndpoint::addPendingTrackEvent(Ref<RTCRtpReceiver>&& receiver, MediaStreamTrack& track, const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>& rtcStreams, RefPtr<RTCRtpTransceiver>&& transceiver) 402 401 { 403 402 Vector<RefPtr<MediaStream>> streams; … … 412 411 m_remoteStreamsFromRemoteTrack.add(&track, WTFMove(streamIds)); 413 412 414 m_peerConnectionBackend.connection().fireEvent(RTCTrackEvent::create(eventNames().trackEvent, 415 Event::CanBubble::No, Event::IsCancelable::No, WTFMove(receiver), &track, WTFMove(streams), WTFMove(transceiver))); 416 417 // FIXME: As per spec, we should set muted to 'false' when starting to receive the content from network. 418 track.source().setMuted(false); 413 m_peerConnectionBackend.addPendingTrackEvent({ WTFMove(receiver), makeRef(track), WTFMove(streams), WTFMove(transceiver) }); 419 414 } 420 415 … … 491 486 auto rtcReceiver = rtcTransceiver->receiver(); 492 487 setExistingReceiverSourceTrack(transceiver->receiver().track().source(), *rtcReceiver); 493 fireTrackEvent(makeRef(transceiver->receiver()), transceiver->receiver().track(), rtcReceiver->streams(), makeRef(*transceiver));488 addPendingTrackEvent(makeRef(transceiver->receiver()), transceiver->receiver().track(), rtcReceiver->streams(), makeRef(*transceiver)); 494 489 return; 495 490 } … … 502 497 auto& newTransceiver = m_peerConnectionBackend.newRemoteTransceiver(std::make_unique<LibWebRTCRtpTransceiverBackend>(WTFMove(rtcTransceiver)), source.releaseNonNull()); 503 498 504 fireTrackEvent(makeRef(newTransceiver.receiver()), newTransceiver.receiver().track(), rtcReceiver->streams(), makeRef(newTransceiver));499 addPendingTrackEvent(makeRef(newTransceiver.receiver()), newTransceiver.receiver().track(), rtcReceiver->streams(), makeRef(newTransceiver)); 505 500 } 506 501 -
trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h
r244034 r244736 144 144 void removeRemoteTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface>&&); 145 145 146 void fireTrackEvent(Ref<RTCRtpReceiver>&&, MediaStreamTrack&, const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>&, RefPtr<RTCRtpTransceiver>&&);146 void addPendingTrackEvent(Ref<RTCRtpReceiver>&&, MediaStreamTrack&, const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>&, RefPtr<RTCRtpTransceiver>&&); 147 147 148 148 template<typename T>
Note: See TracChangeset
for help on using the changeset viewer.