Changeset 213736 in webkit
- Timestamp:
- Mar 10, 2017 4:46:44 PM (7 years ago)
- Location:
- trunk
- Files:
-
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r213735 r213736 1 2017-03-10 Youenn Fablet <youenn@apple.com> 2 3 Move libwebrtc backend to using tracks 4 https://bugs.webkit.org/show_bug.cgi?id=169472 5 6 Reviewed by Alex Christensen. 7 8 * TestExpectations: 9 1 10 2017-03-10 Ryan Haddad <ryanhaddad@apple.com> 2 11 -
trunk/LayoutTests/TestExpectations
r213723 r213736 716 716 # See webkit.org/b/168736 717 717 fast/mediastream/RTCPeerConnection-addIceCandidate.html [ Failure ] 718 fast/mediastream/RTCPeerConnection-addTrack-reuse-sender.html [ Failure ]719 fast/mediastream/RTCPeerConnection-legacy-stream-based-api.html [ Failure ]720 718 imported/w3c/web-platform-tests/webrtc/datachannel-emptystring.html [ Failure ] 721 719 imported/w3c/web-platform-tests/webrtc/no-media-call.html [ Failure ] -
trunk/Source/ThirdParty/libwebrtc/ChangeLog
r213605 r213736 1 2017-03-10 Youenn Fablet <youenn@apple.com> 2 3 Move libwebrtc backend to using tracks 4 https://bugs.webkit.org/show_bug.cgi?id=169472 5 6 Reviewed by Alex Christensen. 7 8 * Source/webrtc/pc/rtcstatscollector.cc: Moving from using media stream to tracks. 9 1 10 2017-03-08 Youenn Fablet <youenn@apple.com> 2 11 -
trunk/Source/ThirdParty/libwebrtc/Source/webrtc/pc/rtcstatscollector.cc
r213418 r213736 1199 1199 RTC_DCHECK(signaling_thread_->IsCurrent()); 1200 1200 std::map<MediaStreamTrackInterface*, std::string> track_to_id; 1201 #if defined(WEBRTC_WEBKIT_BUILD) 1202 for (auto& sender : pc_->GetSenders()) { 1203 auto track = sender->track(); 1204 if (!track) 1205 continue; 1206 track_to_id[track.get()] = track->id(); 1207 } 1208 for (auto& receiver : pc_->GetReceivers()) { 1209 auto track = receiver->track(); 1210 if (!track) 1211 continue; 1212 track_to_id[track.get()] = track->id(); 1213 } 1214 #else 1201 1215 StreamCollectionInterface* local_and_remote_streams[] = 1202 1216 { pc_->local_streams().get(), pc_->remote_streams().get() }; … … 1216 1230 } 1217 1231 } 1232 #endif 1218 1233 return track_to_id; 1219 1234 } -
trunk/Source/WebCore/ChangeLog
r213733 r213736 1 2017-03-10 Youenn Fablet <youenn@apple.com> 2 3 Move libwebrtc backend to using tracks 4 https://bugs.webkit.org/show_bug.cgi?id=169472 5 6 Reviewed by Alex Christensen. 7 8 Covered by current test sets. 9 10 This change allows to move away from streams and use more tracks. 11 This allows future better alignment with the spec and better implementation of sender/receover/transceiver. 12 13 Small refactoring to use more Ref<> in WebRTC track-based code. 14 Added a notifyAddedTrack to notify the backend that a track was added. 15 For libwebrtc, this allows calling AddTrack before making the offer. 16 Updated mock libwebrtc backend accordingly. 17 18 * Modules/mediastream/MediaEndpointPeerConnection.cpp: 19 (WebCore::MediaEndpointPeerConnection::replaceTrack): 20 (WebCore::MediaEndpointPeerConnection::replaceTrackTask): 21 * Modules/mediastream/MediaEndpointPeerConnection.h: 22 * Modules/mediastream/PeerConnectionBackend.h: 23 (WebCore::PeerConnectionBackend::notifyAddedTrack): 24 * Modules/mediastream/RTCPeerConnection.cpp: 25 (WebCore::RTCPeerConnection::addTrack): 26 (WebCore::RTCPeerConnection::replaceTrack): 27 * Modules/mediastream/RTCPeerConnection.h: 28 * Modules/mediastream/RTCRtpSender.cpp: 29 (WebCore::RTCRtpSender::create): 30 (WebCore::RTCRtpSender::RTCRtpSender): 31 (WebCore::RTCRtpSender::setTrack): 32 * Modules/mediastream/RTCRtpSender.h: 33 * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp: 34 (WebCore::LibWebRTCMediaEndpoint::addTrack): 35 (WebCore::LibWebRTCMediaEndpoint::doCreateOffer): 36 (WebCore::LibWebRTCMediaEndpoint::doCreateAnswer): 37 (WebCore::LibWebRTCMediaEndpoint::getStats): 38 * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h: 39 * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp: 40 (WebCore::LibWebRTCPeerConnectionBackend::doAddIceCandidate): 41 (WebCore::LibWebRTCPeerConnectionBackend::notifyAddedTrack): 42 * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h: 43 * testing/MockLibWebRTCPeerConnection.cpp: 44 (WebCore::MockLibWebRTCPeerConnection::AddTrack): 45 (WebCore::MockLibWebRTCPeerConnection::RemoveTrack): 46 (WebCore::MockLibWebRTCPeerConnection::CreateOffer): 47 (WebCore::MockLibWebRTCPeerConnection::CreateAnswer): 48 * testing/MockLibWebRTCPeerConnection.h: 49 (WebCore::MockRtpSender::MockRtpSender): 50 (WebCore::MockRtpSender::ssrc): 51 (WebCore::MockRtpSender::media_type): 52 (WebCore::MockRtpSender::id): 53 (WebCore::MockRtpSender::stream_ids): 54 (WebCore::MockRtpSender::GetParameters): 55 (WebCore::MockRtpSender::SetParameters): 56 (WebCore::MockRtpSender::GetDtmfSender): 57 1 58 2017-03-10 Zalan Bujtas <zalan@apple.com> 2 59 -
trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp
r212338 r213736 694 694 } 695 695 696 void MediaEndpointPeerConnection::replaceTrack(RTCRtpSender& sender, Ref Ptr<MediaStreamTrack>&& withTrack, DOMPromise<void>&& promise)696 void MediaEndpointPeerConnection::replaceTrack(RTCRtpSender& sender, Ref<MediaStreamTrack>&& withTrack, DOMPromise<void>&& promise) 697 697 { 698 698 RTCRtpTransceiver* transceiver = matchTransceiver(m_peerConnection.getTransceivers(), [&sender] (RTCRtpTransceiver& current) { … … 714 714 } 715 715 716 void MediaEndpointPeerConnection::replaceTrackTask(RTCRtpSender& sender, const String& mid, Ref Ptr<MediaStreamTrack>&& withTrack, DOMPromise<void>& promise)716 void MediaEndpointPeerConnection::replaceTrackTask(RTCRtpSender& sender, const String& mid, Ref<MediaStreamTrack>&& withTrack, DOMPromise<void>& promise) 717 717 { 718 718 if (m_peerConnection.internalSignalingState() == SignalingState::Closed) -
trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h
r212338 r213736 63 63 64 64 Ref<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) final; 65 void replaceTrack(RTCRtpSender&, Ref Ptr<MediaStreamTrack>&&, DOMPromise<void>&&) final;65 void replaceTrack(RTCRtpSender&, Ref<MediaStreamTrack>&&, DOMPromise<void>&&) final; 66 66 67 67 void emulatePlatformEvent(const String& action) final; … … 85 85 void addIceCandidateTask(RTCIceCandidate&); 86 86 87 void replaceTrackTask(RTCRtpSender&, const String& mid, Ref Ptr<MediaStreamTrack>&&, DOMPromise<void>&);87 void replaceTrackTask(RTCRtpSender&, const String& mid, Ref<MediaStreamTrack>&&, DOMPromise<void>&); 88 88 89 89 bool localDescriptionTypeValidForState(RTCSessionDescription::SdpType) const; -
trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h
r212745 r213736 94 94 95 95 virtual Ref<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) = 0; 96 virtual void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromise<void>&&) = 0; 96 virtual void replaceTrack(RTCRtpSender&, Ref<MediaStreamTrack>&&, DOMPromise<void>&&) = 0; 97 virtual void notifyAddedTrack(RTCRtpSender&) { } 97 98 98 99 void markAsNeedingNegotiation(); -
trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp
r212745 r213736 124 124 transceiver->enableSendingDirection(); 125 125 sender = &existingSender; 126 126 127 break; 127 128 } … … 147 148 m_backend->markAsNeedingNegotiation(); 148 149 150 m_backend->notifyAddedTrack(*sender); 149 151 return Ref<RTCRtpSender> { *sender }; 150 152 } … … 511 513 } 512 514 513 void RTCPeerConnection::replaceTrack(RTCRtpSender& sender, Ref Ptr<MediaStreamTrack>&& withTrack, DOMPromise<void>&& promise)515 void RTCPeerConnection::replaceTrack(RTCRtpSender& sender, Ref<MediaStreamTrack>&& withTrack, DOMPromise<void>&& promise) 514 516 { 515 517 m_backend->replaceTrack(sender, WTFMove(withTrack), WTFMove(promise)); -
trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h
r212745 r213736 160 160 161 161 // RTCRtpSenderClient 162 void replaceTrack(RTCRtpSender&, Ref Ptr<MediaStreamTrack>&&, DOMPromise<void>&&) final;162 void replaceTrack(RTCRtpSender&, Ref<MediaStreamTrack>&&, DOMPromise<void>&&) final; 163 163 164 164 PeerConnectionStates::SignalingState m_signalingState { PeerConnectionStates::SignalingState::Stable }; -
trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp
r209390 r213736 40 40 Ref<RTCRtpSender> RTCRtpSender::create(Ref<MediaStreamTrack>&& track, Vector<String>&& mediaStreamIds, RTCRtpSenderClient& client) 41 41 { 42 const String& trackKind = track->kind(); 43 return adoptRef(*new RTCRtpSender(WTFMove(track), trackKind, WTFMove(mediaStreamIds), client)); 42 auto sender = adoptRef(*new RTCRtpSender(track->kind(), WTFMove(mediaStreamIds), client)); 43 sender->setTrack(WTFMove(track)); 44 return sender; 44 45 } 45 46 46 47 Ref<RTCRtpSender> RTCRtpSender::create(const String& trackKind, Vector<String>&& mediaStreamIds, RTCRtpSenderClient& client) 47 48 { 48 return adoptRef(*new RTCRtpSender( nullptr,trackKind, WTFMove(mediaStreamIds), client));49 return adoptRef(*new RTCRtpSender(trackKind, WTFMove(mediaStreamIds), client)); 49 50 } 50 51 51 RTCRtpSender::RTCRtpSender( RefPtr<MediaStreamTrack>&& track,const String& trackKind, Vector<String>&& mediaStreamIds, RTCRtpSenderClient& client)52 RTCRtpSender::RTCRtpSender(const String& trackKind, Vector<String>&& mediaStreamIds, RTCRtpSenderClient& client) 52 53 : RTCRtpSenderReceiverBase() 53 54 , m_trackKind(trackKind) … … 55 56 , m_client(&client) 56 57 { 57 setTrack(WTFMove(track));58 58 } 59 59 60 void RTCRtpSender::setTrack(Ref Ptr<MediaStreamTrack>&& track)60 void RTCRtpSender::setTrack(Ref<MediaStreamTrack>&& track) 61 61 { 62 // Save the id from the first non-null track set. That id will be used to negotiate the sender 63 // even if the track is replaced. 64 if (!m_track && track) 65 m_trackId = track->id(); 66 62 ASSERT(!isStopped()); 63 ASSERT(!m_track); 64 m_trackId = track->id(); 67 65 m_track = WTFMove(track); 68 66 } -
trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h
r209390 r213736 40 40 class RTCRtpSenderClient { 41 41 public: 42 virtual void replaceTrack(RTCRtpSender&, Ref Ptr<MediaStreamTrack>&&, DOMPromise<void>&&) = 0;42 virtual void replaceTrack(RTCRtpSender&, Ref<MediaStreamTrack>&&, DOMPromise<void>&&) = 0; 43 43 44 44 virtual ~RTCRtpSenderClient() { } … … 58 58 bool isStopped() const { return !m_client; } 59 59 void stop() { m_client = nullptr; } 60 void setTrack(Ref Ptr<MediaStreamTrack>&&);60 void setTrack(Ref<MediaStreamTrack>&&); 61 61 62 62 ExceptionOr<void> replaceTrack(Ref<MediaStreamTrack>&&, DOMPromise<void>&&); 63 63 64 64 private: 65 RTCRtpSender( RefPtr<MediaStreamTrack>&&,const String& trackKind, Vector<String>&& mediaStreamIds, RTCRtpSenderClient&);65 RTCRtpSender(const String& trackKind, Vector<String>&& mediaStreamIds, RTCRtpSenderClient&); 66 66 67 67 String m_trackId; -
trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp
r213520 r213736 159 159 } 160 160 161 static inline std::string streamId(RTCPeerConnection& connection) 162 { 163 auto& senders = connection.getSenders(); 164 if (senders.size()) { 165 for (RTCRtpSender& sender : senders) { 166 auto* track = sender.track(); 167 if (track) { 168 ASSERT(sender.mediaStreamIds().size() == 1); 169 return std::string(sender.mediaStreamIds().first().utf8().data()); 170 } 171 } 172 } 173 return "av_label"; 161 void LibWebRTCMediaEndpoint::addTrack(MediaStreamTrack& track, const Vector<String>& mediaStreamIds) 162 { 163 if (!LibWebRTCProvider::factory()) 164 return; 165 166 std::vector<webrtc::MediaStreamInterface*> mediaStreams; 167 rtc::scoped_refptr<webrtc::MediaStreamInterface> mediaStream = nullptr; 168 if (mediaStreamIds.size()) { 169 // libwebrtc is only using the first one if any. 170 mediaStream = LibWebRTCProvider::factory()->CreateLocalMediaStream(mediaStreamIds[0].utf8().data()); 171 mediaStreams.push_back(mediaStream.get()); 172 } 173 174 auto& source = track.source(); 175 ASSERT(source.type() != RealtimeMediaSource::None); 176 177 if (source.type() == RealtimeMediaSource::Audio) { 178 auto trackSource = RealtimeOutgoingAudioSource::create(source); 179 auto audioTrack = LibWebRTCProvider::factory()->CreateAudioTrack(track.id().utf8().data(), trackSource.ptr()); 180 trackSource->setTrack(rtc::scoped_refptr<webrtc::AudioTrackInterface>(audioTrack)); 181 m_peerConnectionBackend.addAudioSource(WTFMove(trackSource)); 182 m_backend->AddTrack(audioTrack.get(), WTFMove(mediaStreams)); 183 } else { 184 auto videoSource = RealtimeOutgoingVideoSource::create(source); 185 auto videoTrack = LibWebRTCProvider::factory()->CreateVideoTrack(track.id().utf8().data(), videoSource.ptr()); 186 m_peerConnectionBackend.addVideoSource(WTFMove(videoSource)); 187 m_backend->AddTrack(videoTrack.get(), WTFMove(mediaStreams)); 188 } 174 189 } 175 190 … … 182 197 183 198 m_isInitiator = true; 184 auto& senders = m_peerConnectionBackend.connection().getSenders();185 if (senders.size()) {186 // FIXME: We only support one stream for the moment.187 auto stream = LibWebRTCProvider::factory()->CreateLocalMediaStream(streamId(m_peerConnectionBackend.connection()));188 for (RTCRtpSender& sender : senders) {189 auto* track = sender.track();190 if (track) {191 ASSERT(sender.mediaStreamIds().size() == 1);192 auto& source = track->source();193 if (source.type() == RealtimeMediaSource::Audio) {194 auto trackSource = RealtimeOutgoingAudioSource::create(source);195 auto rtcTrack = LibWebRTCProvider::factory()->CreateAudioTrack(track->id().utf8().data(), trackSource.ptr());196 trackSource->setTrack(rtc::scoped_refptr<webrtc::AudioTrackInterface>(rtcTrack));197 m_peerConnectionBackend.addAudioSource(WTFMove(trackSource));198 stream->AddTrack(WTFMove(rtcTrack));199 } else {200 auto videoSource = RealtimeOutgoingVideoSource::create(source);201 auto videoTrack = LibWebRTCProvider::factory()->CreateVideoTrack(track->id().utf8().data(), videoSource.ptr());202 m_peerConnectionBackend.addVideoSource(WTFMove(videoSource));203 stream->AddTrack(WTFMove(videoTrack));204 }205 }206 }207 m_backend->AddStream(stream);208 }209 199 m_backend->CreateOffer(&m_createSessionDescriptionObserver, nullptr); 210 200 } … … 218 208 219 209 m_isInitiator = false; 220 221 auto& senders = m_peerConnectionBackend.connection().getSenders();222 if (senders.size()) {223 // FIXME: We only support one stream for the moment.224 auto stream = LibWebRTCProvider::factory()->CreateLocalMediaStream(streamId(m_peerConnectionBackend.connection()));225 for (RTCRtpSender& sender : senders) {226 auto* track = sender.track();227 if (track) {228 ASSERT(sender.mediaStreamIds().size() == 1);229 auto& source = track->source();230 if (source.type() == RealtimeMediaSource::Audio) {231 auto trackSource = RealtimeOutgoingAudioSource::create(source);232 auto rtcTrack = LibWebRTCProvider::factory()->CreateAudioTrack(track->id().utf8().data(), trackSource.ptr());233 trackSource->setTrack(rtc::scoped_refptr<webrtc::AudioTrackInterface>(rtcTrack));234 m_peerConnectionBackend.addAudioSource(WTFMove(trackSource));235 stream->AddTrack(WTFMove(rtcTrack));236 } else {237 auto videoSource = RealtimeOutgoingVideoSource::create(source);238 auto videoTrack = LibWebRTCProvider::factory()->CreateVideoTrack(track->id().utf8().data(), videoSource.ptr());239 m_peerConnectionBackend.addVideoSource(WTFMove(videoSource));240 stream->AddTrack(WTFMove(videoTrack));241 }242 }243 }244 m_backend->AddStream(stream);245 }246 210 m_backend->CreateAnswer(&m_createSessionDescriptionObserver, nullptr); 247 211 } … … 249 213 void LibWebRTCMediaEndpoint::getStats(MediaStreamTrack* track, const DeferredPromise& promise) 250 214 { 215 UNUSED_PARAM(track); 216 UNUSED_PARAM(promise); 251 217 m_backend->GetStats(StatsCollector::create(*this, promise, track).get()); 252 218 } -
trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h
r213520 r213736 79 79 RefPtr<RTCSessionDescription> pendingLocalDescription() const; 80 80 RefPtr<RTCSessionDescription> pendingRemoteDescription() const; 81 82 void addTrack(MediaStreamTrack&, const Vector<String>&); 81 83 82 84 private: -
trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp
r213613 r213736 170 170 void LibWebRTCPeerConnectionBackend::doAddIceCandidate(RTCIceCandidate& candidate) 171 171 { 172 if (!m_isRemoteDescriptionSet) {173 addIceCandidateFailed(Exception { INVALID_STATE_ERR, "No remote description set" });174 return;175 }176 177 172 webrtc::SdpParseError error; 178 173 int sdpMLineIndex = candidate.sdpMLineIndex() ? candidate.sdpMLineIndex().value() : 0; … … 251 246 } 252 247 248 void LibWebRTCPeerConnectionBackend::notifyAddedTrack(RTCRtpSender& sender) 249 { 250 ASSERT(sender.track()); 251 m_endpoint->addTrack(*sender.track(), sender.mediaStreamIds()); 252 } 253 253 254 } // namespace WebCore 254 255 -
trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h
r213520 r213736 68 68 RefPtr<RTCSessionDescription> pendingRemoteDescription() const final; 69 69 70 void notifyAddedTrack(RTCRtpSender&) final; 70 71 // FIXME: API to implement for real 71 72 Vector<RefPtr<MediaStream>> getRemoteStreams() const final { return { }; } 72 void replaceTrack(RTCRtpSender&, Ref Ptr<MediaStreamTrack>&&, DOMPromise<void>&&) final { }73 void replaceTrack(RTCRtpSender&, Ref<MediaStreamTrack>&&, DOMPromise<void>&&) final { } 73 74 74 75 void emulatePlatformEvent(const String&) final { } -
trunk/Source/WebCore/testing/MockLibWebRTCPeerConnection.cpp
r213190 r213736 227 227 } 228 228 229 bool MockLibWebRTCPeerConnection::AddStream(webrtc::MediaStreamInterface* stream) 230 { 231 m_stream = stream; 229 rtc::scoped_refptr<webrtc::RtpSenderInterface> MockLibWebRTCPeerConnection::AddTrack(webrtc::MediaStreamTrackInterface* track, std::vector<webrtc::MediaStreamInterface*> streams) 230 { 232 231 LibWebRTCProvider::callOnWebRTCSignalingThread([observer = &m_observer] { 233 232 observer->OnRenegotiationNeeded(); 234 233 }); 235 return true; 236 } 237 238 void MockLibWebRTCPeerConnection::RemoveStream(webrtc::MediaStreamInterface*) 234 235 if (streams.size()) 236 m_streamLabel = streams.front()->label(); 237 238 m_senders.append(new rtc::RefCountedObject<MockRtpSender>(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>(track))); 239 return m_senders.last().get(); 240 } 241 242 bool MockLibWebRTCPeerConnection::RemoveTrack(webrtc::RtpSenderInterface* sender) 239 243 { 240 244 LibWebRTCProvider::callOnWebRTCSignalingThread([observer = &m_observer] { 241 245 observer->OnRenegotiationNeeded(); 242 246 }); 243 m_stream = nullptr; 247 bool isRemoved = false; 248 return m_senders.removeFirstMatching([&](auto& item) { 249 if (item.get() != sender) 250 return false; 251 isRemoved = true; 252 return true; 253 }); 244 254 } 245 255 … … 253 263 "s=-\r\n" 254 264 "t=0 0\r\n"; 255 if (m_s tream) {265 if (m_senders.size()) { 256 266 unsigned partCounter = 1; 257 sdp << "a=msid-semantic:WMS " << m_stream->label() << "\r\n"; 258 for (auto& audioTrack : m_stream->GetAudioTracks()) { 267 sdp << "a=msid-semantic:WMS " << m_streamLabel << "\r\n"; 268 for (auto& sender : m_senders) { 269 auto track = sender->track(); 270 if (track->kind() != "audio") 271 continue; 259 272 sdp << 260 273 "m=audio 9 UDP/TLS/RTP/SAVPF 111 8 0\r\n" … … 267 280 "a=rtpmap:0 PCMU/8000\r\n" 268 281 "a=ssrc:3409173717 cname:/chKzCS9K6KOgL0n\r\n" 269 "a=msid:" << m_stream ->label() << " " << audioTrack->id() << "\r\n"282 "a=msid:" << m_streamLabel << " " << track->id() << "\r\n" 270 283 "a=ice-ufrag:e/B1\r\n" 271 284 "a=ice-pwd:Yotk3Im3mnyi+1Q38p51MDub\r\n" … … 273 286 "a=setup:actpass\r\n"; 274 287 } 275 for (auto& videoTrack : m_stream->GetVideoTracks()) { 288 for (auto& sender : m_senders) { 289 auto track = sender->track(); 290 if (track->kind() != "video") 291 continue; 276 292 sdp << 277 293 "m=video 9 UDP/TLS/RTP/SAVPF 103 100 120\r\n" … … 291 307 "a=rtcp-fb:100 ccm fir\r\n" 292 308 "a=ssrc:3409173718 cname:/chKzCS9K6KOgL0n\r\n" 293 "a=msid:" << m_stream ->label() << " " << videoTrack->id() << "\r\n"309 "a=msid:" << m_streamLabel << " " << track->id() << "\r\n" 294 310 "a=ice-ufrag:e/B1\r\n" 295 311 "a=ice-pwd:Yotk3Im3mnyi+1Q38p51MDub\r\n" … … 312 328 "s=-\r\n" 313 329 "t=0 0\r\n"; 314 if (m_stream) { 315 for (auto& audioTrack : m_stream->GetAudioTracks()) { 316 ASSERT_UNUSED(audioTrack, !!audioTrack); 330 if (m_senders.size()) { 331 for (auto& sender : m_senders) { 332 auto track = sender->track(); 333 if (track->kind() != "audio") 334 continue; 317 335 sdp << 318 336 "m=audio 9 UDP/TLS/RTP/SAVPF 111 8 0\r\n" … … 330 348 "a=setup:active\r\n"; 331 349 } 332 for (auto& videoTrack : m_stream->GetVideoTracks()) { 333 ASSERT_UNUSED(videoTrack, !!videoTrack); 350 for (auto& sender : m_senders) { 351 auto track = sender->track(); 352 if (track->kind() != "video") 353 continue; 334 354 sdp << 335 355 "m=video 9 UDP/TLS/RTP/SAVPF 103 100 120\r\n" -
trunk/Source/WebCore/testing/MockLibWebRTCPeerConnection.h
r213418 r213736 35 35 36 36 class LibWebRTCProvider; 37 class MockRtpSender; 37 38 38 39 void useMockRTCPeerConnectionFactory(LibWebRTCProvider*, const String&); … … 59 60 void Close() override { } 60 61 62 bool AddStream(webrtc::MediaStreamInterface*) final { return false; } 63 void RemoveStream(webrtc::MediaStreamInterface*) final { } 64 61 65 protected: 62 66 void SetRemoteDescription(webrtc::SetSessionDescriptionObserver*, webrtc::SessionDescriptionInterface*) final; 63 67 void CreateAnswer(webrtc::CreateSessionDescriptionObserver*, const webrtc::MediaConstraintsInterface*) final; 64 68 rtc::scoped_refptr<webrtc::DataChannelInterface> CreateDataChannel(const std::string&, const webrtc::DataChannelInit*) final; 65 bool AddStream(webrtc::MediaStreamInterface*) final;66 void RemoveStream(webrtc::MediaStreamInterface*) final;69 rtc::scoped_refptr<webrtc::RtpSenderInterface> AddTrack(webrtc::MediaStreamTrackInterface*, std::vector<webrtc::MediaStreamInterface*> streams) final; 70 bool RemoveTrack(webrtc::RtpSenderInterface*) final; 67 71 68 72 void SetLocalDescription(webrtc::SetSessionDescriptionObserver*, webrtc::SessionDescriptionInterface*) override; … … 74 78 webrtc::PeerConnectionObserver& m_observer; 75 79 unsigned m_counter { 0 }; 76 rtc::scoped_refptr<webrtc::MediaStreamInterface> m_stream;80 Vector<rtc::scoped_refptr<MockRtpSender>> m_senders; 77 81 bool m_isInitiator { true }; 78 82 bool m_isReceivingAudio { false }; 79 83 bool m_isReceivingVideo { false }; 84 std::string m_streamLabel; 80 85 }; 81 86 … … 200 205 }; 201 206 207 class MockRtpSender : public webrtc::RtpSenderInterface { 208 public: 209 MockRtpSender(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>&& track) : m_track(WTFMove(track)) { } 210 211 bool SetTrack(webrtc::MediaStreamTrackInterface*) final { return false; } 212 rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> track() const final { return m_track; } 213 214 uint32_t ssrc() const { return 0; } 215 cricket::MediaType media_type() const { return cricket::MEDIA_TYPE_VIDEO; } 216 std::string id() const { return ""; } 217 std::vector<std::string> stream_ids() const { return { }; } 218 webrtc::RtpParameters GetParameters() const { return { }; } 219 bool SetParameters(const webrtc::RtpParameters&) { return false; } 220 rtc::scoped_refptr<webrtc::DtmfSenderInterface> GetDtmfSender() const { return nullptr; } 221 222 private: 223 rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> m_track; 224 }; 225 202 226 class MockLibWebRTCPeerConnectionFactory : public webrtc::PeerConnectionFactoryInterface { 203 227 public:
Note: See TracChangeset
for help on using the changeset viewer.