Chromium Code Reviews| 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 720 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 731 } | 731 } |
| 732 } | 732 } |
| 733 return false; | 733 return false; |
| 734 } | 734 } |
| 735 | 735 |
| 736 template <class C> | 736 template <class C> |
| 737 static bool IsRtxCodec(const C& codec) { | 737 static bool IsRtxCodec(const C& codec) { |
| 738 return stricmp(codec.name.c_str(), kRtxCodecName) == 0; | 738 return stricmp(codec.name.c_str(), kRtxCodecName) == 0; |
| 739 } | 739 } |
| 740 | 740 |
| 741 static TransportOptions GetTransportOptions(const MediaSessionOptions& options, | |
| 742 const std::string& content_name) { | |
| 743 auto it = options.transport_options.find(content_name); | |
|
honghaiz3
2016/02/12 18:21:04
Perhaps this can be replaced with return options.t
Taylor Brandstetter
2016/02/12 20:43:02
I can't use the [] operator because the MediaSessi
| |
| 744 if (it == options.transport_options.end()) { | |
| 745 return TransportOptions(); | |
| 746 } | |
| 747 return it->second; | |
| 748 } | |
| 749 | |
| 741 // Create a media content to be offered in a session-initiate, | 750 // Create a media content to be offered in a session-initiate, |
| 742 // according to the given options.rtcp_mux, options.is_muc, | 751 // according to the given options.rtcp_mux, options.is_muc, |
| 743 // options.streams, codecs, secure_transport, crypto, and streams. If we don't | 752 // options.streams, codecs, secure_transport, crypto, and streams. If we don't |
| 744 // currently have crypto (in current_cryptos) and it is enabled (in | 753 // currently have crypto (in current_cryptos) and it is enabled (in |
| 745 // secure_policy), crypto is created (according to crypto_suites). If | 754 // secure_policy), crypto is created (according to crypto_suites). If |
| 746 // add_legacy_stream is true, and current_streams is empty, a legacy | 755 // add_legacy_stream is true, and current_streams is empty, a legacy |
| 747 // stream is created. The created content is added to the offer. | 756 // stream is created. The created content is added to the offer. |
| 748 template <class C> | 757 template <class C> |
| 749 static bool CreateMediaContentOffer( | 758 static bool CreateMediaContentOffer( |
| 750 const MediaSessionOptions& options, | 759 const MediaSessionOptions& options, |
| (...skipping 845 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1596 } | 1605 } |
| 1597 } else { | 1606 } else { |
| 1598 if (options.recv_audio) { | 1607 if (options.recv_audio) { |
| 1599 audio->set_direction(MD_RECVONLY); | 1608 audio->set_direction(MD_RECVONLY); |
| 1600 } else { | 1609 } else { |
| 1601 audio->set_direction(MD_INACTIVE); | 1610 audio->set_direction(MD_INACTIVE); |
| 1602 } | 1611 } |
| 1603 } | 1612 } |
| 1604 | 1613 |
| 1605 desc->AddContent(content_name, NS_JINGLE_RTP, audio.release()); | 1614 desc->AddContent(content_name, NS_JINGLE_RTP, audio.release()); |
| 1606 if (!AddTransportOffer(content_name, options.audio_transport_options, | 1615 if (!AddTransportOffer(content_name, |
| 1616 GetTransportOptions(options, content_name), | |
| 1607 current_description, desc)) { | 1617 current_description, desc)) { |
| 1608 return false; | 1618 return false; |
| 1609 } | 1619 } |
| 1610 | 1620 |
| 1611 return true; | 1621 return true; |
| 1612 } | 1622 } |
| 1613 | 1623 |
| 1614 bool MediaSessionDescriptionFactory::AddVideoContentForOffer( | 1624 bool MediaSessionDescriptionFactory::AddVideoContentForOffer( |
| 1615 const MediaSessionOptions& options, | 1625 const MediaSessionOptions& options, |
| 1616 const SessionDescription* current_description, | 1626 const SessionDescription* current_description, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1656 } | 1666 } |
| 1657 } else { | 1667 } else { |
| 1658 if (options.recv_video) { | 1668 if (options.recv_video) { |
| 1659 video->set_direction(MD_RECVONLY); | 1669 video->set_direction(MD_RECVONLY); |
| 1660 } else { | 1670 } else { |
| 1661 video->set_direction(MD_INACTIVE); | 1671 video->set_direction(MD_INACTIVE); |
| 1662 } | 1672 } |
| 1663 } | 1673 } |
| 1664 | 1674 |
| 1665 desc->AddContent(content_name, NS_JINGLE_RTP, video.release()); | 1675 desc->AddContent(content_name, NS_JINGLE_RTP, video.release()); |
| 1666 if (!AddTransportOffer(content_name, options.video_transport_options, | 1676 if (!AddTransportOffer(content_name, |
| 1677 GetTransportOptions(options, content_name), | |
| 1667 current_description, desc)) { | 1678 current_description, desc)) { |
| 1668 return false; | 1679 return false; |
| 1669 } | 1680 } |
| 1670 | 1681 |
| 1671 return true; | 1682 return true; |
| 1672 } | 1683 } |
| 1673 | 1684 |
| 1674 bool MediaSessionDescriptionFactory::AddDataContentForOffer( | 1685 bool MediaSessionDescriptionFactory::AddDataContentForOffer( |
| 1675 const MediaSessionOptions& options, | 1686 const MediaSessionOptions& options, |
| 1676 const SessionDescription* current_description, | 1687 const SessionDescription* current_description, |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1720 return false; | 1731 return false; |
| 1721 } | 1732 } |
| 1722 | 1733 |
| 1723 if (is_sctp) { | 1734 if (is_sctp) { |
| 1724 desc->AddContent(content_name, NS_JINGLE_DRAFT_SCTP, data.release()); | 1735 desc->AddContent(content_name, NS_JINGLE_DRAFT_SCTP, data.release()); |
| 1725 } else { | 1736 } else { |
| 1726 data->set_bandwidth(options.data_bandwidth); | 1737 data->set_bandwidth(options.data_bandwidth); |
| 1727 SetMediaProtocol(secure_transport, data.get()); | 1738 SetMediaProtocol(secure_transport, data.get()); |
| 1728 desc->AddContent(content_name, NS_JINGLE_RTP, data.release()); | 1739 desc->AddContent(content_name, NS_JINGLE_RTP, data.release()); |
| 1729 } | 1740 } |
| 1730 if (!AddTransportOffer(content_name, options.data_transport_options, | 1741 if (!AddTransportOffer(content_name, |
| 1742 GetTransportOptions(options, content_name), | |
| 1731 current_description, desc)) { | 1743 current_description, desc)) { |
| 1732 return false; | 1744 return false; |
| 1733 } | 1745 } |
| 1734 return true; | 1746 return true; |
| 1735 } | 1747 } |
| 1736 | 1748 |
| 1737 bool MediaSessionDescriptionFactory::AddAudioContentForAnswer( | 1749 bool MediaSessionDescriptionFactory::AddAudioContentForAnswer( |
| 1738 const SessionDescription* offer, | 1750 const SessionDescription* offer, |
| 1739 const MediaSessionOptions& options, | 1751 const MediaSessionOptions& options, |
| 1740 const SessionDescription* current_description, | 1752 const SessionDescription* current_description, |
| 1741 StreamParamsVec* current_streams, | 1753 StreamParamsVec* current_streams, |
| 1742 SessionDescription* answer) const { | 1754 SessionDescription* answer) const { |
| 1743 const ContentInfo* audio_content = GetFirstAudioContent(offer); | 1755 const ContentInfo* audio_content = GetFirstAudioContent(offer); |
| 1744 | 1756 |
| 1745 scoped_ptr<TransportDescription> audio_transport(CreateTransportAnswer( | 1757 scoped_ptr<TransportDescription> audio_transport(CreateTransportAnswer( |
| 1746 audio_content->name, offer, options.audio_transport_options, | 1758 audio_content->name, offer, |
| 1747 current_description)); | 1759 GetTransportOptions(options, audio_content->name), current_description)); |
| 1748 if (!audio_transport) { | 1760 if (!audio_transport) { |
| 1749 return false; | 1761 return false; |
| 1750 } | 1762 } |
| 1751 | 1763 |
| 1752 AudioCodecs audio_codecs = audio_codecs_; | 1764 AudioCodecs audio_codecs = audio_codecs_; |
| 1753 if (!options.vad_enabled) { | 1765 if (!options.vad_enabled) { |
| 1754 StripCNCodecs(&audio_codecs); | 1766 StripCNCodecs(&audio_codecs); |
| 1755 } | 1767 } |
| 1756 | 1768 |
| 1757 bool bundle_enabled = | 1769 bool bundle_enabled = |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1794 } | 1806 } |
| 1795 | 1807 |
| 1796 bool MediaSessionDescriptionFactory::AddVideoContentForAnswer( | 1808 bool MediaSessionDescriptionFactory::AddVideoContentForAnswer( |
| 1797 const SessionDescription* offer, | 1809 const SessionDescription* offer, |
| 1798 const MediaSessionOptions& options, | 1810 const MediaSessionOptions& options, |
| 1799 const SessionDescription* current_description, | 1811 const SessionDescription* current_description, |
| 1800 StreamParamsVec* current_streams, | 1812 StreamParamsVec* current_streams, |
| 1801 SessionDescription* answer) const { | 1813 SessionDescription* answer) const { |
| 1802 const ContentInfo* video_content = GetFirstVideoContent(offer); | 1814 const ContentInfo* video_content = GetFirstVideoContent(offer); |
| 1803 scoped_ptr<TransportDescription> video_transport(CreateTransportAnswer( | 1815 scoped_ptr<TransportDescription> video_transport(CreateTransportAnswer( |
| 1804 video_content->name, offer, options.video_transport_options, | 1816 video_content->name, offer, |
| 1805 current_description)); | 1817 GetTransportOptions(options, video_content->name), current_description)); |
| 1806 if (!video_transport) { | 1818 if (!video_transport) { |
| 1807 return false; | 1819 return false; |
| 1808 } | 1820 } |
| 1809 | 1821 |
| 1810 scoped_ptr<VideoContentDescription> video_answer( | 1822 scoped_ptr<VideoContentDescription> video_answer( |
| 1811 new VideoContentDescription()); | 1823 new VideoContentDescription()); |
| 1812 // Do not require or create SDES cryptos if DTLS is used. | 1824 // Do not require or create SDES cryptos if DTLS is used. |
| 1813 cricket::SecurePolicy sdes_policy = | 1825 cricket::SecurePolicy sdes_policy = |
| 1814 video_transport->secure() ? cricket::SEC_DISABLED : secure(); | 1826 video_transport->secure() ? cricket::SEC_DISABLED : secure(); |
| 1815 bool bundle_enabled = | 1827 bool bundle_enabled = |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1849 } | 1861 } |
| 1850 | 1862 |
| 1851 bool MediaSessionDescriptionFactory::AddDataContentForAnswer( | 1863 bool MediaSessionDescriptionFactory::AddDataContentForAnswer( |
| 1852 const SessionDescription* offer, | 1864 const SessionDescription* offer, |
| 1853 const MediaSessionOptions& options, | 1865 const MediaSessionOptions& options, |
| 1854 const SessionDescription* current_description, | 1866 const SessionDescription* current_description, |
| 1855 StreamParamsVec* current_streams, | 1867 StreamParamsVec* current_streams, |
| 1856 SessionDescription* answer) const { | 1868 SessionDescription* answer) const { |
| 1857 const ContentInfo* data_content = GetFirstDataContent(offer); | 1869 const ContentInfo* data_content = GetFirstDataContent(offer); |
| 1858 scoped_ptr<TransportDescription> data_transport(CreateTransportAnswer( | 1870 scoped_ptr<TransportDescription> data_transport(CreateTransportAnswer( |
| 1859 data_content->name, offer, options.data_transport_options, | 1871 data_content->name, offer, |
| 1860 current_description)); | 1872 GetTransportOptions(options, data_content->name), current_description)); |
| 1861 if (!data_transport) { | 1873 if (!data_transport) { |
| 1862 return false; | 1874 return false; |
| 1863 } | 1875 } |
| 1864 bool is_sctp = (options.data_channel_type == DCT_SCTP); | 1876 bool is_sctp = (options.data_channel_type == DCT_SCTP); |
| 1865 std::vector<DataCodec> data_codecs(data_codecs_); | 1877 std::vector<DataCodec> data_codecs(data_codecs_); |
| 1866 FilterDataCodecs(&data_codecs, is_sctp); | 1878 FilterDataCodecs(&data_codecs, is_sctp); |
| 1867 | 1879 |
| 1868 scoped_ptr<DataContentDescription> data_answer( | 1880 scoped_ptr<DataContentDescription> data_answer( |
| 1869 new DataContentDescription()); | 1881 new DataContentDescription()); |
| 1870 // Do not require or create SDES cryptos if DTLS is used. | 1882 // Do not require or create SDES cryptos if DTLS is used. |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1918 } | 1930 } |
| 1919 | 1931 |
| 1920 bool IsVideoContent(const ContentInfo* content) { | 1932 bool IsVideoContent(const ContentInfo* content) { |
| 1921 return IsMediaContentOfType(content, MEDIA_TYPE_VIDEO); | 1933 return IsMediaContentOfType(content, MEDIA_TYPE_VIDEO); |
| 1922 } | 1934 } |
| 1923 | 1935 |
| 1924 bool IsDataContent(const ContentInfo* content) { | 1936 bool IsDataContent(const ContentInfo* content) { |
| 1925 return IsMediaContentOfType(content, MEDIA_TYPE_DATA); | 1937 return IsMediaContentOfType(content, MEDIA_TYPE_DATA); |
| 1926 } | 1938 } |
| 1927 | 1939 |
| 1928 static const ContentInfo* GetFirstMediaContent(const ContentInfos& contents, | 1940 const ContentInfo* GetFirstMediaContent(const ContentInfos& contents, |
| 1929 MediaType media_type) { | 1941 MediaType media_type) { |
| 1930 for (ContentInfos::const_iterator content = contents.begin(); | 1942 for (ContentInfos::const_iterator content = contents.begin(); |
| 1931 content != contents.end(); content++) { | 1943 content != contents.end(); content++) { |
| 1932 if (IsMediaContentOfType(&*content, media_type)) { | 1944 if (IsMediaContentOfType(&*content, media_type)) { |
| 1933 return &*content; | 1945 return &*content; |
| 1934 } | 1946 } |
| 1935 } | 1947 } |
| 1936 return NULL; | 1948 return nullptr; |
| 1937 } | 1949 } |
| 1938 | 1950 |
| 1939 const ContentInfo* GetFirstAudioContent(const ContentInfos& contents) { | 1951 const ContentInfo* GetFirstAudioContent(const ContentInfos& contents) { |
| 1940 return GetFirstMediaContent(contents, MEDIA_TYPE_AUDIO); | 1952 return GetFirstMediaContent(contents, MEDIA_TYPE_AUDIO); |
| 1941 } | 1953 } |
| 1942 | 1954 |
| 1943 const ContentInfo* GetFirstVideoContent(const ContentInfos& contents) { | 1955 const ContentInfo* GetFirstVideoContent(const ContentInfos& contents) { |
| 1944 return GetFirstMediaContent(contents, MEDIA_TYPE_VIDEO); | 1956 return GetFirstMediaContent(contents, MEDIA_TYPE_VIDEO); |
| 1945 } | 1957 } |
| 1946 | 1958 |
| 1947 const ContentInfo* GetFirstDataContent(const ContentInfos& contents) { | 1959 const ContentInfo* GetFirstDataContent(const ContentInfos& contents) { |
| 1948 return GetFirstMediaContent(contents, MEDIA_TYPE_DATA); | 1960 return GetFirstMediaContent(contents, MEDIA_TYPE_DATA); |
| 1949 } | 1961 } |
| 1950 | 1962 |
| 1951 static const ContentInfo* GetFirstMediaContent(const SessionDescription* sdesc, | 1963 static const ContentInfo* GetFirstMediaContent(const SessionDescription* sdesc, |
| 1952 MediaType media_type) { | 1964 MediaType media_type) { |
| 1953 if (sdesc == NULL) | 1965 if (sdesc == nullptr) { |
| 1954 return NULL; | 1966 return nullptr; |
| 1967 } | |
| 1955 | 1968 |
| 1956 return GetFirstMediaContent(sdesc->contents(), media_type); | 1969 return GetFirstMediaContent(sdesc->contents(), media_type); |
| 1957 } | 1970 } |
| 1958 | 1971 |
| 1959 const ContentInfo* GetFirstAudioContent(const SessionDescription* sdesc) { | 1972 const ContentInfo* GetFirstAudioContent(const SessionDescription* sdesc) { |
| 1960 return GetFirstMediaContent(sdesc, MEDIA_TYPE_AUDIO); | 1973 return GetFirstMediaContent(sdesc, MEDIA_TYPE_AUDIO); |
| 1961 } | 1974 } |
| 1962 | 1975 |
| 1963 const ContentInfo* GetFirstVideoContent(const SessionDescription* sdesc) { | 1976 const ContentInfo* GetFirstVideoContent(const SessionDescription* sdesc) { |
| 1964 return GetFirstMediaContent(sdesc, MEDIA_TYPE_VIDEO); | 1977 return GetFirstMediaContent(sdesc, MEDIA_TYPE_VIDEO); |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 1987 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO)); | 2000 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO)); |
| 1988 } | 2001 } |
| 1989 | 2002 |
| 1990 const DataContentDescription* GetFirstDataContentDescription( | 2003 const DataContentDescription* GetFirstDataContentDescription( |
| 1991 const SessionDescription* sdesc) { | 2004 const SessionDescription* sdesc) { |
| 1992 return static_cast<const DataContentDescription*>( | 2005 return static_cast<const DataContentDescription*>( |
| 1993 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA)); | 2006 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA)); |
| 1994 } | 2007 } |
| 1995 | 2008 |
| 1996 } // namespace cricket | 2009 } // namespace cricket |
| OLD | NEW |