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