OLD | NEW |
1 /* | 1 /* |
2 * libjingle | 2 * libjingle |
3 * Copyright 2004 Google Inc. | 3 * Copyright 2004 Google Inc. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
542 current_streams->push_back(stream_param); | 542 current_streams->push_back(stream_param); |
543 } else { | 543 } else { |
544 content_description->AddStream(*param); | 544 content_description->AddStream(*param); |
545 } | 545 } |
546 } | 546 } |
547 return true; | 547 return true; |
548 } | 548 } |
549 | 549 |
550 // Updates the transport infos of the |sdesc| according to the given | 550 // Updates the transport infos of the |sdesc| according to the given |
551 // |bundle_group|. The transport infos of the content names within the | 551 // |bundle_group|. The transport infos of the content names within the |
552 // |bundle_group| should be updated to use the ufrag and pwd of the first | 552 // |bundle_group| should be updated to use the ufrag, pwd and DTLS role of the |
553 // content within the |bundle_group|. | 553 // first content within the |bundle_group|. |
554 static bool UpdateTransportInfoForBundle(const ContentGroup& bundle_group, | 554 static bool UpdateTransportInfoForBundle(const ContentGroup& bundle_group, |
555 SessionDescription* sdesc) { | 555 SessionDescription* sdesc) { |
556 // The bundle should not be empty. | 556 // The bundle should not be empty. |
557 if (!sdesc || !bundle_group.FirstContentName()) { | 557 if (!sdesc || !bundle_group.FirstContentName()) { |
558 return false; | 558 return false; |
559 } | 559 } |
560 | 560 |
561 // We should definitely have a transport for the first content. | 561 // We should definitely have a transport for the first content. |
562 const std::string& selected_content_name = *bundle_group.FirstContentName(); | 562 const std::string& selected_content_name = *bundle_group.FirstContentName(); |
563 const TransportInfo* selected_transport_info = | 563 const TransportInfo* selected_transport_info = |
564 sdesc->GetTransportInfoByName(selected_content_name); | 564 sdesc->GetTransportInfoByName(selected_content_name); |
565 if (!selected_transport_info) { | 565 if (!selected_transport_info) { |
566 return false; | 566 return false; |
567 } | 567 } |
568 | 568 |
569 // Set the other contents to use the same ICE credentials. | 569 // Set the other contents to use the same ICE credentials. |
570 const std::string& selected_ufrag = | 570 const std::string& selected_ufrag = |
571 selected_transport_info->description.ice_ufrag; | 571 selected_transport_info->description.ice_ufrag; |
572 const std::string& selected_pwd = | 572 const std::string& selected_pwd = |
573 selected_transport_info->description.ice_pwd; | 573 selected_transport_info->description.ice_pwd; |
| 574 ConnectionRole selected_connection_role = |
| 575 selected_transport_info->description.connection_role; |
574 for (TransportInfos::iterator it = | 576 for (TransportInfos::iterator it = |
575 sdesc->transport_infos().begin(); | 577 sdesc->transport_infos().begin(); |
576 it != sdesc->transport_infos().end(); ++it) { | 578 it != sdesc->transport_infos().end(); ++it) { |
577 if (bundle_group.HasContentName(it->content_name) && | 579 if (bundle_group.HasContentName(it->content_name) && |
578 it->content_name != selected_content_name) { | 580 it->content_name != selected_content_name) { |
579 it->description.ice_ufrag = selected_ufrag; | 581 it->description.ice_ufrag = selected_ufrag; |
580 it->description.ice_pwd = selected_pwd; | 582 it->description.ice_pwd = selected_pwd; |
| 583 it->description.connection_role = selected_connection_role; |
581 } | 584 } |
582 } | 585 } |
583 return true; | 586 return true; |
584 } | 587 } |
585 | 588 |
586 // Gets the CryptoParamsVec of the given |content_name| from |sdesc|, and | 589 // Gets the CryptoParamsVec of the given |content_name| from |sdesc|, and |
587 // sets it to |cryptos|. | 590 // sets it to |cryptos|. |
588 static bool GetCryptosByName(const SessionDescription* sdesc, | 591 static bool GetCryptosByName(const SessionDescription* sdesc, |
589 const std::string& content_name, | 592 const std::string& content_name, |
590 CryptoParamsVec* cryptos) { | 593 CryptoParamsVec* cryptos) { |
(...skipping 1002 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1593 } | 1596 } |
1594 } else { | 1597 } else { |
1595 if (options.recv_audio) { | 1598 if (options.recv_audio) { |
1596 audio->set_direction(MD_RECVONLY); | 1599 audio->set_direction(MD_RECVONLY); |
1597 } else { | 1600 } else { |
1598 audio->set_direction(MD_INACTIVE); | 1601 audio->set_direction(MD_INACTIVE); |
1599 } | 1602 } |
1600 } | 1603 } |
1601 | 1604 |
1602 desc->AddContent(content_name, NS_JINGLE_RTP, audio.release()); | 1605 desc->AddContent(content_name, NS_JINGLE_RTP, audio.release()); |
1603 if (!AddTransportOffer(content_name, options.transport_options, | 1606 if (!AddTransportOffer(content_name, options.audio_transport_options, |
1604 current_description, desc)) { | 1607 current_description, desc)) { |
1605 return false; | 1608 return false; |
1606 } | 1609 } |
1607 | 1610 |
1608 return true; | 1611 return true; |
1609 } | 1612 } |
1610 | 1613 |
1611 bool MediaSessionDescriptionFactory::AddVideoContentForOffer( | 1614 bool MediaSessionDescriptionFactory::AddVideoContentForOffer( |
1612 const MediaSessionOptions& options, | 1615 const MediaSessionOptions& options, |
1613 const SessionDescription* current_description, | 1616 const SessionDescription* current_description, |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1653 } | 1656 } |
1654 } else { | 1657 } else { |
1655 if (options.recv_video) { | 1658 if (options.recv_video) { |
1656 video->set_direction(MD_RECVONLY); | 1659 video->set_direction(MD_RECVONLY); |
1657 } else { | 1660 } else { |
1658 video->set_direction(MD_INACTIVE); | 1661 video->set_direction(MD_INACTIVE); |
1659 } | 1662 } |
1660 } | 1663 } |
1661 | 1664 |
1662 desc->AddContent(content_name, NS_JINGLE_RTP, video.release()); | 1665 desc->AddContent(content_name, NS_JINGLE_RTP, video.release()); |
1663 if (!AddTransportOffer(content_name, options.transport_options, | 1666 if (!AddTransportOffer(content_name, options.video_transport_options, |
1664 current_description, desc)) { | 1667 current_description, desc)) { |
1665 return false; | 1668 return false; |
1666 } | 1669 } |
1667 | 1670 |
1668 return true; | 1671 return true; |
1669 } | 1672 } |
1670 | 1673 |
1671 bool MediaSessionDescriptionFactory::AddDataContentForOffer( | 1674 bool MediaSessionDescriptionFactory::AddDataContentForOffer( |
1672 const MediaSessionOptions& options, | 1675 const MediaSessionOptions& options, |
1673 const SessionDescription* current_description, | 1676 const SessionDescription* current_description, |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1717 return false; | 1720 return false; |
1718 } | 1721 } |
1719 | 1722 |
1720 if (is_sctp) { | 1723 if (is_sctp) { |
1721 desc->AddContent(content_name, NS_JINGLE_DRAFT_SCTP, data.release()); | 1724 desc->AddContent(content_name, NS_JINGLE_DRAFT_SCTP, data.release()); |
1722 } else { | 1725 } else { |
1723 data->set_bandwidth(options.data_bandwidth); | 1726 data->set_bandwidth(options.data_bandwidth); |
1724 SetMediaProtocol(secure_transport, data.get()); | 1727 SetMediaProtocol(secure_transport, data.get()); |
1725 desc->AddContent(content_name, NS_JINGLE_RTP, data.release()); | 1728 desc->AddContent(content_name, NS_JINGLE_RTP, data.release()); |
1726 } | 1729 } |
1727 if (!AddTransportOffer(content_name, options.transport_options, | 1730 if (!AddTransportOffer(content_name, options.data_transport_options, |
1728 current_description, desc)) { | 1731 current_description, desc)) { |
1729 return false; | 1732 return false; |
1730 } | 1733 } |
1731 return true; | 1734 return true; |
1732 } | 1735 } |
1733 | 1736 |
1734 bool MediaSessionDescriptionFactory::AddAudioContentForAnswer( | 1737 bool MediaSessionDescriptionFactory::AddAudioContentForAnswer( |
1735 const SessionDescription* offer, | 1738 const SessionDescription* offer, |
1736 const MediaSessionOptions& options, | 1739 const MediaSessionOptions& options, |
1737 const SessionDescription* current_description, | 1740 const SessionDescription* current_description, |
1738 StreamParamsVec* current_streams, | 1741 StreamParamsVec* current_streams, |
1739 SessionDescription* answer) const { | 1742 SessionDescription* answer) const { |
1740 const ContentInfo* audio_content = GetFirstAudioContent(offer); | 1743 const ContentInfo* audio_content = GetFirstAudioContent(offer); |
1741 | 1744 |
1742 scoped_ptr<TransportDescription> audio_transport( | 1745 scoped_ptr<TransportDescription> audio_transport(CreateTransportAnswer( |
1743 CreateTransportAnswer(audio_content->name, offer, | 1746 audio_content->name, offer, options.audio_transport_options, |
1744 options.transport_options, | 1747 current_description)); |
1745 current_description)); | |
1746 if (!audio_transport) { | 1748 if (!audio_transport) { |
1747 return false; | 1749 return false; |
1748 } | 1750 } |
1749 | 1751 |
1750 AudioCodecs audio_codecs = audio_codecs_; | 1752 AudioCodecs audio_codecs = audio_codecs_; |
1751 if (!options.vad_enabled) { | 1753 if (!options.vad_enabled) { |
1752 StripCNCodecs(&audio_codecs); | 1754 StripCNCodecs(&audio_codecs); |
1753 } | 1755 } |
1754 | 1756 |
1755 bool bundle_enabled = | 1757 bool bundle_enabled = |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1791 return true; | 1793 return true; |
1792 } | 1794 } |
1793 | 1795 |
1794 bool MediaSessionDescriptionFactory::AddVideoContentForAnswer( | 1796 bool MediaSessionDescriptionFactory::AddVideoContentForAnswer( |
1795 const SessionDescription* offer, | 1797 const SessionDescription* offer, |
1796 const MediaSessionOptions& options, | 1798 const MediaSessionOptions& options, |
1797 const SessionDescription* current_description, | 1799 const SessionDescription* current_description, |
1798 StreamParamsVec* current_streams, | 1800 StreamParamsVec* current_streams, |
1799 SessionDescription* answer) const { | 1801 SessionDescription* answer) const { |
1800 const ContentInfo* video_content = GetFirstVideoContent(offer); | 1802 const ContentInfo* video_content = GetFirstVideoContent(offer); |
1801 scoped_ptr<TransportDescription> video_transport( | 1803 scoped_ptr<TransportDescription> video_transport(CreateTransportAnswer( |
1802 CreateTransportAnswer(video_content->name, offer, | 1804 video_content->name, offer, options.video_transport_options, |
1803 options.transport_options, | 1805 current_description)); |
1804 current_description)); | |
1805 if (!video_transport) { | 1806 if (!video_transport) { |
1806 return false; | 1807 return false; |
1807 } | 1808 } |
1808 | 1809 |
1809 scoped_ptr<VideoContentDescription> video_answer( | 1810 scoped_ptr<VideoContentDescription> video_answer( |
1810 new VideoContentDescription()); | 1811 new VideoContentDescription()); |
1811 // Do not require or create SDES cryptos if DTLS is used. | 1812 // Do not require or create SDES cryptos if DTLS is used. |
1812 cricket::SecurePolicy sdes_policy = | 1813 cricket::SecurePolicy sdes_policy = |
1813 video_transport->secure() ? cricket::SEC_DISABLED : secure(); | 1814 video_transport->secure() ? cricket::SEC_DISABLED : secure(); |
1814 bool bundle_enabled = | 1815 bool bundle_enabled = |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1847 return true; | 1848 return true; |
1848 } | 1849 } |
1849 | 1850 |
1850 bool MediaSessionDescriptionFactory::AddDataContentForAnswer( | 1851 bool MediaSessionDescriptionFactory::AddDataContentForAnswer( |
1851 const SessionDescription* offer, | 1852 const SessionDescription* offer, |
1852 const MediaSessionOptions& options, | 1853 const MediaSessionOptions& options, |
1853 const SessionDescription* current_description, | 1854 const SessionDescription* current_description, |
1854 StreamParamsVec* current_streams, | 1855 StreamParamsVec* current_streams, |
1855 SessionDescription* answer) const { | 1856 SessionDescription* answer) const { |
1856 const ContentInfo* data_content = GetFirstDataContent(offer); | 1857 const ContentInfo* data_content = GetFirstDataContent(offer); |
1857 scoped_ptr<TransportDescription> data_transport( | 1858 scoped_ptr<TransportDescription> data_transport(CreateTransportAnswer( |
1858 CreateTransportAnswer(data_content->name, offer, | 1859 data_content->name, offer, options.data_transport_options, |
1859 options.transport_options, | 1860 current_description)); |
1860 current_description)); | |
1861 if (!data_transport) { | 1861 if (!data_transport) { |
1862 return false; | 1862 return false; |
1863 } | 1863 } |
1864 bool is_sctp = (options.data_channel_type == DCT_SCTP); | 1864 bool is_sctp = (options.data_channel_type == DCT_SCTP); |
1865 std::vector<DataCodec> data_codecs(data_codecs_); | 1865 std::vector<DataCodec> data_codecs(data_codecs_); |
1866 FilterDataCodecs(&data_codecs, is_sctp); | 1866 FilterDataCodecs(&data_codecs, is_sctp); |
1867 | 1867 |
1868 scoped_ptr<DataContentDescription> data_answer( | 1868 scoped_ptr<DataContentDescription> data_answer( |
1869 new DataContentDescription()); | 1869 new DataContentDescription()); |
1870 // Do not require or create SDES cryptos if DTLS is used. | 1870 // Do not require or create SDES cryptos if DTLS is used. |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1987 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO)); | 1987 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO)); |
1988 } | 1988 } |
1989 | 1989 |
1990 const DataContentDescription* GetFirstDataContentDescription( | 1990 const DataContentDescription* GetFirstDataContentDescription( |
1991 const SessionDescription* sdesc) { | 1991 const SessionDescription* sdesc) { |
1992 return static_cast<const DataContentDescription*>( | 1992 return static_cast<const DataContentDescription*>( |
1993 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA)); | 1993 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA)); |
1994 } | 1994 } |
1995 | 1995 |
1996 } // namespace cricket | 1996 } // namespace cricket |
OLD | NEW |