10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2004 Google Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifndef TALK_SESSION_MEDIA_CHANNEL_H_ 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define TALK_SESSION_MEDIA_CHANNEL_H_ 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <string> 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <vector> 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/mediachannel.h" 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/mediaengine.h" 360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/streamparams.h" 370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/videocapturer.h" 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/session.h" 390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/client/socketmonitor.h" 400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/session/media/audiomonitor.h" 41907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org#include "talk/session/media/bundlefilter.h" 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/session/media/mediamonitor.h" 430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/session/media/mediasession.h" 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/session/media/rtcpmuxfilter.h" 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/session/media/srtpfilter.h" 46cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/asyncudpsocket.h" 47cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/criticalsection.h" 48cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/network.h" 49cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/sigslot.h" 50cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/window.h" 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket { 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstruct CryptoParams; 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass MediaContentDescription; 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstruct TypingMonitorOptions; 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass TypingMonitor; 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstruct ViewRequest; 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgenum SinkType { 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SINK_PRE_CRYPTO, // Sink packets before encryption or after decryption. 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SINK_POST_CRYPTO // Sink packets after encryption or before decryption. 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// BaseChannel contains logic common to voice and video, including 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// enable/mute, marshaling calls to a worker thread, and 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// connection and media monitors. 68861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org// 69861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org// WARNING! SUBCLASSES MUST CALL Deinit() IN THEIR DESTRUCTORS! 70861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org// This is required to avoid a data race between the destructor modifying the 71861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org// vtable, and the media channel's thread using BaseChannel as the 72861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org// NetworkInterface. 73861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass BaseChannel 752a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org : public rtc::MessageHandler, public sigslot::has_slots<>, 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public MediaChannel::NetworkInterface { 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 782a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org BaseChannel(rtc::Thread* thread, MediaEngineInterface* media_engine, 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaChannel* channel, BaseSession* session, 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& content_name, bool rtcp); 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual ~BaseChannel(); 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool Init(TransportChannel* transport_channel, 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportChannel* rtcp_transport_channel); 84861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org // Deinit may be called multiple times and is simply ignored if it's alreay 85861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org // done. 86861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org void Deinit(); 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 882a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread* worker_thread() const { return worker_thread_; } 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org BaseSession* session() const { return session_; } 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& content_name() { return content_name_; } 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportChannel* transport_channel() const { 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return transport_channel_; 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportChannel* rtcp_transport_channel() const { 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return rtcp_transport_channel_; 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool enabled() const { return enabled_; } 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // This function returns true if we are using SRTP. 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool secure() const { return srtp_filter_.IsActive(); } 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The following function returns true if we are using 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // DTLS-based keying. If you turned off SRTP later, however 1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // you could have secure() == false and dtls_secure() == true. 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool secure_dtls() const { return dtls_keyed_; } 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // This function returns true if we require secure channel for call setup. 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool secure_required() const { return secure_required_; } 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool writable() const { return writable_; } 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool IsStreamMuted(uint32 ssrc); 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Channel control 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetLocalContent(const MediaContentDescription* content, 113f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentAction action, 114f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetRemoteContent(const MediaContentDescription* content, 116f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentAction action, 117f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool Enable(bool enable); 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Mute sending media on the stream with SSRC |ssrc| 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // If there is only one sending stream SSRC 0 can be used. 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool MuteStream(uint32 ssrc, bool mute); 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Multiplexing 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool AddRecvStream(const StreamParams& sp); 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool RemoveRecvStream(uint32 ssrc); 127952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org bool AddSendStream(const StreamParams& sp); 128952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org bool RemoveSendStream(uint32 ssrc); 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Monitoring 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void StartConnectionMonitor(int cms); 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void StopConnectionMonitor(); 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void set_srtp_signal_silent_time(uint32 silent_time) { 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_filter_.set_signal_silent_time(silent_time); 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void set_content_name(const std::string& content_name) { 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(signaling_thread()->IsCurrent()); 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(!writable_); 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (session_->state() != BaseSession::STATE_INIT) { 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org LOG(LS_ERROR) << "Content name for a channel can be changed only " 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org << "when BaseSession is in STATE_INIT state."; 1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content_name_ = content_name; 1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org template <class T> 1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void RegisterSendSink(T* sink, 1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void (T::*OnPacket)(const void*, size_t, bool), 1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SinkType type) { 1532a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CritScope cs(&signal_send_packet_cs_); 1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (SINK_POST_CRYPTO == type) { 1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalSendPacketPostCrypto.disconnect(sink); 1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalSendPacketPostCrypto.connect(sink, OnPacket); 1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalSendPacketPreCrypto.disconnect(sink); 1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalSendPacketPreCrypto.connect(sink, OnPacket); 1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void UnregisterSendSink(sigslot::has_slots<>* sink, 1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SinkType type) { 1652a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CritScope cs(&signal_send_packet_cs_); 1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (SINK_POST_CRYPTO == type) { 1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalSendPacketPostCrypto.disconnect(sink); 1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalSendPacketPreCrypto.disconnect(sink); 1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool HasSendSinks(SinkType type) { 1742a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CritScope cs(&signal_send_packet_cs_); 1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (SINK_POST_CRYPTO == type) { 1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return !SignalSendPacketPostCrypto.is_empty(); 1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return !SignalSendPacketPreCrypto.is_empty(); 1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org template <class T> 1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void RegisterRecvSink(T* sink, 1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void (T::*OnPacket)(const void*, size_t, bool), 1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SinkType type) { 1862a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CritScope cs(&signal_recv_packet_cs_); 1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (SINK_POST_CRYPTO == type) { 1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalRecvPacketPostCrypto.disconnect(sink); 1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalRecvPacketPostCrypto.connect(sink, OnPacket); 1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalRecvPacketPreCrypto.disconnect(sink); 1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalRecvPacketPreCrypto.connect(sink, OnPacket); 1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void UnregisterRecvSink(sigslot::has_slots<>* sink, 1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SinkType type) { 1982a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CritScope cs(&signal_recv_packet_cs_); 1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (SINK_POST_CRYPTO == type) { 2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalRecvPacketPostCrypto.disconnect(sink); 2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalRecvPacketPreCrypto.disconnect(sink); 2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool HasRecvSinks(SinkType type) { 2072a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CritScope cs(&signal_recv_packet_cs_); 2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (SINK_POST_CRYPTO == type) { 2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return !SignalRecvPacketPostCrypto.is_empty(); 2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return !SignalRecvPacketPreCrypto.is_empty(); 2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 215907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org BundleFilter* bundle_filter() { return &bundle_filter_; } 2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::vector<StreamParams>& local_streams() const { 2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return local_streams_; 2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::vector<StreamParams>& remote_streams() const { 2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return remote_streams_; 2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2247634b1949e4b3a288a6c908ccbf422134ab45f97buildbot@webrtc.org // Used for latency measurements. 2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal1<BaseChannel*> SignalFirstPacketReceived; 2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Used to alert UI when the muted status changes, perhaps autonomously. 2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::repeater2<BaseChannel*, bool> SignalAutoMuted; 2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Made public for easier testing. 2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SetReadyToSend(TransportChannel* channel, bool ready); 2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected: 2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaEngineInterface* media_engine() const { return media_engine_; } 2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual MediaChannel* media_channel() const { return media_channel_; } 2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void set_rtcp_transport_channel(TransportChannel* transport); 2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool was_ever_writable() const { return was_ever_writable_; } 2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void set_local_content_direction(MediaContentDirection direction) { 2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org local_content_direction_ = direction; 2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void set_remote_content_direction(MediaContentDirection direction) { 2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_content_direction_ = direction; 2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool IsReadyToReceive() const; 2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool IsReadyToSend() const; 2462a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread* signaling_thread() { return session_->signaling_thread(); } 2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SrtpFilter* srtp_filter() { return &srtp_filter_; } 2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool rtcp() const { return rtcp_; } 2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void FlushRtcpMessages(); 2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // NetworkInterface implementation, called by MediaEngine 2532a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual bool SendPacket(rtc::Buffer* packet, 2542a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::DiffServCodePoint dscp); 2552a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual bool SendRtcp(rtc::Buffer* packet, 2562a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::DiffServCodePoint dscp); 2572a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual int SetOption(SocketType type, rtc::Socket::Option o, int val); 2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // From TransportChannel 2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnWritableState(TransportChannel* channel); 261f89a403cd8db88001322bbb0765c4636fd123700wu@webrtc.org virtual void OnChannelRead(TransportChannel* channel, 262f89a403cd8db88001322bbb0765c4636fd123700wu@webrtc.org const char* data, 263f89a403cd8db88001322bbb0765c4636fd123700wu@webrtc.org size_t len, 2642a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::PacketTime& packet_time, 265f89a403cd8db88001322bbb0765c4636fd123700wu@webrtc.org int flags); 2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnReadyToSend(TransportChannel* channel); 2670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool PacketIsRtcp(const TransportChannel* channel, const char* data, 2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t len); 2702a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org bool SendPacket(bool rtcp, rtc::Buffer* packet, 2712a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::DiffServCodePoint dscp); 2722a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual bool WantsPacket(bool rtcp, rtc::Buffer* packet); 2732a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org void HandlePacket(bool rtcp, rtc::Buffer* packet, 2742a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::PacketTime& packet_time); 2750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Apply the new local/remote session description. 2770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnNewLocalDescription(BaseSession* session, ContentAction action); 2780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnNewRemoteDescription(BaseSession* session, ContentAction action); 2790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void EnableMedia_w(); 2810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void DisableMedia_w(); 2820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool MuteStream_w(uint32 ssrc, bool mute); 2830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool IsStreamMuted_w(uint32 ssrc); 2840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void ChannelWritable_w(); 2850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void ChannelNotWritable_w(); 2860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool AddRecvStream_w(const StreamParams& sp); 2870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool RemoveRecvStream_w(uint32 ssrc); 288952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org bool AddSendStream_w(const StreamParams& sp); 289952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org bool RemoveSendStream_w(uint32 ssrc); 2900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool ShouldSetupDtlsSrtp() const; 2910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Do the DTLS key expansion and impose it on the SRTP/SRTCP filters. 2920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // |rtcp_channel| indicates whether to set up the RTP or RTCP filter. 2930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetupDtlsSrtp(bool rtcp_channel); 2940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Set the DTLS-SRTP cipher policy on this channel as appropriate. 2950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetDtlsSrtpCiphers(TransportChannel *tc, bool rtcp); 2960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void ChangeState() = 0; 2980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Gets the content info appropriate to the channel (audio or video). 3000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual const ContentInfo* GetFirstContent( 3010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const SessionDescription* sdesc) = 0; 3020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool UpdateLocalStreams_w(const std::vector<StreamParams>& streams, 303f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentAction action, 304f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 3050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool UpdateRemoteStreams_w(const std::vector<StreamParams>& streams, 306f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentAction action, 307f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 3080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetBaseLocalContent_w(const MediaContentDescription* content, 309f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentAction action, 310f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 3110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool SetLocalContent_w(const MediaContentDescription* content, 312f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentAction action, 313f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc) = 0; 3140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetBaseRemoteContent_w(const MediaContentDescription* content, 315f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentAction action, 316f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 3170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool SetRemoteContent_w(const MediaContentDescription* content, 318f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentAction action, 319f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc) = 0; 320f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org 32178afd903598b85bd36e67ca5a4cf8e631cef6eaehenrike@webrtc.org // Helper method to get RTP Absoulute SendTime extension header id if 32278afd903598b85bd36e67ca5a4cf8e631cef6eaehenrike@webrtc.org // present in remote supported extensions list. 32378afd903598b85bd36e67ca5a4cf8e631cef6eaehenrike@webrtc.org void MaybeCacheRtpAbsSendTimeHeaderExtension( 32478afd903598b85bd36e67ca5a4cf8e631cef6eaehenrike@webrtc.org const std::vector<RtpHeaderExtension>& extensions); 32578afd903598b85bd36e67ca5a4cf8e631cef6eaehenrike@webrtc.org 32650a921186d91cc91e2017692ac8a52916a991832buildbot@webrtc.org bool SetRecvRtpHeaderExtensions_w(const MediaContentDescription* content, 32750a921186d91cc91e2017692ac8a52916a991832buildbot@webrtc.org MediaChannel* media_channel, 32850a921186d91cc91e2017692ac8a52916a991832buildbot@webrtc.org std::string* error_desc); 32950a921186d91cc91e2017692ac8a52916a991832buildbot@webrtc.org bool SetSendRtpHeaderExtensions_w(const MediaContentDescription* content, 33050a921186d91cc91e2017692ac8a52916a991832buildbot@webrtc.org MediaChannel* media_channel, 33150a921186d91cc91e2017692ac8a52916a991832buildbot@webrtc.org std::string* error_desc); 33250a921186d91cc91e2017692ac8a52916a991832buildbot@webrtc.org 333f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org bool CheckSrtpConfig(const std::vector<CryptoParams>& cryptos, 334f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org bool* dtls, 335f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 336f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org bool SetSrtp_w(const std::vector<CryptoParams>& params, 337f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentAction action, 338f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentSource src, 339f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 340f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org bool SetRtcpMux_w(bool enable, 341f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentAction action, 342f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentSource src, 343f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 3440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // From MessageHandler 3462a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual void OnMessage(rtc::Message* pmsg); 3470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Handled in derived classes 3490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Get the SRTP ciphers to use for RTP media 3500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void GetSrtpCiphers(std::vector<std::string>* ciphers) const = 0; 3510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnConnectionMonitorUpdate(SocketMonitor* monitor, 3520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::vector<ConnectionInfo>& infos) = 0; 3530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 35470022fa5eb218ec690774cc4a74558699a79600asergeyu@chromium.org // Helper function for invoking bool-returning methods on the worker thread. 35570022fa5eb218ec690774cc4a74558699a79600asergeyu@chromium.org template <class FunctorT> 35670022fa5eb218ec690774cc4a74558699a79600asergeyu@chromium.org bool InvokeOnWorker(const FunctorT& functor) { 35770022fa5eb218ec690774cc4a74558699a79600asergeyu@chromium.org return worker_thread_->Invoke<bool>(functor); 35870022fa5eb218ec690774cc4a74558699a79600asergeyu@chromium.org } 35970022fa5eb218ec690774cc4a74558699a79600asergeyu@chromium.org 3600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 3610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal3<const void*, size_t, bool> SignalSendPacketPreCrypto; 3620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal3<const void*, size_t, bool> SignalSendPacketPostCrypto; 3630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal3<const void*, size_t, bool> SignalRecvPacketPreCrypto; 3640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal3<const void*, size_t, bool> SignalRecvPacketPostCrypto; 3652a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CriticalSection signal_send_packet_cs_; 3662a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CriticalSection signal_recv_packet_cs_; 3670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3682a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread* worker_thread_; 3690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaEngineInterface* media_engine_; 3700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org BaseSession* session_; 3710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaChannel* media_channel_; 3720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<StreamParams> local_streams_; 3730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<StreamParams> remote_streams_; 3740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string content_name_; 3760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool rtcp_; 3770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportChannel* transport_channel_; 3780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportChannel* rtcp_transport_channel_; 3790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SrtpFilter srtp_filter_; 3800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org RtcpMuxFilter rtcp_mux_filter_; 381907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org BundleFilter bundle_filter_; 3822a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SocketMonitor> socket_monitor_; 3830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool enabled_; 3840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool writable_; 3850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool rtp_ready_to_send_; 3860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool rtcp_ready_to_send_; 3870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool was_ever_writable_; 3880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaContentDirection local_content_direction_; 3890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaContentDirection remote_content_direction_; 3900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::set<uint32> muted_streams_; 3910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool has_received_packet_; 3920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool dtls_keyed_; 3930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool secure_required_; 39478afd903598b85bd36e67ca5a4cf8e631cef6eaehenrike@webrtc.org int rtp_abs_sendtime_extn_id_; 3950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 3960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// VoiceChannel is a specialization that adds support for early media, DTMF, 3980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// and input/output level monitoring. 3990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass VoiceChannel : public BaseChannel { 4000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 4012a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org VoiceChannel(rtc::Thread* thread, MediaEngineInterface* media_engine, 4020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VoiceMediaChannel* channel, BaseSession* session, 4030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& content_name, bool rtcp); 4040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ~VoiceChannel(); 4050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool Init(); 4067162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org bool SetRemoteRenderer(uint32 ssrc, AudioRenderer* renderer); 4077162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org bool SetLocalRenderer(uint32 ssrc, AudioRenderer* renderer); 4080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // downcasts a MediaChannel 4100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual VoiceMediaChannel* media_channel() const { 4110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return static_cast<VoiceMediaChannel*>(BaseChannel::media_channel()); 4120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetRingbackTone(const void* buf, int len); 4150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SetEarlyMedia(bool enable); 4160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // This signal is emitted when we have gone a period of time without 4170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // receiving early media. When received, a UI should start playing its 4180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // own ringing sound 4190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal1<VoiceChannel*> SignalEarlyMediaTimeout; 4200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool PlayRingbackTone(uint32 ssrc, bool play, bool loop); 4220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO(ronghuawu): Replace PressDTMF with InsertDtmf. 4230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool PressDTMF(int digit, bool playout); 4240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Returns if the telephone-event has been negotiated. 4250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool CanInsertDtmf(); 4260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Send and/or play a DTMF |event| according to the |flags|. 4270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The DTMF out-of-band signal will be used on sending. 4280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The |ssrc| should be either 0 or a valid send stream ssrc. 429692d748e58db01318ef10a7a19147da601e13e93henrike@webrtc.org // The valid value for the |event| are 0 which corresponding to DTMF 430692d748e58db01318ef10a7a19147da601e13e93henrike@webrtc.org // event 0-9, *, #, A-D. 4310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool InsertDtmf(uint32 ssrc, int event_code, int duration, int flags); 4320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetOutputScaling(uint32 ssrc, double left, double right); 4330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Get statistics about the current media session. 4340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool GetStats(VoiceMediaInfo* stats); 4350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Monitoring functions 4370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal2<VoiceChannel*, const std::vector<ConnectionInfo>&> 4380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalConnectionMonitor; 4390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void StartMediaMonitor(int cms); 4410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void StopMediaMonitor(); 4420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal2<VoiceChannel*, const VoiceMediaInfo&> SignalMediaMonitor; 4430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void StartAudioMonitor(int cms); 4450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void StopAudioMonitor(); 4460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool IsAudioMonitorRunning() const; 4470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal2<VoiceChannel*, const AudioInfo&> SignalAudioMonitor; 4480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void StartTypingMonitor(const TypingMonitorOptions& settings); 4500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void StopTypingMonitor(); 4510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool IsTypingMonitorRunning() const; 4520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Overrides BaseChannel::MuteStream_w. 4540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool MuteStream_w(uint32 ssrc, bool mute); 4550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int GetInputLevel_w(); 4570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int GetOutputLevel_w(); 4580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void GetActiveStreams_w(AudioInfo::StreamList* actives); 4590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Signal errors from VoiceMediaChannel. Arguments are: 4610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // ssrc(uint32), and error(VoiceMediaChannel::Error). 4620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal3<VoiceChannel*, uint32, VoiceMediaChannel::Error> 4630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalMediaError; 4640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Configuration and setting. 4660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetChannelOptions(const AudioOptions& options); 4670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 4690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // overrides from BaseChannel 4700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnChannelRead(TransportChannel* channel, 471f89a403cd8db88001322bbb0765c4636fd123700wu@webrtc.org const char* data, size_t len, 4722a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::PacketTime& packet_time, 473f89a403cd8db88001322bbb0765c4636fd123700wu@webrtc.org int flags); 4740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void ChangeState(); 4750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual const ContentInfo* GetFirstContent(const SessionDescription* sdesc); 4760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool SetLocalContent_w(const MediaContentDescription* content, 477f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentAction action, 478f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 4790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool SetRemoteContent_w(const MediaContentDescription* content, 480f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentAction action, 481f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 4820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetRingbackTone_w(const void* buf, int len); 4830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool PlayRingbackTone_w(uint32 ssrc, bool play, bool loop); 4840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void HandleEarlyMediaTimeout(); 4850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool InsertDtmf_w(uint32 ssrc, int event, int duration, int flags); 4860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetOutputScaling_w(uint32 ssrc, double left, double right); 4870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool GetStats_w(VoiceMediaInfo* stats); 4880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4892a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual void OnMessage(rtc::Message* pmsg); 4900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void GetSrtpCiphers(std::vector<std::string>* ciphers) const; 4910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnConnectionMonitorUpdate( 4920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SocketMonitor* monitor, const std::vector<ConnectionInfo>& infos); 4930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnMediaMonitorUpdate( 4940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VoiceMediaChannel* media_channel, const VoiceMediaInfo& info); 4950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnAudioMonitorUpdate(AudioMonitor* monitor, const AudioInfo& info); 4960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnVoiceChannelError(uint32 ssrc, VoiceMediaChannel::Error error); 4970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SendLastMediaError(); 4980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnSrtpError(uint32 ssrc, SrtpFilter::Mode mode, SrtpFilter::Error error); 4990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static const int kEarlyMediaTimeout = 1000; 5010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool received_media_; 5022a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<VoiceMediaMonitor> media_monitor_; 5032a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<AudioMonitor> audio_monitor_; 5042a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<TypingMonitor> typing_monitor_; 5050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 5060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// VideoChannel is a specialization for video. 5080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass VideoChannel : public BaseChannel { 5090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 5102a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org VideoChannel(rtc::Thread* thread, MediaEngineInterface* media_engine, 5110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoMediaChannel* channel, BaseSession* session, 5120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& content_name, bool rtcp, 5130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VoiceChannel* voice_channel); 5140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ~VideoChannel(); 5150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool Init(); 5160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetRenderer(uint32 ssrc, VideoRenderer* renderer); 5180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool ApplyViewRequest(const ViewRequest& request); 5190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO(pthatcher): Refactor to use a "capture id" instead of an 5210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // ssrc here as the "key". 522c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org // Passes ownership of the capturer to the channel. 523c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org bool AddScreencast(uint32 ssrc, VideoCapturer* capturer); 5240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetCapturer(uint32 ssrc, VideoCapturer* capturer); 5250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool RemoveScreencast(uint32 ssrc); 5260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // True if we've added a screencast. Doesn't matter if the capturer 5270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // has been started or not. 5280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool IsScreencasting(); 529952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org int GetScreencastFps(uint32 ssrc); 530952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org int GetScreencastMaxPixels(uint32 ssrc); 5310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Get statistics about the current media session. 5328a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org bool GetStats(const StatsOptions& options, VideoMediaInfo* stats); 5330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal2<VideoChannel*, const std::vector<ConnectionInfo>&> 5350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalConnectionMonitor; 5360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void StartMediaMonitor(int cms); 5380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void StopMediaMonitor(); 5390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal2<VideoChannel*, const VideoMediaInfo&> SignalMediaMonitor; 5402a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org sigslot::signal2<uint32, rtc::WindowEvent> SignalScreencastWindowEvent; 5410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SendIntraFrame(); 5430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool RequestIntraFrame(); 5440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal3<VideoChannel*, uint32, VideoMediaChannel::Error> 5450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalMediaError; 5460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Configuration and setting. 5480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetChannelOptions(const VideoOptions& options); 5490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected: 5510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // downcasts a MediaChannel 5520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual VideoMediaChannel* media_channel() const { 5530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return static_cast<VideoMediaChannel*>(BaseChannel::media_channel()); 5540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 5570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org typedef std::map<uint32, VideoCapturer*> ScreencastMap; 55870022fa5eb218ec690774cc4a74558699a79600asergeyu@chromium.org struct ScreencastDetailsData; 5590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // overrides from BaseChannel 5610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void ChangeState(); 5620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual const ContentInfo* GetFirstContent(const SessionDescription* sdesc); 5630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool SetLocalContent_w(const MediaContentDescription* content, 564f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentAction action, 565f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 5660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool SetRemoteContent_w(const MediaContentDescription* content, 567f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentAction action, 568f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 5690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool ApplyViewRequest_w(const ViewRequest& request); 5700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 571c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org bool AddScreencast_w(uint32 ssrc, VideoCapturer* capturer); 5720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool RemoveScreencast_w(uint32 ssrc); 5732a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org void OnScreencastWindowEvent_s(uint32 ssrc, rtc::WindowEvent we); 5740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool IsScreencasting_w() const; 57570022fa5eb218ec690774cc4a74558699a79600asergeyu@chromium.org void GetScreencastDetails_w(ScreencastDetailsData* d) const; 5760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool GetStats_w(VideoMediaInfo* stats); 5770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5782a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual void OnMessage(rtc::Message* pmsg); 5790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void GetSrtpCiphers(std::vector<std::string>* ciphers) const; 5800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnConnectionMonitorUpdate( 5810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SocketMonitor* monitor, const std::vector<ConnectionInfo>& infos); 5820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnMediaMonitorUpdate( 5830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoMediaChannel* media_channel, const VideoMediaInfo& info); 5840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnScreencastWindowEvent(uint32 ssrc, 5852a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::WindowEvent event); 5860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnStateChange(VideoCapturer* capturer, CaptureState ev); 5870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool GetLocalSsrc(const VideoCapturer* capturer, uint32* ssrc); 5880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnVideoChannelError(uint32 ssrc, VideoMediaChannel::Error error); 5900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnSrtpError(uint32 ssrc, SrtpFilter::Mode mode, SrtpFilter::Error error); 5910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VoiceChannel* voice_channel_; 5930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoRenderer* renderer_; 5940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ScreencastMap screencast_capturers_; 5952a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<VideoMediaMonitor> media_monitor_; 5960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5972a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::WindowEvent previous_we_; 5980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 5990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// DataChannel is a specialization for data. 6010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass DataChannel : public BaseChannel { 6020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 6032a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org DataChannel(rtc::Thread* thread, 6040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DataMediaChannel* media_channel, 6050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org BaseSession* session, 6060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& content_name, 6070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool rtcp); 6080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ~DataChannel(); 6090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool Init(); 6100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 611d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org virtual bool SendData(const SendDataParams& params, 6122a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::Buffer& payload, 613d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org SendDataResult* result); 6140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void StartMediaMonitor(int cms); 6160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void StopMediaMonitor(); 6170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6184646ae6b3bb147572c89f4aa2fd1ab5566ca3c2ewu@webrtc.org // Should be called on the signaling thread only. 6194646ae6b3bb147572c89f4aa2fd1ab5566ca3c2ewu@webrtc.org bool ready_to_send_data() const { 6204646ae6b3bb147572c89f4aa2fd1ab5566ca3c2ewu@webrtc.org return ready_to_send_data_; 6214646ae6b3bb147572c89f4aa2fd1ab5566ca3c2ewu@webrtc.org } 6224646ae6b3bb147572c89f4aa2fd1ab5566ca3c2ewu@webrtc.org 6230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal2<DataChannel*, const DataMediaInfo&> SignalMediaMonitor; 6240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal2<DataChannel*, const std::vector<ConnectionInfo>&> 6250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalConnectionMonitor; 6260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal3<DataChannel*, uint32, DataMediaChannel::Error> 6270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalMediaError; 6280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal3<DataChannel*, 6290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const ReceiveDataParams&, 6302a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::Buffer&> 6310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalDataReceived; 6320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Signal for notifying when the channel becomes ready to send data. 633d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org // That occurs when the channel is enabled, the transport is writable, 634d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org // both local and remote descriptions are set, and the channel is unblocked. 6350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal1<bool> SignalReadyToSendData; 636f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org // Signal for notifying that the remote side has closed the DataChannel. 637f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org sigslot::signal1<uint32> SignalStreamClosedRemotely; 6380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 639952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org protected: 640952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org // downcasts a MediaChannel. 641952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org virtual DataMediaChannel* media_channel() const { 642952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org return static_cast<DataMediaChannel*>(BaseChannel::media_channel()); 643952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org } 644952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org 6450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 6462a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org struct SendDataMessageData : public rtc::MessageData { 6470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SendDataMessageData(const SendDataParams& params, 6482a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::Buffer* payload, 6490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SendDataResult* result) 6500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : params(params), 6510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org payload(payload), 6520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org result(result), 6530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org succeeded(false) { 6540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 6550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const SendDataParams& params; 6572a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::Buffer* payload; 6580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SendDataResult* result; 6590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool succeeded; 6600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org }; 6610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6622a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org struct DataReceivedMessageData : public rtc::MessageData { 6630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // We copy the data because the data will become invalid after we 6640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // handle DataMediaChannel::SignalDataReceived but before we fire 6650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // SignalDataReceived. 6660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DataReceivedMessageData( 6670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const ReceiveDataParams& params, const char* data, size_t len) 6680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : params(params), 6690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org payload(data, len) { 6700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 6710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const ReceiveDataParams params; 6722a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::Buffer payload; 6730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org }; 6740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6752a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org typedef rtc::TypedMessageData<bool> DataChannelReadyToSendMessageData; 676d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org 6770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // overrides from BaseChannel 6780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual const ContentInfo* GetFirstContent(const SessionDescription* sdesc); 6790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // If data_channel_type_ is DCT_NONE, set it. Otherwise, check that 6800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // it's the same as what was set previously. Returns false if it's 6810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // set to one type one type and changed to another type later. 682f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org bool SetDataChannelType(DataChannelType new_data_channel_type, 683f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 6840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Same as SetDataChannelType, but extracts the type from the 6850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // DataContentDescription. 686f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org bool SetDataChannelTypeFromContent(const DataContentDescription* content, 687f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 6880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool SetLocalContent_w(const MediaContentDescription* content, 689f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentAction action, 690f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 6910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool SetRemoteContent_w(const MediaContentDescription* content, 692f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentAction action, 693f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 6940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void ChangeState(); 6952a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual bool WantsPacket(bool rtcp, rtc::Buffer* packet); 6960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6972a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual void OnMessage(rtc::Message* pmsg); 6980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void GetSrtpCiphers(std::vector<std::string>* ciphers) const; 6990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnConnectionMonitorUpdate( 7000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SocketMonitor* monitor, const std::vector<ConnectionInfo>& infos); 7010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnMediaMonitorUpdate( 7020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DataMediaChannel* media_channel, const DataMediaInfo& info); 7030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool ShouldSetupDtlsSrtp() const; 7040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnDataReceived( 7050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const ReceiveDataParams& params, const char* data, size_t len); 7060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnDataChannelError(uint32 ssrc, DataMediaChannel::Error error); 707d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org void OnDataChannelReadyToSend(bool writable); 7080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnSrtpError(uint32 ssrc, SrtpFilter::Mode mode, SrtpFilter::Error error); 709f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org void OnStreamClosedRemotely(uint32 sid); 7100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7112a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<DataMediaMonitor> media_monitor_; 7120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO(pthatcher): Make a separate SctpDataChannel and 7130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // RtpDataChannel instead of using this. 7140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DataChannelType data_channel_type_; 7154646ae6b3bb147572c89f4aa2fd1ab5566ca3c2ewu@webrtc.org bool ready_to_send_data_; 7160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 7170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // namespace cricket 7190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif // TALK_SESSION_MEDIA_CHANNEL_H_ 721