| Index: webrtc/pc/channel.h | 
| diff --git a/webrtc/pc/channel.h b/webrtc/pc/channel.h | 
| index 4518301d3b65e9e6fdf89586d258b519e42a4677..636632a9f0e34a189f02e27eab2edd5c05ec107e 100644 | 
| --- a/webrtc/pc/channel.h | 
| +++ b/webrtc/pc/channel.h | 
| @@ -19,6 +19,7 @@ | 
| #include <vector> | 
|  | 
| #include "webrtc/audio_sink.h" | 
| +#include "webrtc/base/asyncinvoker.h" | 
| #include "webrtc/base/asyncudpsocket.h" | 
| #include "webrtc/base/criticalsection.h" | 
| #include "webrtc/base/network.h" | 
| @@ -47,11 +48,6 @@ namespace cricket { | 
| struct CryptoParams; | 
| class MediaContentDescription; | 
|  | 
| -enum SinkType { | 
| -  SINK_PRE_CRYPTO,  // Sink packets before encryption or after decryption. | 
| -  SINK_POST_CRYPTO  // Sink packets after encryption or before decryption. | 
| -}; | 
| - | 
| // BaseChannel contains logic common to voice and video, including | 
| // enable, marshaling calls to a worker thread, and | 
| // connection and media monitors. | 
| @@ -66,26 +62,22 @@ class BaseChannel | 
| public MediaChannel::NetworkInterface, | 
| public ConnectionStatsGetter { | 
| public: | 
| -  BaseChannel(rtc::Thread* thread, | 
| +  BaseChannel(rtc::Thread* worker_thread, | 
| +              rtc::Thread* network_thread, | 
| MediaChannel* channel, | 
| TransportController* transport_controller, | 
| const std::string& content_name, | 
| bool rtcp); | 
| virtual ~BaseChannel(); | 
| bool Init(); | 
| -  // Deinit may be called multiple times and is simply ignored if it's alreay | 
| +  // Deinit may be called multiple times and is simply ignored if it's already | 
| // done. | 
| void Deinit(); | 
|  | 
| rtc::Thread* worker_thread() const { return worker_thread_; } | 
| +  rtc::Thread* network_thread() const { return network_thread_; } | 
| const std::string& content_name() const { return content_name_; } | 
| const std::string& transport_name() const { return transport_name_; } | 
| -  TransportChannel* transport_channel() const { | 
| -    return transport_channel_; | 
| -  } | 
| -  TransportChannel* rtcp_transport_channel() const { | 
| -    return rtcp_transport_channel_; | 
| -  } | 
| bool enabled() const { return enabled_; } | 
|  | 
| // This function returns true if we are using SRTP. | 
| @@ -143,18 +135,28 @@ class BaseChannel | 
| } | 
|  | 
| sigslot::signal2<BaseChannel*, bool> SignalDtlsSetupFailure; | 
| -  void SignalDtlsSetupFailure_w(bool rtcp); | 
| +  void SignalDtlsSetupFailure_n(bool rtcp); | 
| void SignalDtlsSetupFailure_s(bool rtcp); | 
|  | 
| // Used for latency measurements. | 
| sigslot::signal1<BaseChannel*> SignalFirstPacketReceived; | 
|  | 
| +  // Forward TransportChannel SignalSentPacket to worker thread. | 
| +  sigslot::signal1<const rtc::SentPacket&> SignalSentPacket; | 
| + | 
| +  // Only public for unit tests.  Otherwise, consider private. | 
| +  TransportChannel* transport_channel() const { return transport_channel_; } | 
| +  TransportChannel* rtcp_transport_channel() const { | 
| +    return rtcp_transport_channel_; | 
| +  } | 
| + | 
| // Made public for easier testing. | 
| void SetReadyToSend(bool rtcp, bool ready); | 
|  | 
| // Only public for unit tests.  Otherwise, consider protected. | 
| int SetOption(SocketType type, rtc::Socket::Option o, int val) | 
| override; | 
| +  int SetOption_n(SocketType type, rtc::Socket::Option o, int val); | 
|  | 
| SrtpFilter* srtp_filter() { return &srtp_filter_; } | 
|  | 
| @@ -162,7 +164,7 @@ class BaseChannel | 
| virtual MediaChannel* media_channel() const { return media_channel_; } | 
| // Sets the |transport_channel_| (and |rtcp_transport_channel_|, if |rtcp_| is | 
| // true). Gets the transport channels from |transport_controller_|. | 
| -  bool SetTransport_w(const std::string& transport_name); | 
| +  bool SetTransport_n(const std::string& transport_name); | 
|  | 
| void set_transport_channel(TransportChannel* transport); | 
| void set_rtcp_transport_channel(TransportChannel* transport, | 
| @@ -188,7 +190,7 @@ class BaseChannel | 
| void ConnectToTransportChannel(TransportChannel* tc); | 
| void DisconnectFromTransportChannel(TransportChannel* tc); | 
|  | 
| -  void FlushRtcpMessages(); | 
| +  void FlushRtcpMessages_n(); | 
|  | 
| // NetworkInterface implementation, called by MediaEngine | 
| bool SendPacket(rtc::CopyOnWriteBuffer* packet, | 
| @@ -217,28 +219,33 @@ class BaseChannel | 
| bool SendPacket(bool rtcp, | 
| rtc::CopyOnWriteBuffer* packet, | 
| const rtc::PacketOptions& options); | 
| + | 
| virtual bool WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet); | 
| void HandlePacket(bool rtcp, rtc::CopyOnWriteBuffer* packet, | 
| const rtc::PacketTime& packet_time); | 
| +  void OnPacketReceived(bool rtcp, | 
| +                        const rtc::CopyOnWriteBuffer& packet, | 
| +                        const rtc::PacketTime& packet_time); | 
|  | 
| void EnableMedia_w(); | 
| void DisableMedia_w(); | 
| -  void UpdateWritableState_w(); | 
| -  void ChannelWritable_w(); | 
| -  void ChannelNotWritable_w(); | 
| +  void UpdateWritableState_n(); | 
| +  void ChannelWritable_n(); | 
| +  void ChannelNotWritable_n(); | 
| bool AddRecvStream_w(const StreamParams& sp); | 
| bool RemoveRecvStream_w(uint32_t ssrc); | 
| bool AddSendStream_w(const StreamParams& sp); | 
| bool RemoveSendStream_w(uint32_t ssrc); | 
| -  virtual bool ShouldSetupDtlsSrtp() const; | 
| +  virtual bool ShouldSetupDtlsSrtp_n() const; | 
| // Do the DTLS key expansion and impose it on the SRTP/SRTCP filters. | 
| // |rtcp_channel| indicates whether to set up the RTP or RTCP filter. | 
| -  bool SetupDtlsSrtp(bool rtcp_channel); | 
| -  void MaybeSetupDtlsSrtp_w(); | 
| +  bool SetupDtlsSrtp_n(bool rtcp_channel); | 
| +  void MaybeSetupDtlsSrtp_n(); | 
| // Set the DTLS-SRTP cipher policy on this channel as appropriate. | 
| bool SetDtlsSrtpCryptoSuites(TransportChannel* tc, bool rtcp); | 
|  | 
| -  virtual void ChangeState() = 0; | 
| +  void ChangeState(); | 
| +  virtual void ChangeState_w() = 0; | 
|  | 
| // Gets the content info appropriate to the channel (audio or video). | 
| virtual const ContentInfo* GetFirstContent( | 
| @@ -255,7 +262,11 @@ class BaseChannel | 
| virtual bool SetRemoteContent_w(const MediaContentDescription* content, | 
| ContentAction action, | 
| std::string* error_desc) = 0; | 
| -  bool SetRtpTransportParameters_w(const MediaContentDescription* content, | 
| +  bool SetRtpTransportParameters(const MediaContentDescription* content, | 
| +                                 ContentAction action, | 
| +                                 ContentSource src, | 
| +                                 std::string* error_desc); | 
| +  bool SetRtpTransportParameters_n(const MediaContentDescription* content, | 
| ContentAction action, | 
| ContentSource src, | 
| std::string* error_desc); | 
| @@ -268,12 +279,12 @@ class BaseChannel | 
| bool CheckSrtpConfig(const std::vector<CryptoParams>& cryptos, | 
| bool* dtls, | 
| std::string* error_desc); | 
| -  bool SetSrtp_w(const std::vector<CryptoParams>& params, | 
| +  bool SetSrtp_n(const std::vector<CryptoParams>& params, | 
| ContentAction action, | 
| ContentSource src, | 
| std::string* error_desc); | 
| -  void ActivateRtcpMux_w(); | 
| -  bool SetRtcpMux_w(bool enable, | 
| +  void ActivateRtcpMux_n(); | 
| +  bool SetRtcpMux_n(bool enable, | 
| ContentAction action, | 
| ContentSource src, | 
| std::string* error_desc); | 
| @@ -294,9 +305,17 @@ class BaseChannel | 
| } | 
|  | 
| private: | 
| -  rtc::Thread* worker_thread_; | 
| -  TransportController* transport_controller_; | 
| -  MediaChannel* media_channel_; | 
| +  bool Init_n(); | 
| +  void Destruct_n(); | 
| +  void SignalSentPacket_n(TransportChannel* channel, | 
| +                          const rtc::SentPacket& sent_packet); | 
| +  void SignalSentPacket_w(const rtc::SentPacket& sent_packet); | 
| + | 
| +  rtc::Thread* const worker_thread_; | 
| +  rtc::Thread* const network_thread_; | 
| +  rtc::AsyncInvoker invoker_; | 
| +  TransportController* const transport_controller_; | 
| +  MediaChannel* const media_channel_; | 
| std::vector<StreamParams> local_streams_; | 
| std::vector<StreamParams> remote_streams_; | 
|  | 
| @@ -328,7 +347,8 @@ class BaseChannel | 
| // and input/output level monitoring. | 
| class VoiceChannel : public BaseChannel { | 
| public: | 
| -  VoiceChannel(rtc::Thread* thread, | 
| +  VoiceChannel(rtc::Thread* worker_thread, | 
| +               rtc::Thread* network_thread, | 
| MediaEngineInterface* media_engine, | 
| VoiceMediaChannel* channel, | 
| TransportController* transport_controller, | 
| @@ -345,7 +365,7 @@ class VoiceChannel : public BaseChannel { | 
| AudioSource* source); | 
|  | 
| // downcasts a MediaChannel | 
| -  virtual VoiceMediaChannel* media_channel() const { | 
| +  VoiceMediaChannel* media_channel() const override { | 
| return static_cast<VoiceMediaChannel*>(BaseChannel::media_channel()); | 
| } | 
|  | 
| @@ -393,29 +413,31 @@ class VoiceChannel : public BaseChannel { | 
|  | 
| private: | 
| // overrides from BaseChannel | 
| -  virtual void OnChannelRead(TransportChannel* channel, | 
| -                             const char* data, size_t len, | 
| -                             const rtc::PacketTime& packet_time, | 
| -                             int flags); | 
| -  virtual void ChangeState(); | 
| -  virtual const ContentInfo* GetFirstContent(const SessionDescription* sdesc); | 
| -  virtual bool SetLocalContent_w(const MediaContentDescription* content, | 
| -                                 ContentAction action, | 
| -                                 std::string* error_desc); | 
| -  virtual bool SetRemoteContent_w(const MediaContentDescription* content, | 
| -                                  ContentAction action, | 
| -                                  std::string* error_desc); | 
| +  void OnChannelRead(TransportChannel* channel, | 
| +                     const char* data, | 
| +                     size_t len, | 
| +                     const rtc::PacketTime& packet_time, | 
| +                     int flags) override; | 
| +  void ChangeState_w() override; | 
| +  const ContentInfo* GetFirstContent(const SessionDescription* sdesc) override; | 
| +  bool SetLocalContent_w(const MediaContentDescription* content, | 
| +                         ContentAction action, | 
| +                         std::string* error_desc) override; | 
| +  bool SetRemoteContent_w(const MediaContentDescription* content, | 
| +                          ContentAction action, | 
| +                          std::string* error_desc) override; | 
| void HandleEarlyMediaTimeout(); | 
| bool InsertDtmf_w(uint32_t ssrc, int event, int duration); | 
| bool SetOutputVolume_w(uint32_t ssrc, double volume); | 
| bool GetStats_w(VoiceMediaInfo* stats); | 
|  | 
| -  virtual void OnMessage(rtc::Message* pmsg); | 
| -  virtual void GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const; | 
| -  virtual void OnConnectionMonitorUpdate( | 
| -      ConnectionMonitor* monitor, const std::vector<ConnectionInfo>& infos); | 
| -  virtual void OnMediaMonitorUpdate( | 
| -      VoiceMediaChannel* media_channel, const VoiceMediaInfo& info); | 
| +  void OnMessage(rtc::Message* pmsg) override; | 
| +  void GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const override; | 
| +  void OnConnectionMonitorUpdate( | 
| +      ConnectionMonitor* monitor, | 
| +      const std::vector<ConnectionInfo>& infos) override; | 
| +  void OnMediaMonitorUpdate(VoiceMediaChannel* media_channel, | 
| +                            const VoiceMediaInfo& info); | 
| void OnAudioMonitorUpdate(AudioMonitor* monitor, const AudioInfo& info); | 
|  | 
| static const int kEarlyMediaTimeout = 1000; | 
| @@ -435,7 +457,8 @@ class VoiceChannel : public BaseChannel { | 
| // VideoChannel is a specialization for video. | 
| class VideoChannel : public BaseChannel { | 
| public: | 
| -  VideoChannel(rtc::Thread* thread, | 
| +  VideoChannel(rtc::Thread* worker_thread, | 
| +               rtc::Thread* netwokr_thread, | 
| VideoMediaChannel* channel, | 
| TransportController* transport_controller, | 
| const std::string& content_name, | 
| @@ -444,7 +467,7 @@ class VideoChannel : public BaseChannel { | 
| bool Init(); | 
|  | 
| // downcasts a MediaChannel | 
| -  virtual VideoMediaChannel* media_channel() const { | 
| +  VideoMediaChannel* media_channel() const override { | 
| return static_cast<VideoMediaChannel*>(BaseChannel::media_channel()); | 
| } | 
|  | 
| @@ -469,24 +492,25 @@ class VideoChannel : public BaseChannel { | 
|  | 
| private: | 
| // overrides from BaseChannel | 
| -  virtual void ChangeState(); | 
| -  virtual const ContentInfo* GetFirstContent(const SessionDescription* sdesc); | 
| -  virtual bool SetLocalContent_w(const MediaContentDescription* content, | 
| -                                 ContentAction action, | 
| -                                 std::string* error_desc); | 
| -  virtual bool SetRemoteContent_w(const MediaContentDescription* content, | 
| -                                  ContentAction action, | 
| -                                  std::string* error_desc); | 
| +  void ChangeState_w() override; | 
| +  const ContentInfo* GetFirstContent(const SessionDescription* sdesc) override; | 
| +  bool SetLocalContent_w(const MediaContentDescription* content, | 
| +                         ContentAction action, | 
| +                         std::string* error_desc) override; | 
| +  bool SetRemoteContent_w(const MediaContentDescription* content, | 
| +                          ContentAction action, | 
| +                          std::string* error_desc) override; | 
| bool GetStats_w(VideoMediaInfo* stats); | 
| webrtc::RtpParameters GetRtpParameters_w(uint32_t ssrc) const; | 
| bool SetRtpParameters_w(uint32_t ssrc, webrtc::RtpParameters parameters); | 
|  | 
| -  virtual void OnMessage(rtc::Message* pmsg); | 
| -  virtual void GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const; | 
| -  virtual void OnConnectionMonitorUpdate( | 
| -      ConnectionMonitor* monitor, const std::vector<ConnectionInfo>& infos); | 
| -  virtual void OnMediaMonitorUpdate( | 
| -      VideoMediaChannel* media_channel, const VideoMediaInfo& info); | 
| +  void OnMessage(rtc::Message* pmsg) override; | 
| +  void GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const override; | 
| +  void OnConnectionMonitorUpdate( | 
| +      ConnectionMonitor* monitor, | 
| +      const std::vector<ConnectionInfo>& infos) override; | 
| +  void OnMediaMonitorUpdate(VideoMediaChannel* media_channel, | 
| +                            const VideoMediaInfo& info); | 
|  | 
| std::unique_ptr<VideoMediaMonitor> media_monitor_; | 
|  | 
| @@ -501,7 +525,8 @@ class VideoChannel : public BaseChannel { | 
| // DataChannel is a specialization for data. | 
| class DataChannel : public BaseChannel { | 
| public: | 
| -  DataChannel(rtc::Thread* thread, | 
| +  DataChannel(rtc::Thread* worker_thread, | 
| +              rtc::Thread* network_thread, | 
| DataMediaChannel* media_channel, | 
| TransportController* transport_controller, | 
| const std::string& content_name, | 
| @@ -535,7 +560,7 @@ class DataChannel : public BaseChannel { | 
|  | 
| protected: | 
| // downcasts a MediaChannel. | 
| -  virtual DataMediaChannel* media_channel() const { | 
| +  DataMediaChannel* media_channel() const override { | 
| return static_cast<DataMediaChannel*>(BaseChannel::media_channel()); | 
| } | 
|  | 
| @@ -572,7 +597,7 @@ class DataChannel : public BaseChannel { | 
| typedef rtc::TypedMessageData<bool> DataChannelReadyToSendMessageData; | 
|  | 
| // overrides from BaseChannel | 
| -  virtual const ContentInfo* GetFirstContent(const SessionDescription* sdesc); | 
| +  const ContentInfo* GetFirstContent(const SessionDescription* sdesc) override; | 
| // If data_channel_type_ is DCT_NONE, set it.  Otherwise, check that | 
| // it's the same as what was set previously.  Returns false if it's | 
| // set to one type one type and changed to another type later. | 
| @@ -582,22 +607,23 @@ class DataChannel : public BaseChannel { | 
| // DataContentDescription. | 
| bool SetDataChannelTypeFromContent(const DataContentDescription* content, | 
| std::string* error_desc); | 
| -  virtual bool SetLocalContent_w(const MediaContentDescription* content, | 
| -                                 ContentAction action, | 
| -                                 std::string* error_desc); | 
| -  virtual bool SetRemoteContent_w(const MediaContentDescription* content, | 
| -                                  ContentAction action, | 
| -                                  std::string* error_desc); | 
| -  virtual void ChangeState(); | 
| -  virtual bool WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet); | 
| +  bool SetLocalContent_w(const MediaContentDescription* content, | 
| +                         ContentAction action, | 
| +                         std::string* error_desc) override; | 
| +  bool SetRemoteContent_w(const MediaContentDescription* content, | 
| +                          ContentAction action, | 
| +                          std::string* error_desc) override; | 
| +  void ChangeState_w() override; | 
| +  bool WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet) override; | 
|  | 
| -  virtual void OnMessage(rtc::Message* pmsg); | 
| -  virtual void GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const; | 
| -  virtual void OnConnectionMonitorUpdate( | 
| -      ConnectionMonitor* monitor, const std::vector<ConnectionInfo>& infos); | 
| -  virtual void OnMediaMonitorUpdate( | 
| -      DataMediaChannel* media_channel, const DataMediaInfo& info); | 
| -  virtual bool ShouldSetupDtlsSrtp() const; | 
| +  void OnMessage(rtc::Message* pmsg) override; | 
| +  void GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const override; | 
| +  void OnConnectionMonitorUpdate( | 
| +      ConnectionMonitor* monitor, | 
| +      const std::vector<ConnectionInfo>& infos) override; | 
| +  void OnMediaMonitorUpdate(DataMediaChannel* media_channel, | 
| +                            const DataMediaInfo& info); | 
| +  bool ShouldSetupDtlsSrtp_n() const override; | 
| void OnDataReceived( | 
| const ReceiveDataParams& params, const char* data, size_t len); | 
| void OnDataChannelError(uint32_t ssrc, DataMediaChannel::Error error); | 
|  |