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 22 matching lines...) Expand all Loading... |
33 bool SetRawAudioSink_w(VoiceMediaChannel* channel, | 33 bool SetRawAudioSink_w(VoiceMediaChannel* channel, |
34 uint32_t ssrc, | 34 uint32_t ssrc, |
35 rtc::scoped_ptr<webrtc::AudioSinkInterface>* sink) { | 35 rtc::scoped_ptr<webrtc::AudioSinkInterface>* sink) { |
36 channel->SetRawAudioSink(ssrc, rtc::ScopedToUnique(std::move(*sink))); | 36 channel->SetRawAudioSink(ssrc, rtc::ScopedToUnique(std::move(*sink))); |
37 return true; | 37 return true; |
38 } | 38 } |
39 } // namespace | 39 } // namespace |
40 | 40 |
41 enum { | 41 enum { |
42 MSG_EARLYMEDIATIMEOUT = 1, | 42 MSG_EARLYMEDIATIMEOUT = 1, |
43 MSG_SCREENCASTWINDOWEVENT, | |
44 MSG_RTPPACKET, | 43 MSG_RTPPACKET, |
45 MSG_RTCPPACKET, | 44 MSG_RTCPPACKET, |
46 MSG_CHANNEL_ERROR, | 45 MSG_CHANNEL_ERROR, |
47 MSG_READYTOSENDDATA, | 46 MSG_READYTOSENDDATA, |
48 MSG_DATARECEIVED, | 47 MSG_DATARECEIVED, |
49 MSG_FIRSTPACKETRECEIVED, | 48 MSG_FIRSTPACKETRECEIVED, |
50 MSG_STREAMCLOSEDREMOTELY, | 49 MSG_STREAMCLOSEDREMOTELY, |
51 }; | 50 }; |
52 | 51 |
53 // Value specified in RFC 5764. | 52 // Value specified in RFC 5764. |
54 static const char kDtlsSrtpExporterLabel[] = "EXTRACTOR-dtls_srtp"; | 53 static const char kDtlsSrtpExporterLabel[] = "EXTRACTOR-dtls_srtp"; |
55 | 54 |
56 static const int kAgcMinus10db = -10; | 55 static const int kAgcMinus10db = -10; |
57 | 56 |
58 static void SafeSetError(const std::string& message, std::string* error_desc) { | 57 static void SafeSetError(const std::string& message, std::string* error_desc) { |
59 if (error_desc) { | 58 if (error_desc) { |
60 *error_desc = message; | 59 *error_desc = message; |
61 } | 60 } |
62 } | 61 } |
63 | 62 |
64 struct PacketMessageData : public rtc::MessageData { | 63 struct PacketMessageData : public rtc::MessageData { |
65 rtc::Buffer packet; | 64 rtc::Buffer packet; |
66 rtc::PacketOptions options; | 65 rtc::PacketOptions options; |
67 }; | 66 }; |
68 | 67 |
69 struct ScreencastEventMessageData : public rtc::MessageData { | |
70 ScreencastEventMessageData(uint32_t s, rtc::WindowEvent we) | |
71 : ssrc(s), event(we) {} | |
72 uint32_t ssrc; | |
73 rtc::WindowEvent event; | |
74 }; | |
75 | |
76 struct VoiceChannelErrorMessageData : public rtc::MessageData { | 68 struct VoiceChannelErrorMessageData : public rtc::MessageData { |
77 VoiceChannelErrorMessageData(uint32_t in_ssrc, | 69 VoiceChannelErrorMessageData(uint32_t in_ssrc, |
78 VoiceMediaChannel::Error in_error) | 70 VoiceMediaChannel::Error in_error) |
79 : ssrc(in_ssrc), error(in_error) {} | 71 : ssrc(in_ssrc), error(in_error) {} |
80 uint32_t ssrc; | 72 uint32_t ssrc; |
81 VoiceMediaChannel::Error error; | 73 VoiceMediaChannel::Error error; |
82 }; | 74 }; |
83 | 75 |
84 struct VideoChannelErrorMessageData : public rtc::MessageData { | 76 struct VideoChannelErrorMessageData : public rtc::MessageData { |
85 VideoChannelErrorMessageData(uint32_t in_ssrc, | 77 VideoChannelErrorMessageData(uint32_t in_ssrc, |
(...skipping 1539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1625 | 1617 |
1626 VideoChannel::VideoChannel(rtc::Thread* thread, | 1618 VideoChannel::VideoChannel(rtc::Thread* thread, |
1627 VideoMediaChannel* media_channel, | 1619 VideoMediaChannel* media_channel, |
1628 TransportController* transport_controller, | 1620 TransportController* transport_controller, |
1629 const std::string& content_name, | 1621 const std::string& content_name, |
1630 bool rtcp) | 1622 bool rtcp) |
1631 : BaseChannel(thread, | 1623 : BaseChannel(thread, |
1632 media_channel, | 1624 media_channel, |
1633 transport_controller, | 1625 transport_controller, |
1634 content_name, | 1626 content_name, |
1635 rtcp), | 1627 rtcp) {} |
1636 previous_we_(rtc::WE_CLOSE) {} | |
1637 | 1628 |
1638 bool VideoChannel::Init() { | 1629 bool VideoChannel::Init() { |
1639 if (!BaseChannel::Init()) { | 1630 if (!BaseChannel::Init()) { |
1640 return false; | 1631 return false; |
1641 } | 1632 } |
1642 return true; | 1633 return true; |
1643 } | 1634 } |
1644 | 1635 |
1645 VideoChannel::~VideoChannel() { | 1636 VideoChannel::~VideoChannel() { |
1646 std::vector<uint32_t> screencast_ssrcs; | |
1647 ScreencastMap::iterator iter; | |
1648 while (!screencast_capturers_.empty()) { | |
1649 if (!RemoveScreencast(screencast_capturers_.begin()->first)) { | |
1650 LOG(LS_ERROR) << "Unable to delete screencast with ssrc " | |
1651 << screencast_capturers_.begin()->first; | |
1652 ASSERT(false); | |
1653 break; | |
1654 } | |
1655 } | |
1656 | |
1657 StopMediaMonitor(); | 1637 StopMediaMonitor(); |
1658 // this can't be done in the base class, since it calls a virtual | 1638 // this can't be done in the base class, since it calls a virtual |
1659 DisableMedia_w(); | 1639 DisableMedia_w(); |
1660 | 1640 |
1661 Deinit(); | 1641 Deinit(); |
1662 } | 1642 } |
1663 | 1643 |
1664 bool VideoChannel::SetSink(uint32_t ssrc, | 1644 bool VideoChannel::SetSink(uint32_t ssrc, |
1665 rtc::VideoSinkInterface<VideoFrame>* sink) { | 1645 rtc::VideoSinkInterface<VideoFrame>* sink) { |
1666 worker_thread()->Invoke<void>( | 1646 worker_thread()->Invoke<void>( |
1667 Bind(&VideoMediaChannel::SetSink, media_channel(), ssrc, sink)); | 1647 Bind(&VideoMediaChannel::SetSink, media_channel(), ssrc, sink)); |
1668 return true; | 1648 return true; |
1669 } | 1649 } |
1670 | 1650 |
1671 bool VideoChannel::AddScreencast(uint32_t ssrc, VideoCapturer* capturer) { | |
1672 return worker_thread()->Invoke<bool>(Bind( | |
1673 &VideoChannel::AddScreencast_w, this, ssrc, capturer)); | |
1674 } | |
1675 | |
1676 bool VideoChannel::SetCapturer(uint32_t ssrc, VideoCapturer* capturer) { | 1651 bool VideoChannel::SetCapturer(uint32_t ssrc, VideoCapturer* capturer) { |
1677 return InvokeOnWorker(Bind(&VideoMediaChannel::SetCapturer, | 1652 return InvokeOnWorker(Bind(&VideoMediaChannel::SetCapturer, |
1678 media_channel(), ssrc, capturer)); | 1653 media_channel(), ssrc, capturer)); |
1679 } | 1654 } |
1680 | 1655 |
1681 bool VideoChannel::RemoveScreencast(uint32_t ssrc) { | |
1682 return InvokeOnWorker(Bind(&VideoChannel::RemoveScreencast_w, this, ssrc)); | |
1683 } | |
1684 | |
1685 bool VideoChannel::IsScreencasting() { | |
1686 return InvokeOnWorker(Bind(&VideoChannel::IsScreencasting_w, this)); | |
1687 } | |
1688 | |
1689 bool VideoChannel::SetVideoSend(uint32_t ssrc, | 1656 bool VideoChannel::SetVideoSend(uint32_t ssrc, |
1690 bool mute, | 1657 bool mute, |
1691 const VideoOptions* options) { | 1658 const VideoOptions* options) { |
1692 return InvokeOnWorker(Bind(&VideoMediaChannel::SetVideoSend, media_channel(), | 1659 return InvokeOnWorker(Bind(&VideoMediaChannel::SetVideoSend, media_channel(), |
1693 ssrc, mute, options)); | 1660 ssrc, mute, options)); |
1694 } | 1661 } |
1695 | 1662 |
1696 void VideoChannel::ChangeState() { | 1663 void VideoChannel::ChangeState() { |
1697 // Send outgoing data if we're the active call, we have the remote content, | 1664 // Send outgoing data if we're the active call, we have the remote content, |
1698 // and we have had some form of connectivity. | 1665 // and we have had some form of connectivity. |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1818 | 1785 |
1819 if (video->rtp_header_extensions_set()) { | 1786 if (video->rtp_header_extensions_set()) { |
1820 MaybeCacheRtpAbsSendTimeHeaderExtension(video->rtp_header_extensions()); | 1787 MaybeCacheRtpAbsSendTimeHeaderExtension(video->rtp_header_extensions()); |
1821 } | 1788 } |
1822 | 1789 |
1823 set_remote_content_direction(content->direction()); | 1790 set_remote_content_direction(content->direction()); |
1824 ChangeState(); | 1791 ChangeState(); |
1825 return true; | 1792 return true; |
1826 } | 1793 } |
1827 | 1794 |
1828 bool VideoChannel::AddScreencast_w(uint32_t ssrc, VideoCapturer* capturer) { | |
1829 if (screencast_capturers_.find(ssrc) != screencast_capturers_.end()) { | |
1830 return false; | |
1831 } | |
1832 capturer->SignalStateChange.connect(this, &VideoChannel::OnStateChange); | |
1833 screencast_capturers_[ssrc] = capturer; | |
1834 return true; | |
1835 } | |
1836 | |
1837 bool VideoChannel::RemoveScreencast_w(uint32_t ssrc) { | |
1838 ScreencastMap::iterator iter = screencast_capturers_.find(ssrc); | |
1839 if (iter == screencast_capturers_.end()) { | |
1840 return false; | |
1841 } | |
1842 // Clean up VideoCapturer. | |
1843 delete iter->second; | |
1844 screencast_capturers_.erase(iter); | |
1845 return true; | |
1846 } | |
1847 | |
1848 bool VideoChannel::IsScreencasting_w() const { | |
1849 return !screencast_capturers_.empty(); | |
1850 } | |
1851 | |
1852 void VideoChannel::OnScreencastWindowEvent_s(uint32_t ssrc, | |
1853 rtc::WindowEvent we) { | |
1854 ASSERT(signaling_thread() == rtc::Thread::Current()); | |
1855 SignalScreencastWindowEvent(ssrc, we); | |
1856 } | |
1857 | |
1858 void VideoChannel::OnMessage(rtc::Message *pmsg) { | 1795 void VideoChannel::OnMessage(rtc::Message *pmsg) { |
1859 switch (pmsg->message_id) { | 1796 switch (pmsg->message_id) { |
1860 case MSG_SCREENCASTWINDOWEVENT: { | |
1861 const ScreencastEventMessageData* data = | |
1862 static_cast<ScreencastEventMessageData*>(pmsg->pdata); | |
1863 OnScreencastWindowEvent_s(data->ssrc, data->event); | |
1864 delete data; | |
1865 break; | |
1866 } | |
1867 case MSG_CHANNEL_ERROR: { | 1797 case MSG_CHANNEL_ERROR: { |
1868 const VideoChannelErrorMessageData* data = | 1798 const VideoChannelErrorMessageData* data = |
1869 static_cast<VideoChannelErrorMessageData*>(pmsg->pdata); | 1799 static_cast<VideoChannelErrorMessageData*>(pmsg->pdata); |
1870 delete data; | 1800 delete data; |
1871 break; | 1801 break; |
1872 } | 1802 } |
1873 default: | 1803 default: |
1874 BaseChannel::OnMessage(pmsg); | 1804 BaseChannel::OnMessage(pmsg); |
1875 break; | 1805 break; |
1876 } | 1806 } |
1877 } | 1807 } |
1878 | 1808 |
1879 void VideoChannel::OnConnectionMonitorUpdate( | 1809 void VideoChannel::OnConnectionMonitorUpdate( |
1880 ConnectionMonitor* monitor, const std::vector<ConnectionInfo> &infos) { | 1810 ConnectionMonitor* monitor, const std::vector<ConnectionInfo> &infos) { |
1881 SignalConnectionMonitor(this, infos); | 1811 SignalConnectionMonitor(this, infos); |
1882 } | 1812 } |
1883 | 1813 |
1884 // TODO(pthatcher): Look into removing duplicate code between | 1814 // TODO(pthatcher): Look into removing duplicate code between |
1885 // audio, video, and data, perhaps by using templates. | 1815 // audio, video, and data, perhaps by using templates. |
1886 void VideoChannel::OnMediaMonitorUpdate( | 1816 void VideoChannel::OnMediaMonitorUpdate( |
1887 VideoMediaChannel* media_channel, const VideoMediaInfo &info) { | 1817 VideoMediaChannel* media_channel, const VideoMediaInfo &info) { |
1888 ASSERT(media_channel == this->media_channel()); | 1818 ASSERT(media_channel == this->media_channel()); |
1889 SignalMediaMonitor(this, info); | 1819 SignalMediaMonitor(this, info); |
1890 } | 1820 } |
1891 | 1821 |
1892 void VideoChannel::OnScreencastWindowEvent(uint32_t ssrc, | |
1893 rtc::WindowEvent event) { | |
1894 ScreencastEventMessageData* pdata = | |
1895 new ScreencastEventMessageData(ssrc, event); | |
1896 signaling_thread()->Post(this, MSG_SCREENCASTWINDOWEVENT, pdata); | |
1897 } | |
1898 | |
1899 void VideoChannel::OnStateChange(VideoCapturer* capturer, CaptureState ev) { | |
1900 // Map capturer events to window events. In the future we may want to simply | |
1901 // pass these events up directly. | |
1902 rtc::WindowEvent we; | |
1903 if (ev == CS_STOPPED) { | |
1904 we = rtc::WE_CLOSE; | |
1905 } else if (ev == CS_PAUSED) { | |
1906 we = rtc::WE_MINIMIZE; | |
1907 } else if (ev == CS_RUNNING && previous_we_ == rtc::WE_MINIMIZE) { | |
1908 we = rtc::WE_RESTORE; | |
1909 } else { | |
1910 return; | |
1911 } | |
1912 previous_we_ = we; | |
1913 | |
1914 uint32_t ssrc = 0; | |
1915 if (!GetLocalSsrc(capturer, &ssrc)) { | |
1916 return; | |
1917 } | |
1918 | |
1919 OnScreencastWindowEvent(ssrc, we); | |
1920 } | |
1921 | |
1922 bool VideoChannel::GetLocalSsrc(const VideoCapturer* capturer, uint32_t* ssrc) { | |
1923 *ssrc = 0; | |
1924 for (ScreencastMap::iterator iter = screencast_capturers_.begin(); | |
1925 iter != screencast_capturers_.end(); ++iter) { | |
1926 if (iter->second == capturer) { | |
1927 *ssrc = iter->first; | |
1928 return true; | |
1929 } | |
1930 } | |
1931 return false; | |
1932 } | |
1933 | |
1934 void VideoChannel::GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const { | 1822 void VideoChannel::GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const { |
1935 GetSupportedVideoCryptoSuites(crypto_suites); | 1823 GetSupportedVideoCryptoSuites(crypto_suites); |
1936 } | 1824 } |
1937 | 1825 |
1938 DataChannel::DataChannel(rtc::Thread* thread, | 1826 DataChannel::DataChannel(rtc::Thread* thread, |
1939 DataMediaChannel* media_channel, | 1827 DataMediaChannel* media_channel, |
1940 TransportController* transport_controller, | 1828 TransportController* transport_controller, |
1941 const std::string& content_name, | 1829 const std::string& content_name, |
1942 bool rtcp) | 1830 bool rtcp) |
1943 : BaseChannel(thread, | 1831 : BaseChannel(thread, |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2248 return (data_channel_type_ == DCT_RTP) && BaseChannel::ShouldSetupDtlsSrtp(); | 2136 return (data_channel_type_ == DCT_RTP) && BaseChannel::ShouldSetupDtlsSrtp(); |
2249 } | 2137 } |
2250 | 2138 |
2251 void DataChannel::OnStreamClosedRemotely(uint32_t sid) { | 2139 void DataChannel::OnStreamClosedRemotely(uint32_t sid) { |
2252 rtc::TypedMessageData<uint32_t>* message = | 2140 rtc::TypedMessageData<uint32_t>* message = |
2253 new rtc::TypedMessageData<uint32_t>(sid); | 2141 new rtc::TypedMessageData<uint32_t>(sid); |
2254 signaling_thread()->Post(this, MSG_STREAMCLOSEDREMOTELY, message); | 2142 signaling_thread()->Post(this, MSG_STREAMCLOSEDREMOTELY, message); |
2255 } | 2143 } |
2256 | 2144 |
2257 } // namespace cricket | 2145 } // namespace cricket |
OLD | NEW |