OLD | NEW |
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 703 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
714 } | 714 } |
715 } | 715 } |
716 return false; | 716 return false; |
717 } | 717 } |
718 | 718 |
719 template <class C> | 719 template <class C> |
720 static bool IsRtxCodec(const C& codec) { | 720 static bool IsRtxCodec(const C& codec) { |
721 return stricmp(codec.name.c_str(), kRtxCodecName) == 0; | 721 return stricmp(codec.name.c_str(), kRtxCodecName) == 0; |
722 } | 722 } |
723 | 723 |
| 724 static TransportOptions GetTransportOptions(const MediaSessionOptions& options, |
| 725 const std::string& content_name) { |
| 726 auto it = options.transport_options.find(content_name); |
| 727 if (it == options.transport_options.end()) { |
| 728 return TransportOptions(); |
| 729 } |
| 730 return it->second; |
| 731 } |
| 732 |
724 // Create a media content to be offered in a session-initiate, | 733 // Create a media content to be offered in a session-initiate, |
725 // according to the given options.rtcp_mux, options.is_muc, | 734 // according to the given options.rtcp_mux, options.is_muc, |
726 // options.streams, codecs, secure_transport, crypto, and streams. If we don't | 735 // options.streams, codecs, secure_transport, crypto, and streams. If we don't |
727 // currently have crypto (in current_cryptos) and it is enabled (in | 736 // currently have crypto (in current_cryptos) and it is enabled (in |
728 // secure_policy), crypto is created (according to crypto_suites). If | 737 // secure_policy), crypto is created (according to crypto_suites). If |
729 // add_legacy_stream is true, and current_streams is empty, a legacy | 738 // add_legacy_stream is true, and current_streams is empty, a legacy |
730 // stream is created. The created content is added to the offer. | 739 // stream is created. The created content is added to the offer. |
731 template <class C> | 740 template <class C> |
732 static bool CreateMediaContentOffer( | 741 static bool CreateMediaContentOffer( |
733 const MediaSessionOptions& options, | 742 const MediaSessionOptions& options, |
(...skipping 845 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1579 } | 1588 } |
1580 } else { | 1589 } else { |
1581 if (options.recv_audio) { | 1590 if (options.recv_audio) { |
1582 audio->set_direction(MD_RECVONLY); | 1591 audio->set_direction(MD_RECVONLY); |
1583 } else { | 1592 } else { |
1584 audio->set_direction(MD_INACTIVE); | 1593 audio->set_direction(MD_INACTIVE); |
1585 } | 1594 } |
1586 } | 1595 } |
1587 | 1596 |
1588 desc->AddContent(content_name, NS_JINGLE_RTP, audio.release()); | 1597 desc->AddContent(content_name, NS_JINGLE_RTP, audio.release()); |
1589 if (!AddTransportOffer(content_name, options.audio_transport_options, | 1598 if (!AddTransportOffer(content_name, |
| 1599 GetTransportOptions(options, content_name), |
1590 current_description, desc)) { | 1600 current_description, desc)) { |
1591 return false; | 1601 return false; |
1592 } | 1602 } |
1593 | 1603 |
1594 return true; | 1604 return true; |
1595 } | 1605 } |
1596 | 1606 |
1597 bool MediaSessionDescriptionFactory::AddVideoContentForOffer( | 1607 bool MediaSessionDescriptionFactory::AddVideoContentForOffer( |
1598 const MediaSessionOptions& options, | 1608 const MediaSessionOptions& options, |
1599 const SessionDescription* current_description, | 1609 const SessionDescription* current_description, |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1639 } | 1649 } |
1640 } else { | 1650 } else { |
1641 if (options.recv_video) { | 1651 if (options.recv_video) { |
1642 video->set_direction(MD_RECVONLY); | 1652 video->set_direction(MD_RECVONLY); |
1643 } else { | 1653 } else { |
1644 video->set_direction(MD_INACTIVE); | 1654 video->set_direction(MD_INACTIVE); |
1645 } | 1655 } |
1646 } | 1656 } |
1647 | 1657 |
1648 desc->AddContent(content_name, NS_JINGLE_RTP, video.release()); | 1658 desc->AddContent(content_name, NS_JINGLE_RTP, video.release()); |
1649 if (!AddTransportOffer(content_name, options.video_transport_options, | 1659 if (!AddTransportOffer(content_name, |
| 1660 GetTransportOptions(options, content_name), |
1650 current_description, desc)) { | 1661 current_description, desc)) { |
1651 return false; | 1662 return false; |
1652 } | 1663 } |
1653 | 1664 |
1654 return true; | 1665 return true; |
1655 } | 1666 } |
1656 | 1667 |
1657 bool MediaSessionDescriptionFactory::AddDataContentForOffer( | 1668 bool MediaSessionDescriptionFactory::AddDataContentForOffer( |
1658 const MediaSessionOptions& options, | 1669 const MediaSessionOptions& options, |
1659 const SessionDescription* current_description, | 1670 const SessionDescription* current_description, |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1703 return false; | 1714 return false; |
1704 } | 1715 } |
1705 | 1716 |
1706 if (is_sctp) { | 1717 if (is_sctp) { |
1707 desc->AddContent(content_name, NS_JINGLE_DRAFT_SCTP, data.release()); | 1718 desc->AddContent(content_name, NS_JINGLE_DRAFT_SCTP, data.release()); |
1708 } else { | 1719 } else { |
1709 data->set_bandwidth(options.data_bandwidth); | 1720 data->set_bandwidth(options.data_bandwidth); |
1710 SetMediaProtocol(secure_transport, data.get()); | 1721 SetMediaProtocol(secure_transport, data.get()); |
1711 desc->AddContent(content_name, NS_JINGLE_RTP, data.release()); | 1722 desc->AddContent(content_name, NS_JINGLE_RTP, data.release()); |
1712 } | 1723 } |
1713 if (!AddTransportOffer(content_name, options.data_transport_options, | 1724 if (!AddTransportOffer(content_name, |
| 1725 GetTransportOptions(options, content_name), |
1714 current_description, desc)) { | 1726 current_description, desc)) { |
1715 return false; | 1727 return false; |
1716 } | 1728 } |
1717 return true; | 1729 return true; |
1718 } | 1730 } |
1719 | 1731 |
1720 bool MediaSessionDescriptionFactory::AddAudioContentForAnswer( | 1732 bool MediaSessionDescriptionFactory::AddAudioContentForAnswer( |
1721 const SessionDescription* offer, | 1733 const SessionDescription* offer, |
1722 const MediaSessionOptions& options, | 1734 const MediaSessionOptions& options, |
1723 const SessionDescription* current_description, | 1735 const SessionDescription* current_description, |
1724 StreamParamsVec* current_streams, | 1736 StreamParamsVec* current_streams, |
1725 SessionDescription* answer) const { | 1737 SessionDescription* answer) const { |
1726 const ContentInfo* audio_content = GetFirstAudioContent(offer); | 1738 const ContentInfo* audio_content = GetFirstAudioContent(offer); |
1727 | 1739 |
1728 scoped_ptr<TransportDescription> audio_transport(CreateTransportAnswer( | 1740 scoped_ptr<TransportDescription> audio_transport(CreateTransportAnswer( |
1729 audio_content->name, offer, options.audio_transport_options, | 1741 audio_content->name, offer, |
1730 current_description)); | 1742 GetTransportOptions(options, audio_content->name), current_description)); |
1731 if (!audio_transport) { | 1743 if (!audio_transport) { |
1732 return false; | 1744 return false; |
1733 } | 1745 } |
1734 | 1746 |
1735 AudioCodecs audio_codecs = audio_codecs_; | 1747 AudioCodecs audio_codecs = audio_codecs_; |
1736 if (!options.vad_enabled) { | 1748 if (!options.vad_enabled) { |
1737 StripCNCodecs(&audio_codecs); | 1749 StripCNCodecs(&audio_codecs); |
1738 } | 1750 } |
1739 | 1751 |
1740 bool bundle_enabled = | 1752 bool bundle_enabled = |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1777 } | 1789 } |
1778 | 1790 |
1779 bool MediaSessionDescriptionFactory::AddVideoContentForAnswer( | 1791 bool MediaSessionDescriptionFactory::AddVideoContentForAnswer( |
1780 const SessionDescription* offer, | 1792 const SessionDescription* offer, |
1781 const MediaSessionOptions& options, | 1793 const MediaSessionOptions& options, |
1782 const SessionDescription* current_description, | 1794 const SessionDescription* current_description, |
1783 StreamParamsVec* current_streams, | 1795 StreamParamsVec* current_streams, |
1784 SessionDescription* answer) const { | 1796 SessionDescription* answer) const { |
1785 const ContentInfo* video_content = GetFirstVideoContent(offer); | 1797 const ContentInfo* video_content = GetFirstVideoContent(offer); |
1786 scoped_ptr<TransportDescription> video_transport(CreateTransportAnswer( | 1798 scoped_ptr<TransportDescription> video_transport(CreateTransportAnswer( |
1787 video_content->name, offer, options.video_transport_options, | 1799 video_content->name, offer, |
1788 current_description)); | 1800 GetTransportOptions(options, video_content->name), current_description)); |
1789 if (!video_transport) { | 1801 if (!video_transport) { |
1790 return false; | 1802 return false; |
1791 } | 1803 } |
1792 | 1804 |
1793 scoped_ptr<VideoContentDescription> video_answer( | 1805 scoped_ptr<VideoContentDescription> video_answer( |
1794 new VideoContentDescription()); | 1806 new VideoContentDescription()); |
1795 // Do not require or create SDES cryptos if DTLS is used. | 1807 // Do not require or create SDES cryptos if DTLS is used. |
1796 cricket::SecurePolicy sdes_policy = | 1808 cricket::SecurePolicy sdes_policy = |
1797 video_transport->secure() ? cricket::SEC_DISABLED : secure(); | 1809 video_transport->secure() ? cricket::SEC_DISABLED : secure(); |
1798 bool bundle_enabled = | 1810 bool bundle_enabled = |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1832 } | 1844 } |
1833 | 1845 |
1834 bool MediaSessionDescriptionFactory::AddDataContentForAnswer( | 1846 bool MediaSessionDescriptionFactory::AddDataContentForAnswer( |
1835 const SessionDescription* offer, | 1847 const SessionDescription* offer, |
1836 const MediaSessionOptions& options, | 1848 const MediaSessionOptions& options, |
1837 const SessionDescription* current_description, | 1849 const SessionDescription* current_description, |
1838 StreamParamsVec* current_streams, | 1850 StreamParamsVec* current_streams, |
1839 SessionDescription* answer) const { | 1851 SessionDescription* answer) const { |
1840 const ContentInfo* data_content = GetFirstDataContent(offer); | 1852 const ContentInfo* data_content = GetFirstDataContent(offer); |
1841 scoped_ptr<TransportDescription> data_transport(CreateTransportAnswer( | 1853 scoped_ptr<TransportDescription> data_transport(CreateTransportAnswer( |
1842 data_content->name, offer, options.data_transport_options, | 1854 data_content->name, offer, |
1843 current_description)); | 1855 GetTransportOptions(options, data_content->name), current_description)); |
1844 if (!data_transport) { | 1856 if (!data_transport) { |
1845 return false; | 1857 return false; |
1846 } | 1858 } |
1847 bool is_sctp = (options.data_channel_type == DCT_SCTP); | 1859 bool is_sctp = (options.data_channel_type == DCT_SCTP); |
1848 std::vector<DataCodec> data_codecs(data_codecs_); | 1860 std::vector<DataCodec> data_codecs(data_codecs_); |
1849 FilterDataCodecs(&data_codecs, is_sctp); | 1861 FilterDataCodecs(&data_codecs, is_sctp); |
1850 | 1862 |
1851 scoped_ptr<DataContentDescription> data_answer( | 1863 scoped_ptr<DataContentDescription> data_answer( |
1852 new DataContentDescription()); | 1864 new DataContentDescription()); |
1853 // Do not require or create SDES cryptos if DTLS is used. | 1865 // Do not require or create SDES cryptos if DTLS is used. |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1901 } | 1913 } |
1902 | 1914 |
1903 bool IsVideoContent(const ContentInfo* content) { | 1915 bool IsVideoContent(const ContentInfo* content) { |
1904 return IsMediaContentOfType(content, MEDIA_TYPE_VIDEO); | 1916 return IsMediaContentOfType(content, MEDIA_TYPE_VIDEO); |
1905 } | 1917 } |
1906 | 1918 |
1907 bool IsDataContent(const ContentInfo* content) { | 1919 bool IsDataContent(const ContentInfo* content) { |
1908 return IsMediaContentOfType(content, MEDIA_TYPE_DATA); | 1920 return IsMediaContentOfType(content, MEDIA_TYPE_DATA); |
1909 } | 1921 } |
1910 | 1922 |
1911 static const ContentInfo* GetFirstMediaContent(const ContentInfos& contents, | 1923 const ContentInfo* GetFirstMediaContent(const ContentInfos& contents, |
1912 MediaType media_type) { | 1924 MediaType media_type) { |
1913 for (ContentInfos::const_iterator content = contents.begin(); | 1925 for (ContentInfos::const_iterator content = contents.begin(); |
1914 content != contents.end(); content++) { | 1926 content != contents.end(); content++) { |
1915 if (IsMediaContentOfType(&*content, media_type)) { | 1927 if (IsMediaContentOfType(&*content, media_type)) { |
1916 return &*content; | 1928 return &*content; |
1917 } | 1929 } |
1918 } | 1930 } |
1919 return NULL; | 1931 return nullptr; |
1920 } | 1932 } |
1921 | 1933 |
1922 const ContentInfo* GetFirstAudioContent(const ContentInfos& contents) { | 1934 const ContentInfo* GetFirstAudioContent(const ContentInfos& contents) { |
1923 return GetFirstMediaContent(contents, MEDIA_TYPE_AUDIO); | 1935 return GetFirstMediaContent(contents, MEDIA_TYPE_AUDIO); |
1924 } | 1936 } |
1925 | 1937 |
1926 const ContentInfo* GetFirstVideoContent(const ContentInfos& contents) { | 1938 const ContentInfo* GetFirstVideoContent(const ContentInfos& contents) { |
1927 return GetFirstMediaContent(contents, MEDIA_TYPE_VIDEO); | 1939 return GetFirstMediaContent(contents, MEDIA_TYPE_VIDEO); |
1928 } | 1940 } |
1929 | 1941 |
1930 const ContentInfo* GetFirstDataContent(const ContentInfos& contents) { | 1942 const ContentInfo* GetFirstDataContent(const ContentInfos& contents) { |
1931 return GetFirstMediaContent(contents, MEDIA_TYPE_DATA); | 1943 return GetFirstMediaContent(contents, MEDIA_TYPE_DATA); |
1932 } | 1944 } |
1933 | 1945 |
1934 static const ContentInfo* GetFirstMediaContent(const SessionDescription* sdesc, | 1946 static const ContentInfo* GetFirstMediaContent(const SessionDescription* sdesc, |
1935 MediaType media_type) { | 1947 MediaType media_type) { |
1936 if (sdesc == NULL) | 1948 if (sdesc == nullptr) { |
1937 return NULL; | 1949 return nullptr; |
| 1950 } |
1938 | 1951 |
1939 return GetFirstMediaContent(sdesc->contents(), media_type); | 1952 return GetFirstMediaContent(sdesc->contents(), media_type); |
1940 } | 1953 } |
1941 | 1954 |
1942 const ContentInfo* GetFirstAudioContent(const SessionDescription* sdesc) { | 1955 const ContentInfo* GetFirstAudioContent(const SessionDescription* sdesc) { |
1943 return GetFirstMediaContent(sdesc, MEDIA_TYPE_AUDIO); | 1956 return GetFirstMediaContent(sdesc, MEDIA_TYPE_AUDIO); |
1944 } | 1957 } |
1945 | 1958 |
1946 const ContentInfo* GetFirstVideoContent(const SessionDescription* sdesc) { | 1959 const ContentInfo* GetFirstVideoContent(const SessionDescription* sdesc) { |
1947 return GetFirstMediaContent(sdesc, MEDIA_TYPE_VIDEO); | 1960 return GetFirstMediaContent(sdesc, MEDIA_TYPE_VIDEO); |
(...skipping 22 matching lines...) Expand all Loading... |
1970 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO)); | 1983 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO)); |
1971 } | 1984 } |
1972 | 1985 |
1973 const DataContentDescription* GetFirstDataContentDescription( | 1986 const DataContentDescription* GetFirstDataContentDescription( |
1974 const SessionDescription* sdesc) { | 1987 const SessionDescription* sdesc) { |
1975 return static_cast<const DataContentDescription*>( | 1988 return static_cast<const DataContentDescription*>( |
1976 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA)); | 1989 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA)); |
1977 } | 1990 } |
1978 | 1991 |
1979 } // namespace cricket | 1992 } // namespace cricket |
OLD | NEW |