OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2004 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2004 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 10 matching lines...) Expand all Loading... |
21 #include "webrtc/base/base64.h" | 21 #include "webrtc/base/base64.h" |
22 #include "webrtc/base/helpers.h" | 22 #include "webrtc/base/helpers.h" |
23 #include "webrtc/base/logging.h" | 23 #include "webrtc/base/logging.h" |
24 #include "webrtc/base/stringutils.h" | 24 #include "webrtc/base/stringutils.h" |
25 #include "webrtc/media/base/cryptoparams.h" | 25 #include "webrtc/media/base/cryptoparams.h" |
26 #include "webrtc/media/base/mediaconstants.h" | 26 #include "webrtc/media/base/mediaconstants.h" |
27 #include "webrtc/p2p/base/p2pconstants.h" | 27 #include "webrtc/p2p/base/p2pconstants.h" |
28 #include "webrtc/pc/channelmanager.h" | 28 #include "webrtc/pc/channelmanager.h" |
29 #include "webrtc/pc/srtpfilter.h" | 29 #include "webrtc/pc/srtpfilter.h" |
30 | 30 |
31 #ifdef HAVE_SCTP | |
32 #include "webrtc/media/sctp/sctpdataengine.h" | |
33 #else | |
34 static const uint32_t kMaxSctpSid = 1023; | |
35 #endif | |
36 | |
37 namespace { | 31 namespace { |
38 const char kInline[] = "inline:"; | 32 const char kInline[] = "inline:"; |
39 | 33 |
40 void GetSupportedCryptoSuiteNames(void (*func)(const rtc::CryptoOptions&, | 34 void GetSupportedCryptoSuiteNames(void (*func)(const rtc::CryptoOptions&, |
41 std::vector<int>*), | 35 std::vector<int>*), |
42 const rtc::CryptoOptions& crypto_options, | 36 const rtc::CryptoOptions& crypto_options, |
43 std::vector<std::string>* names) { | 37 std::vector<std::string>* names) { |
44 #ifdef HAVE_SRTP | 38 #ifdef HAVE_SRTP |
45 std::vector<int> crypto_suites; | 39 std::vector<int> crypto_suites; |
46 func(crypto_options, &crypto_suites); | 40 func(crypto_options, &crypto_suites); |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 for (int i = 0; i < num_ssrcs; i++) { | 269 for (int i = 0; i < num_ssrcs; i++) { |
276 uint32_t candidate; | 270 uint32_t candidate; |
277 do { | 271 do { |
278 candidate = rtc::CreateRandomNonZeroId(); | 272 candidate = rtc::CreateRandomNonZeroId(); |
279 } while (GetStreamBySsrc(params_vec, candidate) || | 273 } while (GetStreamBySsrc(params_vec, candidate) || |
280 std::count(ssrcs->begin(), ssrcs->end(), candidate) > 0); | 274 std::count(ssrcs->begin(), ssrcs->end(), candidate) > 0); |
281 ssrcs->push_back(candidate); | 275 ssrcs->push_back(candidate); |
282 } | 276 } |
283 } | 277 } |
284 | 278 |
285 // Returns false if we exhaust the range of SIDs. | |
286 static bool GenerateSctpSid(const StreamParamsVec& params_vec, uint32_t* sid) { | |
287 if (params_vec.size() > kMaxSctpSid) { | |
288 LOG(LS_WARNING) << | |
289 "Could not generate an SCTP SID: too many SCTP streams."; | |
290 return false; | |
291 } | |
292 while (true) { | |
293 uint32_t candidate = rtc::CreateRandomNonZeroId() % kMaxSctpSid; | |
294 if (!GetStreamBySsrc(params_vec, candidate)) { | |
295 *sid = candidate; | |
296 return true; | |
297 } | |
298 } | |
299 } | |
300 | |
301 static bool GenerateSctpSids(const StreamParamsVec& params_vec, | |
302 std::vector<uint32_t>* sids) { | |
303 uint32_t sid; | |
304 if (!GenerateSctpSid(params_vec, &sid)) { | |
305 LOG(LS_WARNING) << "Could not generated an SCTP SID."; | |
306 return false; | |
307 } | |
308 sids->push_back(sid); | |
309 return true; | |
310 } | |
311 | |
312 // Finds all StreamParams of all media types and attach them to stream_params. | 279 // Finds all StreamParams of all media types and attach them to stream_params. |
313 static void GetCurrentStreamParams(const SessionDescription* sdesc, | 280 static void GetCurrentStreamParams(const SessionDescription* sdesc, |
314 StreamParamsVec* stream_params) { | 281 StreamParamsVec* stream_params) { |
315 if (!sdesc) | 282 if (!sdesc) |
316 return; | 283 return; |
317 | 284 |
318 const ContentInfos& contents = sdesc->contents(); | 285 const ContentInfos& contents = sdesc->contents(); |
319 for (ContentInfos::const_iterator content = contents.begin(); | 286 for (ContentInfos::const_iterator content = contents.begin(); |
320 content != contents.end(); ++content) { | 287 content != contents.end(); ++content) { |
321 if (!IsMediaContent(&*content)) { | 288 if (!IsMediaContent(&*content)) { |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
447 | 414 |
448 // Adds a StreamParams for each Stream in Streams with media type | 415 // Adds a StreamParams for each Stream in Streams with media type |
449 // media_type to content_description. | 416 // media_type to content_description. |
450 // |current_params| - All currently known StreamParams of any media type. | 417 // |current_params| - All currently known StreamParams of any media type. |
451 template <class C> | 418 template <class C> |
452 static bool AddStreamParams(MediaType media_type, | 419 static bool AddStreamParams(MediaType media_type, |
453 const MediaSessionOptions& options, | 420 const MediaSessionOptions& options, |
454 StreamParamsVec* current_streams, | 421 StreamParamsVec* current_streams, |
455 MediaContentDescriptionImpl<C>* content_description, | 422 MediaContentDescriptionImpl<C>* content_description, |
456 const bool add_legacy_stream) { | 423 const bool add_legacy_stream) { |
| 424 // SCTP streams are not negotiated using SDP/ContentDescriptions. |
| 425 if (IsSctp(content_description)) { |
| 426 return true; |
| 427 } |
| 428 |
457 const bool include_rtx_streams = | 429 const bool include_rtx_streams = |
458 ContainsRtxCodec(content_description->codecs()); | 430 ContainsRtxCodec(content_description->codecs()); |
459 | 431 |
460 const MediaSessionOptions::Streams& streams = options.streams; | 432 const MediaSessionOptions::Streams& streams = options.streams; |
461 if (streams.empty() && add_legacy_stream) { | 433 if (streams.empty() && add_legacy_stream) { |
462 // TODO(perkj): Remove this legacy stream when all apps use StreamParams. | 434 // TODO(perkj): Remove this legacy stream when all apps use StreamParams. |
463 std::vector<uint32_t> ssrcs; | 435 std::vector<uint32_t> ssrcs; |
464 if (IsSctp(content_description)) { | 436 int num_ssrcs = include_rtx_streams ? 2 : 1; |
465 GenerateSctpSids(*current_streams, &ssrcs); | 437 GenerateSsrcs(*current_streams, num_ssrcs, &ssrcs); |
466 } else { | |
467 int num_ssrcs = include_rtx_streams ? 2 : 1; | |
468 GenerateSsrcs(*current_streams, num_ssrcs, &ssrcs); | |
469 } | |
470 if (include_rtx_streams) { | 438 if (include_rtx_streams) { |
471 content_description->AddLegacyStream(ssrcs[0], ssrcs[1]); | 439 content_description->AddLegacyStream(ssrcs[0], ssrcs[1]); |
472 content_description->set_multistream(true); | 440 content_description->set_multistream(true); |
473 } else { | 441 } else { |
474 content_description->AddLegacyStream(ssrcs[0]); | 442 content_description->AddLegacyStream(ssrcs[0]); |
475 } | 443 } |
476 return true; | 444 return true; |
477 } | 445 } |
478 | 446 |
479 MediaSessionOptions::Streams::const_iterator stream_it; | 447 MediaSessionOptions::Streams::const_iterator stream_it; |
480 for (stream_it = streams.begin(); | 448 for (stream_it = streams.begin(); |
481 stream_it != streams.end(); ++stream_it) { | 449 stream_it != streams.end(); ++stream_it) { |
482 if (stream_it->type != media_type) | 450 if (stream_it->type != media_type) |
483 continue; // Wrong media type. | 451 continue; // Wrong media type. |
484 | 452 |
485 const StreamParams* param = | 453 const StreamParams* param = |
486 GetStreamByIds(*current_streams, "", stream_it->id); | 454 GetStreamByIds(*current_streams, "", stream_it->id); |
487 // groupid is empty for StreamParams generated using | 455 // groupid is empty for StreamParams generated using |
488 // MediaSessionDescriptionFactory. | 456 // MediaSessionDescriptionFactory. |
489 if (!param) { | 457 if (!param) { |
490 // This is a new stream. | 458 // This is a new stream. |
491 std::vector<uint32_t> ssrcs; | 459 std::vector<uint32_t> ssrcs; |
492 if (IsSctp(content_description)) { | 460 GenerateSsrcs(*current_streams, stream_it->num_sim_layers, &ssrcs); |
493 GenerateSctpSids(*current_streams, &ssrcs); | |
494 } else { | |
495 GenerateSsrcs(*current_streams, stream_it->num_sim_layers, &ssrcs); | |
496 } | |
497 StreamParams stream_param; | 461 StreamParams stream_param; |
498 stream_param.id = stream_it->id; | 462 stream_param.id = stream_it->id; |
499 // Add the generated ssrc. | 463 // Add the generated ssrc. |
500 for (size_t i = 0; i < ssrcs.size(); ++i) { | 464 for (size_t i = 0; i < ssrcs.size(); ++i) { |
501 stream_param.ssrcs.push_back(ssrcs[i]); | 465 stream_param.ssrcs.push_back(ssrcs[i]); |
502 } | 466 } |
503 if (stream_it->num_sim_layers > 1) { | 467 if (stream_it->num_sim_layers > 1) { |
504 SsrcGroup group(kSimSsrcGroupSemantics, stream_param.ssrcs); | 468 SsrcGroup group(kSimSsrcGroupSemantics, stream_param.ssrcs); |
505 stream_param.ssrc_groups.push_back(group); | 469 stream_param.ssrc_groups.push_back(group); |
506 } | 470 } |
(...skipping 1687 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2194 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO)); | 2158 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO)); |
2195 } | 2159 } |
2196 | 2160 |
2197 DataContentDescription* GetFirstDataContentDescription( | 2161 DataContentDescription* GetFirstDataContentDescription( |
2198 SessionDescription* sdesc) { | 2162 SessionDescription* sdesc) { |
2199 return static_cast<DataContentDescription*>( | 2163 return static_cast<DataContentDescription*>( |
2200 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA)); | 2164 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA)); |
2201 } | 2165 } |
2202 | 2166 |
2203 } // namespace cricket | 2167 } // namespace cricket |
OLD | NEW |