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

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

Issue 2647593003: Accept SDP with TRANSPORT attributes missing from bundled m= sections. (Closed)
Patch Set: Fix "a=fingerprint" too. Created 3 years, 11 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
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 1430 matching lines...) Expand 10 before | Expand all | Expand 10 after
1441 return NULL; 1441 return NULL;
1442 } 1442 }
1443 } 1443 }
1444 1444
1445 return offer.release(); 1445 return offer.release();
1446 } 1446 }
1447 1447
1448 SessionDescription* MediaSessionDescriptionFactory::CreateAnswer( 1448 SessionDescription* MediaSessionDescriptionFactory::CreateAnswer(
1449 const SessionDescription* offer, const MediaSessionOptions& options, 1449 const SessionDescription* offer, const MediaSessionOptions& options,
1450 const SessionDescription* current_description) const { 1450 const SessionDescription* current_description) const {
1451 if (!offer) {
1452 return nullptr;
1453 }
1451 // The answer contains the intersection of the codecs in the offer with the 1454 // The answer contains the intersection of the codecs in the offer with the
1452 // codecs we support. As indicated by XEP-0167, we retain the same payload ids 1455 // codecs we support. As indicated by XEP-0167, we retain the same payload ids
1453 // from the offer in the answer. 1456 // from the offer in the answer.
1454 std::unique_ptr<SessionDescription> answer(new SessionDescription()); 1457 std::unique_ptr<SessionDescription> answer(new SessionDescription());
1455 1458
1456 StreamParamsVec current_streams; 1459 StreamParamsVec current_streams;
1457 GetCurrentStreamParams(current_description, &current_streams); 1460 GetCurrentStreamParams(current_description, &current_streams);
1458 1461
1459 if (offer) { 1462 // If the offer supports BUNDLE, and we want to use it too, create a BUNDLE
1460 ContentInfos::const_iterator it = offer->contents().begin(); 1463 // group in the answer with the appropriate content names.
1461 for (; it != offer->contents().end(); ++it) { 1464 const ContentGroup* offer_bundle = offer->GetGroupByName(GROUP_TYPE_BUNDLE);
1462 if (IsMediaContentOfType(&*it, MEDIA_TYPE_AUDIO)) { 1465 ContentGroup answer_bundle(GROUP_TYPE_BUNDLE);
1463 if (!AddAudioContentForAnswer(offer, options, current_description, 1466 // Transport info shared by the bundle group.
1464 &current_streams, answer.get())) { 1467 std::unique_ptr<TransportInfo> bundle_transport;
1465 return NULL; 1468
1466 } 1469 ContentInfos::const_iterator it = offer->contents().begin();
1467 } else if (IsMediaContentOfType(&*it, MEDIA_TYPE_VIDEO)) { 1470 for (; it != offer->contents().end(); ++it) {
1468 if (!AddVideoContentForAnswer(offer, options, current_description, 1471 if (IsMediaContentOfType(&*it, MEDIA_TYPE_AUDIO)) {
1469 &current_streams, answer.get())) { 1472 if (!AddAudioContentForAnswer(offer, options, current_description,
1470 return NULL; 1473 bundle_transport.get(), &current_streams,
1471 } 1474 answer.get())) {
1472 } else { 1475 return NULL;
1473 RTC_DCHECK(IsMediaContentOfType(&*it, MEDIA_TYPE_DATA)); 1476 }
1474 if (!AddDataContentForAnswer(offer, options, current_description, 1477 } else if (IsMediaContentOfType(&*it, MEDIA_TYPE_VIDEO)) {
1475 &current_streams, answer.get())) { 1478 if (!AddVideoContentForAnswer(offer, options, current_description,
1476 return NULL; 1479 bundle_transport.get(), &current_streams,
1477 } 1480 answer.get())) {
1481 return NULL;
1482 }
1483 } else {
1484 RTC_DCHECK(IsMediaContentOfType(&*it, MEDIA_TYPE_DATA));
1485 if (!AddDataContentForAnswer(offer, options, current_description,
1486 bundle_transport.get(), &current_streams,
1487 answer.get())) {
1488 return NULL;
1489 }
1490 }
1491 // See if we can add the newly generated m= section to the BUNDLE group in
1492 // the answer.
1493 if (options.bundle_enabled) {
1494 ContentInfo& added = answer->contents().back();
1495 if (!added.rejected && offer_bundle &&
1496 offer_bundle->HasContentName(added.name)) {
1497 answer_bundle.AddContentName(added.name);
1498 bundle_transport.reset(
1499 new TransportInfo(*answer->GetTransportInfoByName(added.name)));
pthatcher1 2017/02/17 19:17:32 Why do you need to set the bundle_transport here?
Taylor Brandstetter 2017/02/17 21:49:15 Because it's needed inside the loop, for AddXConte
1478 } 1500 }
1479 } 1501 }
pthatcher1 2017/02/17 19:17:32 Might be more clear with one if statement: Conten
Taylor Brandstetter 2017/02/17 21:49:15 Done.
1480 } 1502 }
pthatcher1 2017/02/17 19:17:32 If the offer has this: a=bundle b a m= a=mid:a m=
Taylor Brandstetter 2017/02/17 21:49:15 Yes we already do that. Yes, it's technically wron
1481 1503
1482 // If the offer supports BUNDLE, and we want to use it too, create a BUNDLE 1504 // Only put BUNDLE group in answer if nonempty.
1483 // group in the answer with the appropriate content names. 1505 if (answer_bundle.FirstContentName()) {
1484 if (offer->HasGroup(GROUP_TYPE_BUNDLE) && options.bundle_enabled) { 1506 answer->AddGroup(answer_bundle);
1485 const ContentGroup* offer_bundle = offer->GetGroupByName(GROUP_TYPE_BUNDLE); 1507
1486 ContentGroup answer_bundle(GROUP_TYPE_BUNDLE); 1508 // Share the same ICE credentials and crypto params across all contents,
1487 for (ContentInfos::const_iterator content = answer->contents().begin(); 1509 // as BUNDLE requires.
1488 content != answer->contents().end(); ++content) { 1510 if (!UpdateTransportInfoForBundle(answer_bundle, answer.get())) {
1489 if (!content->rejected && offer_bundle->HasContentName(content->name)) { 1511 LOG(LS_ERROR) << "CreateAnswer failed to UpdateTransportInfoForBundle.";
1490 answer_bundle.AddContentName(content->name); 1512 return NULL;
1491 }
1492 } 1513 }
1493 if (answer_bundle.FirstContentName()) {
1494 answer->AddGroup(answer_bundle);
1495 1514
1496 // Share the same ICE credentials and crypto params across all contents, 1515 if (!UpdateCryptoParamsForBundle(answer_bundle, answer.get())) {
1497 // as BUNDLE requires. 1516 LOG(LS_ERROR) << "CreateAnswer failed to UpdateCryptoParamsForBundle.";
1498 if (!UpdateTransportInfoForBundle(answer_bundle, answer.get())) { 1517 return NULL;
1499 LOG(LS_ERROR) << "CreateAnswer failed to UpdateTransportInfoForBundle.";
1500 return NULL;
1501 }
1502
1503 if (!UpdateCryptoParamsForBundle(answer_bundle, answer.get())) {
1504 LOG(LS_ERROR) << "CreateAnswer failed to UpdateCryptoParamsForBundle.";
1505 return NULL;
1506 }
1507 } 1518 }
1508 } 1519 }
1509 1520
1510 return answer.release(); 1521 return answer.release();
1511 } 1522 }
1512 1523
1513 const AudioCodecs& MediaSessionDescriptionFactory::GetAudioCodecsForOffer( 1524 const AudioCodecs& MediaSessionDescriptionFactory::GetAudioCodecsForOffer(
1514 const RtpTransceiverDirection& direction) const { 1525 const RtpTransceiverDirection& direction) const {
1515 // If stream is inactive - generate list as if sendrecv. 1526 // If stream is inactive - generate list as if sendrecv.
1516 if (direction.send == direction.recv) { 1527 if (direction.send == direction.recv) {
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
1645 LOG(LS_ERROR) 1656 LOG(LS_ERROR)
1646 << "Failed to AddTransportOffer, content name=" << content_name; 1657 << "Failed to AddTransportOffer, content name=" << content_name;
1647 } 1658 }
1648 return ret; 1659 return ret;
1649 } 1660 }
1650 1661
1651 TransportDescription* MediaSessionDescriptionFactory::CreateTransportAnswer( 1662 TransportDescription* MediaSessionDescriptionFactory::CreateTransportAnswer(
1652 const std::string& content_name, 1663 const std::string& content_name,
1653 const SessionDescription* offer_desc, 1664 const SessionDescription* offer_desc,
1654 const TransportOptions& transport_options, 1665 const TransportOptions& transport_options,
1655 const SessionDescription* current_desc) const { 1666 const SessionDescription* current_desc,
1667 bool bundled) const {
1656 if (!transport_desc_factory_) 1668 if (!transport_desc_factory_)
1657 return NULL; 1669 return NULL;
1658 const TransportDescription* offer_tdesc = 1670 const TransportDescription* offer_tdesc =
1659 GetTransportDescription(content_name, offer_desc); 1671 GetTransportDescription(content_name, offer_desc);
1660 const TransportDescription* current_tdesc = 1672 const TransportDescription* current_tdesc =
1661 GetTransportDescription(content_name, current_desc); 1673 GetTransportDescription(content_name, current_desc);
1662 return 1674 return transport_desc_factory_->CreateAnswer(offer_tdesc, transport_options,
1663 transport_desc_factory_->CreateAnswer(offer_tdesc, transport_options, 1675 current_tdesc, bundled);
1664 current_tdesc);
1665 } 1676 }
1666 1677
1667 bool MediaSessionDescriptionFactory::AddTransportAnswer( 1678 bool MediaSessionDescriptionFactory::AddTransportAnswer(
1668 const std::string& content_name, 1679 const std::string& content_name,
1669 const TransportDescription& transport_desc, 1680 const TransportDescription& transport_desc,
1670 SessionDescription* answer_desc) const { 1681 SessionDescription* answer_desc) const {
1671 if (!answer_desc->AddTransportInfo(TransportInfo(content_name, 1682 if (!answer_desc->AddTransportInfo(TransportInfo(content_name,
1672 transport_desc))) { 1683 transport_desc))) {
1673 LOG(LS_ERROR) 1684 LOG(LS_ERROR)
1674 << "Failed to AddTransportAnswer, content name=" << content_name; 1685 << "Failed to AddTransportAnswer, content name=" << content_name;
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
1849 current_description, desc)) { 1860 current_description, desc)) {
1850 return false; 1861 return false;
1851 } 1862 }
1852 return true; 1863 return true;
1853 } 1864 }
1854 1865
1855 bool MediaSessionDescriptionFactory::AddAudioContentForAnswer( 1866 bool MediaSessionDescriptionFactory::AddAudioContentForAnswer(
1856 const SessionDescription* offer, 1867 const SessionDescription* offer,
1857 const MediaSessionOptions& options, 1868 const MediaSessionOptions& options,
1858 const SessionDescription* current_description, 1869 const SessionDescription* current_description,
1870 const TransportInfo* bundle_transport,
1859 StreamParamsVec* current_streams, 1871 StreamParamsVec* current_streams,
1860 SessionDescription* answer) const { 1872 SessionDescription* answer) const {
1861 const ContentInfo* audio_content = GetFirstAudioContent(offer); 1873 const ContentInfo* audio_content = GetFirstAudioContent(offer);
1862 const AudioContentDescription* offer_audio = 1874 const AudioContentDescription* offer_audio =
1863 static_cast<const AudioContentDescription*>(audio_content->description); 1875 static_cast<const AudioContentDescription*>(audio_content->description);
1864 1876
1865 std::unique_ptr<TransportDescription> audio_transport(CreateTransportAnswer( 1877 std::unique_ptr<TransportDescription> audio_transport(
1866 audio_content->name, offer, 1878 CreateTransportAnswer(audio_content->name, offer,
1867 GetTransportOptions(options, audio_content->name), current_description)); 1879 GetTransportOptions(options, audio_content->name),
1880 current_description, bundle_transport != nullptr));
1868 if (!audio_transport) { 1881 if (!audio_transport) {
1869 return false; 1882 return false;
1870 } 1883 }
1871 1884
1872 // Pick codecs based on the requested communications direction in the offer. 1885 // Pick codecs based on the requested communications direction in the offer.
1873 const bool wants_send = 1886 const bool wants_send =
1874 options.HasSendMediaStream(MEDIA_TYPE_AUDIO) || add_legacy_; 1887 options.HasSendMediaStream(MEDIA_TYPE_AUDIO) || add_legacy_;
1875 auto wants_rtd = RtpTransceiverDirection(wants_send, options.recv_audio); 1888 auto wants_rtd = RtpTransceiverDirection(wants_send, options.recv_audio);
1876 auto offer_rtd = 1889 auto offer_rtd =
1877 RtpTransceiverDirection::FromMediaContentDirection( 1890 RtpTransceiverDirection::FromMediaContentDirection(
(...skipping 18 matching lines...) Expand all
1896 sdes_policy, 1909 sdes_policy,
1897 GetCryptos(GetFirstAudioContentDescription(current_description)), 1910 GetCryptos(GetFirstAudioContentDescription(current_description)),
1898 audio_rtp_extensions_, 1911 audio_rtp_extensions_,
1899 current_streams, 1912 current_streams,
1900 add_legacy_, 1913 add_legacy_,
1901 bundle_enabled, 1914 bundle_enabled,
1902 audio_answer.get())) { 1915 audio_answer.get())) {
1903 return false; // Fails the session setup. 1916 return false; // Fails the session setup.
1904 } 1917 }
1905 1918
1919 bool secure = bundle_transport ? bundle_transport->description.secure()
1920 : audio_transport->secure();
1906 bool rejected = !options.has_audio() || audio_content->rejected || 1921 bool rejected = !options.has_audio() || audio_content->rejected ||
1907 !IsMediaProtocolSupported(MEDIA_TYPE_AUDIO, 1922 !IsMediaProtocolSupported(MEDIA_TYPE_AUDIO,
1908 audio_answer->protocol(), 1923 audio_answer->protocol(), secure);
1909 audio_transport->secure());
1910 if (!rejected) { 1924 if (!rejected) {
1911 AddTransportAnswer(audio_content->name, *(audio_transport.get()), answer); 1925 AddTransportAnswer(audio_content->name, *(audio_transport.get()), answer);
1912 } else { 1926 } else {
1913 // RFC 3264 1927 // RFC 3264
1914 // The answer MUST contain the same number of m-lines as the offer. 1928 // The answer MUST contain the same number of m-lines as the offer.
1915 LOG(LS_INFO) << "Audio is not supported in the answer."; 1929 LOG(LS_INFO) << "Audio is not supported in the answer.";
1916 } 1930 }
1917 1931
1918 answer->AddContent(audio_content->name, audio_content->type, rejected, 1932 answer->AddContent(audio_content->name, audio_content->type, rejected,
1919 audio_answer.release()); 1933 audio_answer.release());
1920 return true; 1934 return true;
1921 } 1935 }
1922 1936
1923 bool MediaSessionDescriptionFactory::AddVideoContentForAnswer( 1937 bool MediaSessionDescriptionFactory::AddVideoContentForAnswer(
1924 const SessionDescription* offer, 1938 const SessionDescription* offer,
1925 const MediaSessionOptions& options, 1939 const MediaSessionOptions& options,
1926 const SessionDescription* current_description, 1940 const SessionDescription* current_description,
1941 const TransportInfo* bundle_transport,
1927 StreamParamsVec* current_streams, 1942 StreamParamsVec* current_streams,
1928 SessionDescription* answer) const { 1943 SessionDescription* answer) const {
1929 const ContentInfo* video_content = GetFirstVideoContent(offer); 1944 const ContentInfo* video_content = GetFirstVideoContent(offer);
1930 std::unique_ptr<TransportDescription> video_transport(CreateTransportAnswer( 1945 std::unique_ptr<TransportDescription> video_transport(
1931 video_content->name, offer, 1946 CreateTransportAnswer(video_content->name, offer,
1932 GetTransportOptions(options, video_content->name), current_description)); 1947 GetTransportOptions(options, video_content->name),
1948 current_description, bundle_transport != nullptr));
1933 if (!video_transport) { 1949 if (!video_transport) {
1934 return false; 1950 return false;
1935 } 1951 }
1936 1952
1937 std::unique_ptr<VideoContentDescription> video_answer( 1953 std::unique_ptr<VideoContentDescription> video_answer(
1938 new VideoContentDescription()); 1954 new VideoContentDescription());
1939 // Do not require or create SDES cryptos if DTLS is used. 1955 // Do not require or create SDES cryptos if DTLS is used.
1940 cricket::SecurePolicy sdes_policy = 1956 cricket::SecurePolicy sdes_policy =
1941 video_transport->secure() ? cricket::SEC_DISABLED : secure(); 1957 video_transport->secure() ? cricket::SEC_DISABLED : secure();
1942 bool bundle_enabled = 1958 bool bundle_enabled =
1943 offer->HasGroup(GROUP_TYPE_BUNDLE) && options.bundle_enabled; 1959 offer->HasGroup(GROUP_TYPE_BUNDLE) && options.bundle_enabled;
1944 if (!CreateMediaContentAnswer( 1960 if (!CreateMediaContentAnswer(
1945 static_cast<const VideoContentDescription*>( 1961 static_cast<const VideoContentDescription*>(
1946 video_content->description), 1962 video_content->description),
1947 options, 1963 options,
1948 video_codecs_, 1964 video_codecs_,
1949 sdes_policy, 1965 sdes_policy,
1950 GetCryptos(GetFirstVideoContentDescription(current_description)), 1966 GetCryptos(GetFirstVideoContentDescription(current_description)),
1951 video_rtp_extensions_, 1967 video_rtp_extensions_,
1952 current_streams, 1968 current_streams,
1953 add_legacy_, 1969 add_legacy_,
1954 bundle_enabled, 1970 bundle_enabled,
1955 video_answer.get())) { 1971 video_answer.get())) {
1956 return false; 1972 return false;
1957 } 1973 }
1974 bool secure = bundle_transport ? bundle_transport->description.secure()
1975 : video_transport->secure();
1958 bool rejected = !options.has_video() || video_content->rejected || 1976 bool rejected = !options.has_video() || video_content->rejected ||
1959 !IsMediaProtocolSupported(MEDIA_TYPE_VIDEO, 1977 !IsMediaProtocolSupported(MEDIA_TYPE_VIDEO,
1960 video_answer->protocol(), 1978 video_answer->protocol(), secure);
1961 video_transport->secure());
1962 if (!rejected) { 1979 if (!rejected) {
1963 if (!AddTransportAnswer(video_content->name, *(video_transport.get()), 1980 if (!AddTransportAnswer(video_content->name, *(video_transport.get()),
1964 answer)) { 1981 answer)) {
1965 return false; 1982 return false;
1966 } 1983 }
1967 video_answer->set_bandwidth(options.video_bandwidth); 1984 video_answer->set_bandwidth(options.video_bandwidth);
1968 } else { 1985 } else {
1969 // RFC 3264 1986 // RFC 3264
1970 // The answer MUST contain the same number of m-lines as the offer. 1987 // The answer MUST contain the same number of m-lines as the offer.
1971 LOG(LS_INFO) << "Video is not supported in the answer."; 1988 LOG(LS_INFO) << "Video is not supported in the answer.";
1972 } 1989 }
1973 answer->AddContent(video_content->name, video_content->type, rejected, 1990 answer->AddContent(video_content->name, video_content->type, rejected,
1974 video_answer.release()); 1991 video_answer.release());
1975 return true; 1992 return true;
1976 } 1993 }
1977 1994
1978 bool MediaSessionDescriptionFactory::AddDataContentForAnswer( 1995 bool MediaSessionDescriptionFactory::AddDataContentForAnswer(
1979 const SessionDescription* offer, 1996 const SessionDescription* offer,
1980 const MediaSessionOptions& options, 1997 const MediaSessionOptions& options,
1981 const SessionDescription* current_description, 1998 const SessionDescription* current_description,
1999 const TransportInfo* bundle_transport,
1982 StreamParamsVec* current_streams, 2000 StreamParamsVec* current_streams,
1983 SessionDescription* answer) const { 2001 SessionDescription* answer) const {
1984 const ContentInfo* data_content = GetFirstDataContent(offer); 2002 const ContentInfo* data_content = GetFirstDataContent(offer);
1985 std::unique_ptr<TransportDescription> data_transport(CreateTransportAnswer( 2003 std::unique_ptr<TransportDescription> data_transport(
1986 data_content->name, offer, 2004 CreateTransportAnswer(data_content->name, offer,
1987 GetTransportOptions(options, data_content->name), current_description)); 2005 GetTransportOptions(options, data_content->name),
2006 current_description, bundle_transport != nullptr));
1988 if (!data_transport) { 2007 if (!data_transport) {
1989 return false; 2008 return false;
1990 } 2009 }
1991 bool is_sctp = (options.data_channel_type == DCT_SCTP); 2010 bool is_sctp = (options.data_channel_type == DCT_SCTP);
1992 std::vector<DataCodec> data_codecs(data_codecs_); 2011 std::vector<DataCodec> data_codecs(data_codecs_);
1993 FilterDataCodecs(&data_codecs, is_sctp); 2012 FilterDataCodecs(&data_codecs, is_sctp);
1994 2013
1995 std::unique_ptr<DataContentDescription> data_answer( 2014 std::unique_ptr<DataContentDescription> data_answer(
1996 new DataContentDescription()); 2015 new DataContentDescription());
1997 // Do not require or create SDES cryptos if DTLS is used. 2016 // Do not require or create SDES cryptos if DTLS is used.
1998 cricket::SecurePolicy sdes_policy = 2017 cricket::SecurePolicy sdes_policy =
1999 data_transport->secure() ? cricket::SEC_DISABLED : secure(); 2018 data_transport->secure() ? cricket::SEC_DISABLED : secure();
2000 bool bundle_enabled = 2019 bool bundle_enabled =
2001 offer->HasGroup(GROUP_TYPE_BUNDLE) && options.bundle_enabled; 2020 offer->HasGroup(GROUP_TYPE_BUNDLE) && options.bundle_enabled;
2002 if (!CreateMediaContentAnswer( 2021 if (!CreateMediaContentAnswer(
2003 static_cast<const DataContentDescription*>( 2022 static_cast<const DataContentDescription*>(
2004 data_content->description), 2023 data_content->description),
2005 options, 2024 options,
2006 data_codecs_, 2025 data_codecs_,
2007 sdes_policy, 2026 sdes_policy,
2008 GetCryptos(GetFirstDataContentDescription(current_description)), 2027 GetCryptos(GetFirstDataContentDescription(current_description)),
2009 RtpHeaderExtensions(), 2028 RtpHeaderExtensions(),
2010 current_streams, 2029 current_streams,
2011 add_legacy_, 2030 add_legacy_,
2012 bundle_enabled, 2031 bundle_enabled,
2013 data_answer.get())) { 2032 data_answer.get())) {
2014 return false; // Fails the session setup. 2033 return false; // Fails the session setup.
2015 } 2034 }
2016 2035
2036 bool secure = bundle_transport ? bundle_transport->description.secure()
2037 : data_transport->secure();
2017 bool rejected = !options.has_data() || data_content->rejected || 2038 bool rejected = !options.has_data() || data_content->rejected ||
2018 !IsMediaProtocolSupported(MEDIA_TYPE_DATA, 2039 !IsMediaProtocolSupported(MEDIA_TYPE_DATA,
2019 data_answer->protocol(), 2040 data_answer->protocol(), secure);
2020 data_transport->secure());
2021 if (!rejected) { 2041 if (!rejected) {
2022 data_answer->set_bandwidth(options.data_bandwidth); 2042 data_answer->set_bandwidth(options.data_bandwidth);
2023 if (!AddTransportAnswer(data_content->name, *(data_transport.get()), 2043 if (!AddTransportAnswer(data_content->name, *(data_transport.get()),
2024 answer)) { 2044 answer)) {
2025 return false; 2045 return false;
2026 } 2046 }
2027 } else { 2047 } else {
2028 // RFC 3264 2048 // RFC 3264
2029 // The answer MUST contain the same number of m-lines as the offer. 2049 // The answer MUST contain the same number of m-lines as the offer.
2030 LOG(LS_INFO) << "Data is not supported in the answer."; 2050 LOG(LS_INFO) << "Data is not supported in the answer.";
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
2187 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO)); 2207 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO));
2188 } 2208 }
2189 2209
2190 DataContentDescription* GetFirstDataContentDescription( 2210 DataContentDescription* GetFirstDataContentDescription(
2191 SessionDescription* sdesc) { 2211 SessionDescription* sdesc) {
2192 return static_cast<DataContentDescription*>( 2212 return static_cast<DataContentDescription*>(
2193 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA)); 2213 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA));
2194 } 2214 }
2195 2215
2196 } // namespace cricket 2216 } // namespace cricket
OLDNEW
« webrtc/p2p/base/transportdescriptionfactory.h ('K') | « webrtc/pc/mediasession.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698