OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 1092 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1103 stream->RegisterObserver(this); | 1103 stream->RegisterObserver(this); |
1104 for (auto& track : stream->getTracks()) { | 1104 for (auto& track : stream->getTracks()) { |
1105 DCHECK(track->Component()); | 1105 DCHECK(track->Component()); |
1106 tracks_.insert(track->Component(), track); | 1106 tracks_.insert(track->Component(), track); |
1107 } | 1107 } |
1108 | 1108 |
1109 bool valid = peer_handler_->AddStream(stream->Descriptor(), constraints); | 1109 bool valid = peer_handler_->AddStream(stream->Descriptor(), constraints); |
1110 if (!valid) | 1110 if (!valid) |
1111 exception_state.ThrowDOMException(kSyntaxError, | 1111 exception_state.ThrowDOMException(kSyntaxError, |
1112 "Unable to add the provided stream."); | 1112 "Unable to add the provided stream."); |
| 1113 // Ensure |rtp_senders_| is up-to-date. |
| 1114 getSenders(); |
1113 } | 1115 } |
1114 | 1116 |
1115 void RTCPeerConnection::removeStream(MediaStream* stream, | 1117 void RTCPeerConnection::removeStream(MediaStream* stream, |
1116 ExceptionState& exception_state) { | 1118 ExceptionState& exception_state) { |
1117 if (ThrowExceptionIfSignalingStateClosed(signaling_state_, exception_state)) | 1119 if (ThrowExceptionIfSignalingStateClosed(signaling_state_, exception_state)) |
1118 return; | 1120 return; |
1119 | 1121 |
1120 if (!stream) { | 1122 if (!stream) { |
1121 exception_state.ThrowDOMException( | 1123 exception_state.ThrowDOMException( |
1122 kTypeMismatchError, | 1124 kTypeMismatchError, |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1229 DCHECK(track); | 1231 DCHECK(track); |
1230 RTCRtpReceiver* rtp_receiver = | 1232 RTCRtpReceiver* rtp_receiver = |
1231 new RTCRtpReceiver(std::move(web_rtp_receivers[i]), track); | 1233 new RTCRtpReceiver(std::move(web_rtp_receivers[i]), track); |
1232 rtp_receivers_.insert(id, rtp_receiver); | 1234 rtp_receivers_.insert(id, rtp_receiver); |
1233 rtp_receivers[i] = rtp_receiver; | 1235 rtp_receivers[i] = rtp_receiver; |
1234 } | 1236 } |
1235 } | 1237 } |
1236 return rtp_receivers; | 1238 return rtp_receivers; |
1237 } | 1239 } |
1238 | 1240 |
| 1241 RTCRtpSender* RTCPeerConnection::addTrack(MediaStreamTrack* track, |
| 1242 MediaStreamVector streams, |
| 1243 ExceptionState& exception_state) { |
| 1244 DCHECK(track); |
| 1245 DCHECK(track->Component()); |
| 1246 if (ThrowExceptionIfSignalingStateClosed(signaling_state_, exception_state)) |
| 1247 return nullptr; |
| 1248 if (streams.size() >= 2) { |
| 1249 // TODO(hbos): Don't throw an exception when this is supported by the lower |
| 1250 // layers. https://crbug.com/webrtc/7932 |
| 1251 exception_state.ThrowDOMException( |
| 1252 kNotSupportedError, |
| 1253 "Adding a track to multiple streams is not supported."); |
| 1254 return nullptr; |
| 1255 } |
| 1256 for (const auto sender_entry : rtp_senders_) { |
| 1257 RTCRtpSender* sender = sender_entry.value; |
| 1258 if (sender->track() == track) { |
| 1259 exception_state.ThrowDOMException( |
| 1260 kInvalidAccessError, "A sender already exists for the track."); |
| 1261 return nullptr; |
| 1262 } |
| 1263 } |
| 1264 |
| 1265 WebVector<WebMediaStream> web_streams(streams.size()); |
| 1266 for (size_t i = 0; i < streams.size(); ++i) { |
| 1267 web_streams[i] = streams[i]->Descriptor(); |
| 1268 } |
| 1269 std::unique_ptr<WebRTCRtpSender> web_rtp_sender = |
| 1270 peer_handler_->AddTrack(track->Component(), web_streams); |
| 1271 if (!web_rtp_sender) { |
| 1272 exception_state.ThrowDOMException( |
| 1273 kNotSupportedError, "A sender could not be created for this track."); |
| 1274 return nullptr; |
| 1275 } |
| 1276 |
| 1277 uintptr_t id = web_rtp_sender->Id(); |
| 1278 DCHECK(rtp_senders_.find(id) == rtp_senders_.end()); |
| 1279 RTCRtpSender* rtp_sender = new RTCRtpSender(std::move(web_rtp_sender), track); |
| 1280 tracks_.insert(track->Component(), track); |
| 1281 rtp_senders_.insert(id, rtp_sender); |
| 1282 return rtp_sender; |
| 1283 } |
| 1284 |
| 1285 void RTCPeerConnection::removeTrack(RTCRtpSender* sender, |
| 1286 ExceptionState& exception_state) { |
| 1287 DCHECK(sender); |
| 1288 if (ThrowExceptionIfSignalingStateClosed(signaling_state_, exception_state)) |
| 1289 return; |
| 1290 if (rtp_senders_.find(sender->web_rtp_sender()->Id()) == rtp_senders_.end()) { |
| 1291 exception_state.ThrowDOMException( |
| 1292 kInvalidAccessError, |
| 1293 "The sender was not created by this peer connection."); |
| 1294 } |
| 1295 |
| 1296 if (!peer_handler_->RemoveTrack(sender->web_rtp_sender())) { |
| 1297 // Operation aborted. This indicates that the sender is no longer used by |
| 1298 // the peer connection, i.e. that it was removed due to setting a remote |
| 1299 // description of type "rollback". |
| 1300 // Note: Until the WebRTC library supports re-using senders, a sender will |
| 1301 // also stop being used as a result of being removed. |
| 1302 return; |
| 1303 } |
| 1304 // Successfully removing the track results in the sender's track property |
| 1305 // being nulled. |
| 1306 DCHECK(!sender->web_rtp_sender()->Track()); |
| 1307 sender->SetTrack(nullptr); |
| 1308 } |
| 1309 |
1239 RTCDataChannel* RTCPeerConnection::createDataChannel( | 1310 RTCDataChannel* RTCPeerConnection::createDataChannel( |
1240 ScriptState* script_state, | 1311 ScriptState* script_state, |
1241 String label, | 1312 String label, |
1242 const RTCDataChannelInit& data_channel_dict, | 1313 const RTCDataChannelInit& data_channel_dict, |
1243 ExceptionState& exception_state) { | 1314 ExceptionState& exception_state) { |
1244 if (ThrowExceptionIfSignalingStateClosed(signaling_state_, exception_state)) | 1315 if (ThrowExceptionIfSignalingStateClosed(signaling_state_, exception_state)) |
1245 return nullptr; | 1316 return nullptr; |
1246 | 1317 |
1247 WebRTCDataChannelInit init; | 1318 WebRTCDataChannelInit init; |
1248 init.ordered = data_channel_dict.ordered(); | 1319 init.ordered = data_channel_dict.ordered(); |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1584 visitor->Trace(rtp_senders_); | 1655 visitor->Trace(rtp_senders_); |
1585 visitor->Trace(rtp_receivers_); | 1656 visitor->Trace(rtp_receivers_); |
1586 visitor->Trace(dispatch_scheduled_event_runner_); | 1657 visitor->Trace(dispatch_scheduled_event_runner_); |
1587 visitor->Trace(scheduled_events_); | 1658 visitor->Trace(scheduled_events_); |
1588 EventTargetWithInlineData::Trace(visitor); | 1659 EventTargetWithInlineData::Trace(visitor); |
1589 SuspendableObject::Trace(visitor); | 1660 SuspendableObject::Trace(visitor); |
1590 MediaStreamObserver::Trace(visitor); | 1661 MediaStreamObserver::Trace(visitor); |
1591 } | 1662 } |
1592 | 1663 |
1593 } // namespace blink | 1664 } // namespace blink |
OLD | NEW |