| Index: webrtc/pc/webrtcsdp.cc
|
| diff --git a/webrtc/pc/webrtcsdp.cc b/webrtc/pc/webrtcsdp.cc
|
| index 3953773d83f361837e7239ef81550da44635d247..49cd0444bf10db984f597340b706118e64319360 100644
|
| --- a/webrtc/pc/webrtcsdp.cc
|
| +++ b/webrtc/pc/webrtcsdp.cc
|
| @@ -1176,7 +1176,25 @@ bool ParseExtmap(const std::string& line,
|
| return false;
|
| }
|
|
|
| - *extmap = RtpExtension(uri, value);
|
| + bool encrypted = false;
|
| + if (uri == RtpExtension::kEncryptHeaderExtensionsUri) {
|
| + // RFC 6904
|
| + // a=extmap:<value["/"<direction>] urn:ietf:params:rtp-hdrext:encrypt \
|
| + // <URI> <extensionattributes>
|
| + const size_t expected_min_fields_encrypted = expected_min_fields + 1;
|
| + if (fields.size() < expected_min_fields_encrypted) {
|
| + return ParseFailedExpectMinFieldNum(line, expected_min_fields_encrypted,
|
| + error);
|
| + }
|
| +
|
| + encrypted = true;
|
| + uri = fields[2];
|
| + if (uri == RtpExtension::kEncryptHeaderExtensionsUri) {
|
| + return ParseFailed(line, "Recursive encrypted header.", error);
|
| + }
|
| + }
|
| +
|
| + *extmap = RtpExtension(uri, value, encrypted);
|
| return true;
|
| }
|
|
|
| @@ -1433,9 +1451,13 @@ void BuildRtpContentAttributes(const MediaContentDescription* media_desc,
|
| // The definitions MUST be either all session level or all media level. This
|
| // implementation uses all media level.
|
| for (size_t i = 0; i < media_desc->rtp_header_extensions().size(); ++i) {
|
| + const RtpExtension& extension = media_desc->rtp_header_extensions()[i];
|
| InitAttrLine(kAttributeExtmap, &os);
|
| - os << kSdpDelimiterColon << media_desc->rtp_header_extensions()[i].id
|
| - << kSdpDelimiterSpace << media_desc->rtp_header_extensions()[i].uri;
|
| + os << kSdpDelimiterColon << extension.id;
|
| + if (extension.encrypt) {
|
| + os << kSdpDelimiterSpace << RtpExtension::kEncryptHeaderExtensionsUri;
|
| + }
|
| + os << kSdpDelimiterSpace << extension.uri;
|
| AddLine(os.str(), message);
|
| }
|
|
|
|
|