| 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 559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 570 cricket::IsValidRtpPayloadType(*payload_type); | 570 cricket::IsValidRtpPayloadType(*payload_type); |
| 571 } | 571 } |
| 572 | 572 |
| 573 // |msid_stream_id| and |msid_track_id| represent the stream/track ID from the | 573 // |msid_stream_id| and |msid_track_id| represent the stream/track ID from the |
| 574 // "a=msid" attribute, if it exists. They are empty if the attribute does not | 574 // "a=msid" attribute, if it exists. They are empty if the attribute does not |
| 575 // exist. | 575 // exist. |
| 576 void CreateTracksFromSsrcInfos(const SsrcInfoVec& ssrc_infos, | 576 void CreateTracksFromSsrcInfos(const SsrcInfoVec& ssrc_infos, |
| 577 const std::string& msid_stream_id, | 577 const std::string& msid_stream_id, |
| 578 const std::string& msid_track_id, | 578 const std::string& msid_track_id, |
| 579 StreamParamsVec* tracks) { | 579 StreamParamsVec* tracks) { |
| 580 RTC_DCHECK(tracks != NULL); | 580 RTC_DCHECK(tracks != nullptr); |
| 581 RTC_DCHECK(msid_stream_id.empty() == msid_track_id.empty()); | 581 RTC_DCHECK(msid_stream_id.empty() == msid_track_id.empty()); |
| 582 for (SsrcInfoVec::const_iterator ssrc_info = ssrc_infos.begin(); | 582 for (SsrcInfoVec::const_iterator ssrc_info = ssrc_infos.begin(); |
| 583 ssrc_info != ssrc_infos.end(); ++ssrc_info) { | 583 ssrc_info != ssrc_infos.end(); ++ssrc_info) { |
| 584 if (ssrc_info->cname.empty()) { | 584 if (ssrc_info->cname.empty()) { |
| 585 continue; | 585 continue; |
| 586 } | 586 } |
| 587 | 587 |
| 588 std::string stream_id; | 588 std::string stream_id; |
| 589 std::string track_id; | 589 std::string track_id; |
| 590 if (ssrc_info->stream_id.empty() && !ssrc_info->mslabel.empty()) { | 590 if (ssrc_info->stream_id.empty() && !ssrc_info->mslabel.empty()) { |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 824 AddLine(kSessionName, &message); | 824 AddLine(kSessionName, &message); |
| 825 | 825 |
| 826 // Time Description. | 826 // Time Description. |
| 827 AddLine(kTimeDescription, &message); | 827 AddLine(kTimeDescription, &message); |
| 828 | 828 |
| 829 // Group | 829 // Group |
| 830 if (desc->HasGroup(cricket::GROUP_TYPE_BUNDLE)) { | 830 if (desc->HasGroup(cricket::GROUP_TYPE_BUNDLE)) { |
| 831 std::string group_line = kAttrGroup; | 831 std::string group_line = kAttrGroup; |
| 832 const cricket::ContentGroup* group = | 832 const cricket::ContentGroup* group = |
| 833 desc->GetGroupByName(cricket::GROUP_TYPE_BUNDLE); | 833 desc->GetGroupByName(cricket::GROUP_TYPE_BUNDLE); |
| 834 RTC_DCHECK(group != NULL); | 834 RTC_DCHECK(group != nullptr); |
| 835 const cricket::ContentNames& content_names = group->content_names(); | 835 const cricket::ContentNames& content_names = group->content_names(); |
| 836 for (cricket::ContentNames::const_iterator it = content_names.begin(); | 836 for (cricket::ContentNames::const_iterator it = content_names.begin(); |
| 837 it != content_names.end(); ++it) { | 837 it != content_names.end(); ++it) { |
| 838 group_line.append(" "); | 838 group_line.append(" "); |
| 839 group_line.append(*it); | 839 group_line.append(*it); |
| 840 } | 840 } |
| 841 AddLine(group_line, &message); | 841 AddLine(group_line, &message); |
| 842 } | 842 } |
| 843 | 843 |
| 844 // MediaStream semantics | 844 // MediaStream semantics |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 931 it = candidates.begin(); it != candidates.end(); ++it) { | 931 it = candidates.begin(); it != candidates.end(); ++it) { |
| 932 jdesc->AddCandidate(*it); | 932 jdesc->AddCandidate(*it); |
| 933 delete *it; | 933 delete *it; |
| 934 } | 934 } |
| 935 return true; | 935 return true; |
| 936 } | 936 } |
| 937 | 937 |
| 938 bool SdpDeserializeCandidate(const std::string& message, | 938 bool SdpDeserializeCandidate(const std::string& message, |
| 939 JsepIceCandidate* jcandidate, | 939 JsepIceCandidate* jcandidate, |
| 940 SdpParseError* error) { | 940 SdpParseError* error) { |
| 941 RTC_DCHECK(jcandidate != NULL); | 941 RTC_DCHECK(jcandidate != nullptr); |
| 942 Candidate candidate; | 942 Candidate candidate; |
| 943 if (!ParseCandidate(message, &candidate, error, true)) { | 943 if (!ParseCandidate(message, &candidate, error, true)) { |
| 944 return false; | 944 return false; |
| 945 } | 945 } |
| 946 jcandidate->SetCandidate(candidate); | 946 jcandidate->SetCandidate(candidate); |
| 947 return true; | 947 return true; |
| 948 } | 948 } |
| 949 | 949 |
| 950 bool SdpDeserializeCandidate(const std::string& transport_name, | 950 bool SdpDeserializeCandidate(const std::string& transport_name, |
| 951 const std::string& message, | 951 const std::string& message, |
| 952 cricket::Candidate* candidate, | 952 cricket::Candidate* candidate, |
| 953 SdpParseError* error) { | 953 SdpParseError* error) { |
| 954 RTC_DCHECK(candidate != nullptr); | 954 RTC_DCHECK(candidate != nullptr); |
| 955 if (!ParseCandidate(message, candidate, error, true)) { | 955 if (!ParseCandidate(message, candidate, error, true)) { |
| 956 return false; | 956 return false; |
| 957 } | 957 } |
| 958 candidate->set_transport_name(transport_name); | 958 candidate->set_transport_name(transport_name); |
| 959 return true; | 959 return true; |
| 960 } | 960 } |
| 961 | 961 |
| 962 bool ParseCandidate(const std::string& message, Candidate* candidate, | 962 bool ParseCandidate(const std::string& message, Candidate* candidate, |
| 963 SdpParseError* error, bool is_raw) { | 963 SdpParseError* error, bool is_raw) { |
| 964 RTC_DCHECK(candidate != NULL); | 964 RTC_DCHECK(candidate != nullptr); |
| 965 | 965 |
| 966 // Get the first line from |message|. | 966 // Get the first line from |message|. |
| 967 std::string first_line = message; | 967 std::string first_line = message; |
| 968 size_t pos = 0; | 968 size_t pos = 0; |
| 969 GetLine(message, &pos, &first_line); | 969 GetLine(message, &pos, &first_line); |
| 970 | 970 |
| 971 // Makes sure |message| contains only one line. | 971 // Makes sure |message| contains only one line. |
| 972 if (message.size() > first_line.size()) { | 972 if (message.size() > first_line.size()) { |
| 973 std::string left, right; | 973 std::string left, right; |
| 974 if (rtc::tokenize_first(message, kNewLine, &left, &right) && | 974 if (rtc::tokenize_first(message, kNewLine, &left, &right) && |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1214 *extmap = RtpExtension(uri, value); | 1214 *extmap = RtpExtension(uri, value); |
| 1215 return true; | 1215 return true; |
| 1216 } | 1216 } |
| 1217 | 1217 |
| 1218 void BuildMediaDescription(const ContentInfo* content_info, | 1218 void BuildMediaDescription(const ContentInfo* content_info, |
| 1219 const TransportInfo* transport_info, | 1219 const TransportInfo* transport_info, |
| 1220 const MediaType media_type, | 1220 const MediaType media_type, |
| 1221 const std::vector<Candidate>& candidates, | 1221 const std::vector<Candidate>& candidates, |
| 1222 bool unified_plan_sdp, | 1222 bool unified_plan_sdp, |
| 1223 std::string* message) { | 1223 std::string* message) { |
| 1224 RTC_DCHECK(message != NULL); | 1224 RTC_DCHECK(message != nullptr); |
| 1225 if (content_info == NULL || message == NULL) { | 1225 if (content_info == nullptr || message == nullptr) { |
| 1226 return; | 1226 return; |
| 1227 } | 1227 } |
| 1228 // TODO: Rethink if we should use sprintfn instead of stringstream. | 1228 // TODO: Rethink if we should use sprintfn instead of stringstream. |
| 1229 // According to the style guide, streams should only be used for logging. | 1229 // According to the style guide, streams should only be used for logging. |
| 1230 // http://google-styleguide.googlecode.com/svn/ | 1230 // http://google-styleguide.googlecode.com/svn/ |
| 1231 // trunk/cppguide.xml?showone=Streams#Streams | 1231 // trunk/cppguide.xml?showone=Streams#Streams |
| 1232 std::ostringstream os; | 1232 std::ostringstream os; |
| 1233 const MediaContentDescription* media_desc = | 1233 const MediaContentDescription* media_desc = |
| 1234 static_cast<const MediaContentDescription*>( | 1234 static_cast<const MediaContentDescription*>( |
| 1235 content_info->description); | 1235 content_info->description); |
| 1236 RTC_DCHECK(media_desc != NULL); | 1236 RTC_DCHECK(media_desc != nullptr); |
| 1237 | 1237 |
| 1238 int sctp_port = cricket::kSctpDefaultPort; | 1238 int sctp_port = cricket::kSctpDefaultPort; |
| 1239 | 1239 |
| 1240 // RFC 4566 | 1240 // RFC 4566 |
| 1241 // m=<media> <port> <proto> <fmt> | 1241 // m=<media> <port> <proto> <fmt> |
| 1242 // fmt is a list of payload type numbers that MAY be used in the session. | 1242 // fmt is a list of payload type numbers that MAY be used in the session. |
| 1243 const char* type = NULL; | 1243 const char* type = nullptr; |
| 1244 if (media_type == cricket::MEDIA_TYPE_AUDIO) | 1244 if (media_type == cricket::MEDIA_TYPE_AUDIO) |
| 1245 type = kMediaTypeAudio; | 1245 type = kMediaTypeAudio; |
| 1246 else if (media_type == cricket::MEDIA_TYPE_VIDEO) | 1246 else if (media_type == cricket::MEDIA_TYPE_VIDEO) |
| 1247 type = kMediaTypeVideo; | 1247 type = kMediaTypeVideo; |
| 1248 else if (media_type == cricket::MEDIA_TYPE_DATA) | 1248 else if (media_type == cricket::MEDIA_TYPE_DATA) |
| 1249 type = kMediaTypeData; | 1249 type = kMediaTypeData; |
| 1250 else | 1250 else |
| 1251 RTC_NOTREACHED(); | 1251 RTC_NOTREACHED(); |
| 1252 | 1252 |
| 1253 std::string fmt; | 1253 std::string fmt; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1307 // RFC 3264 | 1307 // RFC 3264 |
| 1308 // To reject an offered stream, the port number in the corresponding stream in | 1308 // To reject an offered stream, the port number in the corresponding stream in |
| 1309 // the answer MUST be set to zero. | 1309 // the answer MUST be set to zero. |
| 1310 // | 1310 // |
| 1311 // However, the BUNDLE draft adds a new meaning to port zero, when used along | 1311 // However, the BUNDLE draft adds a new meaning to port zero, when used along |
| 1312 // with a=bundle-only. | 1312 // with a=bundle-only. |
| 1313 const std::string& port = | 1313 const std::string& port = |
| 1314 (content_info->rejected || content_info->bundle_only) ? kMediaPortRejected | 1314 (content_info->rejected || content_info->bundle_only) ? kMediaPortRejected |
| 1315 : kDummyPort; | 1315 : kDummyPort; |
| 1316 | 1316 |
| 1317 rtc::SSLFingerprint* fp = (transport_info) ? | 1317 rtc::SSLFingerprint* fp = |
| 1318 transport_info->description.identity_fingerprint.get() : NULL; | 1318 (transport_info) ? transport_info->description.identity_fingerprint.get() |
| 1319 : nullptr; |
| 1319 | 1320 |
| 1320 // Add the m and c lines. | 1321 // Add the m and c lines. |
| 1321 InitLine(kLineTypeMedia, type, &os); | 1322 InitLine(kLineTypeMedia, type, &os); |
| 1322 os << " " << port << " " << media_desc->protocol() << fmt; | 1323 os << " " << port << " " << media_desc->protocol() << fmt; |
| 1323 std::string mline = os.str(); | 1324 std::string mline = os.str(); |
| 1324 UpdateMediaDefaultDestination(candidates, mline, message); | 1325 UpdateMediaDefaultDestination(candidates, mline, message); |
| 1325 | 1326 |
| 1326 // RFC 4566 | 1327 // RFC 4566 |
| 1327 // b=AS:<bandwidth> | 1328 // b=AS:<bandwidth> |
| 1328 if (media_desc->bandwidth() >= 1000) { | 1329 if (media_desc->bandwidth() >= 1000) { |
| (...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1657 os << " " << iter->param(); | 1658 os << " " << iter->param(); |
| 1658 } | 1659 } |
| 1659 AddLine(os.str(), message); | 1660 AddLine(os.str(), message); |
| 1660 } | 1661 } |
| 1661 } | 1662 } |
| 1662 | 1663 |
| 1663 bool AddSctpDataCodec(DataContentDescription* media_desc, | 1664 bool AddSctpDataCodec(DataContentDescription* media_desc, |
| 1664 int sctp_port) { | 1665 int sctp_port) { |
| 1665 for (const auto& codec : media_desc->codecs()) { | 1666 for (const auto& codec : media_desc->codecs()) { |
| 1666 if (cricket::CodecNamesEq(codec.name, cricket::kGoogleSctpDataCodecName)) { | 1667 if (cricket::CodecNamesEq(codec.name, cricket::kGoogleSctpDataCodecName)) { |
| 1667 return ParseFailed("", | 1668 return ParseFailed("", "Can't have multiple sctp port attributes.", |
| 1668 "Can't have multiple sctp port attributes.", | 1669 nullptr); |
| 1669 NULL); | |
| 1670 } | 1670 } |
| 1671 } | 1671 } |
| 1672 // Add the SCTP Port number as a pseudo-codec "port" parameter | 1672 // Add the SCTP Port number as a pseudo-codec "port" parameter |
| 1673 cricket::DataCodec codec_port(cricket::kGoogleSctpDataCodecPlType, | 1673 cricket::DataCodec codec_port(cricket::kGoogleSctpDataCodecPlType, |
| 1674 cricket::kGoogleSctpDataCodecName); | 1674 cricket::kGoogleSctpDataCodecName); |
| 1675 codec_port.SetParam(cricket::kCodecParamPort, sctp_port); | 1675 codec_port.SetParam(cricket::kCodecParamPort, sctp_port); |
| 1676 LOG(INFO) << "AddSctpDataCodec: Got SCTP Port Number " | 1676 LOG(INFO) << "AddSctpDataCodec: Got SCTP Port Number " |
| 1677 << sctp_port; | 1677 << sctp_port; |
| 1678 media_desc->AddCodec(codec_port); | 1678 media_desc->AddCodec(codec_port); |
| 1679 return true; | 1679 return true; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1698 } | 1698 } |
| 1699 if (!rtc::FromString(found->second, value)) { | 1699 if (!rtc::FromString(found->second, value)) { |
| 1700 return false; | 1700 return false; |
| 1701 } | 1701 } |
| 1702 return true; | 1702 return true; |
| 1703 } | 1703 } |
| 1704 | 1704 |
| 1705 void BuildRtpMap(const MediaContentDescription* media_desc, | 1705 void BuildRtpMap(const MediaContentDescription* media_desc, |
| 1706 const MediaType media_type, | 1706 const MediaType media_type, |
| 1707 std::string* message) { | 1707 std::string* message) { |
| 1708 RTC_DCHECK(message != NULL); | 1708 RTC_DCHECK(message != nullptr); |
| 1709 RTC_DCHECK(media_desc != NULL); | 1709 RTC_DCHECK(media_desc != nullptr); |
| 1710 std::ostringstream os; | 1710 std::ostringstream os; |
| 1711 if (media_type == cricket::MEDIA_TYPE_VIDEO) { | 1711 if (media_type == cricket::MEDIA_TYPE_VIDEO) { |
| 1712 const VideoContentDescription* video_desc = | 1712 const VideoContentDescription* video_desc = |
| 1713 static_cast<const VideoContentDescription*>(media_desc); | 1713 static_cast<const VideoContentDescription*>(media_desc); |
| 1714 for (std::vector<cricket::VideoCodec>::const_iterator it = | 1714 for (std::vector<cricket::VideoCodec>::const_iterator it = |
| 1715 video_desc->codecs().begin(); | 1715 video_desc->codecs().begin(); |
| 1716 it != video_desc->codecs().end(); ++it) { | 1716 it != video_desc->codecs().end(); ++it) { |
| 1717 // RFC 4566 | 1717 // RFC 4566 |
| 1718 // a=rtpmap:<payload type> <encoding name>/<clock rate> | 1718 // a=rtpmap:<payload type> <encoding name>/<clock rate> |
| 1719 // [/<encodingparameters>] | 1719 // [/<encodingparameters>] |
| (...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2005 if (!ParseIceOptions(line, &(session_td->transport_options), error)) { | 2005 if (!ParseIceOptions(line, &(session_td->transport_options), error)) { |
| 2006 return false; | 2006 return false; |
| 2007 } | 2007 } |
| 2008 } else if (HasAttribute(line, kAttributeFingerprint)) { | 2008 } else if (HasAttribute(line, kAttributeFingerprint)) { |
| 2009 if (session_td->identity_fingerprint.get()) { | 2009 if (session_td->identity_fingerprint.get()) { |
| 2010 return ParseFailed( | 2010 return ParseFailed( |
| 2011 line, | 2011 line, |
| 2012 "Can't have multiple fingerprint attributes at the same level.", | 2012 "Can't have multiple fingerprint attributes at the same level.", |
| 2013 error); | 2013 error); |
| 2014 } | 2014 } |
| 2015 rtc::SSLFingerprint* fingerprint = NULL; | 2015 rtc::SSLFingerprint* fingerprint = nullptr; |
| 2016 if (!ParseFingerprintAttribute(line, &fingerprint, error)) { | 2016 if (!ParseFingerprintAttribute(line, &fingerprint, error)) { |
| 2017 return false; | 2017 return false; |
| 2018 } | 2018 } |
| 2019 session_td->identity_fingerprint.reset(fingerprint); | 2019 session_td->identity_fingerprint.reset(fingerprint); |
| 2020 } else if (HasAttribute(line, kAttributeSetup)) { | 2020 } else if (HasAttribute(line, kAttributeSetup)) { |
| 2021 if (!ParseDtlsSetup(line, &(session_td->connection_role), error)) { | 2021 if (!ParseDtlsSetup(line, &(session_td->connection_role), error)) { |
| 2022 return false; | 2022 return false; |
| 2023 } | 2023 } |
| 2024 } else if (HasAttribute(line, kAttributeMsidSemantics)) { | 2024 } else if (HasAttribute(line, kAttributeMsidSemantics)) { |
| 2025 std::string semantics; | 2025 std::string semantics; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2036 session_extmaps->push_back(extmap); | 2036 session_extmaps->push_back(extmap); |
| 2037 } | 2037 } |
| 2038 } | 2038 } |
| 2039 | 2039 |
| 2040 return true; | 2040 return true; |
| 2041 } | 2041 } |
| 2042 | 2042 |
| 2043 bool ParseGroupAttribute(const std::string& line, | 2043 bool ParseGroupAttribute(const std::string& line, |
| 2044 cricket::SessionDescription* desc, | 2044 cricket::SessionDescription* desc, |
| 2045 SdpParseError* error) { | 2045 SdpParseError* error) { |
| 2046 RTC_DCHECK(desc != NULL); | 2046 RTC_DCHECK(desc != nullptr); |
| 2047 | 2047 |
| 2048 // RFC 5888 and draft-holmberg-mmusic-sdp-bundle-negotiation-00 | 2048 // RFC 5888 and draft-holmberg-mmusic-sdp-bundle-negotiation-00 |
| 2049 // a=group:BUNDLE video voice | 2049 // a=group:BUNDLE video voice |
| 2050 std::vector<std::string> fields; | 2050 std::vector<std::string> fields; |
| 2051 rtc::split(line.substr(kLinePrefixLength), | 2051 rtc::split(line.substr(kLinePrefixLength), |
| 2052 kSdpDelimiterSpace, &fields); | 2052 kSdpDelimiterSpace, &fields); |
| 2053 std::string semantics; | 2053 std::string semantics; |
| 2054 if (!GetValue(fields[0], kAttributeGroup, &semantics, error)) { | 2054 if (!GetValue(fields[0], kAttributeGroup, &semantics, error)) { |
| 2055 return false; | 2055 return false; |
| 2056 } | 2056 } |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2243 *content_name = cricket::CN_DATA; | 2243 *content_name = cricket::CN_DATA; |
| 2244 break; | 2244 break; |
| 2245 default: | 2245 default: |
| 2246 RTC_NOTREACHED(); | 2246 RTC_NOTREACHED(); |
| 2247 break; | 2247 break; |
| 2248 } | 2248 } |
| 2249 if (!ParseContent(message, media_type, mline_index, protocol, payload_types, | 2249 if (!ParseContent(message, media_type, mline_index, protocol, payload_types, |
| 2250 pos, content_name, bundle_only, media_desc, transport, | 2250 pos, content_name, bundle_only, media_desc, transport, |
| 2251 candidates, error)) { | 2251 candidates, error)) { |
| 2252 delete media_desc; | 2252 delete media_desc; |
| 2253 return NULL; | 2253 return nullptr; |
| 2254 } | 2254 } |
| 2255 // Sort the codecs according to the m-line fmt list. | 2255 // Sort the codecs according to the m-line fmt list. |
| 2256 std::unordered_map<int, int> payload_type_preferences; | 2256 std::unordered_map<int, int> payload_type_preferences; |
| 2257 // "size + 1" so that the lowest preference payload type has a preference of | 2257 // "size + 1" so that the lowest preference payload type has a preference of |
| 2258 // 1, which is greater than the default (0) for payload types not in the fmt | 2258 // 1, which is greater than the default (0) for payload types not in the fmt |
| 2259 // list. | 2259 // list. |
| 2260 int preference = static_cast<int>(payload_types.size() + 1); | 2260 int preference = static_cast<int>(payload_types.size() + 1); |
| 2261 for (int pt : payload_types) { | 2261 for (int pt : payload_types) { |
| 2262 payload_type_preferences[pt] = preference--; | 2262 payload_type_preferences[pt] = preference--; |
| 2263 } | 2263 } |
| 2264 std::vector<typename C::CodecType> codecs = media_desc->codecs(); | 2264 std::vector<typename C::CodecType> codecs = media_desc->codecs(); |
| 2265 std::sort(codecs.begin(), codecs.end(), [&payload_type_preferences]( | 2265 std::sort(codecs.begin(), codecs.end(), [&payload_type_preferences]( |
| 2266 const typename C::CodecType& a, | 2266 const typename C::CodecType& a, |
| 2267 const typename C::CodecType& b) { | 2267 const typename C::CodecType& b) { |
| 2268 return payload_type_preferences[a.id] > payload_type_preferences[b.id]; | 2268 return payload_type_preferences[a.id] > payload_type_preferences[b.id]; |
| 2269 }); | 2269 }); |
| 2270 media_desc->set_codecs(codecs); | 2270 media_desc->set_codecs(codecs); |
| 2271 return media_desc; | 2271 return media_desc; |
| 2272 } | 2272 } |
| 2273 | 2273 |
| 2274 bool ParseMediaDescription(const std::string& message, | 2274 bool ParseMediaDescription(const std::string& message, |
| 2275 const TransportDescription& session_td, | 2275 const TransportDescription& session_td, |
| 2276 const RtpHeaderExtensions& session_extmaps, | 2276 const RtpHeaderExtensions& session_extmaps, |
| 2277 size_t* pos, | 2277 size_t* pos, |
| 2278 cricket::SessionDescription* desc, | 2278 cricket::SessionDescription* desc, |
| 2279 std::vector<JsepIceCandidate*>* candidates, | 2279 std::vector<JsepIceCandidate*>* candidates, |
| 2280 SdpParseError* error) { | 2280 SdpParseError* error) { |
| 2281 RTC_DCHECK(desc != NULL); | 2281 RTC_DCHECK(desc != nullptr); |
| 2282 std::string line; | 2282 std::string line; |
| 2283 int mline_index = -1; | 2283 int mline_index = -1; |
| 2284 | 2284 |
| 2285 // Zero or more media descriptions | 2285 // Zero or more media descriptions |
| 2286 // RFC 4566 | 2286 // RFC 4566 |
| 2287 // m=<media> <port> <proto> <fmt> | 2287 // m=<media> <port> <proto> <fmt> |
| 2288 while (GetLineWithType(message, pos, &line, kLineTypeMedia)) { | 2288 while (GetLineWithType(message, pos, &line, kLineTypeMedia)) { |
| 2289 ++mline_index; | 2289 ++mline_index; |
| 2290 | 2290 |
| 2291 std::vector<std::string> fields; | 2291 std::vector<std::string> fields; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2354 int p; | 2354 int p; |
| 2355 if (data_desc && IsDtlsSctp(protocol) && rtc::FromString(fields[3], &p)) { | 2355 if (data_desc && IsDtlsSctp(protocol) && rtc::FromString(fields[3], &p)) { |
| 2356 if (!AddSctpDataCodec(data_desc, p)) | 2356 if (!AddSctpDataCodec(data_desc, p)) |
| 2357 return false; | 2357 return false; |
| 2358 } | 2358 } |
| 2359 } else { | 2359 } else { |
| 2360 LOG(LS_WARNING) << "Unsupported media type: " << line; | 2360 LOG(LS_WARNING) << "Unsupported media type: " << line; |
| 2361 continue; | 2361 continue; |
| 2362 } | 2362 } |
| 2363 if (!content.get()) { | 2363 if (!content.get()) { |
| 2364 // ParseContentDescription returns NULL if failed. | 2364 // ParseContentDescription returns null if failed. |
| 2365 return false; | 2365 return false; |
| 2366 } | 2366 } |
| 2367 | 2367 |
| 2368 bool content_rejected = false; | 2368 bool content_rejected = false; |
| 2369 // A port of 0 is not interpreted as a rejected m= section when it's | 2369 // A port of 0 is not interpreted as a rejected m= section when it's |
| 2370 // used along with a=bundle-only. | 2370 // used along with a=bundle-only. |
| 2371 if (bundle_only) { | 2371 if (bundle_only) { |
| 2372 if (!port_rejected) { | 2372 if (!port_rejected) { |
| 2373 // Usage of bundle-only with a nonzero port is unspecified. So just | 2373 // Usage of bundle-only with a nonzero port is unspecified. So just |
| 2374 // ignore bundle-only if we see this. | 2374 // ignore bundle-only if we see this. |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2575 int mline_index, | 2575 int mline_index, |
| 2576 const std::string& protocol, | 2576 const std::string& protocol, |
| 2577 const std::vector<int>& payload_types, | 2577 const std::vector<int>& payload_types, |
| 2578 size_t* pos, | 2578 size_t* pos, |
| 2579 std::string* content_name, | 2579 std::string* content_name, |
| 2580 bool* bundle_only, | 2580 bool* bundle_only, |
| 2581 MediaContentDescription* media_desc, | 2581 MediaContentDescription* media_desc, |
| 2582 TransportDescription* transport, | 2582 TransportDescription* transport, |
| 2583 std::vector<JsepIceCandidate*>* candidates, | 2583 std::vector<JsepIceCandidate*>* candidates, |
| 2584 SdpParseError* error) { | 2584 SdpParseError* error) { |
| 2585 RTC_DCHECK(media_desc != NULL); | 2585 RTC_DCHECK(media_desc != nullptr); |
| 2586 RTC_DCHECK(content_name != NULL); | 2586 RTC_DCHECK(content_name != nullptr); |
| 2587 RTC_DCHECK(transport != NULL); | 2587 RTC_DCHECK(transport != nullptr); |
| 2588 | 2588 |
| 2589 if (media_type == cricket::MEDIA_TYPE_AUDIO) { | 2589 if (media_type == cricket::MEDIA_TYPE_AUDIO) { |
| 2590 MaybeCreateStaticPayloadAudioCodecs( | 2590 MaybeCreateStaticPayloadAudioCodecs( |
| 2591 payload_types, static_cast<AudioContentDescription*>(media_desc)); | 2591 payload_types, static_cast<AudioContentDescription*>(media_desc)); |
| 2592 } | 2592 } |
| 2593 | 2593 |
| 2594 // The media level "ice-ufrag" and "ice-pwd". | 2594 // The media level "ice-ufrag" and "ice-pwd". |
| 2595 // The candidates before update the media level "ice-pwd" and "ice-ufrag". | 2595 // The candidates before update the media level "ice-pwd" and "ice-ufrag". |
| 2596 Candidates candidates_orig; | 2596 Candidates candidates_orig; |
| 2597 std::string line; | 2597 std::string line; |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2686 } | 2686 } |
| 2687 } else if (HasAttribute(line, kAttributeIceOption)) { | 2687 } else if (HasAttribute(line, kAttributeIceOption)) { |
| 2688 if (!ParseIceOptions(line, &transport->transport_options, error)) { | 2688 if (!ParseIceOptions(line, &transport->transport_options, error)) { |
| 2689 return false; | 2689 return false; |
| 2690 } | 2690 } |
| 2691 } else if (HasAttribute(line, kAttributeFmtp)) { | 2691 } else if (HasAttribute(line, kAttributeFmtp)) { |
| 2692 if (!ParseFmtpAttributes(line, media_type, media_desc, error)) { | 2692 if (!ParseFmtpAttributes(line, media_type, media_desc, error)) { |
| 2693 return false; | 2693 return false; |
| 2694 } | 2694 } |
| 2695 } else if (HasAttribute(line, kAttributeFingerprint)) { | 2695 } else if (HasAttribute(line, kAttributeFingerprint)) { |
| 2696 rtc::SSLFingerprint* fingerprint = NULL; | 2696 rtc::SSLFingerprint* fingerprint = nullptr; |
| 2697 | 2697 |
| 2698 if (!ParseFingerprintAttribute(line, &fingerprint, error)) { | 2698 if (!ParseFingerprintAttribute(line, &fingerprint, error)) { |
| 2699 return false; | 2699 return false; |
| 2700 } | 2700 } |
| 2701 transport->identity_fingerprint.reset(fingerprint); | 2701 transport->identity_fingerprint.reset(fingerprint); |
| 2702 } else if (HasAttribute(line, kAttributeSetup)) { | 2702 } else if (HasAttribute(line, kAttributeSetup)) { |
| 2703 if (!ParseDtlsSetup(line, &(transport->connection_role), error)) { | 2703 if (!ParseDtlsSetup(line, &(transport->connection_role), error)) { |
| 2704 return false; | 2704 return false; |
| 2705 } | 2705 } |
| 2706 } else if (IsDtlsSctp(protocol) && HasAttribute(line, kAttributeSctpPort)) { | 2706 } else if (IsDtlsSctp(protocol) && HasAttribute(line, kAttributeSctpPort)) { |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2851 RTC_DCHECK((*it).password().empty()); | 2851 RTC_DCHECK((*it).password().empty()); |
| 2852 (*it).set_password(transport->ice_pwd); | 2852 (*it).set_password(transport->ice_pwd); |
| 2853 candidates->push_back( | 2853 candidates->push_back( |
| 2854 new JsepIceCandidate(mline_id, mline_index, *it)); | 2854 new JsepIceCandidate(mline_id, mline_index, *it)); |
| 2855 } | 2855 } |
| 2856 return true; | 2856 return true; |
| 2857 } | 2857 } |
| 2858 | 2858 |
| 2859 bool ParseSsrcAttribute(const std::string& line, SsrcInfoVec* ssrc_infos, | 2859 bool ParseSsrcAttribute(const std::string& line, SsrcInfoVec* ssrc_infos, |
| 2860 SdpParseError* error) { | 2860 SdpParseError* error) { |
| 2861 RTC_DCHECK(ssrc_infos != NULL); | 2861 RTC_DCHECK(ssrc_infos != nullptr); |
| 2862 // RFC 5576 | 2862 // RFC 5576 |
| 2863 // a=ssrc:<ssrc-id> <attribute> | 2863 // a=ssrc:<ssrc-id> <attribute> |
| 2864 // a=ssrc:<ssrc-id> <attribute>:<value> | 2864 // a=ssrc:<ssrc-id> <attribute>:<value> |
| 2865 std::string field1, field2; | 2865 std::string field1, field2; |
| 2866 if (!rtc::tokenize_first(line.substr(kLinePrefixLength), kSdpDelimiterSpace, | 2866 if (!rtc::tokenize_first(line.substr(kLinePrefixLength), kSdpDelimiterSpace, |
| 2867 &field1, &field2)) { | 2867 &field1, &field2)) { |
| 2868 const size_t expected_fields = 2; | 2868 const size_t expected_fields = 2; |
| 2869 return ParseFailedExpectFieldNum(line, expected_fields, error); | 2869 return ParseFailedExpectFieldNum(line, expected_fields, error); |
| 2870 } | 2870 } |
| 2871 | 2871 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2930 // The label isn't defined. | 2930 // The label isn't defined. |
| 2931 // label:<value> | 2931 // label:<value> |
| 2932 ssrc_info->label = value; | 2932 ssrc_info->label = value; |
| 2933 } | 2933 } |
| 2934 return true; | 2934 return true; |
| 2935 } | 2935 } |
| 2936 | 2936 |
| 2937 bool ParseSsrcGroupAttribute(const std::string& line, | 2937 bool ParseSsrcGroupAttribute(const std::string& line, |
| 2938 SsrcGroupVec* ssrc_groups, | 2938 SsrcGroupVec* ssrc_groups, |
| 2939 SdpParseError* error) { | 2939 SdpParseError* error) { |
| 2940 RTC_DCHECK(ssrc_groups != NULL); | 2940 RTC_DCHECK(ssrc_groups != nullptr); |
| 2941 // RFC 5576 | 2941 // RFC 5576 |
| 2942 // a=ssrc-group:<semantics> <ssrc-id> ... | 2942 // a=ssrc-group:<semantics> <ssrc-id> ... |
| 2943 std::vector<std::string> fields; | 2943 std::vector<std::string> fields; |
| 2944 rtc::split(line.substr(kLinePrefixLength), | 2944 rtc::split(line.substr(kLinePrefixLength), |
| 2945 kSdpDelimiterSpace, &fields); | 2945 kSdpDelimiterSpace, &fields); |
| 2946 const size_t expected_min_fields = 2; | 2946 const size_t expected_min_fields = 2; |
| 2947 if (fields.size() < expected_min_fields) { | 2947 if (fields.size() < expected_min_fields) { |
| 2948 return ParseFailedExpectMinFieldNum(line, expected_min_fields, error); | 2948 return ParseFailedExpectMinFieldNum(line, expected_min_fields, error); |
| 2949 } | 2949 } |
| 2950 std::string semantics; | 2950 std::string semantics; |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3212 UpdateCodec<AudioContentDescription, cricket::AudioCodec>( | 3212 UpdateCodec<AudioContentDescription, cricket::AudioCodec>( |
| 3213 media_desc, payload_type, feedback_param); | 3213 media_desc, payload_type, feedback_param); |
| 3214 } else if (media_type == cricket::MEDIA_TYPE_VIDEO) { | 3214 } else if (media_type == cricket::MEDIA_TYPE_VIDEO) { |
| 3215 UpdateCodec<VideoContentDescription, cricket::VideoCodec>( | 3215 UpdateCodec<VideoContentDescription, cricket::VideoCodec>( |
| 3216 media_desc, payload_type, feedback_param); | 3216 media_desc, payload_type, feedback_param); |
| 3217 } | 3217 } |
| 3218 return true; | 3218 return true; |
| 3219 } | 3219 } |
| 3220 | 3220 |
| 3221 } // namespace webrtc | 3221 } // namespace webrtc |
| OLD | NEW |