OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2011 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2011 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 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
225 typedef std::vector<SsrcGroup> SsrcGroupVec; | 225 typedef std::vector<SsrcGroup> SsrcGroupVec; |
226 | 226 |
227 template <class T> | 227 template <class T> |
228 static void AddFmtpLine(const T& codec, std::string* message); | 228 static void AddFmtpLine(const T& codec, std::string* message); |
229 static void BuildMediaDescription(const ContentInfo* content_info, | 229 static void BuildMediaDescription(const ContentInfo* content_info, |
230 const TransportInfo* transport_info, | 230 const TransportInfo* transport_info, |
231 const MediaType media_type, | 231 const MediaType media_type, |
232 const std::vector<Candidate>& candidates, | 232 const std::vector<Candidate>& candidates, |
233 bool unified_plan_sdp, | 233 bool unified_plan_sdp, |
234 std::string* message); | 234 std::string* message); |
235 static void BuildSctpContentAttributes(std::string* message, int sctp_port); | 235 static void BuildSctpContentAttributes(std::string* message, |
236 int sctp_port, | |
237 bool use_sctpmap); | |
236 static void BuildRtpContentAttributes(const MediaContentDescription* media_desc, | 238 static void BuildRtpContentAttributes(const MediaContentDescription* media_desc, |
237 const MediaType media_type, | 239 const MediaType media_type, |
238 bool unified_plan_sdp, | 240 bool unified_plan_sdp, |
239 std::string* message); | 241 std::string* message); |
240 static void BuildRtpMap(const MediaContentDescription* media_desc, | 242 static void BuildRtpMap(const MediaContentDescription* media_desc, |
241 const MediaType media_type, | 243 const MediaType media_type, |
242 std::string* message); | 244 std::string* message); |
243 static void BuildCandidate(const std::vector<Candidate>& candidates, | 245 static void BuildCandidate(const std::vector<Candidate>& candidates, |
244 bool include_ufrag, | 246 bool include_ufrag, |
245 std::string* message); | 247 std::string* message); |
(...skipping 1010 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1256 it != audio_desc->codecs().end(); ++it) { | 1258 it != audio_desc->codecs().end(); ++it) { |
1257 fmt.append(" "); | 1259 fmt.append(" "); |
1258 fmt.append(rtc::ToString<int>(it->id)); | 1260 fmt.append(rtc::ToString<int>(it->id)); |
1259 } | 1261 } |
1260 } else if (media_type == cricket::MEDIA_TYPE_DATA) { | 1262 } else if (media_type == cricket::MEDIA_TYPE_DATA) { |
1261 const DataContentDescription* data_desc = | 1263 const DataContentDescription* data_desc = |
1262 static_cast<const DataContentDescription*>(media_desc); | 1264 static_cast<const DataContentDescription*>(media_desc); |
1263 if (IsDtlsSctp(media_desc->protocol())) { | 1265 if (IsDtlsSctp(media_desc->protocol())) { |
1264 fmt.append(" "); | 1266 fmt.append(" "); |
1265 | 1267 |
1266 for (std::vector<cricket::DataCodec>::const_iterator it = | 1268 if (data_desc->use_sctpmap()) { |
1267 data_desc->codecs().begin(); | 1269 for (std::vector<cricket::DataCodec>::const_iterator it = |
1268 it != data_desc->codecs().end(); ++it) { | 1270 data_desc->codecs().begin(); |
1269 if (cricket::CodecNamesEq(it->name, cricket::kGoogleSctpDataCodecName) | 1271 it != data_desc->codecs().end(); ++it) { |
1270 && it->GetParam(cricket::kCodecParamPort, &sctp_port)) { | 1272 if (cricket::CodecNamesEq(it->name, |
1271 break; | 1273 cricket::kGoogleSctpDataCodecName) && |
1274 it->GetParam(cricket::kCodecParamPort, &sctp_port)) { | |
1275 break; | |
1276 } | |
1272 } | 1277 } |
1278 | |
1279 fmt.append(rtc::ToString<int>(sctp_port)); | |
1280 } else { | |
1281 fmt.append(kDefaultSctpmapProtocol); | |
1273 } | 1282 } |
1274 | |
1275 fmt.append(rtc::ToString<int>(sctp_port)); | |
1276 } else { | 1283 } else { |
1277 for (std::vector<cricket::DataCodec>::const_iterator it = | 1284 for (std::vector<cricket::DataCodec>::const_iterator it = |
1278 data_desc->codecs().begin(); | 1285 data_desc->codecs().begin(); |
1279 it != data_desc->codecs().end(); ++it) { | 1286 it != data_desc->codecs().end(); ++it) { |
1280 fmt.append(" "); | 1287 fmt.append(" "); |
1281 fmt.append(rtc::ToString<int>(it->id)); | 1288 fmt.append(rtc::ToString<int>(it->id)); |
1282 } | 1289 } |
1283 } | 1290 } |
1284 } | 1291 } |
1285 // The fmt must never be empty. If no codecs are found, set the fmt attribute | 1292 // The fmt must never be empty. If no codecs are found, set the fmt attribute |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1388 | 1395 |
1389 // RFC 3388 | 1396 // RFC 3388 |
1390 // mid-attribute = "a=mid:" identification-tag | 1397 // mid-attribute = "a=mid:" identification-tag |
1391 // identification-tag = token | 1398 // identification-tag = token |
1392 // Use the content name as the mid identification-tag. | 1399 // Use the content name as the mid identification-tag. |
1393 InitAttrLine(kAttributeMid, &os); | 1400 InitAttrLine(kAttributeMid, &os); |
1394 os << kSdpDelimiterColon << content_info->name; | 1401 os << kSdpDelimiterColon << content_info->name; |
1395 AddLine(os.str(), message); | 1402 AddLine(os.str(), message); |
1396 | 1403 |
1397 if (IsDtlsSctp(media_desc->protocol())) { | 1404 if (IsDtlsSctp(media_desc->protocol())) { |
1398 BuildSctpContentAttributes(message, sctp_port); | 1405 const DataContentDescription* data_desc = |
1406 static_cast<const DataContentDescription*>(media_desc); | |
1407 bool use_sctpmap = data_desc != nullptr ? data_desc->use_sctpmap() : true; | |
Taylor Brandstetter
2017/02/17 02:10:56
It won't be possible for data_desc to be nullptr h
Zach Stein
2017/02/17 21:29:17
Done. This is the block I would like to try and mo
| |
1408 BuildSctpContentAttributes(message, sctp_port, use_sctpmap); | |
1399 } else if (IsRtp(media_desc->protocol())) { | 1409 } else if (IsRtp(media_desc->protocol())) { |
1400 BuildRtpContentAttributes(media_desc, media_type, unified_plan_sdp, | 1410 BuildRtpContentAttributes(media_desc, media_type, unified_plan_sdp, |
1401 message); | 1411 message); |
1402 } | 1412 } |
1403 } | 1413 } |
1404 | 1414 |
1405 void BuildSctpContentAttributes(std::string* message, int sctp_port) { | 1415 void BuildSctpContentAttributes(std::string* message, |
1406 // draft-ietf-mmusic-sctp-sdp-04 | 1416 int sctp_port, |
1407 // a=sctpmap:sctpmap-number protocol [streams] | 1417 bool use_sctpmap) { |
1408 // TODO(lally): switch this over to mmusic-sctp-sdp-12 (or later), with | |
1409 // 'a=sctp-port:' | |
1410 std::ostringstream os; | 1418 std::ostringstream os; |
1411 InitAttrLine(kAttributeSctpmap, &os); | 1419 if (use_sctpmap) { |
1412 os << kSdpDelimiterColon << sctp_port << kSdpDelimiterSpace | 1420 // draft-ietf-mmusic-sctp-sdp-04 |
1413 << kDefaultSctpmapProtocol << kSdpDelimiterSpace | 1421 // a=sctpmap:sctpmap-number protocol [streams] |
1414 << cricket::kMaxSctpStreams; | 1422 InitAttrLine(kAttributeSctpmap, &os); |
1423 os << kSdpDelimiterColon << sctp_port << kSdpDelimiterSpace | |
1424 << kDefaultSctpmapProtocol << kSdpDelimiterSpace | |
1425 << cricket::kMaxSctpStreams; | |
1426 } else { | |
1427 // draft-ietf-mmusic-sctp-sdp-23 | |
1428 // a=sctp-port:<port> | |
1429 InitAttrLine(kAttributeSctpPort, &os); | |
1430 os << kSdpDelimiterColon << sctp_port; | |
1431 // TODO(zstein): emit max-message-size here | |
1432 } | |
1415 AddLine(os.str(), message); | 1433 AddLine(os.str(), message); |
1416 } | 1434 } |
1417 | 1435 |
1418 // If unified_plan_sdp is true, will use "a=msid". | 1436 // If unified_plan_sdp is true, will use "a=msid". |
1419 void BuildRtpContentAttributes(const MediaContentDescription* media_desc, | 1437 void BuildRtpContentAttributes(const MediaContentDescription* media_desc, |
1420 const MediaType media_type, | 1438 const MediaType media_type, |
1421 bool unified_plan_sdp, | 1439 bool unified_plan_sdp, |
1422 std::string* message) { | 1440 std::string* message) { |
1423 std::ostringstream os; | 1441 std::ostringstream os; |
1424 // RFC 5285 | 1442 // RFC 5285 |
(...skipping 840 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2265 | 2283 |
2266 // Zero or more media descriptions | 2284 // Zero or more media descriptions |
2267 // RFC 4566 | 2285 // RFC 4566 |
2268 // m=<media> <port> <proto> <fmt> | 2286 // m=<media> <port> <proto> <fmt> |
2269 while (GetLineWithType(message, pos, &line, kLineTypeMedia)) { | 2287 while (GetLineWithType(message, pos, &line, kLineTypeMedia)) { |
2270 ++mline_index; | 2288 ++mline_index; |
2271 | 2289 |
2272 std::vector<std::string> fields; | 2290 std::vector<std::string> fields; |
2273 rtc::split(line.substr(kLinePrefixLength), | 2291 rtc::split(line.substr(kLinePrefixLength), |
2274 kSdpDelimiterSpace, &fields); | 2292 kSdpDelimiterSpace, &fields); |
2293 | |
2275 const size_t expected_min_fields = 4; | 2294 const size_t expected_min_fields = 4; |
2276 if (fields.size() < expected_min_fields) { | 2295 if (fields.size() < expected_min_fields) { |
2277 return ParseFailedExpectMinFieldNum(line, expected_min_fields, error); | 2296 return ParseFailedExpectMinFieldNum(line, expected_min_fields, error); |
2278 } | 2297 } |
2279 bool port_rejected = false; | 2298 bool port_rejected = false; |
2280 // RFC 3264 | 2299 // RFC 3264 |
2281 // To reject an offered stream, the port number in the corresponding stream | 2300 // To reject an offered stream, the port number in the corresponding stream |
2282 // in the answer MUST be set to zero. | 2301 // in the answer MUST be set to zero. |
2283 if (fields[1] == kMediaPortRejected) { | 2302 if (fields[1] == kMediaPortRejected) { |
2284 port_rejected = true; | 2303 port_rejected = true; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2325 payload_types, pos, &content_name, &bundle_only, &transport, | 2344 payload_types, pos, &content_name, &bundle_only, &transport, |
2326 candidates, error)); | 2345 candidates, error)); |
2327 } else if (HasAttribute(line, kMediaTypeData)) { | 2346 } else if (HasAttribute(line, kMediaTypeData)) { |
2328 DataContentDescription* data_desc = | 2347 DataContentDescription* data_desc = |
2329 ParseContentDescription<DataContentDescription>( | 2348 ParseContentDescription<DataContentDescription>( |
2330 message, cricket::MEDIA_TYPE_DATA, mline_index, protocol, | 2349 message, cricket::MEDIA_TYPE_DATA, mline_index, protocol, |
2331 payload_types, pos, &content_name, &bundle_only, &transport, | 2350 payload_types, pos, &content_name, &bundle_only, &transport, |
2332 candidates, error); | 2351 candidates, error); |
2333 content.reset(data_desc); | 2352 content.reset(data_desc); |
2334 | 2353 |
2335 int p; | 2354 if (data_desc && IsDtlsSctp(protocol)) { |
2336 if (data_desc && IsDtlsSctp(protocol) && rtc::FromString(fields[3], &p)) { | 2355 int p; |
2337 if (!AddSctpDataCodec(data_desc, p)) | 2356 if (rtc::FromString(fields[3], &p)) { |
2338 return false; | 2357 if (!AddSctpDataCodec(data_desc, p)) { |
2358 return false; | |
2359 } | |
2360 } else if (fields[3] == kDefaultSctpmapProtocol) { | |
2361 data_desc->set_use_sctpmap(false); | |
2362 } | |
2339 } | 2363 } |
2340 } else { | 2364 } else { |
2341 LOG(LS_WARNING) << "Unsupported media type: " << line; | 2365 LOG(LS_WARNING) << "Unsupported media type: " << line; |
2342 continue; | 2366 continue; |
2343 } | 2367 } |
2344 if (!content.get()) { | 2368 if (!content.get()) { |
2345 // ParseContentDescription returns NULL if failed. | 2369 // ParseContentDescription returns NULL if failed. |
2346 return false; | 2370 return false; |
2347 } | 2371 } |
2348 | 2372 |
(...skipping 844 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3193 UpdateCodec<AudioContentDescription, cricket::AudioCodec>( | 3217 UpdateCodec<AudioContentDescription, cricket::AudioCodec>( |
3194 media_desc, payload_type, feedback_param); | 3218 media_desc, payload_type, feedback_param); |
3195 } else if (media_type == cricket::MEDIA_TYPE_VIDEO) { | 3219 } else if (media_type == cricket::MEDIA_TYPE_VIDEO) { |
3196 UpdateCodec<VideoContentDescription, cricket::VideoCodec>( | 3220 UpdateCodec<VideoContentDescription, cricket::VideoCodec>( |
3197 media_desc, payload_type, feedback_param); | 3221 media_desc, payload_type, feedback_param); |
3198 } | 3222 } |
3199 return true; | 3223 return true; |
3200 } | 3224 } |
3201 | 3225 |
3202 } // namespace webrtc | 3226 } // namespace webrtc |
OLD | NEW |