Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Side by Side Diff: webrtc/pc/mediasession.cc

Issue 2761143002: Support encrypted RTP extensions (RFC 6904) (Closed)
Patch Set: Fix compile error on win_x64 bots. Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/pc/mediasession.h ('k') | webrtc/pc/mediasession_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 938 matching lines...) Expand 10 before | Expand all | Expand 10 after
949 rtc::ToString(matching_codec.id); 949 rtc::ToString(matching_codec.id);
950 used_pltypes->FindAndSetIdUsed(&rtx_codec); 950 used_pltypes->FindAndSetIdUsed(&rtx_codec);
951 offered_codecs->push_back(rtx_codec); 951 offered_codecs->push_back(rtx_codec);
952 } 952 }
953 } 953 }
954 } 954 }
955 955
956 static bool FindByUri(const RtpHeaderExtensions& extensions, 956 static bool FindByUri(const RtpHeaderExtensions& extensions,
957 const webrtc::RtpExtension& ext_to_match, 957 const webrtc::RtpExtension& ext_to_match,
958 webrtc::RtpExtension* found_extension) { 958 webrtc::RtpExtension* found_extension) {
959 // We assume that all URIs are given in a canonical format.
960 const webrtc::RtpExtension* found =
961 webrtc::RtpExtension::FindHeaderExtensionByUri(extensions,
962 ext_to_match.uri);
963 if (!found) {
964 return false;
965 }
966 if (found_extension) {
967 *found_extension = *found;
968 }
969 return true;
970 }
971
972 static bool FindByUriWithEncryptionPreference(
973 const RtpHeaderExtensions& extensions,
974 const webrtc::RtpExtension& ext_to_match, bool encryption_preference,
975 webrtc::RtpExtension* found_extension) {
976 const webrtc::RtpExtension* unencrypted_extension = nullptr;
959 for (RtpHeaderExtensions::const_iterator it = extensions.begin(); 977 for (RtpHeaderExtensions::const_iterator it = extensions.begin();
960 it != extensions.end(); ++it) { 978 it != extensions.end(); ++it) {
961 // We assume that all URIs are given in a canonical format. 979 // We assume that all URIs are given in a canonical format.
962 if (it->uri == ext_to_match.uri) { 980 if (it->uri == ext_to_match.uri) {
963 if (found_extension != NULL) { 981 if (!encryption_preference || it->encrypt) {
964 *found_extension = *it; 982 if (found_extension) {
983 *found_extension = *it;
984 }
985 return true;
965 } 986 }
966 return true; 987 unencrypted_extension = &(*it);
967 } 988 }
968 } 989 }
990 if (unencrypted_extension) {
991 if (found_extension) {
992 *found_extension = *unencrypted_extension;
993 }
994 return true;
995 }
969 return false; 996 return false;
970 } 997 }
971 998
972 // Iterates through |offered_extensions|, adding each one to |all_extensions| 999 // Iterates through |offered_extensions|, adding each one to
973 // and |used_ids|, and resolving ID conflicts. If an offered extension has the 1000 // |regular_extensions| (or |encrypted_extensions| if encrypted) and |used_ids|,
974 // same URI as one in |all_extensions|, it will re-use the same ID and won't be 1001 // and resolving ID conflicts.
975 // treated as a conflict. 1002 // If an offered extension has the same URI as one in |regular_extensions| or
1003 // |encrypted_extensions|, it will re-use the same ID and won't be treated as
1004 // a conflict.
976 static void FindAndSetRtpHdrExtUsed(RtpHeaderExtensions* offered_extensions, 1005 static void FindAndSetRtpHdrExtUsed(RtpHeaderExtensions* offered_extensions,
977 RtpHeaderExtensions* all_extensions, 1006 RtpHeaderExtensions* regular_extensions,
1007 RtpHeaderExtensions* encrypted_extensions,
978 UsedRtpHeaderExtensionIds* used_ids) { 1008 UsedRtpHeaderExtensionIds* used_ids) {
979 for (auto& extension : *offered_extensions) { 1009 for (auto& extension : *offered_extensions) {
980 webrtc::RtpExtension existing; 1010 webrtc::RtpExtension existing;
981 if (FindByUri(*all_extensions, extension, &existing)) { 1011 if ((extension.encrypt &&
1012 FindByUri(*encrypted_extensions, extension, &existing)) ||
1013 (!extension.encrypt &&
1014 FindByUri(*regular_extensions, extension, &existing))) {
982 extension.id = existing.id; 1015 extension.id = existing.id;
983 } else { 1016 } else {
984 used_ids->FindAndSetIdUsed(&extension); 1017 used_ids->FindAndSetIdUsed(&extension);
985 all_extensions->push_back(extension); 1018 if (extension.encrypt) {
1019 encrypted_extensions->push_back(extension);
1020 } else {
1021 regular_extensions->push_back(extension);
1022 }
986 } 1023 }
987 } 1024 }
988 } 1025 }
989 1026
990 // Adds |reference_extensions| to |offered_extensions|, while updating 1027 // Adds |reference_extensions| to |offered_extensions|, while updating
991 // |all_extensions| and |used_ids|. 1028 // |all_extensions| and |used_ids|.
992 static void FindRtpHdrExtsToOffer( 1029 static void FindRtpHdrExtsToOffer(
993 const RtpHeaderExtensions& reference_extensions, 1030 const RtpHeaderExtensions& reference_extensions,
994 RtpHeaderExtensions* offered_extensions, 1031 RtpHeaderExtensions* offered_extensions,
995 RtpHeaderExtensions* all_extensions, 1032 RtpHeaderExtensions* all_extensions,
996 UsedRtpHeaderExtensionIds* used_ids) { 1033 UsedRtpHeaderExtensionIds* used_ids) {
997 for (auto reference_extension : reference_extensions) { 1034 for (auto reference_extension : reference_extensions) {
998 if (!FindByUri(*offered_extensions, reference_extension, NULL)) { 1035 if (!FindByUri(*offered_extensions, reference_extension, NULL)) {
999 webrtc::RtpExtension existing; 1036 webrtc::RtpExtension existing;
1000 if (FindByUri(*all_extensions, reference_extension, &existing)) { 1037 if (FindByUri(*all_extensions, reference_extension, &existing)) {
1001 offered_extensions->push_back(existing); 1038 offered_extensions->push_back(existing);
1002 } else { 1039 } else {
1003 used_ids->FindAndSetIdUsed(&reference_extension); 1040 used_ids->FindAndSetIdUsed(&reference_extension);
1004 all_extensions->push_back(reference_extension); 1041 all_extensions->push_back(reference_extension);
1005 offered_extensions->push_back(reference_extension); 1042 offered_extensions->push_back(reference_extension);
1006 } 1043 }
1007 } 1044 }
1008 } 1045 }
1009 } 1046 }
1010 1047
1048 static void AddEncryptedVersionsOfHdrExts(RtpHeaderExtensions* extensions,
1049 RtpHeaderExtensions* all_extensions,
1050 UsedRtpHeaderExtensionIds* used_ids) {
1051 RtpHeaderExtensions encrypted_extensions;
1052 for (const webrtc::RtpExtension& extension : *extensions) {
1053 webrtc::RtpExtension existing;
1054 // Don't add encrypted extensions again that were already included in a
1055 // previous offer or regular extensions that are also included as encrypted
1056 // extensions.
1057 if (extension.encrypt ||
1058 !webrtc::RtpExtension::IsEncryptionSupported(extension.uri) ||
1059 (FindByUriWithEncryptionPreference(*extensions, extension, true,
1060 &existing) && existing.encrypt)) {
1061 continue;
1062 }
1063
1064 if (FindByUri(*all_extensions, extension, &existing)) {
1065 encrypted_extensions.push_back(existing);
1066 } else {
1067 webrtc::RtpExtension encrypted(extension);
1068 encrypted.encrypt = true;
1069 used_ids->FindAndSetIdUsed(&encrypted);
1070 all_extensions->push_back(encrypted);
1071 encrypted_extensions.push_back(encrypted);
1072 }
1073 }
1074 extensions->insert(extensions->end(), encrypted_extensions.begin(),
1075 encrypted_extensions.end());
1076 }
1077
1011 static void NegotiateRtpHeaderExtensions( 1078 static void NegotiateRtpHeaderExtensions(
1012 const RtpHeaderExtensions& local_extensions, 1079 const RtpHeaderExtensions& local_extensions,
1013 const RtpHeaderExtensions& offered_extensions, 1080 const RtpHeaderExtensions& offered_extensions,
1081 bool enable_encrypted_rtp_header_extensions,
1014 RtpHeaderExtensions* negotiated_extenstions) { 1082 RtpHeaderExtensions* negotiated_extenstions) {
1015 RtpHeaderExtensions::const_iterator ours; 1083 RtpHeaderExtensions::const_iterator ours;
1016 for (ours = local_extensions.begin(); 1084 for (ours = local_extensions.begin();
1017 ours != local_extensions.end(); ++ours) { 1085 ours != local_extensions.end(); ++ours) {
1018 webrtc::RtpExtension theirs; 1086 webrtc::RtpExtension theirs;
1019 if (FindByUri(offered_extensions, *ours, &theirs)) { 1087 if (FindByUriWithEncryptionPreference(offered_extensions, *ours,
1088 enable_encrypted_rtp_header_extensions, &theirs)) {
1020 // We respond with their RTP header extension id. 1089 // We respond with their RTP header extension id.
1021 negotiated_extenstions->push_back(theirs); 1090 negotiated_extenstions->push_back(theirs);
1022 } 1091 }
1023 } 1092 }
1024 } 1093 }
1025 1094
1026 static void StripCNCodecs(AudioCodecs* audio_codecs) { 1095 static void StripCNCodecs(AudioCodecs* audio_codecs) {
1027 AudioCodecs::iterator iter = audio_codecs->begin(); 1096 AudioCodecs::iterator iter = audio_codecs->begin();
1028 while (iter != audio_codecs->end()) { 1097 while (iter != audio_codecs->end()) {
1029 if (STR_CASE_CMP(iter->name.c_str(), kComfortNoiseCodecName) == 0) { 1098 if (STR_CASE_CMP(iter->name.c_str(), kComfortNoiseCodecName) == 0) {
(...skipping 14 matching lines...) Expand all
1044 // from the incoming session-initiate. If the negotiation fails, this 1113 // from the incoming session-initiate. If the negotiation fails, this
1045 // method returns false. The created content is added to the offer. 1114 // method returns false. The created content is added to the offer.
1046 template <class C> 1115 template <class C>
1047 static bool CreateMediaContentAnswer( 1116 static bool CreateMediaContentAnswer(
1048 const MediaContentDescriptionImpl<C>* offer, 1117 const MediaContentDescriptionImpl<C>* offer,
1049 const MediaSessionOptions& options, 1118 const MediaSessionOptions& options,
1050 const std::vector<C>& local_codecs, 1119 const std::vector<C>& local_codecs,
1051 const SecurePolicy& sdes_policy, 1120 const SecurePolicy& sdes_policy,
1052 const CryptoParamsVec* current_cryptos, 1121 const CryptoParamsVec* current_cryptos,
1053 const RtpHeaderExtensions& local_rtp_extenstions, 1122 const RtpHeaderExtensions& local_rtp_extenstions,
1123 bool enable_encrypted_rtp_header_extensions,
1054 StreamParamsVec* current_streams, 1124 StreamParamsVec* current_streams,
1055 bool add_legacy_stream, 1125 bool add_legacy_stream,
1056 bool bundle_enabled, 1126 bool bundle_enabled,
1057 MediaContentDescriptionImpl<C>* answer) { 1127 MediaContentDescriptionImpl<C>* answer) {
1058 std::vector<C> negotiated_codecs; 1128 std::vector<C> negotiated_codecs;
1059 NegotiateCodecs(local_codecs, offer->codecs(), &negotiated_codecs); 1129 NegotiateCodecs(local_codecs, offer->codecs(), &negotiated_codecs);
1060 answer->AddCodecs(negotiated_codecs); 1130 answer->AddCodecs(negotiated_codecs);
1061 answer->set_protocol(offer->protocol()); 1131 answer->set_protocol(offer->protocol());
1062 RtpHeaderExtensions negotiated_rtp_extensions; 1132 RtpHeaderExtensions negotiated_rtp_extensions;
1063 NegotiateRtpHeaderExtensions(local_rtp_extenstions, 1133 NegotiateRtpHeaderExtensions(local_rtp_extenstions,
1064 offer->rtp_header_extensions(), 1134 offer->rtp_header_extensions(),
1135 enable_encrypted_rtp_header_extensions,
1065 &negotiated_rtp_extensions); 1136 &negotiated_rtp_extensions);
1066 answer->set_rtp_header_extensions(negotiated_rtp_extensions); 1137 answer->set_rtp_header_extensions(negotiated_rtp_extensions);
1067 1138
1068 answer->set_rtcp_mux(options.rtcp_mux_enabled && offer->rtcp_mux()); 1139 answer->set_rtcp_mux(options.rtcp_mux_enabled && offer->rtcp_mux());
1069 if (answer->type() == cricket::MEDIA_TYPE_VIDEO) { 1140 if (answer->type() == cricket::MEDIA_TYPE_VIDEO) {
1070 answer->set_rtcp_reduced_size(offer->rtcp_reduced_size()); 1141 answer->set_rtcp_reduced_size(offer->rtcp_reduced_size());
1071 } 1142 }
1072 1143
1073 if (sdes_policy != SEC_DISABLED) { 1144 if (sdes_policy != SEC_DISABLED) {
1074 CryptoParams crypto; 1145 CryptoParams crypto;
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after
1573 &used_pltypes); 1644 &used_pltypes);
1574 } 1645 }
1575 1646
1576 void MediaSessionDescriptionFactory::GetRtpHdrExtsToOffer( 1647 void MediaSessionDescriptionFactory::GetRtpHdrExtsToOffer(
1577 const SessionDescription* current_description, 1648 const SessionDescription* current_description,
1578 RtpHeaderExtensions* audio_extensions, 1649 RtpHeaderExtensions* audio_extensions,
1579 RtpHeaderExtensions* video_extensions) const { 1650 RtpHeaderExtensions* video_extensions) const {
1580 // All header extensions allocated from the same range to avoid potential 1651 // All header extensions allocated from the same range to avoid potential
1581 // issues when using BUNDLE. 1652 // issues when using BUNDLE.
1582 UsedRtpHeaderExtensionIds used_ids; 1653 UsedRtpHeaderExtensionIds used_ids;
1583 RtpHeaderExtensions all_extensions; 1654 RtpHeaderExtensions all_regular_extensions;
1655 RtpHeaderExtensions all_encrypted_extensions;
1584 audio_extensions->clear(); 1656 audio_extensions->clear();
1585 video_extensions->clear(); 1657 video_extensions->clear();
1586 1658
1587 // First - get all extensions from the current description if the media type 1659 // First - get all extensions from the current description if the media type
1588 // is used. 1660 // is used.
1589 // Add them to |used_ids| so the local ids are not reused if a new media 1661 // Add them to |used_ids| so the local ids are not reused if a new media
1590 // type is added. 1662 // type is added.
1591 if (current_description) { 1663 if (current_description) {
1592 const AudioContentDescription* audio = 1664 const AudioContentDescription* audio =
1593 GetFirstAudioContentDescription(current_description); 1665 GetFirstAudioContentDescription(current_description);
1594 if (audio) { 1666 if (audio) {
1595 *audio_extensions = audio->rtp_header_extensions(); 1667 *audio_extensions = audio->rtp_header_extensions();
1596 FindAndSetRtpHdrExtUsed(audio_extensions, &all_extensions, &used_ids); 1668 FindAndSetRtpHdrExtUsed(audio_extensions, &all_regular_extensions,
1669 &all_encrypted_extensions, &used_ids);
1597 } 1670 }
1598 const VideoContentDescription* video = 1671 const VideoContentDescription* video =
1599 GetFirstVideoContentDescription(current_description); 1672 GetFirstVideoContentDescription(current_description);
1600 if (video) { 1673 if (video) {
1601 *video_extensions = video->rtp_header_extensions(); 1674 *video_extensions = video->rtp_header_extensions();
1602 FindAndSetRtpHdrExtUsed(video_extensions, &all_extensions, &used_ids); 1675 FindAndSetRtpHdrExtUsed(video_extensions, &all_regular_extensions,
1676 &all_encrypted_extensions, &used_ids);
1603 } 1677 }
1604 } 1678 }
1605 1679
1606 // Add our default RTP header extensions that are not in 1680 // Add our default RTP header extensions that are not in
1607 // |current_description|. 1681 // |current_description|.
1608 FindRtpHdrExtsToOffer(audio_rtp_header_extensions(), audio_extensions, 1682 FindRtpHdrExtsToOffer(audio_rtp_header_extensions(), audio_extensions,
1609 &all_extensions, &used_ids); 1683 &all_regular_extensions, &used_ids);
1610 FindRtpHdrExtsToOffer(video_rtp_header_extensions(), video_extensions, 1684 FindRtpHdrExtsToOffer(video_rtp_header_extensions(), video_extensions,
1611 &all_extensions, &used_ids); 1685 &all_regular_extensions, &used_ids);
1686 // TODO(jbauch): Support adding encrypted header extensions to existing
1687 // sessions.
1688 if (enable_encrypted_rtp_header_extensions_ && !current_description) {
1689 AddEncryptedVersionsOfHdrExts(audio_extensions, &all_encrypted_extensions,
1690 &used_ids);
1691 AddEncryptedVersionsOfHdrExts(video_extensions, &all_encrypted_extensions,
1692 &used_ids);
1693 }
1612 } 1694 }
1613 1695
1614 bool MediaSessionDescriptionFactory::AddTransportOffer( 1696 bool MediaSessionDescriptionFactory::AddTransportOffer(
1615 const std::string& content_name, 1697 const std::string& content_name,
1616 const TransportOptions& transport_options, 1698 const TransportOptions& transport_options,
1617 const SessionDescription* current_desc, 1699 const SessionDescription* current_desc,
1618 SessionDescription* offer_desc) const { 1700 SessionDescription* offer_desc) const {
1619 if (!transport_desc_factory_) 1701 if (!transport_desc_factory_)
1620 return false; 1702 return false;
1621 const TransportDescription* current_tdesc = 1703 const TransportDescription* current_tdesc =
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
1879 // Do not require or create SDES cryptos if DTLS is used. 1961 // Do not require or create SDES cryptos if DTLS is used.
1880 cricket::SecurePolicy sdes_policy = 1962 cricket::SecurePolicy sdes_policy =
1881 audio_transport->secure() ? cricket::SEC_DISABLED : secure(); 1963 audio_transport->secure() ? cricket::SEC_DISABLED : secure();
1882 if (!CreateMediaContentAnswer( 1964 if (!CreateMediaContentAnswer(
1883 offer_audio, 1965 offer_audio,
1884 options, 1966 options,
1885 audio_codecs, 1967 audio_codecs,
1886 sdes_policy, 1968 sdes_policy,
1887 GetCryptos(GetFirstAudioContentDescription(current_description)), 1969 GetCryptos(GetFirstAudioContentDescription(current_description)),
1888 audio_rtp_extensions_, 1970 audio_rtp_extensions_,
1971 enable_encrypted_rtp_header_extensions_,
1889 current_streams, 1972 current_streams,
1890 add_legacy_, 1973 add_legacy_,
1891 bundle_enabled, 1974 bundle_enabled,
1892 audio_answer.get())) { 1975 audio_answer.get())) {
1893 return false; // Fails the session setup. 1976 return false; // Fails the session setup.
1894 } 1977 }
1895 1978
1896 bool secure = bundle_transport ? bundle_transport->description.secure() 1979 bool secure = bundle_transport ? bundle_transport->description.secure()
1897 : audio_transport->secure(); 1980 : audio_transport->secure();
1898 bool rejected = !options.has_audio() || audio_content->rejected || 1981 bool rejected = !options.has_audio() || audio_content->rejected ||
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1935 bool bundle_enabled = 2018 bool bundle_enabled =
1936 offer->HasGroup(GROUP_TYPE_BUNDLE) && options.bundle_enabled; 2019 offer->HasGroup(GROUP_TYPE_BUNDLE) && options.bundle_enabled;
1937 if (!CreateMediaContentAnswer( 2020 if (!CreateMediaContentAnswer(
1938 static_cast<const VideoContentDescription*>( 2021 static_cast<const VideoContentDescription*>(
1939 video_content->description), 2022 video_content->description),
1940 options, 2023 options,
1941 video_codecs_, 2024 video_codecs_,
1942 sdes_policy, 2025 sdes_policy,
1943 GetCryptos(GetFirstVideoContentDescription(current_description)), 2026 GetCryptos(GetFirstVideoContentDescription(current_description)),
1944 video_rtp_extensions_, 2027 video_rtp_extensions_,
2028 enable_encrypted_rtp_header_extensions_,
1945 current_streams, 2029 current_streams,
1946 add_legacy_, 2030 add_legacy_,
1947 bundle_enabled, 2031 bundle_enabled,
1948 video_answer.get())) { 2032 video_answer.get())) {
1949 return false; 2033 return false;
1950 } 2034 }
1951 bool secure = bundle_transport ? bundle_transport->description.secure() 2035 bool secure = bundle_transport ? bundle_transport->description.secure()
1952 : video_transport->secure(); 2036 : video_transport->secure();
1953 bool rejected = !options.has_video() || video_content->rejected || 2037 bool rejected = !options.has_video() || video_content->rejected ||
1954 !IsMediaProtocolSupported(MEDIA_TYPE_VIDEO, 2038 !IsMediaProtocolSupported(MEDIA_TYPE_VIDEO,
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1996 bool bundle_enabled = 2080 bool bundle_enabled =
1997 offer->HasGroup(GROUP_TYPE_BUNDLE) && options.bundle_enabled; 2081 offer->HasGroup(GROUP_TYPE_BUNDLE) && options.bundle_enabled;
1998 if (!CreateMediaContentAnswer( 2082 if (!CreateMediaContentAnswer(
1999 static_cast<const DataContentDescription*>( 2083 static_cast<const DataContentDescription*>(
2000 data_content->description), 2084 data_content->description),
2001 options, 2085 options,
2002 data_codecs_, 2086 data_codecs_,
2003 sdes_policy, 2087 sdes_policy,
2004 GetCryptos(GetFirstDataContentDescription(current_description)), 2088 GetCryptos(GetFirstDataContentDescription(current_description)),
2005 RtpHeaderExtensions(), 2089 RtpHeaderExtensions(),
2090 enable_encrypted_rtp_header_extensions_,
2006 current_streams, 2091 current_streams,
2007 add_legacy_, 2092 add_legacy_,
2008 bundle_enabled, 2093 bundle_enabled,
2009 data_answer.get())) { 2094 data_answer.get())) {
2010 return false; // Fails the session setup. 2095 return false; // Fails the session setup.
2011 } 2096 }
2012 2097
2013 // Respond with sctpmap if the offer uses sctpmap. 2098 // Respond with sctpmap if the offer uses sctpmap.
2014 const DataContentDescription* offer_data_description = 2099 const DataContentDescription* offer_data_description =
2015 static_cast<const DataContentDescription*>(data_content->description); 2100 static_cast<const DataContentDescription*>(data_content->description);
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
2191 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO)); 2276 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO));
2192 } 2277 }
2193 2278
2194 DataContentDescription* GetFirstDataContentDescription( 2279 DataContentDescription* GetFirstDataContentDescription(
2195 SessionDescription* sdesc) { 2280 SessionDescription* sdesc) {
2196 return static_cast<DataContentDescription*>( 2281 return static_cast<DataContentDescription*>(
2197 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA)); 2282 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA));
2198 } 2283 }
2199 2284
2200 } // namespace cricket 2285 } // namespace cricket
OLDNEW
« no previous file with comments | « webrtc/pc/mediasession.h ('k') | webrtc/pc/mediasession_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698